Diff for /loncom/interface/londocs.pm between versions 1.528 and 1.536

version 1.528, 2013/01/09 04:01:16 version 1.536, 2013/03/13 00:29:09
Line 40  use Apache::lonxml; Line 40  use Apache::lonxml;
 use Apache::lonclonecourse;  use Apache::lonclonecourse;
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
 use Apache::lonnavdisplay();  use Apache::lonnavdisplay();
 use Apache::lonuserstate();  
 use Apache::lonextresedit();  use Apache::lonextresedit();
 use HTML::Entities;  use HTML::Entities;
 use HTML::TokeParser;  use HTML::TokeParser;
Line 153  sub dumpcourse { Line 152  sub dumpcourse {
             $r->print(&endContentScreen());              $r->print(&endContentScreen());
             return '';              return '';
         }          }
  my ($ca,$cd)=split(/\@/,$env{'form.authorspace'});   my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});
  $r->print('<h3>'.&mt('Copying Files').'</h3>');   $r->print('<h3>'.&mt('Copying Files').'</h3>');
  my $title=$env{'form.authorfolder'};   my $title=$env{'form.authorfolder'};
  $title=&clean($title);   $title=&clean($title);
Line 271  sub dumpcourse { Line 270  sub dumpcourse {
   
 sub group_import {  sub group_import {
     my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;      my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;
       my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,
           %removeparam,$importuploaded,$fixuperrors);
       $allmaps = {};
     while (@files) {      while (@files) {
  my ($name, $url, $residx) = @{ shift(@files) };   my ($name, $url, $residx) = @{ shift(@files) };
         if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$})          if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$})
Line 288  sub group_import { Line 289  sub group_import {
             $env{'form.output'}=$newmapstr;              $env{'form.output'}=$newmapstr;
             my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,              my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
                                                 'output',$1.$2);                                                  'output',$1.$2);
             if ($result != m|^/uploaded/|) {              if ($result !~ m{^/uploaded/}) {
                 $errtext.='Map not saved: A network error occurred when trying to save the new map. ';                  $errtext.='Map not saved: A network error occurred when trying to save the new map. ';
                 $fatal = 2;                  $fatal = 2;
             }              }
Line 297  sub group_import { Line 298  sub group_import {
             }              }
         }          }
  if ($url) {   if ($url) {
               if (($caller eq 'londocs') &&
                   ($folder =~ /^default/)) {
                   if (($url =~ /\.(page|sequence)$/) && (!$donechk)) {
                       my $chome = &Apache::lonnet::homeserver($coursenum,$coursedom);
                       my $cid = $coursedom.'_'.$coursenum;
                       $allmaps =
                           &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,
                                                                $chome,$cid);
                       $donechk = 1;
                   }
                   if ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) {
                       &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
                                            \%addedmaps,\%hierarchy,\%titles,$allmaps);
                       $importuploaded = 1;
                   } elsif ($url =~ m{^/res/.+\.(page|sequence)$}) {
                       next if ($allmaps->{$url});
                   }
               }
     if (!$residx      if (!$residx
  || defined($LONCAPA::map::zombies[$residx])) {   || defined($LONCAPA::map::zombies[$residx])) {
  $residx = &LONCAPA::map::getresidx($url,$residx);   $residx = &LONCAPA::map::getresidx($url,$residx);
Line 306  sub group_import { Line 325  sub group_import {
     if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }      if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }
     $url  = &LONCAPA::map::qtunescape($url);      $url  = &LONCAPA::map::qtunescape($url);
     $name = &LONCAPA::map::qtunescape($name);      $name = &LONCAPA::map::qtunescape($name);
               if ($name eq '') {
                   $name = &mt('Web Page');
               }
               if ($url =~ m{^/uploaded/$coursedom/$coursenum/((?:docs|supplemental)/(?:default|\d+))/new\.html$}) {
                   my $filepath = $1;
                   my $fname = $name;
                   if ($fname =~ /^\W+$/) {
                       $fname = 'web';
                   } else {
                       $fname =~ s/\W/_/g;
                   }
                   if (length($fname > 15)) {
                       $fname = substr($fname,0,14);
                   }
                   my $initialtext = &mt('Replace with your own content.');
                   my $newhtml = <<END;
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
   <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <title>$name</title>
   </head>
   <body bgcolor="#ffffff">
   $initialtext
   </body>
   </html>
   END
                   $env{'form.output'}=$newhtml;
                   my $result = 
                       &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
                                                             'output',
                                                             "$filepath/$residx/$fname.html");
                   if ($result =~ m{^/uploaded/}) {
                       $url = $result;
                       if ($filepath =~ /^supplemental/) {
                           $name = time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                                   $env{'user.domain'}.'___&&&___'.$name;
                       }
                   } else {
                       return (&mt('Failed to save new web page.'),1);
                   }
               }
     $LONCAPA::map::resources[$residx] =      $LONCAPA::map::resources[$residx] =
  join(':', ($name, $url, $ext, 'normal', 'res'));   join(':', ($name, $url, $ext, 'normal', 'res'));
  }   }
     }      }
     return &storemap($coursenum, $coursedom, $folder.'.'.$container,1);      if ($importuploaded) {
           my %import_errors;
           my %updated = (
                             removefrommap => \%removefrommap,
                             removeparam   => \%removeparam,
                         );
           my ($result,$msgsarray,$lockerror) = 
               &apply_fixups($folder,1,$coursedom,$coursenum,\%import_errors,\%updated);
           if (keys(%import_errors) > 0) {
               $fixuperrors =
                   '<p span class="LC_warning">'."\n".
                   &mt('The following files are either dependencies of a web page or references within a folder and/or composite page for which errors occurred during import:')."\n".
                   '<ul>'."\n";
               foreach my $key (sort(keys(%import_errors))) {
                   $fixuperrors .= '<li>'.$key.'</li>'."\n";
               }
               $fixuperrors .= '</ul></p>'."\n";
           }
           if (ref($msgsarray) eq 'ARRAY') {
               if (@{$msgsarray} > 0) {
                   $fixuperrors .= '<p class="LC_info">'.
                                   join('<br />',@{$msgsarray}).
                                   '</p>';
               }
           }
           if ($lockerror) {
               $fixuperrors .= '<p class="LC_error">'.
                               $lockerror.
                               '</p>';
           }
       }
       my ($errtext,$fatal) =
           &storemap($coursenum, $coursedom, $folder.'.'.$container,1);
       return ($errtext,$fatal,$fixuperrors);
 }  }
   
 sub log_docs {  sub log_docs {
Line 696  sub print_paste_buffer { Line 790  sub print_paste_buffer {
         $buffer = $type.': '.          $buffer = $type.': '.
                   &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.                    &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.
                   &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')';                    &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')';
     }  else {      } else {
         my $icon = &Apache::loncommon::icon($extension);          my $icon = &Apache::loncommon::icon($extension);
         if ($extension eq 'sequence' &&          if ($extension eq 'sequence' &&
             $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {              $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {
Line 708  sub print_paste_buffer { Line 802  sub print_paste_buffer {
     }      }
     if ($canpaste) {      if ($canpaste) {
         $r->print('<form name="pasteform" action="/adm/coursedocs" method="post">'.$buffer);          $r->print('<form name="pasteform" action="/adm/coursedocs" method="post">'.$buffer);
         if (($is_uploaded_map) && (!$areachange)) {          if ((!$areachange) && (!$othercourse) &&
             if ((!$othercourse) && ($env{'docs.markedcopy_cmd'} eq 'cut')) {              ($env{'docs.markedcopy_cmd'} eq 'cut')) {
               if (($is_uploaded_map) || 
                   ($env{'docs.markedcopy_url'} =~ /(bulletinboard|smppg)$/) ||
                   ($env{'docs.markedcopy_url'} =~ m{^/uploaded/$coursedom/$coursenum/(?:docs|supplemental)/(.+)$})) {
                   my ($copytext,$movetext);
                   if ($is_uploaded_map) {
                       $copytext = &mt('Copy to new folder');
                       $movetext = &mt('Move old folder');
                   } elsif ($env{'docs.markedcopy_url'} =~ /bulletinboard$/) {
                       $copytext = &mt('Copy to new bulletin board (not posts)');
                       $movetext = &mt('Move old bulletin board (not posts)');
                   } elsif ($env{'docs.markedcopy_url'} =~ /smppg$/) {
                       $copytext = &mt('Copy to new simple page');
                       $movetext = &mt('Move old simple page');
                   } else {
                       $copytext = &mt('Copy to new uploaded document');
                       $movetext = &mt('Move old uploaded document');
                   }
                 $r->print(('&nbsp;'x 4).'<span id="pasteoptionstext">'.                  $r->print(('&nbsp;'x 4).'<span id="pasteoptionstext">'.
                           '<a href="javascript:showPasteOptions();" class="LC_menubuttons_link">'.                            '<a href="javascript:showPasteOptions();" class="LC_menubuttons_link">'.
                           &mt('Show Paste Options').'</a></span><br />'.                            &mt('Show Paste Options').'</a></span><br />'.
                           '<div id="pasteoptions" class="LC_dccid">'.('&nbsp;'x 4).                            '<div id="pasteoptions" class="LC_dccid">'.('&nbsp;'x 4).
                           '<label>'.                            '<label>'.
                           '<input type="radio" name="docs.markedcopy_options" value="new" checked="checked" />'.                            '<input type="radio" name="docs.markedcopy_options" value="new" checked="checked" />'.
                           &mt('Copy to new folder').'</label>'.('&nbsp;' x2).                            $copytext.'</label>'.('&nbsp;' x2).
                           '<label>'.                               '<label>'.   
                           '<input type="radio" name="docs.markedcopy_options" value="move" />'.                            '<input type="radio" name="docs.markedcopy_options" value="move" />'.
                           &mt('Move old folder').'</label><br />');                            $movetext.'</label><br />');
                 if ($env{'docs.markedcopy_nested'}) {                  if (($is_uploaded_map) && ($env{'docs.markedcopy_nested'})) {
                     $r->print('<br />'.&mt('Folder to paste contains sub-folders').                      $r->print('<br />'.&mt('Folder to paste contains sub-folders').
                               '<br /><table border="0">');                                '<br /><table border="0">');
                     my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested'});                      my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested'});
Line 895  sub do_paste_from_buffer { Line 1006  sub do_paste_from_buffer {
         %dbcopies,%zombies,%params,%docmoves,%mapmoves,%newsubdir,%newurls);          %dbcopies,%zombies,%params,%docmoves,%mapmoves,%newsubdir,%newurls);
     $oldurl = $url;      $oldurl = $url;
     if ($is_map) {      if ($is_map) {
         if ($folder =~ /^default/) {  
             my $lastchange = &Apache::lonnet::get_coursechange($coursedom,$coursenum);  
             if ($lastchange > $env{'request.course.tied'}) {  
                 &reinit_role($coursedom,$coursenum,$env{"course.$env{'request.course.id'}.home"});   
             }  
         }  
 # If pasting a map, check if map contains other maps  # If pasting a map, check if map contains other maps
         my (%allmaps,%hierarchy,%titles);          my ($allmaps,%hierarchy,%titles);
           $allmaps = {};
         if ($folder =~ /^default/) {          if ($folder =~ /^default/) {
             my $navmap = Apache::lonnavmaps::navmap->new();              $allmaps =
             if (defined($navmap)) {                  &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,
                 foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_map() },1,0,1)) {                                                       $env{"course.$env{'request.course.id'}.home"},
                     $allmaps{$res->src()} = 1;                                                       $env{'request.course.id'});
                 }  
             }  
         }          }
         &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/}) {
             my $newurl;              my $newurl;
             unless ($env{'form.docs.markedcopy_options'} eq 'move') {              unless ($env{'form.docs.markedcopy_options'} eq 'move') {
                 ($newurl,my $error) =                   ($newurl,my $error) = 
                     &get_newmap_url($url,$folder,$prefixchg,$coursedom,$coursenum,                      &get_newmap_url($url,$folder,$prefixchg,$coursedom,$coursenum,
                                     $srcdom,$srcnum,\$title,\%allmaps,\%newurls);                                      $srcdom,$srcnum,\$title,$allmaps,\%newurls);
                 if ($error) {                  if ($error) {
                     return ($error);                      return ($error);
                 }                  }
Line 933  sub do_paste_from_buffer { Line 1037  sub do_paste_from_buffer {
             }              }
             if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) ||              if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) ||
                 (($newurl ne '') && ($newurl ne $url))) {                  (($newurl ne '') && ($newurl ne $url))) {
                 unless (&url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,                  unless (&url_paste_fixups($url,$folder,$prefixchg,$coursedom,
                                           \%allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies,                                            $coursenum,$srcdom,$srcnum,$allmaps,
                                             \%rewrites,\%retitles,\%copies,\%dbcopies,
                                           \%zombies,\%params,\%mapmoves,\%mapchanges,\%tomove,                                            \%zombies,\%params,\%mapmoves,\%mapchanges,\%tomove,
                                           \%newsubdir,\%newurls)) {                                            \%newsubdir,\%newurls)) {
                     $mapmoves{$url} = 1;                      $mapmoves{$url} = 1;
                 }                  }
                 $url = $newurl;                  $url = $newurl;
             } elsif ($env{'docs.markedcopy_nested'}) {              } elsif ($env{'docs.markedcopy_nested'}) {
                 &url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,\%allmaps,\%rewrites,                  &url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,
                                     $srcdom,$srcnum,$allmaps,\%rewrites,
                                   \%retitles,\%copies,\%dbcopies,\%zombies,\%params,\%mapmoves,                                    \%retitles,\%copies,\%dbcopies,\%zombies,\%params,\%mapmoves,
                                   \%mapchanges,\%tomove,\%newsubdir,\%newurls);                                     \%mapchanges,\%tomove,\%newsubdir,\%newurls); 
             }              }
Line 950  sub do_paste_from_buffer { Line 1056  sub do_paste_from_buffer {
             &Apache::lonnet::delenv('docs.markedcopy');              &Apache::lonnet::delenv('docs.markedcopy');
 # if pasting published map (main content are only) check map is not already in course  # if pasting published map (main content are only) check map is not already in course
             if ($folder =~ /^default/) {              if ($folder =~ /^default/) {
                 if ($allmaps{$url}) {                  if ((ref($allmaps) eq 'HASH') && ($allmaps->{$url})) {
                     return (&mt('Paste failed: only one instance of a particular published sequence or page is allowed within each course.'));                      return (&mt('Paste failed: only one instance of a particular published sequence or page is allowed within each course.'));
                 }                  }
             }              }
         }          }
     }      }
     if ($url=~ m{/smppg$}) {      my $lockerrors;
  my $db_name = &Apache::lonsimplepage::get_db_name($url);      if ($url=~ m{/(bulletinboard|smppg)$}) {
  if ($db_name =~ /^smppage_/) {          my $prefix = $1;
     #simple pages, need to copy the db contents to a new one.          #need to copy the db contents to a new one, unless this is a move.
     my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);          my %info = (
     my $now = time();                       src  => $url,
     $db_name =~ s{_\d*$ }{_$now}x;                       cdom => $coursedom,
     my $dbresult=&Apache::lonnet::put($db_name,\%contents,                       cnum => $coursenum,
     $coursedom,$coursenum);          );
             if ($dbresult eq 'ok') {          my (%lockerr,$msg);
                 $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;          unless ($env{'form.docs.markedcopy_options'} eq 'move') {
               my ($newurl,$result,$errtext) =
                   &dbcopy(\%info,$coursedom,$coursenum,\%lockerr);
               if ($result eq 'ok') {
                   $url = $newurl;
                 $title=&mt('Copy of').' '.$title;                  $title=&mt('Copy of').' '.$title;
             } else {              } else {
                 return (&mt('Paste failed: An error occurred when copying the simple page.'));                  if ($prefix eq 'smppg') {
                       $msg = &mt('Paste failed: An error occurred when copying the simple page.').' '.$errtext;
                   } elsif ($prefix eq 'bulletinboard') {
                       $msg = &mt('Paste failed: An error occurred when copying the bulletin board.').' '.$errtext;
                   }
                   return ($result,undef,[$msg],$lockerr{$prefix});
       }
               if ($lockerr{$prefix}) {
                   $lockerrors = $lockerr{$prefix};  
             }              }
  }          }
     }      }
     $title = &LONCAPA::map::qtunescape($title);      $title = &LONCAPA::map::qtunescape($title);
     my $ext='false';      my $ext='false';
Line 998  sub do_paste_from_buffer { Line 1116  sub do_paste_from_buffer {
                 if ($newdocsdir eq '') {                  if ($newdocsdir eq '') {
                     $newdocsdir = 'default';                      $newdocsdir = 'default';
                 }                  }
                 if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {                  if (($prefixchg) || 
                       ($srcdom ne $coursedom) || ($srcnum ne $coursenum) ||
                       ($env{'form.docs.markedcopy_options'} ne 'move')) {
                     my $newpath = "$newprefix/$newdocsdir/$newidx/$rem";                      my $newpath = "$newprefix/$newdocsdir/$newidx/$rem";
                     $url =                      $url =
                         &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,                          &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,
Line 1016  sub do_paste_from_buffer { Line 1136  sub do_paste_from_buffer {
     }      }
 # Apply any changes to maps, or copy dependencies for uploaded HTML pages   # Apply any changes to maps, or copy dependencies for uploaded HTML pages 
     my ($result,$save_err);      my ($result,$save_err);
     $result =      my %updated = (
         &apply_fixups($folder,$is_map,$prefixchg,$coursedom,$coursenum,$oldurl,                      rewrites      => \%rewrites,
                       $url,\%removefrommap,\%removeparam,\%rewrites,\%retitles,                      zombies       => \%zombies,
                       \%copies,\%dbcopies,\%zombies,\%params,\%docmoves,                      removefrommap => \%removefrommap,
                       \%mapmoves,\%newsubdir,$errors,\%before,\%after);                      removeparam   => \%removeparam,
                       dbcopies      => \%dbcopies,
                       retitles      => \%retitles,
                     );
       my %info = (
                      newsubdir => \%newsubdir,
                      params    => \%params,
                      before    => \%before,
                      after     => \%after,
                  );
       my %moves = (
                      copies   => \%copies,
                      docmoves => \%docmoves,
                      mapmoves => \%mapmoves,
                   );
       ($result,my $msgsarray,my $lockerror) =
           &apply_fixups($folder,$is_map,$coursedom,$coursenum,$errors,
                         \%updated,\%info,\%moves,$prefixchg,$oldurl,$url,'paste');
       $lockerrors .= $lockerror;
     if ($result eq 'ok') {      if ($result eq 'ok') {
         if ($is_map) {           if ($is_map) { 
             my ($errtext,$fatal) = &mapread($coursenum,$coursedom,              my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
                                             $folder.'.'.$container);                                              $folder.'.'.$container);
             return $errtext if ($fatal);              return ($errtext,$save_err,$msgsarray,$lockerrors) if ($fatal);
   
             if ($#LONCAPA::map::order<1) {              if ($#LONCAPA::map::order<1) {
                 my $idx=&LONCAPA::map::getresidx();                  my $idx=&LONCAPA::map::getresidx();
Line 1056  sub do_paste_from_buffer { Line 1194  sub do_paste_from_buffer {
             $save_err = $errtext;              $save_err = $errtext;
         }          }
     }      }
      
     if ($env{'form.docs.markedcopy_options'} eq 'move') {      if ($env{'form.docs.markedcopy_options'} eq 'move') {
         &Apache::lonnet::delenv('docs.markedcopy');          &Apache::lonnet::delenv('docs.markedcopy');
         &Apache::lonnet::delenv('docs.markedcopy_nested');          &Apache::lonnet::delenv('docs.markedcopy_nested');
         &Apache::lonnet::delenv('docs.markedcopy_nestednames');          &Apache::lonnet::delenv('docs.markedcopy_nestednames');
     }      }
     return ($result,$save_err);      return ($result,$save_err,$msgsarray,$lockerrors);
 }  }
   
 sub get_newmap_url {  sub get_newmap_url {
Line 1126  sub get_newmap_url { Line 1264  sub get_newmap_url {
 }  }
   
 sub dbcopy {  sub dbcopy {
     my ($url,$coursedom,$coursenum) = @_;      my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_;
     if ($url=~ m{/smppg$}) {      my ($url,$result,$errtext);
         my $db_name = &Apache::lonsimplepage::get_db_name($url);      my $url = $dbref->{'src'};
         if ($db_name =~ /^smppage_/) {      if (ref($dbref) eq 'HASH') {
             #simple pages, need to copy the db contents to a new one.          if ($url =~ m{/(smppg|bulletinboard)$}) {
             my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);              my $prefix = $1;
             my $now = time();              if (($dbref->{'cdom'} =~ /^$match_domain$/) && 
             $db_name =~ s{_\d*$ }{_$now}x;                  ($dbref->{'cnum'} =~ /^$match_courseid$/)) {
             my $result=&Apache::lonnet::put($db_name,\%contents,                  my $db_name;
                                             $coursedom,$coursenum);                  my $marker = (split(m{/},$url))[4];
             $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;                  $marker=~s/\D//g;
                   if ($dbref->{'src'} =~ m{/smppg$}) {
                       $db_name =
                           &Apache::lonsimplepage::get_db_name($url,$marker,
                                                               $dbref->{'cdom'},
                                                               $dbref->{'cnum'});
                   } else {
                       $db_name = 'bulletinpage_'.$marker;
                   }
                   my ($suffix,$freedlock,$error) =
                       &Apache::lonnet::get_timebased_id($prefix,'num','templated',
                                                         $coursedom,$coursenum,
                                                         'concat');
                   if (!$suffix) {
                       if ($prefix eq 'smppg') {
                           $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a simple page [_1].',$url);
                       } else {
                           $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a bulletin board [_1].',$url);
                       }
                       if ($error) {
                           $errtext .= '<br />'.$error;
                       }
                   } else {
                       #need to copy the db contents to a new one.
                       my %contents=&Apache::lonnet::dump($db_name,
                                                          $dbref->{'cdom'},
                                                          $dbref->{'cnum'});
                       if (exists($contents{'uploaded.photourl'})) {
                           my $photo = $contents{'uploaded.photourl'};
                           my ($subdir,$fname) =
                               ($photo =~ m{^/uploaded/$match_domain/$match_courseid/+(bulletin|simplepage)/(?:|\d+/)([^/]+)$});
                           my $newphoto; 
                           if ($fname ne '') {
                               my $content = &Apache::lonnet::getfile($photo);
                               unless ($content eq '-1') {
                                   $env{'form.'.$suffix.'.photourl'} = $content;
                                   $newphoto = 
                                       &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.photourl',"$subdir/$suffix/$fname");
                                   delete($env{'form.'.$suffix.'.photourl'});
                               }
                           }
                           if ($newphoto =~ m{^/uploaded/}) {
                               $contents{'uploaded.photourl'} = $newphoto;
                           }
                       }
                       $db_name =~ s{_\d*$ }{_$suffix}x;
                       $result=&Apache::lonnet::put($db_name,\%contents,
                                                    $coursedom,$coursenum);
                       if ($result eq 'ok') {
                           $url =~ s{/(\d*)/(smppg|bulletinboard)$}{/$suffix/$2}x;
                       }
                   }
                   if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {
                       $lockerrorsref->{$prefix} = 
                           '<div class="LC_error">'.
                           &mt('There was a problem removing a lockfile.');
                       if ($prefix eq 'smppg') {
                           $lockerrorsref->{$prefix} .= 
                               &mt('This will prevent creation of additional simple pages in this course.');
                       } else {
                           $lockerrorsref->{$prefix} .= &mt('This will prevent creation of additional bulletin boards in this course.');
                       }
                       $lockerrorsref->{$prefix} .= &mt('Please contact the domain coordinator for your LON-CAPA domain.').'</div>';
                   }
               }
           } elsif ($url =~ m{/syllabus$}) {
               if (($dbref->{'cdom'} =~ /^$match_domain$/) &&
                   ($dbref->{'cnum'} =~ /^$match_courseid$/)) {
                   if (($dbref->{'cdom'} ne $coursedom) ||
                       ($dbref->{'cnum'} ne $coursenum)) {
                       my %contents=&Apache::lonnet::dump('syllabus',
                                                          $dbref->{'cdom'},
                                                          $dbref->{'cnum'});
                       $result=&Apache::lonnet::put('syllabus',\%contents,
                                                    $coursedom,$coursenum);
                   }
               }
         }          }
     }      }
     return $url;      return ($url,$result,$errtext);
 }  }
   
 sub uniqueness_check {  sub uniqueness_check {
Line 1180  sub contained_map_check { Line 1394  sub contained_map_check {
                         $titles->{$url}{$token->[2]->{'id'}} = $token->[2]->{'title'};                          $titles->{$url}{$token->[2]->{'id'}} = $token->[2]->{'title'};
                     } else {                      } else {
                         if ($allmaps->{$ressrc}) {                          if ($allmaps->{$ressrc}) {
                             $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;                               $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                         } elsif (ref($addedmaps->{$ressrc}) eq 'ARRAY') {                          } elsif (ref($addedmaps->{$ressrc}) eq 'ARRAY') {
                             $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;                              $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                         } else {                          } else {
Line 1204  sub contained_map_check { Line 1418  sub contained_map_check {
     return;      return;
 }  }
   
 sub reinit_role {  
     my ($cdom,$cnum,$chome) = @_;  
     my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum");  
     unless ($ferr) {  
         &Apache::loncommon::update_content_constraints($cdom,$cnum,$chome,$cdom.'_'.$cnum);  
     }  
     return;  
 }  
   
 sub url_paste_fixups {  sub url_paste_fixups {
     my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$allmaps,$rewrites,$retitles,$copies,      my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$fromcdom,$fromcnum,$allmaps,
         $dbcopies,$zombies,$params,$mapmoves,$mapchanges,$tomove,$newsubdir,$newurls) = @_;          $rewrites,$retitles,$copies,$dbcopies,$zombies,$params,$mapmoves,
           $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 1242  sub url_paste_fixups { Line 1448  sub url_paste_fixups {
             my $title = $token->[2]->{'title'};              my $title = $token->[2]->{'title'};
             if ($checktitle) {              if ($checktitle) {
                 if ($title =~ m{\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {                  if ($title =~ m{\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {
                     $retitles->{$oldurl}{$ressrc} = $id;                      $retitles->{$oldurl}{$id} = $ressrc;
                 }                  }
             }              }
             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}{$ressrc} = $id;                  $zombies->{$oldurl}{$id} = $ressrc;
                 $changed = 1;                  $changed = 1;
             } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {
                 my $srcdom = $1;                  my $srcdom = $1;
Line 1260  sub url_paste_fixups { Line 1466  sub url_paste_fixups {
                     my $prefix = $1;                      my $prefix = $1;
                     $mapname = $prefix.$2;                      $mapname = $prefix.$2;
                     if ($tomove->{$mapname}) {                      if ($tomove->{$mapname}) {
                         &url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps,                          &url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,
                                           $rewrites,$retitles,$copies,$dbcopies,$zombies,                                            $srcdom,$srcnum,$allmaps,$rewrites,
                                           $params,$mapmoves,$mapchanges,$tomove,$newsubdir,                                            $retitles,$copies,$dbcopies,$zombies,
                                           $newurls);                                            $params,$mapmoves,$mapchanges,$tomove,
                                             $newsubdir,$newurls);
                         next;                          next;
                     } else {                      } else {
                         ($newurl,my $error) =                          ($newurl,my $error) =
Line 1281  sub url_paste_fixups { Line 1488  sub url_paste_fixups {
                     ($mapchanges->{$oldurl}) || (($newurl ne '') && ($newurl ne $oldurl))) {                      ($mapchanges->{$oldurl}) || (($newurl ne '') && ($newurl ne $oldurl))) {
                                         
                     if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) {                      if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) {
                         $rewrites->{$oldurl}{$ressrc} = $id;                          $rewrites->{$oldurl}{$id} = $ressrc;
                         $mapchanges->{$ressrc} = 1;                          $mapchanges->{$ressrc} = 1;
                         unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps,                          unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,
                                                   $rewrites,$retitles,$copies,$dbcopies,$zombies,                                                    $cnum,$srcdom,$srcnum,$allmaps,
                                                   $params,$mapmoves,$mapchanges,$tomove,$newsubdir,                                                    $rewrites,$retitles,$copies,$dbcopies,
                                                   $newurls)) {                                                    $zombies,$params,$mapmoves,$mapchanges,
                                                     $tomove,$newsubdir,$newurls)) {
                             $mapmoves->{$ressrc} = 1;                              $mapmoves->{$ressrc} = 1;
                         }                          }
                         $changed = 1;                          $changed = 1;
                     } else {                      } else {
                         $rewrites->{$oldurl}{$ressrc} = $id;                          $rewrites->{$oldurl}{$id} = $ressrc;
                         $copies->{$oldurl}{$ressrc} = $id;                          $copies->{$oldurl}{$ressrc} = $id;
                         $changed = 1;                          $changed = 1;
                     }                      }
                 }                  }
             } elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/.+$}) {
                 next if ($skip);                    next if ($skip);
                 my $srcdom = $1;                  my $srcdom = $1;
                 my $srcnum = $2;                  my $srcnum = $2;
                 if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {                  if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {
                     $rewrites->{$oldurl}{$ressrc} = $id;                      $rewrites->{$oldurl}{$id} = $ressrc;
                     $dbcopies->{$oldurl}{$ressrc} = $id;                      $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;
                       $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom;
                       $dbcopies->{$oldurl}{$id}{'cnum'} = $srcnum;
                       $changed = 1;
                   }
               } elsif ($ressrc =~ m{^/adm/$match_domain/$match_username/\d+/(smppg|bulletinboard)$}) {
                   if (($fromcdom ne $cdom) || ($fromcnum ne $cnum) ||
                       ($env{'form.docs.markedcopy_options'} ne 'move')) {
                       $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;
                       $dbcopies->{$oldurl}{$id}{'cdom'} = $fromcdom;
                       $dbcopies->{$oldurl}{$id}{'cnum'} = $fromcnum;
                     $changed = 1;                      $changed = 1;
                 }                  }
             } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) {
Line 1310  sub url_paste_fixups { Line 1528  sub url_paste_fixups {
                 my $srcdom = $1;                  my $srcdom = $1;
                 my $srcnum = $2;                  my $srcnum = $2;
                 if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {                  if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {
                     $rewrites->{$oldurl}{$ressrc} = $id;                      $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;
                     $dbcopies->{$oldurl}{$ressrc} = $id;                      $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom;
                       $dbcopies->{$oldurl}{$id}{'cnum'} = $srcnum;
                     $changed = 1;                      $changed = 1;
                 }                  }
             }              }
Line 1331  sub url_paste_fixups { Line 1550  sub url_paste_fixups {
 }  }
   
 sub apply_fixups {  sub apply_fixups {
     my ($folder,$is_map,$prefixchg,$cdom,$cnum,$oldurl,$url,$removefrommap,      my ($folder,$is_map,$cdom,$cnum,$errors,$updated,$info,$moves,$prefixchg,
         $removeparam,$rewrites,$retitles,$copies,$dbcopies,$zombies,$params,          $oldurl,$url,$caller) = @_;
         $docmoves,$mapmoves,$newsubdir,$errors,$before,$after) = @_;      my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,
     foreach my $key (keys(%{$copies}),keys(%{$docmoves})) {          %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs,
           %lockerrors,$lockmsg);
       if (ref($updated) eq 'HASH') {
           if (ref($updated->{'rewrites'}) eq 'HASH') {
               %rewrites = %{$updated->{'rewrites'}};
           }
           if (ref($updated->{'zombies'}) eq 'HASH') {
               %zombies = %{$updated->{'zombies'}};
           }
           if (ref($updated->{'removefrommap'}) eq 'HASH') {
               %removefrommap = %{$updated->{'removefrommap'}};
           }
           if (ref($updated->{'removeparam'}) eq 'HASH') {
               %removeparam = %{$updated->{'removeparam'}};
           }
           if (ref($updated->{'dbcopies'}) eq 'HASH') {
               %dbcopies = %{$updated->{'dbcopies'}};
           }
           if (ref($updated->{'retitles'}) eq 'HASH') {
               %retitles = %{$updated->{'retitles'}};
           }
       }
       if (ref($info) eq 'HASH') {
           if (ref($info->{'newsubdir'}) eq 'HASH') {
               %newsubdir = %{$info->{'newsubdir'}};
           }
           if (ref($info->{'params'}) eq 'HASH') {
               %params = %{$info->{'params'}};
           }
           if (ref($info->{'before'}) eq 'HASH') {
               %before = %{$info->{'before'}};
           }
           if (ref($info->{'after'}) eq 'HASH') {
               %after = %{$info->{'after'}};
           }
       }
       if (ref($moves) eq 'HASH') {
           if (ref($moves->{'copies'}) eq 'HASH') {
               %copies = %{$moves->{'copies'}};
           }
           if (ref($moves->{'docmoves'}) eq 'HASH') {
               %docmoves = %{$moves->{'docmoves'}};
           }
           if (ref($moves->{'mapmoves'}) eq 'HASH') {
               %mapmoves = %{$moves->{'mapmoves'}};
           }
       }
       foreach my $key (keys(%copies),keys(%docmoves)) {
         my @allcopies;          my @allcopies;
         if (ref($copies->{$key}) eq 'HASH') {          if (exists($copies{$key})) {
             my %added;              if (ref($copies{$key}) eq 'HASH') {
             foreach my $innerkey (keys(%{$copies->{$key}})) {                  my %added;
                 if (($innerkey ne '') && (!$added{$innerkey})) {                  foreach my $innerkey (keys(%{$copies{$key}})) {
                     push(@allcopies,$innerkey);                      if (($innerkey ne '') && (!$added{$innerkey})) {
                     $added{$innerkey} = 1;                          push(@allcopies,$innerkey);
                           $added{$innerkey} = 1;
                       }
                 }                  }
                   undef(%added);
             }              }
             undef(%added);  
         }          }
         if ($key eq $oldurl) {          if ($key eq $oldurl) {
             if ((exists($docmoves->{$key}))) {              if ((exists($docmoves{$key}))) {
                 unless (grep(/^\Q$oldurl\E/,@allcopies)) {                  unless (grep(/^\Q$oldurl\E$/,@allcopies)) {
                     push(@allcopies,$oldurl);                      push(@allcopies,$oldurl);
                 }                  }
             }              }
Line 1361  sub apply_fixups { Line 1629  sub apply_fixups {
                     my $content = &Apache::lonnet::getfile($item);                      my $content = &Apache::lonnet::getfile($item);
                     unless ($content eq '-1') {                      unless ($content eq '-1') {
                         my $storefn;                          my $storefn;
                         if (($key eq $oldurl) && (ref($docmoves) eq 'HASH') && (exists($docmoves->{$key}))) {                          if (($key eq $oldurl) && (exists($docmoves{$key}))) {
                             $storefn = $docmoves->{$key};                              $storefn = $docmoves{$key};
                         } else {                          } else {
                             $storefn = $relpath;                              $storefn = $relpath;
                             $storefn =~s{^/uploaded/$match_domain/$match_courseid/}{};                              $storefn =~s{^/uploaded/$match_domain/$match_courseid/}{};
                             if ($prefixchg) {                              if ($prefixchg && $before{'doc'} && $after{'doc'}) {
                                 $storefn =~ s/^\Q$before->{'doc'}\E/$after->{'doc'}/;                                  $storefn =~ s/^\Q$before{'doc'}\E/$after{'doc'}/;
                             }                              }
                             if ($newsubdir->{$key}) {                              if ($newsubdir{$key}) {
                                 $storefn =~ s#^(docs|supplemental)/\Q$oldsubdir\E/#$1/$newsubdir->{$key}#;                                  $storefn =~ s#^(docs|supplemental)/\Q$oldsubdir\E/#$1/$newsubdir{$key}/#;
                             }                              }
                         }                          }
                         &copy_dependencies($item,$storefn,$relpath,$errors,\$content);                          &copy_dependencies($item,$storefn,$relpath,$errors,\$content);
Line 1378  sub apply_fixups { Line 1646  sub apply_fixups {
                             &Apache::lonclonecourse::writefile($env{'request.course.id'},                              &Apache::lonclonecourse::writefile($env{'request.course.id'},
                                                                $storefn.$fname,$content);                                                                 $storefn.$fname,$content);
                         if ($copyurl eq '/adm/notfound.html') {                          if ($copyurl eq '/adm/notfound.html') {
                             if ((ref($docmoves) eq 'HASH') && (exists($docmoves->{$oldurl}))) {                              if (exists($docmoves{$oldurl})) {
                                 return &mt('Paste failed: an error occurred copying the file.');                                  return &mt('Paste failed: an error occurred copying the file.');
                             } elsif (ref($errors) eq 'HASH') {                              } elsif (ref($errors) eq 'HASH') {
                                 $errors->{$item} = 1;                                  $errors->{$item} = 1;
Line 1389  sub apply_fixups { Line 1657  sub apply_fixups {
             }              }
         }          }
     }      }
     foreach my $key (keys(%{$mapmoves})) {      foreach my $key (keys(%mapmoves)) {
         my $storefn=$key;          my $storefn=$key;
         $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{};          $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{};
         if ($prefixchg) {          if ($prefixchg && $before{'map'} && $after{'map'}) {
             $storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/;              $storefn =~ s/^\Q$before{'map'}\E/$after{'map'}/;
         }          }
         if ($newsubdir->{$key}) {          if ($newsubdir{$key}) {
             $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir->{$key}/;              $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;
         }          }
         my $mapcontent = &Apache::lonnet::getfile($key);          my $mapcontent = &Apache::lonnet::getfile($key);
         if ($mapcontent eq '-1') {          if ($mapcontent eq '-1') {
Line 1416  sub apply_fixups { Line 1684  sub apply_fixups {
     }      }
     my %updates;      my %updates;
     if ($is_map) {      if ($is_map) {
         foreach my $key (keys(%{$rewrites})) {          if (ref($updated) eq 'HASH') {
             $updates{$key} = 1;              foreach my $type (keys(%{$updated})) {
         }                  if (ref($updated->{$type}) eq 'HASH') {
         foreach my $key (keys(%{$zombies})) {                      foreach my $key (keys(%{$updated->{$type}})) {
             $updates{$key} = 1;                          $updates{$key} = 1;
         }                      }
         foreach my $key (keys(%{$removefrommap})) {                  }
             $updates{$key} = 1;              }
         }  
         foreach my $key (keys(%{$removeparam})) {  
             $updates{$key} = 1;  
         }  
         foreach my $key (keys(%{$dbcopies})) {  
             $updates{$key} = 1;  
         }  
         foreach my $key (keys(%{$retitles})) {  
             $updates{$key} = 1;  
         }          }
         foreach my $key (keys(%updates)) {          foreach my $key (keys(%updates)) {
             my (%torewrite,%toretitle,%toremove,%remparam,%currparam,%zombie,%newdb);              my (%torewrite,%toretitle,%toremove,%remparam,%currparam,%zombie,%newdb);
             if (ref($rewrites->{$key}) eq 'HASH') {              if (ref($rewrites{$key}) eq 'HASH') {
                 %torewrite = %{$rewrites->{$key}};                  %torewrite = %{$rewrites{$key}};
             }  
             if (ref($retitles->{$key}) eq 'HASH') {  
                 %toretitle = %{$retitles->{$key}};  
             }  
             if (ref($removefrommap->{$key}) eq 'HASH') {  
                 %toremove = %{$removefrommap->{$key}};  
             }              }
             if (ref($removeparam->{$key}) eq 'HASH') {              if (ref($retitles{$key}) eq 'HASH') {
                 %remparam = %{$removeparam->{$key}};                  %toretitle = %{$retitles{$key}};
             }              }
             if (ref($zombies->{$key}) eq 'HASH') {              if (ref($removefrommap{$key}) eq 'HASH') {
                 %zombie = %{$zombies->{$key}};                  %toremove = %{$removefrommap{$key}};
             }              }
             if (ref($dbcopies->{$key}) eq 'HASH') {              if (ref($removeparam{$key}) eq 'HASH') {
                 foreach my $item (keys(%{$dbcopies->{$key}})) {                  %remparam = %{$removeparam{$key}};
                     $newdb{$item} = &dbcopy($item);              }
               if (ref($zombies{$key}) eq 'HASH') {
                   %zombie = %{$zombies{$key}};
               }
               if (ref($dbcopies{$key}) eq 'HASH') {
                   foreach my $idx (keys(%{$dbcopies{$key}})) {
                       if (ref($dbcopies{$key}{$idx}) eq 'HASH') {
                           my ($newurl,$result,$errtext) =
                               &dbcopy($dbcopies{$key}{$idx},$cdom,$cnum,\%lockerrors);
                           if ($result eq 'ok') {
                               $newdb{$idx} = $newurl;
                           } elsif (ref($errors) eq 'HASH') {
                               $errors->{$key} = 1;
                           }
                           push(@msgs,$errtext);
                       }
                 }                  }
             }              }
             if (ref($params->{$key}) eq 'HASH') {              if (ref($params{$key}) eq 'HASH') {
                 %currparam = %{$params->{$key}};                  %currparam = %{$params{$key}};
             }              }
             my ($errtext,$fatal) = &LONCAPA::map::mapread($key);              my ($errtext,$fatal) = &LONCAPA::map::mapread($key);
             if ($fatal) {              if ($fatal) {
                 return $errtext;                  return ($errtext);
             }              }
             for (my $i=0; $i<@LONCAPA::map::zombies; $i++) {              for (my $i=0; $i<@LONCAPA::map::zombies; $i++) {
                 if (defined($LONCAPA::map::zombies[$i])) {                  if (defined($LONCAPA::map::zombies[$i])) {
                     my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::zombies[$i]);                      my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::zombies[$i]);
                     if ($zombie{$src} eq $i) {                      if ($zombie{$i} eq $src) {
                         undef($LONCAPA::map::zombies[$i]);                          undef($LONCAPA::map::zombies[$i]);
                     }                      }
                 }                  }
             }              }
             for (my $i=0; $i<@LONCAPA::map::resources; $i++) {              for (my $i=0; $i<@LONCAPA::map::order; $i++) {
                 if (defined($LONCAPA::map::resources[$i])) {                  my $idx = $LONCAPA::map::order[$i];
                   if (defined($LONCAPA::map::resources[$idx])) {
                     my $changed;                      my $changed;
                     my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$i]);                      my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$idx]);
                     if ($toremove{$src} eq $i) {                      if ((exists($toremove{$idx})) && ($toremove{$idx} eq $src)) {
                         splice(@LONCAPA::map::order,$i,1);                          splice(@LONCAPA::map::order,$i,1);
                         if (ref($currparam{$i}) eq 'ARRAY') {                          if (ref($currparam{$idx}) eq 'ARRAY') {
                             foreach my $name (@{$currparam{$i}}) {                              foreach my $name (@{$currparam{$idx}}) {
                                 &LONCAPA::map::delparameter($i,'parameter_'.$name);                                  &LONCAPA::map::delparameter($idx,'parameter_'.$name);
                             }                              }
                         }                          }
                         next;                          next;
                     }                      }
                     my $origsrc = $src;                      my $origsrc = $src;
                     if ((exists($toretitle{$src})) && ($toretitle{$src} eq $i)) {                      if ((exists($toretitle{$idx})) && ($toretitle{$idx} eq $src)) {
                         if ($title =~ m{^\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {                          if ($title =~ m{^\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {
                             $changed = 1;                              $changed = 1;
                         }                          }
                     }                      }
                     if ((exists($torewrite{$src})) && ($torewrite{$src} eq $i)) {                      if ((exists($torewrite{$idx})) && ($torewrite{$idx} eq $src)) {
                         $src =~ s{^/(uploaded|adm|public)/$match_domain/$match_courseid/}{/$1/$cdom/$cnum/};                          $src =~ s{^/(uploaded|adm|public)/$match_domain/$match_courseid/}{/$1/$cdom/$cnum/};
                         if ($origsrc =~ m{^/uploaded/}) {                          if ($origsrc =~ m{^/uploaded/}) {
                             if ($prefixchg) {                              if ($prefixchg && $before{'map'} && $after{'map'}) {
                                 if ($src =~ /\.(page|sequence)$/) {                                  if ($src =~ /\.(page|sequence)$/) {
                                     $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'map'}\E#$1$after->{'map'}#;                                      $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before{'map'}\E#$1$after{'map'}#;
                                 } else {                                  } else {
                                     $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'doc'}\E#$1$after->{'doc'}#;                                      $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before{'doc'}\E#$1$after{'doc'}#;
                                 }                                  }
                             }                              }
                             if ($newsubdir->{$origsrc}) {                              if ($origsrc =~ /\.(page|sequence)$/) {
                                 if ($src =~ /\.(page|sequence)$/) {                                  if ($newsubdir{$origsrc}) {
                                     $src =~ s#^(/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_)(\d+)#$1$newsubdir->{$origsrc}#;                                      $src =~ s#^(/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_)(\d+)#$1$newsubdir{$origsrc}#;
                                 } else {  
                                     $src =~ s#^(/uploaded/$match_domain/$match_courseid/\w+/)(\d+)#$1$newsubdir->{$origsrc}#;  
                                 }                                  }
                               } elsif ($newsubdir{$key}) {
                                   $src =~ s#^(/uploaded/$match_domain/$match_courseid/\w+/)(\d+)#$1$newsubdir{$key}#;
                             }                              }
                         }                          }
                         $changed = 1;                          $changed = 1;
                     } elsif ($newdb{$src} ne '') {                      } elsif ($newdb{$idx} ne '') {
                         $src = $newdb{$src};                          $src = $newdb{$idx};
                         $changed = 1;                          $changed = 1;
                     }                      }
                     if ($changed) {                      if ($changed) {
                         $LONCAPA::map::resources[$i] = join(':',($title,$src,$ext,$type));                          $LONCAPA::map::resources[$idx] = join(':',($title,$src,$ext,$type));
                     }                      }
                 }                  }
             }              }
Line 1525  sub apply_fixups { Line 1794  sub apply_fixups {
                     }                      }
                 }                  }
             }              }
               if (values(%lockerrors) > 0) {
                   $lockmsg = join('<br />',values(%lockerrors));
               }
             my $storefn;              my $storefn;
             if ($key eq $oldurl) {              if ($key eq $oldurl) {
                 $storefn = $url;                  $storefn = $url;
Line 1532  sub apply_fixups { Line 1804  sub apply_fixups {
             } else {              } else {
                 $storefn = $key;                  $storefn = $key;
                 $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{};                  $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{};
                 if ($prefixchg) {                  if ($prefixchg && $before{'map'} && $after{'map'}) {
                     $storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/;                      $storefn =~ s/^\Q$before{'map'}\E/$after{'map'}/;
                 }                  }
                 if ($newsubdir->{$key}) {                  if ($newsubdir{$key}) {
                     $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir->{$key}/;                      $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;
                 }                  }
             }              }
             my $report;              my $report;
Line 1546  sub apply_fixups { Line 1818  sub apply_fixups {
             (my $outtext,$errtext) =              (my $outtext,$errtext) =
                 &LONCAPA::map::storemap("/uploaded/$cdom/$cnum/$storefn",1,$report);                  &LONCAPA::map::storemap("/uploaded/$cdom/$cnum/$storefn",1,$report);
             if ($errtext) {              if ($errtext) {
                 return &mt('Paste failed: an error occurred saving the folder or page.');                  if ($caller eq 'paste') {
                       return (&mt('Paste failed: an error occurred saving the folder or page.'));
                   }
             }              }
         }          }
     }      }
     return 'ok';      return ('ok',\@msgs,$lockmsg);
 }  }
   
 sub copy_dependencies {  sub copy_dependencies {
Line 1738  sub editor { Line 2012  sub editor {
   
  if ($env{'form.pastemarked'}) {   if ($env{'form.pastemarked'}) {
             my %paste_errors;              my %paste_errors;
             my ($paste_res,$save_error) =              my ($paste_res,$save_error,$pastemsgarray,$lockerror) =
                 &do_paste_from_buffer($coursenum,$coursedom,$folder,$container,                  &do_paste_from_buffer($coursenum,$coursedom,$folder,$container,
                                       \%paste_errors);                                        \%paste_errors);
                   if (ref($pastemsgarray) eq 'ARRAY') {
                       if (@{$pastemsgarray} > 0) {
                             
                           $r->print('<p class="LC_info">'.
                                     join('<br />',@{$pastemsgarray}).
                                     '</p>');
                       }
                   }
                   if ($lockerror) {
                       $r->print('<p class="LC_error">'.
                                 $lockerror.
                                 '</p>');
                   }
                 if ($save_error ne '') {                  if ($save_error ne '') {
                     return $save_error;                       return $save_error; 
                 }                  }
Line 1774  sub editor { Line 2061  sub editor {
     foreach my $item (split(/\&/,$env{'form.importdetail'})) {      foreach my $item (split(/\&/,$env{'form.importdetail'})) {
  if (defined($item)) {   if (defined($item)) {
     my ($name,$url,$residx)=      my ($name,$url,$residx)=
  map {&unescape($_)} split(/\=/,$item);   map { &unescape($_); } split(/\=/,$item);
                     if ($url=~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) {                      if ($url =~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) {
                         my ($suffix,$errortxt,$locknotfreed) =                           my ($suffix,$errortxt,$locknotfreed) =
                             &newmap_suffix($1,$2,$coursedom,$coursenum);                              &new_timebased_suffix($coursedom,$coursenum,'map',$1,$2);
                         if ($locknotfreed) {                          if ($locknotfreed) {
                             $r->print($locknotfreed);                              $r->print($locknotfreed);
                         }                          }
Line 1786  sub editor { Line 2073  sub editor {
                         } else {                          } else {
                             return $errortxt;                              return $errortxt;
                         }                          }
                       } elsif ($url =~ m{^/adm/$match_domain/$match_username/new/(smppg|bulletinboard)$}) {
                           my $type = $1;
                           my ($suffix,$errortxt,$locknotfreed) =
                               &new_timebased_suffix($coursedom,$coursenum,$type);
                           if ($locknotfreed) {
                               $r->print($locknotfreed);
                           }
                           if ($suffix) {
                               $url =~ s{^(/adm/$match_domain/$match_username)/new}{$1/$suffix};
                           } else {
                               return $errortxt;
                           }
                       } elsif ($url =~ m{^/uploaded/$coursedom/$coursenum/(docs|supplemental)/(default|\d+)/new.html$}) {
                           if ($supplementalflag) {
                               next unless ($1 eq 'supplemental');
                               if ($folder eq 'supplemental') {
                                   next unless ($2 eq 'default');
                               } else {
                                   next unless ($folder eq 'supplemental_'.$2);
                               }
                           } else {
                               next unless ($1 eq 'docs');
                               if ($folder eq 'default') {
                                   next unless ($2 eq 'default');
                               } else {
                                   next unless ($folder eq 'default_'.$2);
                               }
                           }
                     }                      }
     push(@imports, [$name, $url, $residx]);      push(@imports, [$name, $url, $residx]);
  }   }
     }      }
     ($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder,              ($errtext,$fatal,my $fixuperrors) =
     $container,'londocs',@imports);                  &group_import($coursenum, $coursedom, $folder,$container,
                                 'londocs',@imports);
     return $errtext if ($fatal);      return $errtext if ($fatal);
               if ($fixuperrors) {
                   $r->print($fixuperrors);
               }
  }   }
 # Loading a complete map  # Loading a complete map
  if ($env{'form.loadmap'}) {   if ($env{'form.loadmap'}) {
Line 1955  sub process_file_upload { Line 2274  sub process_file_upload {
             $container='page';              $container='page';
         }          }
         ($errtext,$fatal)=          ($errtext,$fatal)=
               &mapread($coursenum,$coursedom,$folder.'.'.$container);              &mapread($coursenum,$coursedom,$folder.'.'.$container);
         if ($#LONCAPA::map::order<1) {          if ($#LONCAPA::map::order<1) {
             $LONCAPA::map::order[0]=1;              $LONCAPA::map::order[0]=1;
             $LONCAPA::map::resources[1]='';              $LONCAPA::map::resources[1]='';
         }          }
         if ($fatal) {  
             $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</div>';  
             return;  
         }  
         my $destination = 'docs/';          my $destination = 'docs/';
         if ($folder =~ /^supplemental/) {          if ($folder =~ /^supplemental/) {
             $destination = 'supplemental/';              $destination = 'supplemental/';
Line 1973  sub process_file_upload { Line 2288  sub process_file_upload {
         } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {          } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
             $destination .=  $2.'/';              $destination .=  $2.'/';
         }          }
           if ($fatal) {
               $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</div>';
               return;
           }
 # this is for a course, not a user, so set context to coursedoc.  # this is for a course, not a user, so set context to coursedoc.
         my $newidx=&LONCAPA::map::getresidx();          my $newidx=&LONCAPA::map::getresidx();
         $destination .= $newidx;          $destination .= $newidx;
Line 2113  sub entryline { Line 2432  sub entryline {
     my $line=&Apache::loncommon::start_data_table_row();      my $line=&Apache::loncommon::start_data_table_row();
     my ($form_start,$form_end,$form_common);      my ($form_start,$form_end,$form_common);
 # Edit commands  # Edit commands
     my ($type, $esc_path, $path, $symb);      my ($esc_path, $path, $symb);
     if ($container eq 'page') {  
         $type = 'page';  
     } else {  
         $type = 'folder';  
     }  
     if ($env{'form.folderpath'}) {      if ($env{'form.folderpath'}) {
  $esc_path=&escape($env{'form.folderpath'});   $esc_path=&escape($env{'form.folderpath'});
  $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');   $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
Line 2286  ENDREN Line 2600  ENDREN
    <form action="/adm/coursedocs" method="post">     <form action="/adm/coursedocs" method="post">
 ';  ';
         $form_common=(<<END);          $form_common=(<<END);
    <input type="hidden" name="${type}path" value="$path" />     <input type="hidden" name="folderpath" value="$path" />
    <input type="hidden" name="${type}symb" value="$symb" />     <input type="hidden" name="symb" value="$symb" />
    <input type="hidden" name="setparms" value="$orderidx" />     <input type="hidden" name="setparms" value="$orderidx" />
    <input type="hidden" name="changeparms" value="0" />     <input type="hidden" name="changeparms" value="0" />
 END  END
Line 2295  END Line 2609  END
  $line.=(<<END);   $line.=(<<END);
 <td>  <td>
 <div class="LC_docs_entry_move">  <div class="LC_docs_entry_move">
   <a href='/adm/coursedocs?cmd=up_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb'>    <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='/adm/coursedocs?cmd=down_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb'>    <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 2512  ENDPARMS Line 2826  ENDPARMS
     return $line;      return $line;
 }  }
   
 sub newmap_suffix {  sub new_timebased_suffix {
     my ($area,$container,$coursedom,$coursenum) = @_;      my ($coursedom,$coursenum,$type,$area,$container) = @_;
     my ($prefix,$idtype,$errtext,$locknotfreed);      my ($prefix,$namespace,$idtype,$errtext,$locknotfreed);
     $prefix = 'docs';      if ($type eq 'map') {
     if ($area eq 'supplemental') {          $prefix = 'docs';
         $prefix = 'supp';          if ($area eq 'supplemental') {
               $prefix = 'supp';
           }
           $prefix .= $container;
           $namespace = 'uploadedmaps';
       } else {
           $prefix = $type;
           $namespace = 'templated';
     }      }
     $prefix .= $container;  
     $idtype = 'concat';      $idtype = 'concat';
     my ($suffix,$freedlock,$error) =      my ($suffix,$freedlock,$error) =
         &Apache::lonnet::get_timebased_id($prefix,'num','uploadedmaps',          &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,
                                           $coursedom,$coursenum);                                            $coursedom,$coursenum);
     if (!$suffix) {      if (!$suffix) {
         $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.');          if ($type eq 'map') {
               $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.');
           } elsif ($type eq 'smppg') {
               $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new simple page.');
           } else {
               $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new bulletin board.');
           }
         if ($error) {          if ($error) {
             $errtext .= '<br />'.$error;              $errtext .= '<br />'.$error;
         }          }
     }      }
     if ($freedlock ne 'ok') {      if ($freedlock ne 'ok') {
         $locknotfreed = '<div class="LC_error">'.&mt('There was a problem removing a lockfile. This will prevent creation of additional folders or composite pages in this course.  Please contact the domain coordinator for your LON-CAPA domain.').'</div>';          $locknotfreed = 
               '<div class="LC_error">'.
               &mt('There was a problem removing a lockfile.').' ';
           if ($type eq 'map') {
               &mt('This will prevent creation of additional folders or composite pages in this course.');
           } elsif ($type eq 'smppg') {
               $locknotfreed .=
                   &mt('This will prevent creation of additional simple pages in this course.');
           } else {
               $locknotfreed .=
                   &mt('This will prevent creation of additional bulletin boards in this course.');
           }
           $locknotfreed .=
               ' '.&mt('Please contact the domain coordinator for your LON-CAPA domain.').
               '</div>';
     }      }
     return ($suffix,$errtext,$locknotfreed);      return ($suffix,$errtext,$locknotfreed);
 }  }
Line 3137  sub handler { Line 3477  sub handler {
   'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');    'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
     $help{'Group Portfolio'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');      $help{'Group Portfolio'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');      $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
       $help{'Course Roster'} = &Apache::loncommon::help_open_topic('Docs_Course_Roster');
           $help{'Web Page'} =  &Apache::loncommon::help_open_topic('Docs_Web_Page');
    
     my $allowed;      my $allowed;
 # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.  # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.
     unless ($r->uri eq '/adm/supplemental') {      unless ($r->uri eq '/adm/supplemental') {
Line 3219  sub handler { Line 3560  sub handler {
        if ($env{'form.symb'} ne '') {         if ($env{'form.symb'} ne '') {
            $env{'form.folderpath'}=             $env{'form.folderpath'}=
                &Apache::loncommon::symb_to_docspath($env{'form.symb'});                 &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 '') {
            $env{'form.folderpath'}=$env{'form.supppath'};             $env{'form.folderpath'}=$env{'form.supppath'};
            &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>              &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>
                $env{'form.command'}.'_'.$env{'form.supppath'}});                 $env{'form.command'}.'_'.$env{'form.supppath'}});
        }         }
    } elsif ($env{'form.command'} eq 'editdocs') {     } elsif ($env{'form.command'} eq 'editdocs') {
Line 3472  sub handler { Line 3813  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)', 
                 '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 3724  NAMFORM Line 4066  NAMFORM
  </form>   </form>
 NASOFORM  NASOFORM
   
   
  my $newrosterform=(<<NROSTFORM);   my $newrosterform=(<<NROSTFORM);
  <form action="/adm/coursedocs" method="post" name="newroster">   <form action="/adm/coursedocs" method="post" name="newroster">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
Line 3736  NASOFORM Line 4077  NASOFORM
  </form>   </form>
 NROSTFORM  NROSTFORM
   
           my $newwebpage;
           if ($folder =~ /^default_?(\d*)$/) {
               $newwebpage = "/uploaded/$coursedom/$coursenum/docs/";
               if ($1) {
                   $newwebpage .= $1;
               } else {
                   $newwebpage .= 'default';
               }
               $newwebpage .= '/new.html';
           }
           my $newwebpageform =(<<NWEBFORM);
           <form action="/adm/coursedocs" method="post" name="newwebpage">
           <input type="hidden" name="active" value="cc" />
           $pathitem
           <input type="hidden" name="importdetail" value="$newwebpage" />
           <a class="LC_menubuttons_link" href="javascript:makewebpage();">$lt{'webp'}</a>
           $help{'Web Page'}
           </form>
   NWEBFORM
    
   
 my $specialdocumentsform;  my $specialdocumentsform;
 my @specialdocumentsforma;  my @specialdocumentsforma;
 my $gradingform;  my $gradingform;
Line 3794  NGFFORM Line 4156  NGFFORM
  {'<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/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="document.newnav.submit()" />'=>$newnavform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$newnavform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},
           {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},
         );          );
         $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));          $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));
   
Line 3931  SNSFORM Line 4294  SNSFORM
  </form>   </form>
 SNAMFORM  SNAMFORM
   
           my $supwebpage;
           if ($folder =~ /^supplemental_?(\d*)$/) {
               $supwebpage = "/uploaded/$coursedom/$coursenum/supplemental/";
               if ($1) {
                   $supwebpage .= $1;
               } else {
                   $supwebpage .= 'default';
               }
               $supwebpage .= '/new.html';
           }
           my $supwebpageform =(<<SWEBFORM);
           <form action="/adm/coursedocs" method="post" name="supwebpage">
           <input type="hidden" name="active" value="cc" />
           $pathitem
           <input type="hidden" name="importdetail" value="$supwebpage" />
           <a class="LC_menubuttons_link" href="javascript:makewebpage('supp');">$lt{'webp'}</a>
           $help{'Web Page'}
           </form>
   SWEBFORM
   
   
 my @specialdocs = (  my @specialdocs = (
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.supnewsyl.submit()" />'   {'<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="document.supnewaboutme.submit()" />'   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="document.supnewaboutme.submit()" />'
             =>$supnewaboutmeform},              =>$supnewaboutmeform},
                   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage('."'supp'".');" />'=>$supwebpageform},
   
  );   );
 my @supimportdoc = (  my @supimportdoc = (
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleUpload(\'suppext\')" />'   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleUpload(\'suppext\')" />'
Line 4291  sub generate_edit_table { Line 4676  sub generate_edit_table {
   
 sub editing_js {  sub editing_js {
     my ($udom,$uname,$supplementalflag) = @_;      my ($udom,$uname,$supplementalflag) = @_;
     my $now = time();  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                           p_mnf => 'Name of New Folder',                                            p_mnf => 'Name of New Folder',
                                           t_mnf => 'New Folder',                                            t_mnf => 'New Folder',
Line 4302  sub editing_js { Line 4686  sub editing_js {
                                           p_msb => 'Title for the Problem',                                            p_msb => 'Title for the Problem',
                                           p_mdb => 'Title for the Drop Box',                                            p_mdb => 'Title for the Drop Box',
                                           p_mbb => 'Title for the Discussion Board',                                            p_mbb => 'Title for the Discussion Board',
                                             p_mwp => 'Title for Web Page', 
                                           p_mab => "Enter user:domain for User's Personal Information Page",                                            p_mab => "Enter user:domain for User's Personal Information Page",
                                           p_mab2 => 'Personal Information Page of ',                                            p_mab2 => 'Personal Information Page of ',
                                           p_mab_alrt1 => 'Not a valid user:domain',                                            p_mab_alrt1 => 'Not a valid user:domain',
Line 4331  sub editing_js { Line 4716  sub editing_js {
     my $toplevelsupp = &supplemental_base();      my $toplevelsupp = &supplemental_base();
   
     my $backtourl;      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/) {
             $backtourl = '/adm/supplemental?folderpath='.&escape($caller);              $backtourl = '/adm/supplemental?folderpath='.&escape($caller);
         } else {          } else {
Line 4389  function makesmppage() { Line 4774  function makesmppage() {
    var title=prompt('$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/$now/smppg';   escape(title)+'=/adm/$udom/$uname/new/smppg';
     this.document.forms.newsmppg.submit();      this.document.forms.newsmppg.submit();
    }     }
 }  }
   
   function makewebpage(type) {
      var title=prompt('$lt{"p_mwp"}');
      var formname;
      if (type == 'supp') {
          formname = this.document.forms.supwebpage;
      } else {
          formname = this.document.forms.newwebpage;
      }
      if (title) {
          var webpage = formname.importdetail.value; 
          formname.importdetail.value = escape(title)+'='+webpage;
          formname.submit();
      }
   }
   
 function makesmpproblem() {  function makesmpproblem() {
    var title=prompt('$lt{"p_msb"}');     var title=prompt('$lt{"p_msb"}');
    if (title) {     if (title) {
Line 4416  function makebulboard() { Line 4816  function makebulboard() {
    var title=prompt('$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/$now/bulletinboard';   escape(title)+'=/adm/$udom/$uname/new/bulletinboard';
     this.document.forms.newbul.submit();      this.document.forms.newbul.submit();
    }     }
 }  }
Line 4843  Return hash with valid author names Line 5243  Return hash with valid author names
   
 =item contained_map_check()  =item contained_map_check()
   
 =item reinit_role()  
   
 =item url_paste_fixups()  =item url_paste_fixups()
   
 =item apply_fixups()  =item apply_fixups()

Removed from v.1.528  
changed lines
  Added in v.1.536


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