Diff for /loncom/interface/londocs.pm between versions 1.135 and 1.218

version 1.135, 2004/07/08 19:58:29 version 1.218, 2006/01/16 23:42:39
Line 30  package Apache::londocs; Line 30  package Apache::londocs;
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
   use Apache::imsexport;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonratedt;  use Apache::lonratedt;
 use Apache::lonratsrv;  use Apache::lonratsrv;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::loncreatecourse;  use Apache::loncreatecourse;
   use Apache::lonnavmaps;
 use HTML::Entities;  use HTML::Entities;
 use GDBM_File;  use GDBM_File;
 use Apache::lonlocal;  use Apache::lonlocal;
   use Cwd;
   
 my $iconpath;  my $iconpath;
   
Line 83  sub authorhosts { Line 86  sub authorhosts {
     my %outhash=();      my %outhash=();
     my $home=0;      my $home=0;
     my $other=0;      my $other=0;
     foreach (keys %ENV) {      foreach (keys %env) {
  if ($_=~/^user\.role\.(au|ca)\.(.+)$/) {   if ($_=~/^user\.role\.(au|ca)\.(.+)$/) {
     my $role=$1;      my $role=$1;
     my $realm=$2;      my $realm=$2;
     my ($start,$end)=split(/\./,$ENV{$_});      my ($start,$end)=split(/\./,$env{$_});
     if (($start) && ($start>time)) { next; }      if (($start) && ($start>time)) { next; }
     if (($end) && (time>$end)) { next; }      if (($end) && (time>$end)) { next; }
     my $ca; my $cd;      my $ca; my $cd;
     if ($1 eq 'au') {      if ($1 eq 'au') {
  $ca=$ENV{'user.name'};   $ca=$env{'user.name'};
  $cd=$ENV{'user.domain'};   $cd=$env{'user.domain'};
     } else {      } else {
  ($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/);   ($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/);
     }      }
Line 129  sub dumpbutton { Line 132  sub dumpbutton {
     }      }
 }  }
   
   sub clean {
       my ($title)=@_;
       $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs;
       return $title;
   }
 # -------------------------------------------------------- Actually dump course  # -------------------------------------------------------- Actually dump course
   
 sub dumpcourse {  sub dumpcourse {
     my $r=shift;      my $r=shift;
     $r->print('<html><head><title>Dump DOCS</title></head>'.      my $html=&Apache::lonxml::xmlbegin();
       $r->print($html.'<head><title>Dump DOCS</title></head>'.
         &Apache::loncommon::bodytag('Dump Course DOCS to Construction Space').          &Apache::loncommon::bodytag('Dump Course DOCS to Construction Space').
       '<form name="dumpdoc" method="post">');        '<form name="dumpdoc" method="post">');
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     unless ($home) { return ''; }      unless ($home) { return ''; }
     my $origcrsid=$ENV{'request.course.id'};      my $origcrsid=$env{'request.course.id'};
     my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);      my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);
     if (($ENV{'form.authorspace'}) && ($ENV{'form.authorfolder'}=~/\w/)) {      if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
 # Do the dumping  # Do the dumping
  unless ($outhash{'home_'.$ENV{'form.authorspace'}}) { return ''; }   unless ($outhash{'home_'.$env{'form.authorspace'}}) { 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=~s/[^\w\/]+/\_/g;   $title=&clean($title);
  my %replacehash=();   my %replacehash=();
  foreach (keys %ENV) {   foreach (keys %env) {
     if ($_=~/^form\.namefor\_(.+)/) {      if ($_=~/^form\.namefor\_(.+)/) {
  $replacehash{$1}=$ENV{$_};   $replacehash{$1}=$env{$_};
     }      }
  }   }
  my $crs='/uploaded/'.$ENV{'request.course.id'}.'/';   my $crs='/uploaded/'.$env{'request.course.id'}.'/';
  $crs=~s/\_/\//g;   $crs=~s/\_/\//g;
  foreach (keys %replacehash) {   foreach (keys %replacehash) {
     my $newfilename=$title.'/'.$replacehash{$_};      my $newfilename=$title.'/'.$replacehash{$_};
     $newfilename=~s/[^\w\/\.\/]+/\_/g;      $newfilename=~s/\.(\w+)$//;
       my $ext=$1;
       $newfilename=&clean($newfilename);
       $newfilename.='.'.$ext;
     my @dirs=split(/\//,$newfilename);      my @dirs=split(/\//,$newfilename);
     my $path='/home/'.$ca.'/public_html';      my $path='/home/'.$ca.'/public_html';
     my $makepath=$path;      my $makepath=$path;
Line 172  sub dumpcourse { Line 184  sub dumpcourse {
     if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {      if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {
  if ($_=~/\.(sequence|page|html|htm|xml|xhtml)$/) {   if ($_=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
     print $fh &Apache::loncreatecourse::rewritefile(      print $fh &Apache::loncreatecourse::rewritefile(
          &Apache::loncreatecourse::readfile($ENV{'request.course.id'},$_),           &Apache::loncreatecourse::readfile($env{'request.course.id'},$_),
      (%replacehash,$crs => '')       (%replacehash,$crs => '')
     );      );
  } else {   } else {
     print $fh      print $fh
          &Apache::loncreatecourse::readfile($ENV{'request.course.id'},$_);           &Apache::loncreatecourse::readfile($env{'request.course.id'},$_);
        }         }
  $fh->close();   $fh->close();
     } else {      } else {
Line 211  sub dumpcourse { Line 223  sub dumpcourse {
  }   }
  my $title=$origcrsdata{'description'};   my $title=$origcrsdata{'description'};
  $title=~s/\s+/\_/gs;   $title=~s/\s+/\_/gs;
  $title=~s/\W//gs;   $title=&clean($title);
  $r->print('<h3>'.&mt('Folder in Construction Space').'</h3><input type="text" size="50" name="authorfolder" value="'.$title.'" /><br />');   $r->print('<h3>'.&mt('Folder in Construction Space').'</h3><input type="text" size="50" name="authorfolder" value="'.$title.'" /><br />');
  &tiehash();   &tiehash();
  $r->print('<h3>'.&mt('Filenames in Construction Space').'</h3><table border="2"><tr><th>'.&mt('Internal Filename').'</th><th>'.&mt('Title').'</th><th>'.&mt('Save as ...').'</th></tr>');   $r->print('<h3>'.&mt('Filenames in Construction Space').'</h3><table border="2"><tr><th>'.&mt('Internal Filename').'</th><th>'.&mt('Title').'</th><th>'.&mt('Save as ...').'</th></tr>');
Line 220  sub dumpcourse { Line 232  sub dumpcourse {
     my ($ext)=($_=~/\.(\w+)$/);      my ($ext)=($_=~/\.(\w+)$/);
     my $title=$hash{'title_'.$hash{      my $title=$hash{'title_'.$hash{
  'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};   'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};
       $title=~s/&colon;/:/g;
     $r->print('<td>'.($title?$title:'&nbsp;').'</td>');      $r->print('<td>'.($title?$title:'&nbsp;').'</td>');
     unless ($title) {      unless ($title) {
  $title=$_;   $title=$_;
     }      }
     $title=~s/\.(\w+)$//;      $title=~s/\.(\w+)$//;
     $title=~s/[^\w\/]+/\_/gs;      $title=&clean($title);
     $title.='.'.$ext;      $title.='.'.$ext;
     $r->print("\n<td><input type='text' size='60' name='namefor_".$_."' value='".$title."' /></td></tr>\n");      $r->print("\n<td><input type='text' size='60' name='namefor_".$_."' value='".$title."' /></td></tr>\n");
  }   }
Line 236  sub dumpcourse { Line 249  sub dumpcourse {
     }      }
 }  }
   
   # ------------------------------------------------------ Generate "export" button
   
   sub exportbutton {
       return '</td><td bgcolor="#DDDDCC">'.
               '<input type="submit" name="exportcourse" value="'.
               &mt('Export Course to IMS').'" />'.
       &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs');
   }
   
   sub exportcourse {
       my $r=shift;
       my %discussiontime = &Apache::lonnet::dump('discussiontimes',
                                                  $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});
       my $numdisc = keys %discussiontime;
       my $navmap = Apache::lonnavmaps::navmap->new();
       my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
       my $curRes;
       my $outcome;
   
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                               ['finishexport']);
       if ($env{'form.finishexport'}) {
           &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                               ['archive','discussion']);
   
           my @exportitems = &Apache::loncommon::get_env_multiple('form.archive');
           my @discussions = &Apache::loncommon::get_env_multiple('form.discussion');
           if (@exportitems == 0 && @discussions == 0) {
               $outcome = '<br />As you did not select any content items or discussions for export, an IMS package has not been created.  Please <a href="javascript:history.go(-1)">go back</a> to select either content items or discussions for export';
           } else {
               my $now = time;
               my %symbs;
               my $manifestok = 0;
               my $imsresources;
               my $tempexport;
               my $copyresult;
               my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport);
               if ($manifestok) {
                   &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest);
                   close($ims_manifest);
   
   #Create zip file in prtspool
                   my $imszipfile = '/prtspool/'.
                   $env{'user.name'}.'_'.$env{'user.domain'}.'_'.
                      time.'_'.rand(1000000000).'.zip';
                   my $cwd = &Cwd::getcwd();
                   my $imszip = '/home/httpd/'.$imszipfile;
                   chdir $tempexport;
                   open(OUTPUT, "zip -r $imszip *  2> /dev/null |");
                   close(OUTPUT);
                   chdir $cwd;
                   $outcome .= 'Download the zip file from <a href="'.$imszipfile.'">IMS course archive</a><br />';
                   if ($copyresult) {
                       $outcome .= 'The following errors occurred during export - '.$copyresult;
                   }
               } else {
                   $outcome = '<br />Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.<br />';
               }
           }
    my $html=&Apache::lonxml::xmlbegin();
           $r->print($html.'<head><title>Export Course</title></head>'.
               &Apache::loncommon::bodytag('Export course to IMS content package'));
           $r->print($outcome);
           $r->print('</body></html>');
       } else {
           my $display;
           $display = '<form name="exportdoc" method="post">'."\n";
           $display .= 'Choose which items you wish to export from your course.<br /><br />';
           $display .= '<table border="0" cellspacing="0" cellpadding="3">'.
                       '<tr><td><fieldset><legend>&nbsp;<b>Content items</b></legend>'.
                       '<input type="button" value="check all" '.
                       'onclick="javascript:checkAll(document.exportdoc.archive)" />'.
                       '&nbsp;&nbsp;<input type="button" value="uncheck all"'.
                       ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset></td>'.
                       '<td>&nbsp;</td><td>&nbsp;</td>'.
                       '<td align="right"><fieldset><legend>&nbsp;<b>Discussion posts'.
                       '</b></legend><input type="button" value="check all"'.
                       ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'.
                       '&nbsp;&nbsp;<input type="button" value="uncheck all"'.
                       ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" /></fieldset></td>'.
                       '</tr></table>';
           my $curRes;
           my $depth = 0;
           my $count = 0;
           my $boards = 0;
           my $startcount = 5;
           my %parent = ();
           my %children = ();
           my $lastcontainer = $startcount;
           my @bgcolors = ('#F6F6F6','#FFFFFF');
           $display .= '<table cellspacing="0"><tr>'.
               '<td><b>Export content item?<br /></b></td><td>&nbsp;</td><td align="right">'."\n";
           if ($numdisc > 0) {
               $display.='<b>Export&nbsp;discussion posts?</b>'."\n";
           }
           $display.='&nbsp;</td></tr>';
           while ($curRes = $it->next()) {
               if (ref($curRes)) {
                   $count ++;
               }
               if ($curRes == $it->BEGIN_MAP()) {
                   $depth++;
                   $parent{$depth} = $lastcontainer;
               }
               if ($curRes == $it->END_MAP()) {
                   $depth--;
                   $lastcontainer = $parent{$depth};
               }
               if (ref($curRes)) {
                   my $symb = $curRes->symb();
                   my $ressymb = $symb;
                   if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
                       unless ($ressymb =~ m|adm/wrapper/adm|) {
                           $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                       }
                   }
                   my $color = $count%2;
                   $display .='<tr bgcolor='.$bgcolors[$color].'><td>'."\n".
                       '<input type="checkbox" name="archive" value="'.$count.'" ';
                   if (($curRes->is_sequence()) || ($curRes->is_page())) {
                       my $checkitem = $count + $boards + $startcount;
                       $display .= 'onClick="javascript:propagateCheck('."'$checkitem'".')"';
                   }
                   $display .= ' />'."\n";
                   for (my $i=0; $i<$depth; $i++) {
                       $display .= '<img src="/adm/lonIcons/whitespace1.gif" width="25" height="1" alt="" border="0" /><img src="/adm/lonIcons/whitespace1.gif" width="25" height="1" alt="" border="0" />'."\n";
                   }
                   if ($curRes->is_sequence()) {
                       $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif">&nbsp;'."\n";
                       $lastcontainer = $count + $startcount + $boards;
                   } elsif ($curRes->is_page()) {
                       $display .= '<img src="/adm/lonIcons/navmap.page.open.gif">&nbsp;'."\n";
                       $lastcontainer = $count + $startcount + $boards;
                   }
                   my $currelem = $count+$boards+$startcount;
                   $children{$parent{$depth}} .= $currelem.':';
                   $display .= '&nbsp;'.$curRes->title().'</td>';
                   if ($discussiontime{$ressymb} > 0) {
                       $boards ++;
                       $currelem = $count+$boards+$startcount;
                       $display .= '<td>&nbsp;</td><td align="right"><input type="checkbox" name="discussion" value="'.$count.'" />&nbsp;</td>'."\n";
                   } else {
                       $display .= '<td colspan="2">&nbsp;</td>'."\n";
                   }
               }
           }
           my $scripttag = qq|
   <script>
   
   function checkAll(field) {
       if (field.length > 0) {
           for (i = 0; i < field.length; i++) {
               field[i].checked = true ;
           }
       } else {
           field.checked = true
       }
   }
                                                                                   
   function uncheckAll(field) {
       if (field.length > 0) {
           for (i = 0; i < field.length; i++) {
               field[i].checked = false ;
           }
       } else {
           field.checked = false ;
       }
   }
   
   function propagateCheck(item) {
       if (document.exportdoc.elements[item].checked == true) {
           containerCheck(item)
       }
   } 
   
   function containerCheck(item) {
       document.exportdoc.elements[item].checked = true
       var numitems = $count + $boards + $startcount
       var parents = new Array(numitems)
       for (var i=$startcount; i<numitems; i++) {
           parents[i] = new Array
       }
           |;
   
           foreach my $container (sort { $a <=> $b } keys %children) {
               my @contents = split/:/,$children{$container};
               for (my $i=0; $i<@contents; $i ++) {
                   $scripttag .= '    parents['.$container.']['.$i.'] = '.$contents[$i]."\n";
               }
           }
   
           $scripttag .= qq|
       if (parents[item].length > 0) {
           for (var j=0; j<parents[item].length; j++) {
               containerCheck(parents[item][j])
           }
        }   
   }
   
   </script>
           |;
    my $html=&Apache::lonxml::xmlbegin();
           $r->print($html.'<head><title>Export Course</title>'.$scripttag.'</head>'.
               &Apache::loncommon::bodytag('Export course to IMS content package'
   ));
   
           $r->print($display.'</table>'.
                     '<p><input type="hidden" name="finishexport" value="1">'.
                     '<input type="submit" name="exportcourse" value="'.
                     &mt('Export Course DOCS').'" /></p></form></body></html>');
       }
   }
   
   sub create_ims_store {
       my ($now,$manifestok,$outcome,$tempexport) = @_;
       $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports';
       my $ims_manifest;
       if (!-e $$tempexport) {
           mkdir($$tempexport,0700);
       }
       $$tempexport .= '/'.$now;
       if (!-e $$tempexport) {
           mkdir($$tempexport,0700);
       }
       $$tempexport .= '/'.$env{'user.domain'}.'_'.$env{'user.name'};
       if (!-e $$tempexport) {
           mkdir($$tempexport,0700);
       }
       if (!-e "$$tempexport/resources") {
           mkdir("$$tempexport/resources",0700);
       }
   # open manifest file
       my $manifest = '/imsmanifest.xml';
       my $manifestfilename = $$tempexport.$manifest;
       if ($ims_manifest = Apache::File->new('>'.$manifestfilename)) {
           $$manifestok=1;
           print $ims_manifest
   '<?xml version="1.0" encoding="UTF-8"?>'."\n".
   '<manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"'.
   ' xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"'.
   ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'.
   ' identifier="MANIFEST-'.$env{'request.course.id'}.'-'.$now.'"'.
   '  xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1imscp_v1p1.xsd'.
   '  http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd">'."\n".
   '  <metadata>
       <schema></schema>
       <imsmd:lom>
         <imsmd:general>
           <imsmd:identifier>'.$env{'request.course.id'}.'</imsmd:identifier>
           <imsmd:title>
             <imsmd:langstring xml:lang="en">'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</imsmd:langstring>
           </imsmd:title>
         </imsmd:general>
       </imsmd:lom>
     </metadata>'."\n".
   '  <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n".
   '    <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'.
   ' structure="hierarchical">'."\n".
   '      <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>'
       } else {
           $$outcome .= 'An error occurred opening the IMS manifest file.<br />'
   ;
       }
       return $ims_manifest;
   }
   
   sub build_package {
       my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult,$ims_manifest) = @_;
   # first iterator to look for dependencies
       my $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
       my $curRes;
       my $count = 0;
       my $depth = 0;
       my $lastcontainer = 0;
       my %parent = ();
       my @dependencies = ();
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       while ($curRes = $it->next()) {
           if (ref($curRes)) {
               $count ++;
           }
           if ($curRes == $it->BEGIN_MAP()) {
               $depth++;
               $parent{$depth} = $lastcontainer;
           }
           if ($curRes == $it->END_MAP()) {
               $depth--;
               $lastcontainer = $parent{$depth};
           }
           if (ref($curRes)) {
               if ($curRes->is_sequence() || $curRes->is_page()) {
                   $lastcontainer = $count;
               }
               if (grep/^$count$/,@$exportitems) {
                   &get_dependencies($exportitems,\%parent,$depth,\@dependencies);
               }
           }
       }
   # second iterator to build manifest and store resources
       $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
       $depth = 0;
       my $prevdepth;
       $count = 0;
       my $imsresources;
       my $pkgdepth;
       while ($curRes = $it->next()) {
           if ($curRes == $it->BEGIN_MAP()) {
               $prevdepth = $depth;
               $depth++;
           }
           if ($curRes == $it->END_MAP()) {
               $prevdepth = $depth;
               $depth--;
           }
   
           if (ref($curRes)) {
               $count ++;
               if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) {
                   my $symb = $curRes->symb();
                   my $isvisible = 'true';
                   my $resourceref;
                   if ($curRes->randomout()) {
                       $isvisible = 'false';
                   }
                   unless ($curRes->is_sequence()) {
                       $resourceref = 'identifierref="RES-'.$env{'request.course.id'}.'-'.$count.'"';
                   }
                   my $step = $prevdepth - $depth;
                   if (($step >= 0) && ($count > 1)) {
                       while ($step >= 0) {
                           print $ims_manifest "\n".'  </item>'."\n";
                           $step --;
                       }
                   }
                   $prevdepth = $depth;
   
                   my $itementry =
                 '<item identifier="ITEM-'.$env{'request.course.id'}.'-'.$count.
                 '" isvisible="'.$isvisible.'" '.$resourceref.'>'.
                 '<title>'.$curRes->title().'</title>';
                   print $ims_manifest "\n".$itementry;
   
                   unless ($curRes->is_sequence()) {
                       my $content_file;
                       my @hrefs = ();
                       &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport);
                       if ($content_file) {
                           $imsresources .= "\n".
                        '   <resource identifier="RES-'.$env{'request.course.id'}.'-'.$count.
                        '" type="webcontent" href="'.$content_file.'">'."\n".
                        '       <file href="'.$content_file.'" />'."\n";
                           foreach (@hrefs) {
                               $imsresources .=
                        '        <file href="'.$_.'" />'."\n";
                           }
                           if (grep/^$count$/,@$discussions) {
                               my $ressymb = $symb;
                               my $mode;
                               if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
                                   unless ($ressymb =~ m|adm/wrapper/adm|) {
                                       $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                                   }
                                   $mode = 'board';
                               }
                               my %extras = (
                                             caller => 'imsexport',
                                             tempexport => $tempexport.'/resources',
                                             count => $count
                                            );
                               my $discresult = &Apache::lonfeedback::list_discussion($mode,undef,$ressymb,\%extras);
                           }
                           $imsresources .= '    </resource>'."\n";
                       }
                   }
                   $pkgdepth = $depth;
               }
           }
       }
       while ($pkgdepth > 0) {
           print $ims_manifest "    </item>\n";
           $pkgdepth --;
       }
       my $resource_text = qq|
       </organization>
     </organizations>
     <resources>
       $imsresources
     </resources>
   </manifest>
       |;
       print $ims_manifest $resource_text;
   }
   
   sub get_dependencies {
       my ($exportitems,$parent,$depth,$dependencies) = @_;
       if ($depth > 1) {
           if ((!grep/^$$parent{$depth}$/,@$exportitems) && (!grep/^$$parent{$depth}$/,@$dependencies)) {
               push @$dependencies, $$parent{$depth};
               if ($depth > 2) {
                   &get_dependencies($exportitems,$parent,$depth-1,$dependencies);
               }
           }
       }
   }
   
   sub process_content {
       my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_;
       my $content_type;
       my $message;
       my @uploads = ();
       if ($curRes->is_sequence()) {
           $content_type = 'sequence';
       } elsif ($curRes->is_page()) {
           $content_type = 'page'; # need to handle individual items in pages.
       } elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) {
           $content_type = 'syllabus';
           my $contents = &Apache::imsexport::templatedpage($content_type);
           if ($contents) {
               $$content_file = &store_template($contents,$tempexport,$count,$content_type);
           }
       } elsif ($symb =~ m-\.sequence___\d+___ext-) {
           $content_type = 'external';
           my $title = $curRes->title;
           my $contents =  &Apache::imsexport::external($symb,$title);
           if ($contents) {
               $$content_file = &store_template($contents,$tempexport,$count,$content_type);
           }
       } elsif ($symb =~ m-adm/navmaps$-) {
           $content_type =  'navmap';
       } elsif ($symb =~ m-adm/[^/]+/[^/]+/(\d+)/smppg$-) {
           $content_type = 'simplepage';
           my $contents = &Apache::imsexport::templatedpage($content_type,$1,$count,\@uploads);
           if ($contents) {
               $$content_file = &store_template($contents,$tempexport,$count,$content_type);
           }
       } elsif ($symb =~ m-lib/templates/simpleproblem\.problem$-) {
           $content_type = 'simpleproblem';
           my $contents =  &Apache::imsexport::simpleproblem($symb);
           if ($contents) {
               $$content_file = &store_template($contents,$tempexport,$count,$content_type);
           }
       } elsif ($symb =~ m-lib/templates/examupload\.problem$-) {
           $content_type = 'examupload';
       } elsif ($symb =~ m-adm/(\w+)/(\w+)/(\d+)/bulletinboard$-) {
           $content_type = 'bulletinboard';
           my $contents =  &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2);
           if ($contents) {
               $$content_file = &store_template($contents,$tempexport,$count,$content_type);
           }
       } elsif ($symb =~ m-adm/([^/]+)/([^/]+)/aboutme$-) {
           $content_type = 'aboutme';
           my $contents =  &Apache::imsexport::templatedpage($content_type,undef,$count,\@uploads,$1,$2);
           if ($contents) {
               $$content_file = &store_template($contents,$tempexport,$count,$content_type);
           }
       } elsif ($symb =~ m-\.(sequence|page)___\d+___uploaded/$cdom/$cnum/-) {
           $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
       } elsif ($symb =~ m-\.(sequence|page)___\d+___([^/]+)/([^/]+)-) {
           my $canedit = 0;
           if ($2 eq $env{'user.domain'} && $3 eq $env{'user.name'})  {
               $canedit= 1;
           }
   # only include problem code where current user is author
           if ($canedit) {
               $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource');
           } else {
               $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit');
           }
       } elsif ($symb =~ m-uploaded/$cdom/$cnum-) {
           $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
       }
       if (@uploads > 0) {
           foreach my $item (@uploads) {
               my $uploadmsg = '';
               &replicate_content($cdom,$cnum,$tempexport,$item,$count,\$uploadmsg,$href,'templateupload');
               if ($uploadmsg) {
                   $$copyresult .= $uploadmsg."\n";
               }
           }
       }
       if ($message) {
           $$copyresult .= $message."\n";
       }
   }
   
   sub replicate_content {
       my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_;
       my ($map,$ind,$url);
       if ($caller eq 'templateupload') {
           $url = $symb;
           $url =~ s#//#/#g;
       } else { 
           ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
       }
       my $content;
       my $filename;
       my $repstatus;
       my $content_name;
       if ($url =~ m-/([^/]+)$-) {
           $filename = $1;
           if (!-e $tempexport.'/resources') {
               mkdir($tempexport.'/resources',0700);
           }
           if (!-e $tempexport.'/resources/'.$count) {
               mkdir($tempexport.'/resources/'.$count,0700);
           }
           my $destination = $tempexport.'/resources/'.$count.'/'.$filename;
           my $copiedfile;
           if ($copiedfile = Apache::File->new('>'.$destination)) {
               my $content;
               if ($caller eq 'resource') {
                   my $respath =  $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';
                   my $filepath = &Apache::lonnet::filelocation($respath,$url);
                   $content = &Apache::lonnet::getfile($filepath);
                   if ($content eq -1) {
                       $$message = 'Could not copy file '.$filename;
                   } else {
                       &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'resource');
                       $repstatus = 'ok';
                   }
               } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') {
                   my $rtncode;
                   $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode);
                   if ($repstatus eq 'ok') {
                       if ($url =~ /\.html?$/i) {
                           &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'uploaded');
                       }
                   } else {
                       $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n";
                   }
               } elsif ($caller eq 'noedit') {
   # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this. 
                   $repstatus = 'ok';
                   $content = 'Not the owner of this resource'; 
               }
               if ($repstatus eq 'ok') {
                   print $copiedfile $content;
               }
               close($copiedfile);
           } else {
               $$message = 'Could not open destination file for '.$filename."<br />\n";
           }
       } else {
           $$message = 'Could not determine name of file for '.$symb."<br />\n";
       }
       if ($repstatus eq 'ok') {
           $content_name = 'resources/'.$count.'/'.$filename;
       }
       return $content_name;
   }
   
   sub extract_media {
       my ($url,$cdom,$cnum,$content,$count,$tempexport,$href,$message,$caller) = @_;
       my ($dirpath,$container);
       my %allfiles = ();
       my %codebase = ();
       if ($url =~ m-(.*/)([^/]+)$-) {
           $dirpath = $1;
           $container = $2;
       } else {
           $dirpath = $url;
           $container = '';
       }
       &Apache::lonnet::extract_embedded_items(undef,undef,\%allfiles,\%codebase,$content);
       foreach my $embed_file (keys(%allfiles)) {
           my $filename;
           if ($embed_file =~ m#([^/]+)$#) {
               $filename = $1;
           } else {
               $filename = $embed_file;
           }
           my $newname = 'res/'.$filename;
           my ($rtncode,$embed_content,$repstatus);
           my $embed_url;
           if ($embed_file =~ m-^/-) {
               $embed_url = $embed_file;           # points to absolute path
           } else {
               if ($embed_file =~ m-https?://-) {
                   next;                           # points to url
               } else {
                   $embed_url = $dirpath.$embed_file;  # points to relative path
               }
           }
           if ($caller eq 'resource') {
               my $respath =  $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';  
               my $embed_path = &Apache::lonnet::filelocation($respath,$embed_url); 
               $embed_content = &Apache::lonnet::getfile($embed_path);
               unless ($embed_content eq -1) {
                   $repstatus = 'ok';
               }
           } elsif ($caller eq 'uploaded') {
               
               $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode);
           }
           if ($repstatus eq 'ok') {
               my $destination = $tempexport.'/resources/'.$count.'/res';
               if (!-e "$destination") {
                   mkdir($destination,0755);
               }
               $destination .= '/'.$filename;
               my $copiedfile;
               if ($copiedfile = Apache::File->new('>'.$destination)) {
                   print $copiedfile $embed_content;
                   push @{$href}, 'resources/'.$count.'/res/'.$filename;
                   my $attrib_regexp = '';
                   if (@{$allfiles{$embed_file}} > 1) {
                       $attrib_regexp = join('|',@{$allfiles{$embed_file}});
                   } else {
                       $attrib_regexp = $allfiles{$embed_file}[0];
                   }
                   $$content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$embed_file\E(['"]?)#$1$newname$2#gi;
                   if ($caller eq 'resource' && $container =~ /\.(problem|library)$/) {
                       $$content =~ s#\Q$embed_file\E#$newname#gi;
                   }
               }
           } else {
               $$message .= 'replication of embedded file - '.$embed_file.' in '.$url.' failed, reason -'.$rtncode."<br />\n";
           }
       }
       return;
   }
   
   sub store_template {
       my ($contents,$tempexport,$count,$content_type) = @_;
       if ($contents) {
           if ($tempexport) {
               if (!-e $tempexport.'/resources') {
                   mkdir($tempexport.'/resources',0700);
               }
               if (!-e $tempexport.'/resources/'.$count) {
                   mkdir($tempexport.'/resources/'.$count,0700);
               }
               my $destination = $tempexport.'/resources/'.$count.'/'.$content_type.'.xml';
               my $storetemplate;
               if ($storetemplate = Apache::File->new('>'.$destination)) {
                   print $storetemplate $contents;
                   close($storetemplate);
               }
               if ($content_type eq 'external') {
                   return 'resources/'.$count.'/'.$content_type.'.html';
               } else {
                   return 'resources/'.$count.'/'.$content_type.'.xml';
               }
           }
       }
   }
   
 # Imports the given (name, url) resources into the course  # Imports the given (name, url) resources into the course
 # coursenum, coursedom, and folder must precede the list  # coursenum, coursedom, and folder must precede the list
Line 243  sub group_import { Line 903  sub group_import {
     my $coursenum = shift;      my $coursenum = shift;
     my $coursedom = shift;      my $coursedom = shift;
     my $folder = shift;      my $folder = shift;
       my $container = shift;
       my $caller = shift;
     while (@_) {      while (@_) {
  my $name = shift;   my $name = shift;
  my $url = shift;   my $url = shift;
           if (($url =~ m#^/uploaded/$coursedom/$coursenum/(default_\d+\.)(page|sequence)$#) && ($caller eq 'londocs')) {
               my $errtext = '';
               my $fatal = 0;
               my $newmapstr = '<map>'."\n".
                               '<resource id="1" src="" type="start"></resource>'."\n".
                               '<link from="1" to="2" index="1"></link>'."\n".
                               '<resource id="2" src="" type="finish"></resource>'."\n".
                               '</map>';
               $env{'form.output'}=$newmapstr;
               my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
                                                   'output',$1.$2);
               if ($result != m|^/uploaded/|) {
                   $errtext.='Map not saved: A network error occured when trying to save the new map. ';
                   $fatal = 2;
               }
               if ($fatal) {
                   return ($errtext,$fatal);
               }
           }
  if ($url) {   if ($url) {
     my $idx = $#Apache::lonratedt::resources + 1;      my $idx = &Apache::lonratedt::getresidx($url);
     $Apache::lonratedt::order[$#Apache::lonratedt::order+1]=$idx;      $Apache::lonratedt::order[$#Apache::lonratedt::order+1]=$idx;
     my $ext = 'false';      my $ext = 'false';
     if ($url=~/^http:\/\//) { $ext = 'true'; }      if ($url=~/^http:\/\//) { $ext = 'true'; }
Line 257  sub group_import { Line 938  sub group_import {
  join ':', ($name, $url, $ext, 'normal', 'res');   join ':', ($name, $url, $ext, 'normal', 'res');
  }   }
     }      }
     return &storemap($coursenum, $coursedom, $folder.'.sequence');      return &storemap($coursenum, $coursedom, $folder.'.'.$container);
 }  }
   
 sub breadcrumbs {  sub breadcrumbs {
     my ($where)=@_;      my ($where)=@_;
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     my (@folders)=split('&',$ENV{'form.folderpath'});      my (@folders);
       if ($env{'form.pagepath'}) {
           @folders = split('&',$env{'form.pagepath'});
       } else {
           @folders=split('&',$env{'form.folderpath'});
       }
     my $folderpath;      my $folderpath;
       my $cpinfo='';
       if ($env{'form.markedcopy_url'}) {
    &Apache::lonnet::logthis('Found '.$env{'form.markedcopy_url'});
          $cpinfo='&markedcopy_url='.
                  &Apache::lonnet::escape($env{'form.markedcopy_url'}).
                  '&markedcopy_title='.
                  &Apache::lonnet::escape($env{'form.markedcopy_title'});
       }
     while (@folders) {      while (@folders) {
  my $folder=shift(@folders);   my $folder=shift(@folders);
  my $foldername=shift(@folders);   my $foldername=shift(@folders);
Line 273  sub breadcrumbs { Line 967  sub breadcrumbs {
  my $url='/adm/coursedocs?folderpath='.   my $url='/adm/coursedocs?folderpath='.
     &Apache::lonnet::escape($folderpath);      &Apache::lonnet::escape($folderpath);
     &Apache::lonhtmlcommon::add_breadcrumb(      &Apache::lonhtmlcommon::add_breadcrumb(
       {'href'=>$url,        {'href'=>$url.$cpinfo,
        'title'=>&Apache::lonnet::unescape($foldername),         'title'=>&Apache::lonnet::unescape($foldername),
        'text'=>'<font size="+1">'.         'text'=>'<font size="+1">'.
    &Apache::lonnet::unescape($foldername).'</font>'     &Apache::lonnet::unescape($foldername).'</font>'
Line 281  sub breadcrumbs { Line 975  sub breadcrumbs {
                 
       
     }      }
     return &Apache::lonhtmlcommon::breadcrumbs(undef,undef,undef,undef,undef,0);      return &Apache::lonhtmlcommon::breadcrumbs(undef,undef,undef,undef,undef,
          0,'nohelp');
 }  }
   
 sub editor {  sub editor {
     my ($r,$coursenum,$coursedom,$folder,$allowed)=@_;      my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output)=@_;
   
     $r->print(&breadcrumbs($folder));  
     my $errtext='';      my $errtext='';
     my $fatal=0;      my $fatal=0;
       my $container='sequence';
       if ($env{'form.pagepath'}) {
           $container='page';
       }
     ($errtext,$fatal)=      ($errtext,$fatal)=
           &mapread($coursenum,$coursedom,$folder.'.sequence');                &mapread($coursenum,$coursedom,$folder.'.'.$container);
     if ($#Apache::lonratedt::order<1) {      if ($#Apache::lonratedt::order<1) {
         $Apache::lonratedt::order[0]=1;   my $idx=&Apache::lonratedt::getresidx();
         $Apache::lonratedt::resources[1]='';   if ($idx<=0) { $idx=1; }
           $Apache::lonratedt::order[0]=$idx;
           $Apache::lonratedt::resources[$idx]='';
       }
       if (defined($env{'form.markcopy'})) {
   # Mark for copying
    my ($title,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$env{'form.markcopy'}]]);
    $env{'form.markedcopy_title'}=$title;
    $env{'form.markedcopy_url'}=$url;
     }      }
       $r->print(&breadcrumbs($folder));
     if ($fatal) {      if ($fatal) {
    $r->print('<p><font color="red">'.$errtext.'</font></p>');     $r->print('<p><font color="red">'.$errtext.'</font></p>');
     } else {      } else {
 # ------------------------------------------------------------ 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) && ($ENV{'form.folder'} eq $folder)) {   if (($allowed) && ($env{'form.folder'} eq $folder)) {
 # set parameters and change order  # set parameters and change order
     if (defined($ENV{'form.setparms'})) {      if (defined($env{'form.setparms'})) {
  my $idx=$ENV{'form.setparms'};   my $idx=$env{'form.setparms'};
 # set parameters  # set parameters
  if ($ENV{'form.randpick_'.$idx}) {   if ($env{'form.randpick_'.$idx}) {
     &Apache::lonratedt::storeparameter($idx,'parameter_randompick',$ENV{'form.randpick_'.$idx},'int_pos');      &Apache::lonratedt::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
  } else {   } else {
     &Apache::lonratedt::delparameter($idx,'parameter_randompick');      &Apache::lonratedt::delparameter($idx,'parameter_randompick');
  }   }
  if ($ENV{'form.hidprs_'.$idx}) {   if ($env{'form.hidprs_'.$idx}) {
     &Apache::lonratedt::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');      &Apache::lonratedt::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
  } else {   } else {
     &Apache::lonratedt::delparameter($idx,'parameter_hiddenresource');      &Apache::lonratedt::delparameter($idx,'parameter_hiddenresource');
  }   }
  if ($ENV{'form.encprs_'.$idx}) {   if ($env{'form.encprs_'.$idx}) {
     &Apache::lonratedt::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');      &Apache::lonratedt::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
  } else {   } else {
     &Apache::lonratedt::delparameter($idx,'parameter_encrypturl');      &Apache::lonratedt::delparameter($idx,'parameter_encrypturl');
  }   }
   
  if ($ENV{'form.newpos'}) {   if ($env{'form.newpos'}) {
 # change order  # change order
   
     my $newpos=$ENV{'form.newpos'}-1;      my $newpos=$env{'form.newpos'}-1;
     my $currentpos=$ENV{'form.currentpos'}-1;      my $currentpos=$env{'form.currentpos'}-1;
     my $i;      my $i;
     my @neworder=();      my @neworder=();
     if ($newpos>$currentpos) {      if ($newpos>$currentpos) {
Line 359  sub editor { Line 1065  sub editor {
  }   }
 # store the changed version  # store the changed version
   
  ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.sequence');   ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
  if ($fatal) {   if ($fatal) {
     $r->print('<p><font color="red">'.$errtext.'</font></p>');      $r->print('<p><font color="red">'.$errtext.'</font></p>');
     return;      return;
  }   }
   
     }      }
       if ($env{'form.pastemarked'}) {
   # paste resource to end of list
                   my $url=$env{'form.markedcopy_url'};
    my $title=$env{'form.markedcopy_title'};
   # Maps need to be copied first
    if (($url=~/\.(page|sequence)$/) || ($url=~/^\/uploaded\//)) {
       $title=&mt('Copy of').' '.$title;
                       my $newid=$$.time;
       $url=~/^(.+)\.(\w+)$/;
       my $newurl=$1.$newid.'.'.$2;
       my $storefn=$newurl;
                       $storefn=~s/^\/\w+\/\w+\/\w+\///;
       &Apache::loncreatecourse::writefile
    ($env{'request.course.id'},$storefn,
    &Apache::lonnet::getfile($url));
       $url=$newurl;
    }
    $title=~s/\</\&lt\;/g;
    $title=~s/\>/\&gt\;/g;
    $title=~s/\:/\&colon;/g;
    my $ext='false';
    if ($url=~/^http\:\/\//) { $ext='true'; }
    $url=~s/\:/\&colon;/g;
   # Now insert the URL at the bottom
                   my $newidx=&Apache::lonratedt::getresidx($url);
    $Apache::lonratedt::resources[$newidx]=
       $title.':'.$url.':'.$ext.':normal:res';
    $Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx;
   # Store the result
    ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
    if ($fatal) {
       $r->print('<p><font color="red">'.$errtext.'</font></p>');
       return;
    }
   
 # upload a file, if present      }
            if (($ENV{'form.uploaddoc.filename'}) &&              $r->print($upload_output);
                ($ENV{'form.cmd'}=~/^upload_(\w+)/)) {      if ($env{'form.cmd'}) {
     if ( ($folder=~/^$1/) || ($1 eq 'default') ) {                  my ($cmd,$idx)=split(/\_/,$env{'form.cmd'});
 # this is for a course, not a user, so set coursedoc flag  
 # probably the only place in the system where this should be "1"  
       my $url=&Apache::lonnet::userfileupload('uploaddoc',1,'docs');  
               my $ext='false';  
               if ($url=~/^http\:\/\//) { $ext='true'; }  
               $url=~s/\:/\&colon;/g;  
       my $comment=$ENV{'form.comment'};  
               $comment=~s/\</\&lt\;/g;  
               $comment=~s/\>/\&gt\;/g;  
               $comment=~s/\:/\&colon;/g;  
               if ($folder=~/^supplemental/) {  
   $comment=time.'___&&&___'.$ENV{'user.name'}.'___&&&___'.  
       $ENV{'user.domain'}.'___&&&___'.$comment;  
               }  
               my $newidx=$#Apache::lonratedt::resources+1;  
               $Apache::lonratedt::resources[$newidx]=  
                   $comment.':'.$url.':'.$ext.':normal:res';  
               $Apache::lonratedt::order[$#Apache::lonratedt::order+1]=  
                                                               $newidx;         
   
       ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.sequence');  
       if ($fatal) {  
   $r->print('<p><font color="red">'.$errtext.'</font></p>');  
   return;  
       }  
      }  
             }  
     if ($ENV{'form.cmd'}) {  
                 my ($cmd,$idx)=split(/\_/,$ENV{'form.cmd'});  
                 if ($cmd eq 'del') {                  if ($cmd eq 'del') {
     my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]);      my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]);
     if ($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) {      if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
    ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
  &Apache::lonnet::removeuploadedurl($url);   &Apache::lonnet::removeuploadedurl($url);
       } else {
    &Apache::lonratedt::makezombie($Apache::lonratedt::order[$idx]);
     }      }
     for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) {      for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) {
                         $Apache::lonratedt::order[$i]=                          $Apache::lonratedt::order[$i]=
                           $Apache::lonratedt::order[$i+1];                            $Apache::lonratedt::order[$i+1];
                     }                      }
                     $#Apache::lonratedt::order--;                      $#Apache::lonratedt::order--;
                   } elsif ($cmd eq 'cut') {
       my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]);
       &Apache::lonratedt::makezombie($Apache::lonratedt::order[$idx]);
       for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) {
                           $Apache::lonratedt::order[$i]=
                             $Apache::lonratedt::order[$i+1];
                       }
                       $#Apache::lonratedt::order--;
                 } elsif ($cmd eq 'up') {                  } elsif ($cmd eq 'up') {
   if (($idx) && (defined($Apache::lonratedt::order[$idx-1]))) {    if (($idx) && (defined($Apache::lonratedt::order[$idx-1]))) {
                     my $i=$Apache::lonratedt::order[$idx-1];                      my $i=$Apache::lonratedt::order[$idx-1];
Line 425  sub editor { Line 1147  sub editor {
                     $Apache::lonratedt::order[$idx]=$i;                      $Apache::lonratedt::order[$idx]=$i;
    }     }
                 } elsif ($cmd eq 'rename') {                  } elsif ($cmd eq 'rename') {
                       my $ratstr = $Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]];
                     my ($rtitle,@rrest)=split(/\:/,                      my ($rtitle,@rrest)=split(/\:/,
                        $Apache::lonratedt::resources[                         $Apache::lonratedt::resources[
        $Apache::lonratedt::order[$idx]]);         $Apache::lonratedt::order[$idx]]);
                     my $comment=                      my $comment=
                      &HTML::Entities::decode($ENV{'form.title'});                       &HTML::Entities::decode($env{'form.title'});
                     $comment=~s/\</\&lt\;/g;                      $comment=~s/\</\&lt\;/g;
                     $comment=~s/\>/\&gt\;/g;                      $comment=~s/\>/\&gt\;/g;
                     $comment=~s/\:/\&colon;/g;                      $comment=~s/\:/\&colon;/g;
                     $Apache::lonratedt::resources[      if ($comment=~/\S/) {
    $Apache::lonratedt::resources[
        $Apache::lonratedt::order[$idx]]=         $Apache::lonratedt::order[$idx]]=
                              $comment.':'.join(':',@rrest);              $comment.':'.join(':',@rrest);
                           }
                 }                  }
 # Store the changed version  # Store the changed version
  ($errtext,$fatal)=&storemap($coursenum,$coursedom,   ($errtext,$fatal)=&storemap($coursenum,$coursedom,
     $folder.'.sequence');      $folder.'.'.$container);
  if ($fatal) {   if ($fatal) {
     $r->print('<p><font color="red">'.$errtext.'</font></p>');      $r->print('<p><font color="red">'.$errtext.'</font></p>');
     return;      return;
  }   }
             }              }
 # Group import/search  # Group import/search
     if ($ENV{'form.importdetail'}) {      if ($env{'form.importdetail'}) {
  my @imports;   my @imports;
  foreach (split(/\&/,$ENV{'form.importdetail'})) {   foreach (split(/\&/,$env{'form.importdetail'})) {
     if (defined($_)) {      if (defined($_)) {
  my ($name,$url)=split(/\=/,$_);   my ($name,$url)=split(/\=/,$_);
  $name=&Apache::lonnet::unescape($name);   $name=&Apache::lonnet::unescape($name);
Line 459  sub editor { Line 1183  sub editor {
  }   }
 # Store the changed version  # Store the changed version
  ($errtext,$fatal)=group_import($coursenum, $coursedom, $folder,   ($errtext,$fatal)=group_import($coursenum, $coursedom, $folder,
        @imports);         $container,'londocs',@imports);
  if ($fatal) {   if ($fatal) {
     $r->print('<p><font color="red">'.$errtext.'</font></p>');      $r->print('<p><font color="red">'.$errtext.'</font></p>');
     return;      return;
  }   }
             }              }
 # Loading a complete map  # Loading a complete map
    if (($ENV{'form.importmap'}) && ($ENV{'form.loadmap'})) {     if (($env{'form.importmap'}) && ($env{'form.loadmap'})) {
        foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$ENV{'form.importmap'}))) {         foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
                    my $idx=$#Apache::lonratedt::resources;     my ($title,$url,$ext,$type)=split(/\:/,$_);
                    $idx++;                     my $idx=&Apache::lonratedt::getresidx($url);
                    $Apache::lonratedt::resources[$idx]=$_;                     $Apache::lonratedt::resources[$idx]=$_;
                    $Apache::lonratedt::order                     $Apache::lonratedt::order
        [$#Apache::lonratedt::order+1]=$idx;         [$#Apache::lonratedt::order+1]=$idx;
Line 477  sub editor { Line 1201  sub editor {
   
 # Store the changed version  # Store the changed version
        ($errtext,$fatal)=&storemap($coursenum,$coursedom,         ($errtext,$fatal)=&storemap($coursenum,$coursedom,
    $folder.'.sequence');     $folder.'.'.$container);
        if ($fatal) {         if ($fatal) {
    $r->print('<p><font color="red">'.$errtext.'</font></p>');     $r->print('<p><font color="red">'.$errtext.'</font></p>');
    return;     return;
Line 487  sub editor { Line 1211  sub editor {
 # ---------------------------------------------------------------- End commands  # ---------------------------------------------------------------- End commands
 # ---------------------------------------------------------------- Print screen  # ---------------------------------------------------------------- Print screen
         my $idx=0;          my $idx=0;
    my $shown=0;
         $r->print('<table>');          $r->print('<table>');
         foreach (@Apache::lonratedt::order) {          foreach (@Apache::lonratedt::order) {
            my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]);             my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]);
      $name=&Apache::lonratsrv::qtescape($name);
      $url=&Apache::lonratsrv::qtescape($url);
            unless ($name) {  $name=(split(/\//,$url))[-1]; }             unless ($name) {  $name=(split(/\//,$url))[-1]; }
            unless ($name) { next; }             unless ($name) { $idx++; next; }
            $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum));             $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum));
            $idx++;             $idx++;
      $shown++;
         }          }
  unless ($idx) {   unless ($shown) {
     $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');      $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');
  }   }
         $r->print('</table>');          $r->print("\n</table>\n");
    if ($env{'form.markedcopy_url'}) {
       $r->print(<<ENDPASTE);
   <p><form name="pasteform" action="/adm/coursedocs" method="post">
   <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
   <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
   ENDPASTE
               $r->print(
      '<input type="submit" name="pastemarked" value="'.&mt('Paste').
         '" /> '.&Apache::loncommon::filedescription(
    (split(/\./,$env{'form.markedcopy_url'}))[-1]).': '.
         $env{'form.markedcopy_title'});
               if ($container eq 'page') {
    $r->print(<<PAGEINFO);
   <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
   <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
   PAGEINFO
               } else {
    $r->print(<<FOLDERINFO);
   <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
   FOLDERINFO
       }
       $r->print('</form></p>');
    }
       }
   }
   
   sub process_file_upload {
       my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
   # upload a file, if present
       my $parseaction;
      if ($env{'form.parserflag'}) {
           $parseaction = 'parse';
       }
       my $phase_status;
       my $folder=$env{'form.folder'};
       if ($folder eq '') {
           $folder='default';
       }
       if ( ($folder=~/^$uploadcmd/) || ($uploadcmd eq 'default') ) {
           my $errtext='';
           my $fatal=0;
           my $container='sequence';
           if ($env{'form.pagepath'}) {
               $container='page';
           }
           ($errtext,$fatal)=
                 &mapread($coursenum,$coursedom,$folder.'.'.$container);
           if ($#Apache::lonratedt::order<1) {
               $Apache::lonratedt::order[0]=1;
               $Apache::lonratedt::resources[1]='';
           }
           if ($fatal) {
               return 'failed';
           }
           my $destination = 'docs/';
           if ($folder =~ /^supplemental/) {
               $destination = 'supplemental/';
           }
           if (($folder eq 'default') || ($folder eq 'supplemental')) {
               $destination .= 'default/';
           } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
               $destination .=  $2.'/';
           }
   # this is for a course, not a user, so set coursedoc flag
   # probably the only place in the system where this should be "1"
           my $newidx=&Apache::lonratedt::getresidx();
           $destination .= $newidx;
           my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
    $parseaction,$allfiles,
    $codebase);
           my $ext='false';
           if ($url=~/^http\:\/\//) { $ext='true'; }
           $url=~s/\:/\&colon;/g;
           my $comment=$env{'form.comment'};
           $comment=~s/\</\&lt\;/g;
           $comment=~s/\>/\&gt\;/g;
           $comment=~s/\:/\&colon;/g;
           if ($folder=~/^supplemental/) {
                 $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                     $env{'user.domain'}.'___&&&___'.$comment;
           }
   
           $Apache::lonratedt::resources[$newidx]=
                     $comment.':'.$url.':'.$ext.':normal:res';
           $Apache::lonratedt::order[$#Apache::lonratedt::order+1]= $newidx;
           ($errtext,$fatal)=&storemap($coursenum,$coursedom,
       $folder.'.'.$container);
           if ($fatal) {
               $$upload_output .= '<p><font color="red">'.$errtext.'</font></p>';
               return 'failed';
           } else {
               if ($parseaction eq 'parse') {
                   my $total_embedded = keys(%{$allfiles});
                   if ($total_embedded > 0) {
                       my $num = 0;
                       $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />
      <form name="upload_embedded" action="/adm/coursedocs"
                     method="post" enctype="multipart/form-data">
      <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" />   <input type="hidden" name="cmd" value="upload_embedded" />
      <input type="hidden" name="newidx" value="'.$newidx.'" />
      <input type="hidden" name="primaryurl" value="'.&Apache::lonnet::escape($url).'" />
      <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
                       $$upload_output .= '<b>Upload embedded files</b>:<br />
      <table>';
                       foreach my $embed_file (keys(%{$allfiles})) {
                           $$upload_output .= '<tr><td>'.$embed_file.
             '<input name="embedded_item_'.$num.'" type="file" />
              <input name="embedded_orig_'.$num.'" type="hidden" value="'.&Apache::lonnet::escape($embed_file).'" />';
                           my $attrib;
                           if (@{$$allfiles{$embed_file}} > 1) {
                               $attrib = join(':',@{$$allfiles{$embed_file}});
                           } else {
                               $attrib = $$allfiles{$embed_file}[0];
                           }
                           $$upload_output .=
              '<input name="embedded_attrib_'.$num.'" type="hidden" value="'.$attrib.'" />';
                           if (exists($$codebase{$embed_file})) {
                               $$upload_output .= 
             '<input name="codebase_'.$num.'" type="hidden" value="'.&Apache::lonnet::escape($$codebase{$embed_file}).'" />';
                           }
                           $$upload_output .= '</td></tr>';
                           $num ++;
                       }
                       $phase_status = 'phasetwo';
                       $$upload_output .= '</table><br />
      <input type ="submit" value="Complete upload" />
      </form>';
                   } else {
                       $$upload_output .= 'No embedded items identified<br />';
                   }
               }
           }
     }      }
       return $phase_status;
   }
   
   sub process_secondary_uploads {
       my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
       my $folder=$env{'form.folder'};
       my $destination = 'docs/';
       if ($folder =~ /^supplemental/) {
           $destination = 'supplemental/';
       }
       if (($folder eq 'default') || ($folder eq 'supplemental')) {
           $destination .= 'default/';
       } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
           $destination .=  $2.'/';
       }
       $destination .= $newidx;
       my ($url,$filename);
       $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
       ($filename) = ($url =~ m-^/uploaded/$coursedom/$coursenum/$destination/(.+)$-);
       return $filename;
 }  }
   
 # --------------------------------------------------------------- An entry line  # --------------------------------------------------------------- An entry line
Line 511  sub entryline { Line 1391  sub entryline {
      &Apache::lonnet::unescape($title)),'"<>&\'');       &Apache::lonnet::unescape($title)),'"<>&\'');
     my $renametitle=$title;      my $renametitle=$title;
     my $foldertitle=$title;      my $foldertitle=$title;
       my $pagetitle=$title;
     my $orderidx=$Apache::lonratedt::order[$index];      my $orderidx=$Apache::lonratedt::order[$index];
     if ($title=~ /^(\d+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(.*)$/ ) {       if ($title=~ /^(\d+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(.*)$/ ) { 
  $foldertitle=&Apache::lontexconvert::msgtexconverted($4);   $foldertitle=&Apache::lontexconvert::msgtexconverted($4);
Line 522  sub entryline { Line 1403  sub entryline {
     $renametitle=~s/\&quot\;/\\\"/g;      $renametitle=~s/\&quot\;/\\\"/g;
     my $line='<tr>';      my $line='<tr>';
 # Edit commands  # Edit commands
       my $container;
     my $folderpath;      my $folderpath;
     if ($ENV{'form.folderpath'}) {      if ($env{'form.folderpath'}) {
  $folderpath=&Apache::lonnet::escape($ENV{'form.folderpath'});          $container = 'sequence';
  # $htmlfoldername=&HTML::Entities::encode($ENV{'form.foldername'},'<>&"');   $folderpath=&Apache::lonnet::escape($env{'form.folderpath'});
    # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
       }
       my ($pagepath,$pagesymb);
       if ($env{'form.pagepath'}) {
           $container = 'page';
           $pagepath=&Apache::lonnet::escape($env{'form.pagepath'});
           $pagesymb=&Apache::lonnet::escape($env{'form.pagesymb'});
       }
       my $cpinfo='';
       if ($env{'form.markedcopy_url'}) {
          $cpinfo='&markedcopy_url='.
                  &Apache::lonnet::escape($env{'form.markedcopy_url'}).
                  '&markedcopy_title='.
                  &Apache::lonnet::escape($env{'form.markedcopy_title'});
     }      }
     if ($allowed) {      if ($allowed) {
  my $incindex=$index+1;   my $incindex=$index+1;
  my $selectbox='';   my $selectbox='';
  if ($folder!~/^supplemental/) {   if (($folder!~/^supplemental/) &&
       ($#Apache::lonratedt::order>0) && 
       ((split(/\:/,
        $Apache::lonratedt::resources[$Apache::lonratedt::order[0]]))[1] 
        ne '') && 
       ((split(/\:/,
        $Apache::lonratedt::resources[$Apache::lonratedt::order[1]]))[1] 
        ne '')) {
     $selectbox=      $selectbox=
  '<input type="hidden" name="currentpos" value="'.$incindex.'" />'.   '<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
  '<select name="newpos" onChange="this.form.submit()">';   '<select name="newpos" onChange="this.form.submit()">';
Line 547  sub entryline { Line 1450  sub entryline {
                 'up' => 'Move Up',                  'up' => 'Move Up',
  'dw' => 'Move Down',   'dw' => 'Move Down',
  'rm' => 'Remove',   'rm' => 'Remove',
  'rn' => 'Rename');                  'ct' => 'Cut',
  $line.=(<<END);   'rn' => 'Rename',
    'cp' => 'Copy');
    my $nocopy=0;
           if ($url=~/\.(page|sequence)$/) {
       foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) {
    my ($title,$url,$ext,$type)=split(/\:/,$_);
    if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
       $nocopy=1;
       last;
    }
       }
    }
           my $copylink='&nbsp;';
           if ($env{'form.pagepath'}) {
              unless ($nocopy) {
                  $copylink=(<<ENDCOPY);
   <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>
   <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
   ENDCOPY
               }
               $line.=(<<END);
 <form name="entry_$index" action="/adm/coursedocs" method="post">  <form name="entry_$index" action="/adm/coursedocs" method="post">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
   <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
   <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
   <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
 <input type="hidden" name="setparms" value="$orderidx" />  <input type="hidden" name="setparms" value="$orderidx" />
 <td><table border='0' cellspacing='2' cellpadding='0'>  <td><table border='0' cellspacing='2' cellpadding='0'>
 <tr><td bgcolor="#DDDDDD">  <tr><td bgcolor="#DDDDDD">
 <a href='/adm/coursedocs?cmd=up_$index&folderpath=$folderpath'>  <a href='/adm/coursedocs?cmd=up_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
 <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>  <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
 <tr><td bgcolor="#DDDDDD">  <tr><td bgcolor="#DDDDDD">
 <a href='/adm/coursedocs?cmd=down_$index&folderpath=$folderpath'>  <a href='/adm/coursedocs?cmd=down_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
 <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>  <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
 </table></td>  </table></td>
 <td>$selectbox  <td>$selectbox
 </td><td bgcolor="#DDDDDD">  </td><td bgcolor="#DDDDDD">
 <a href='javascript:removeres("$folderpath","$index","$renametitle");'>  <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#990000">$lt{'rm'}</font></a>  <font size="-2" color="#990000">$lt{'rm'}</font></a>
 <a href='javascript:changename("$folderpath","$index","$renametitle");'>  <a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#009900">$lt{'rn'}</font></a></td>  <font size="-2" color="#550044">$lt{'ct'}</font></a>
   <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>
   <font size="-2" color="#009900">$lt{'rn'}</font></a>
   $copylink
 END  END
           } else {
              unless ($nocopy) {
                  $copylink=(<<ENDCOPY);
   <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>
   <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
   ENDCOPY
               }
               $line.=(<<END); 
   <form name="entry_$index" action="/adm/coursedocs" method="post">
   <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
   <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
   <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
   <input type="hidden" name="setparms" value="$orderidx" />
   <td><table border='0' cellspacing='2' cellpadding='0'>
   <tr><td bgcolor="#DDDDDD">
   <a href='/adm/coursedocs?cmd=up_$index&folderpath=$folderpath$cpinfo'>
   <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
   <tr><td bgcolor="#DDDDDD">
   <a href='/adm/coursedocs?cmd=down_$index&folderpath=$folderpath$cpinfo'>
   <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
   </table></td>
   <td>$selectbox
   </td><td bgcolor="#DDDDDD">
   <a href='javascript:removeres("$folderpath","$index","$renametitle","sequence");'>
   <font size="-2" color="#990000">$lt{'rm'}</font></a>
   <a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
   <font size="-2" color="#550044">$lt{'ct'}</font></a>
   <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'>
   <font size="-2" color="#009900">$lt{'rn'}</font></a>
   $copylink
   END
           }
     }      }
 # Figure out what kind of a resource this is  # Figure out what kind of a resource this is
     my ($extension)=($url=~/\.(\w+)$/);      my ($extension)=($url=~/\.(\w+)$/);
     my $uploaded=($url=~/^\/*uploaded\//);      my $uploaded=($url=~/^\/*uploaded\//);
     my $icon=&Apache::loncommon::icon($url);      my $icon=&Apache::loncommon::icon($url);
     my $isfolder=0;      my $isfolder=0;
       my $ispage=0;
     my $folderarg;      my $folderarg;
       my $pagearg;
       my $pagefile;
     if ($uploaded) {      if ($uploaded) {
  if ($extension eq 'sequence') {   if ($extension eq 'sequence') {
     $icon=$iconpath.'/folder_closed.gif';      $icon=$iconpath.'/folder_closed.gif';
Line 581  END Line 1545  END
     $url='/adm/coursedocs?';      $url='/adm/coursedocs?';
     $folderarg=$1;      $folderarg=$1;
     $isfolder=1;      $isfolder=1;
           } elsif ($extension eq 'page') {
               $icon=$iconpath.'/page.gif';
               $url=~/$coursenum\/([\/\w]+)\.page$/;
               $pagearg=$1;
               $url='/adm/coursedocs?';
               $ispage=1;
  } else {   } else {
     &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);      &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
  }   }
     }      }
     $url=~s/^http\&colon\;\/\//\/adm\/wrapper\/ext\//;      $url=~s-^http(\&colon\;|:)//-/adm/wrapper/ext/-;
     if ((!$isfolder) && ($residx) && ($folder!~/supplemental/)) {      if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {
  my $symb=&Apache::lonnet::symbclean(   my $symb=&Apache::lonnet::symbclean(
           &Apache::lonnet::declutter('uploaded/'.            &Apache::lonnet::declutter('uploaded/'.
            $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.             $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
            $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.$folder.             $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.
            '.sequence').             '.sequence').
            '___'.$residx.'___'.             '___'.$residx.'___'.
    &Apache::lonnet::declutter($url));     &Apache::lonnet::declutter($url));
Line 606  END Line 1576  END
     } elsif ($url!~/\.(sequence|page)$/) {      } elsif ($url!~/\.(sequence|page)$/) {
  $url='/adm/coursedocs/showdoc'.$url;   $url='/adm/coursedocs/showdoc'.$url;
     }      }
    } elsif ($url=~m|^/ext/|) { 
       $url='/adm/wrapper'.$url;
  }   }
  $url.=(($url=~/\?/)?'&':'?').'symb='.&Apache::lonnet::escape($symb);   $url.=(($url=~/\?/)?'&':'?').'symb='.&Apache::lonnet::escape($symb);
    if ($container eq 'page') {
       my $symb=$env{'form.pagesymb'};
           
       $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
       $url.=(($url=~/\?/)?'&':'?').'symb='.&Apache::lonnet::escape($symb);
    }
     }      }
     my $parameterset='&nbsp;';      my $parameterset='&nbsp;';
     if ($isfolder) {      if ($isfolder || $extension eq 'sequence') {
  my $foldername=&Apache::lonnet::escape($foldertitle);   my $foldername=&Apache::lonnet::escape($foldertitle);
  my $folderpath=$ENV{'form.folderpath'};   my $folderpath=$env{'form.folderpath'};
  if ($folderpath) { $folderpath.='&' };   if ($folderpath) { $folderpath.='&' };
  $folderpath.=$folderarg.'&'.$foldername;   $folderpath.=$folderarg.'&'.$foldername;
  $url.='folderpath='.&Apache::lonnet::escape($folderpath);   $url.='folderpath='.&Apache::lonnet::escape($folderpath).$cpinfo;
  $parameterset=&mt('Randomly Pick: ').   $parameterset='<label>'.&mt('Randomly Pick: ').
     '<input type="text" size="4" name="randpick_'.$orderidx.'" value="'.      '<input type="text" size="4" onChange="this.form.submit()" name="randpick_'.$orderidx.'" value="'.
     (&Apache::lonratedt::getparameter($orderidx,'parameter_randompick'))[0].'" />';      (&Apache::lonratedt::getparameter($orderidx,
                                                 'parameter_randompick'))[0].
                                                 '" />'.
   '<font size="-2"><a href="javascript:void(0)">'.&mt('Store').'</a></font></label>';
          
       }
       if ($ispage) {
           my $pagename=&Apache::lonnet::escape($pagetitle);
           my $pagepath;
           my $folderpath=$env{'form.folderpath'};
           if ($folderpath) { $pagepath = $folderpath.'&' };
           $pagepath.=$pagearg.'&'.$pagename;
    my $symb=$env{'form.pagesymb'};
    if (!$symb) {
       my $path='uploaded/'.
    $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
    $env{'course.'.$env{'request.course.id'}.'.num'}.'/';
       $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
          $residx,
          $path.$pagearg.'.page');
    }
    $url.='pagepath='.&Apache::lonnet::escape($pagepath).
       '&pagesymb='.&Apache::lonnet::escape($symb).$cpinfo;
     }      }
     $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon.      $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon.
  '" border="0"></a></td>'.   '" border="0"></a></td>'.
         "<td bgcolor='#FFFFBB'><a href='$url'>$title</a></td>";          "<td bgcolor='#FFFFBB'><a href=\"$url\">$title</a></td>";
     if (($allowed) && ($folder!~/^supplemental/)) {      if (($allowed) && ($folder!~/^supplemental/)) {
   my %lt=&Apache::lonlocal::texthash(    my %lt=&Apache::lonlocal::texthash(
        'hd' => 'Hidden',         'hd' => 'Hidden',
        'ec' => 'URL hidden',         'ec' => 'URL hidden');
        'sp' => 'Store Parameters');  
  my $enctext=   my $enctext=
     ((&Apache::lonratedt::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');      ((&Apache::lonratedt::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');
  my $hidtext=   my $hidtext=
     ((&Apache::lonratedt::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');      ((&Apache::lonratedt::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
  $line.=(<<ENDPARMS);   $line.=(<<ENDPARMS);
 <td bgcolor="#BBBBFF"><font size='-2'>  <td bgcolor="#BBBBFF"><font size='-2'>
 <input type="checkbox" name="hidprs_$orderidx" $hidtext/> $lt{'hd'}</td>  <nobr><label><input type="checkbox" name="hidprs_$orderidx" onClick="this.form.submit()" $hidtext /> $lt{'hd'}</label></nobr></td>
 <td bgcolor="#BBBBFF"><font size='-2'>  <td bgcolor="#BBBBFF"><font size='-2'>
 <input type="checkbox" name="encprs_$orderidx" $enctext/> $lt{'ec'}</td>  <nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
 <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>  <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
 <td bgcolor="#BBBBFF"><font size='-2'>  
 <input type="submit" value="$lt{'sp'}" />  
 </font></td>  
 ENDPARMS  ENDPARMS
     }      }
     $line.="</form></tr>";      $line.="</form></tr>";
Line 650  ENDPARMS Line 1646  ENDPARMS
 # ---------------------------------------------------------------- tie the hash  # ---------------------------------------------------------------- tie the hash
   
 sub tiehash {  sub tiehash {
       my ($mode)=@_;
     $hashtied=0;      $hashtied=0;
     if ($ENV{'request.course.fn'}) {      if ($env{'request.course.fn'}) {
         if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.".db",   if ($mode eq 'write') {
             &GDBM_READER(),0640)) {      if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
       &GDBM_WRCREAT(),0640)) {
                   $hashtied=2;
       }
    } else {
       if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
       &GDBM_READER(),0640)) {
                 $hashtied=1;                  $hashtied=1;
         }      }
    }
     }          }    
 }  }
   
Line 668  sub untiehash { Line 1672  sub untiehash {
   
 sub checkonthis {  sub checkonthis {
     my ($r,$url,$level,$title)=@_;      my ($r,$url,$level,$title)=@_;
       $url=&Apache::lonnet::unescape($url);
     $alreadyseen{$url}=1;      $alreadyseen{$url}=1;
     $r->rflush();      $r->rflush();
     if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {      if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
Line 680  sub checkonthis { Line 1685  sub checkonthis {
        if ($url=~/^\/res\//) {         if ($url=~/^\/res\//) {
   my $result=&Apache::lonnet::repcopy(    my $result=&Apache::lonnet::repcopy(
                               &Apache::lonnet::filelocation('',$url));                                &Apache::lonnet::filelocation('',$url));
           if ($result==OK) {            if ($result eq 'ok') {
              $r->print('<font color="green">'.&mt('ok').'</font>');               $r->print('<font color="green">'.&mt('ok').'</font>');
              $r->rflush();               $r->rflush();
              &Apache::lonnet::countacc($url);               &Apache::lonnet::countacc($url);
Line 692  sub checkonthis { Line 1697  sub checkonthis {
                      $r->print('&nbsp;');                       $r->print('&nbsp;');
                  }                   }
                  $r->print('- '.&mt('Rendering').': ');                   $r->print('- '.&mt('Rendering').': ');
                  my $oldpath=$ENV{'request.filename'};   my ($errorcount,$warningcount)=split(/:/,
                  $ENV{'request.filename'}=&Apache::lonnet::filelocation('',$url);         &Apache::lonnet::ssi_body($url,
                  &Apache::lonxml::xmlparse($r,'web',         ('grade_target'=>'web',
                    &Apache::lonnet::getfile(   'return_only_error_and_warning_counts' => 1)));
                     &Apache::lonnet::filelocation('',$url)));                   if (($errorcount) ||
  undef($Apache::lonhomework::parsing_a_problem);                       ($warningcount)) {
  $ENV{'request.filename'}=$oldpath;       if ($errorcount) {
                  if (($Apache::lonxml::errorcount) ||  
                      ($Apache::lonxml::warningcount)) {  
      if ($Apache::lonxml::errorcount) {  
                         $r->print('<img src="/adm/lonMisc/bomb.gif" /><font color="red"><b>'.                          $r->print('<img src="/adm/lonMisc/bomb.gif" /><font color="red"><b>'.
   $Apache::lonxml::errorcount.' '.    $errorcount.' '.
   &mt('error(s)').'</b></font> ');    &mt('error(s)').'</b></font> ');
                      }                       }
      if ($Apache::lonxml::warningcount) {       if ($warningcount) {
                         $r->print('<font color="blue">'.                          $r->print('<font color="blue">'.
   $Apache::lonxml::warningcount.' '.    $warningcount.' '.
   &mt('warning(s)').'</font>');    &mt('warning(s)').'</font>');
                      }                       }
                  } else {                   } else {
Line 723  sub checkonthis { Line 1725  sub checkonthis {
                     &checkonthis($r,$_,$level+1);                      &checkonthis($r,$_,$level+1);
                  }                   }
              }               }
           } elsif ($result==HTTP_SERVICE_UNAVAILABLE) {            } elsif ($result eq 'unavailable') {
              $r->print('<font color="red"><b>'.&mt('connection down').'</b></font>');               $r->print('<font color="red"><b>'.&mt('connection down').'</b></font>');
           } elsif ($result==HTTP_NOT_FOUND) {            } elsif ($result eq 'not_found') {
       unless ($url=~/\$/) {        unless ($url=~/\$/) {
   $r->print('<font color="red"><b>'.&mt('not found').'</b></font>');    $r->print('<font color="red"><b>'.&mt('not found').'</b></font>');
       } else {        } else {
Line 740  sub checkonthis { Line 1742  sub checkonthis {
   
   
 #  #
   # ----------------------------------------------------------------- List Symbs
   # 
   sub list_symbs {
      my $r=shift; 
      my $html=&Apache::lonxml::xmlbegin();
      $r->print($html.'<head><title>Symb List</title></head>'.
                 &Apache::loncommon::bodytag('Symb List'));
      my $navmap = Apache::lonnavmaps::navmap->new();
      $r->print("<pre>\n");
      foreach my $res ($navmap->retrieveResources()) {
          $r->print($res->compTitle()."\t".$res->symb()."\n");
      }
      $r->print("\n</pre>\n");
      $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>');
   }
   
   
   #
 # -------------------------------------------------------------- Verify Content  # -------------------------------------------------------------- Verify Content
 #   # 
 sub verifycontent {  sub verifycontent {
    my $r=shift;      my $r=shift; 
    my $loaderror=&Apache::lonnet::overloaderror($r);     my $loaderror=&Apache::lonnet::overloaderror($r);
    if ($loaderror) { return $loaderror; }     if ($loaderror) { return $loaderror; }
      my $html=&Apache::lonxml::xmlbegin();
    $r->print('<html><head><title>Verify Content</title></head>'.     $r->print($html.'<head><title>Verify Content</title></head>'.
               &Apache::loncommon::bodytag('Verify Course Documents'));                &Apache::loncommon::bodytag('Verify Course Documents'));
    $hashtied=0;     $hashtied=0;
    undef %alreadyseen;     undef %alreadyseen;
    %alreadyseen=();     %alreadyseen=();
    &tiehash();     &tiehash();
    foreach (keys %hash) {     foreach (keys %hash) {
        if (($_=~/^src\_(.+)$/) && (!$alreadyseen{$hash{$_}})) {         if ($hash{$_}=~/\.(page|sequence)$/) {
      if (($_=~/^src_/) && ($alreadyseen{&Apache::lonnet::unescape($hash{$_})})) {
          $r->print('<hr /><font color="red">'.
    &mt('The following sequence or page is included more than once in your course: ').
    &Apache::lonnet::unescape($hash{$_}).'</font><br />'.
    &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));
      }
          }
          if (($_=~/^src\_(.+)$/) && (!$alreadyseen{&Apache::lonnet::unescape($hash{$_})})) {
            &checkonthis($r,$hash{$_},0,$hash{'title_'.$1});             &checkonthis($r,$hash{$_},0,$hash{'title_'.$1});
        }         }
    }     }
Line 763  sub verifycontent { Line 1791  sub verifycontent {
      &mt('Return to DOCS').'</a>');       &mt('Return to DOCS').'</a>');
 }  }
   
   
 # -------------------------------------------------------------- Check Versions  # -------------------------------------------------------------- Check Versions
   
   sub devalidateversioncache {
       my $src=shift;
       &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
     &Apache::lonnet::clutter($src));
   }
   
 sub checkversions {  sub checkversions {
     my $r=shift;      my $r=shift;
     $r->print('<html><head><title>Check Versions</title></head>'.      my $html=&Apache::lonxml::xmlbegin();
       $r->print($html.'<head><title>Check Versions</title></head>'.
               &Apache::loncommon::bodytag('Check Course Document Versions'));                &Apache::loncommon::bodytag('Check Course Document Versions'));
     my $header='';      my $header='';
     my $startsel='';      my $startsel='';
Line 779  sub checkversions { Line 1815  sub checkversions {
     my $starttime=0;      my $starttime=0;
     my $haschanged=0;      my $haschanged=0;
     my %setversions=&Apache::lonnet::dump('resourceversions',      my %setversions=&Apache::lonnet::dump('resourceversions',
   $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},    $env{'course.'.$env{'request.course.id'}.'.domain'},
   $ENV{'course.'.$ENV{'request.course.id'}.'.num'});    $env{'course.'.$env{'request.course.id'}.'.num'});
   
     $hashtied=0;      $hashtied=0;
     &tiehash();      &tiehash();
     my %newsetversions=();      my %newsetversions=();
     if ($ENV{'form.setmostrecent'}) {      if ($env{'form.setmostrecent'}) {
  $haschanged=1;   $haschanged=1;
  foreach (keys %hash) {   foreach (keys %hash) {
     if ($_=~/^ids\_(\/res\/.+)$/) {      if ($_=~/^ids\_(\/res\/.+)$/) {
  $newsetversions{$1}='mostrecent';   $newsetversions{$1}='mostrecent';
                   &devalidateversioncache($1);
     }      }
  }   }
     } elsif ($ENV{'form.setcurrent'}) {      } elsif ($env{'form.setcurrent'}) {
  $haschanged=1;   $haschanged=1;
  foreach (keys %hash) {   foreach (keys %hash) {
     if ($_=~/^ids\_(\/res\/.+)$/) {      if ($_=~/^ids\_(\/res\/.+)$/) {
  my $getvers=&Apache::lonnet::getversion($1);   my $getvers=&Apache::lonnet::getversion($1);
  if ($getvers>0) {   if ($getvers>0) {
     $newsetversions{$1}=$getvers;      $newsetversions{$1}=$getvers;
       &devalidateversioncache($1);
  }   }
     }      }
  }   }
     } elsif ($ENV{'form.setversions'}) {      } elsif ($env{'form.setversions'}) {
  $haschanged=1;   $haschanged=1;
  foreach (keys %ENV) {   foreach (keys %env) {
     if ($_=~/^form\.set_version_(.+)$/) {      if ($_=~/^form\.set_version_(.+)$/) {
  my $src=$1;   my $src=$1;
  if (($ENV{$_}) && ($ENV{$_} ne $setversions{$src})) {   if (($env{$_}) && ($env{$_} ne $setversions{$src})) {
     $newsetversions{$src}=$ENV{$_};      $newsetversions{$src}=$env{$_};
       &devalidateversioncache($src);
  }   }
     }      }
  }   }
     }      }
     if ($haschanged) {      if ($haschanged) {
         if (&Apache::lonnet::put('resourceversions',\%newsetversions,          if (&Apache::lonnet::put('resourceversions',\%newsetversions,
   $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},    $env{'course.'.$env{'request.course.id'}.'.domain'},
   $ENV{'course.'.$ENV{'request.course.id'}.'.num'}) eq 'ok') {    $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
     $r->print('<h1>'.&mt('Your Version Settings have been Stored').'</h1>');      $r->print('<h1>'.&mt('Your Version Settings have been Stored').'</h1>');
  } else {   } else {
     $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Store your Version Settings').'</font></h1>');      $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Store your Version Settings').'</font></h1>');
  }   }
  &changewarning($r,'');   &mark_hash_old();
     }      }
     if ($ENV{'form.timerange'} eq 'all') {      &changewarning($r,'');
       if ($env{'form.timerange'} eq 'all') {
 # show all documents  # show all documents
  $header=&mt('All Documents in Course');   $header=&mt('All Documents in Course');
  $allsel=1;   $allsel=1;
Line 836  sub checkversions { Line 1876  sub checkversions {
     } else {      } else {
 # show documents which changed  # show documents which changed
  %changes=&Apache::lonnet::dump   %changes=&Apache::lonnet::dump
  ('versionupdate',$ENV{'course.'.$ENV{'request.course.id'}.'.domain'},   ('versionupdate',$env{'course.'.$env{'request.course.id'}.'.domain'},
                      $ENV{'course.'.$ENV{'request.course.id'}.'.num'});                       $env{'course.'.$env{'request.course.id'}.'.num'});
  my $firstkey=(keys %changes)[0];   my $firstkey=(keys %changes)[0];
  unless ($firstkey=~/^error\:/) {   unless ($firstkey=~/^error\:/) {
     unless ($ENV{'form.timerange'}) {      unless ($env{'form.timerange'}) {
  $ENV{'form.timerange'}=604800;   $env{'form.timerange'}=604800;
     }      }
     my $seltext=&mt('during the last').' '.$ENV{'form.timerange'}.' '      my $seltext=&mt('during the last').' '.$env{'form.timerange'}.' '
  .&mt('seconds');   .&mt('seconds');
     if ($ENV{'form.timerange'}==-1) {      if ($env{'form.timerange'}==-1) {
  $seltext='since start of course';   $seltext='since start of course';
  $startsel='selected';   $startsel='selected';
  $ENV{'form.timerange'}=time;   $env{'form.timerange'}=time;
     }      }
     $starttime=time-$ENV{'form.timerange'};      $starttime=time-$env{'form.timerange'};
     if ($ENV{'form.timerange'}==2592000) {      if ($env{'form.timerange'}==2592000) {
  $seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';   $seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
  $monthsel='selected';   $monthsel='selected';
     } elsif ($ENV{'form.timerange'}==604800) {      } elsif ($env{'form.timerange'}==604800) {
  $seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';   $seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
  $weeksel='selected';   $weeksel='selected';
     } elsif ($ENV{'form.timerange'}==86400) {      } elsif ($env{'form.timerange'}==86400) {
  $seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';   $seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
  $daysel='selected';   $daysel='selected';
     }      }
Line 867  sub checkversions { Line 1907  sub checkversions {
  }   }
     }      }
     %setversions=&Apache::lonnet::dump('resourceversions',      %setversions=&Apache::lonnet::dump('resourceversions',
   $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},    $env{'course.'.$env{'request.course.id'}.'.domain'},
   $ENV{'course.'.$ENV{'request.course.id'}.'.num'});    $env{'course.'.$env{'request.course.id'}.'.num'});
     my %lt=&Apache::lonlocal::texthash      my %lt=&Apache::lonlocal::texthash
       ('st' => 'Version changes since start of Course',        ('st' => 'Version changes since start of Course',
        'lm' => 'Version changes since last Month',         'lm' => 'Version changes since last Month',
Line 942  ENDHEADERS Line 1982  ENDHEADERS
 # Set version  # Set version
     $r->print(&Apache::loncommon::select_form($setversions{$linkurl},      $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
       'set_version_'.$linkurl,        'set_version_'.$linkurl,
       ('' => '',        ('select_form_order' =>
          ['',1..$currentversion,'mostrecent'],
          '' => '',
        'mostrecent' => 'most recent',         'mostrecent' => 'most recent',
        map {$_,$_} (1..$currentversion))));         map {$_,$_} (1..$currentversion))));
     $r->print('</nobr></td></tr><tr><td></td>');      $r->print('</nobr></td></tr><tr><td></td>');
Line 1003  ENDHEADERS Line 2045  ENDHEADERS
     &untiehash();      &untiehash();
 }  }
   
   sub mark_hash_old {
       my $retie_hash=0;
       if ($hashtied) {
    $retie_hash=1;
    &untiehash();
       }
       &tiehash('write');
       $hash{'old'}=1;
       &untiehash();
       if ($retie_hash) { &tiehash(); }
   }
   
   sub is_hash_old {
       my $untie_hash=0;
       if (!$hashtied) {
    $untie_hash=1;
    &tiehash();
       }
       my $return=$hash{'old'};
       if ($untie_hash) { &untiehash(); }
       return $return;
   }
   
 sub changewarning {  sub changewarning {
     my ($r,$postexec)=@_;      my ($r,$postexec,$message,$url)=@_;
     $r->print(      if (!&is_hash_old()) { return; }
 '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'.       my $pathvar='folderpath';
 '<form method="post" action="/adm/roles" target="loncapaclient">'.      my $path=&Apache::lonnet::escape($env{'form.folderpath'});
 '<input type="hidden" name="orgurl" value="/adm/coursedocs?folderpath='.      if (!defined($url)) {
 &Apache::lonnet::escape($ENV{'form.folderpath'}).   if (defined($env{'form.pagepath'})) {
       $pathvar='pagepath';
       $path=&Apache::lonnet::escape($env{'form.pagepath'});
       $path.='&amp;pagesymb='.&Apache::lonnet::escape($env{'form.pagesymb'});
    }
    $url='/adm/coursedocs?'.$pathvar.'='.$path;
       }
       if (!defined($message)) {
    $message='Changes will become active for your current session after [_1], or the next time you log in.';
       }
       $r->print("\n\n".
   '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n". 
   '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
   '<input type="hidden" name="orgurl" value="'.$url.
 '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.  '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.
 &mt('Changes will become active for your current session after').  &mt($message,' <input type="hidden" name="'.
 ' <input type="hidden" name="'.      $env{'request.role'}.'" value="1" /><input type="button" value="'.
 $ENV{'request.role'}.'" value="1" /><input type="button" value="'.      &mt('re-initializing course').'" onClick="reinit(this.form)" />').
 &mt('re-initializing course').'" onClick="reinit(this.form)"/>'.&mt(', or the next time you log in.').  $help{'Caching'}.'</font></h3></form>'."\n\n");
 $help{'Caching'}.'</font></h3></form>');  
 }  }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
Line 1026  sub handler { Line 2103  sub handler {
     return OK if $r->header_only;      return OK if $r->header_only;
   
 # --------------------------------------------- Initialize help topics for this  # --------------------------------------------- Initialize help topics for this
   foreach ('Adding_Course_Doc','Main_Course_Documents',      foreach ('Adding_Course_Doc','Main_Course_Documents',
            'Adding_External_Resource','Navigate_Content',       'Adding_External_Resource','Navigate_Content',
            'Adding_Folders','Docs_Overview', 'Load_Map',       'Adding_Folders','Docs_Overview', 'Load_Map',
            'Supplemental', 'Score_Upload_Form',       'Supplemental','Score_Upload_Form','Adding_Pages',
            'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',       'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
    'Check_Resource_Versions','Verify_Content') {       'Check_Resource_Versions','Verify_Content') {
       $help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_);   $help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_);
   }      }
     # Composite help files      # Composite help files
     $help{'Syllabus'} = &Apache::loncommon::help_open_topic(      $help{'Syllabus'} = &Apache::loncommon::help_open_topic(
     'Docs_About_Syllabus,Docs_Editing_Templated_Pages');      'Docs_About_Syllabus,Docs_Editing_Templated_Pages');
Line 1046  sub handler { Line 2123  sub handler {
     $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(      $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
   'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');    'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');      $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
    
   if ($ENV{'form.verify'}) {  # does this user have privileges to modify docs
       my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
   
     if ($allowed && $env{'form.verify'}) {
       &verifycontent($r);        &verifycontent($r);
   } elsif ($ENV{'form.versions'}) {    } elsif ($allowed && $env{'form.listsymbs'}) {
         &list_symbs($r);
     } elsif ($allowed && $env{'form.versions'}) {
       &checkversions($r);        &checkversions($r);
   } elsif ($ENV{'form.dumpcourse'}) {    } elsif ($allowed && $env{'form.dumpcourse'}) {
       &dumpcourse($r);        &dumpcourse($r);
     } elsif ($allowed && $env{'form.exportcourse'}) {
         &exportcourse($r);
   } else {    } else {
 # is this a standard course?  # is this a standard course?
   
     my $standard=($ENV{'request.course.uri'}=~/^\/uploaded\//);      my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
     my $forcestandard;      my $forcestandard = 0;
     my $forcesupplement;      my $forcesupplement;
     my $script='';      my $script='';
     my $allowed;  
     my $events='';      my $events='';
     my $showdoc=0;      my $showdoc=0;
       my $containertag;
       my $uploadtag;
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
     ['folderpath']);      ['folderpath','pagepath','pagesymb','markedcopy_url','markedcopy_title']);
     if ($ENV{'form.folderpath'}) {      if ($env{'form.folderpath'}) {
  my (@folderpath)=split('&',$ENV{'form.folderpath'});   my (@folderpath)=split('&',$env{'form.folderpath'});
  $ENV{'form.foldername'}=&Apache::lonnet::unescape(pop(@folderpath));   $env{'form.foldername'}=&Apache::lonnet::unescape(pop(@folderpath));
  $ENV{'form.folder'}=pop(@folderpath);   $env{'form.folder'}=pop(@folderpath);
     }       }
       if ($env{'form.pagepath'}) {
           my (@pagepath)=split('&',$env{'form.pagepath'});
           $env{'form.pagename'}=&Apache::lonnet::unescape(pop(@pagepath));
           $env{'form.folder'}=pop(@pagepath);
           $containertag = '<input type="hidden" name="pagepath" value="" />'.
       '<input type="hidden" name="pagesymb" value="" />';
           $uploadtag = '<input type="hidden" name="pagepath" value="'.$env{'form.pagepath'}.'" />'.
       '<input type="hidden" name="pagesymb" value="'.$env{'form.pagesymb'}.'" />';
       }
     if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {      if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
        $showdoc='/'.$1;         $showdoc='/'.$1;
     }      }
     unless ($showdoc) { # got called from remote      unless ($showdoc) { # got called from remote
        $forcestandard=($ENV{'form.folder'}=~/^default_/);         if (($env{'form.folder'}=~/^default_/) || 
        $forcesupplement=($ENV{'form.folder'}=~/^supplemental_/);            ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
              $forcestandard = 1;
          } 
          $forcesupplement=($env{'form.folder'}=~/^supplemental_/);
   
 # does this user have privileges to post, etc?  
        $allowed=&Apache::lonnet::allowed('mdc',$ENV{'request.course.id'});  
        if ($allowed) {          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 1091  sub handler { Line 2186  sub handler {
     }      }
   
 # get course data  # get course data
     my $coursenum=$ENV{'course.'.$ENV{'request.course.id'}.'.num'};      my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
     my $coursedom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};      my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
   
 # get personal data  # get personal data
     
     my $uname=$ENV{'user.name'};      my $uname=$env{'user.name'};
     my $udom=$ENV{'user.domain'};      my $udom=$env{'user.domain'};
     my $plainname=&Apache::lonnet::escape(      my $plainname=&Apache::lonnet::escape(
                      &Apache::loncommon::plainname($uname,$udom));                       &Apache::loncommon::plainname($uname,$udom));
   
 # graphics settings  # graphics settings
   
     $iconpath = $r->dir_config('lonIconsURL') . "/";      $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
   
     my $now=time;      my $now=time;
   
 # print screen  # print screen
          my $html=&Apache::lonxml::xmlbegin();
     $r->print(<<ENDDOCUMENT);      $r->print(<<ENDDOCUMENT);
 <html>  $html
 <head>  <head>
 <title>The LearningOnline Network with CAPA</title>  <title>The LearningOnline Network with CAPA</title>
 <script>  <script>
Line 1127  function makenewfolder(targetform,folder Line 2223  function makenewfolder(targetform,folder
     }      }
 }  }
   
   function makenewpage(targetform,folderseq) {
       var pagename=prompt('Name of New Page','New Page');
       if (pagename) {
           targetform.importdetail.value=pagename+"="+folderseq;
           targetform.submit();
       }
   }
   
 function makenewext(targetname) {  function makenewext(targetname) {
     this.document.forms.extimport.useform.value=targetname;      this.document.forms.extimport.useform.value=targetname;
     window.open('/adm/rat/extpickframe.html');      window.open('/adm/rat/extpickframe.html');
Line 1178  function makeabout() { Line 2282  function makeabout() {
        this.document.forms.newaboutsomeone.importdetail.value=         this.document.forms.newaboutsomeone.importdetail.value=
    'About '+user+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';     'About '+user+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
        this.document.forms.newaboutsomeone.submit();         this.document.forms.newaboutsomeone.submit();
    }     } else {
                  alert("Not a valid user\@domain");
              }
          } else {
              alert("Please enter both user and domain in the format user\@domain"); 
        }         }
    }     }
 }  }
   
 function makeims() {  function makeims() {
     var caller = document.forms.ims.folder.value      var caller = document.forms.ims.folder.value;
     var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one"      var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
     newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes")      newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
     newWindow.location.href = newlocation      newWindow.location.href = newlocation;
 }  }
   
   
Line 1200  function finishpick() { Line 2308  function finishpick() {
     '";this.document.forms.'+form+'.submit();');      '";this.document.forms.'+form+'.submit();');
 }  }
   
 function changename(folderpath,index,oldtitle) {  function changename(folderpath,index,oldtitle,container,pagesymb) {
     var title=prompt('New Title',oldtitle);      var title=prompt('New Title',oldtitle);
     if (title) {      if (title) {
  this.document.forms.renameform.title.value=title;   this.document.forms.renameform.title.value=title;
  this.document.forms.renameform.cmd.value='rename_'+index;   this.document.forms.renameform.cmd.value='rename_'+index;
  this.document.forms.renameform.folderpath.value=folderpath;          if (container == 'sequence') {
       this.document.forms.renameform.folderpath.value=folderpath;
           }
           if (container == 'page') {
               this.document.forms.renameform.pagepath.value=folderpath;
               this.document.forms.renameform.pagesymb.value=pagesymb;
           }
         this.document.forms.renameform.submit();          this.document.forms.renameform.submit();
     }      }
 }  }
   
 function removeres(folderpath,index,oldtitle) {  function removeres(folderpath,index,oldtitle,container,pagesymb) {
     if (confirm('Remove "'+oldtitle+'"?')) {      if (confirm('WARNING: Removing a resource makes associated grades and scores inaccessible!\\nRemove "'+oldtitle+'"?')) {
  this.document.forms.renameform.cmd.value='del_'+index;   this.document.forms.renameform.cmd.value='del_'+index;
  this.document.forms.renameform.folderpath.value=folderpath;          if (container == 'sequence') {
               this.document.forms.renameform.folderpath.value=folderpath;
           }
           if (container == 'page') {
               this.document.forms.renameform.pagepath.value=folderpath;
               this.document.forms.renameform.pagesymb.value=pagesymb;
           }
         this.document.forms.renameform.submit();          this.document.forms.renameform.submit();
     }      }
 }  }
   
   function cutres(folderpath,index,oldtitle,container,pagesymb) {
       if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible!\\nGrades remain inaccessible if resource is pasted into another folder.\\nCut "'+oldtitle+'"?')) {
    this.document.forms.renameform.cmd.value='cut_'+index;
    this.document.forms.renameform.markcopy.value=index;
           if (container == 'sequence') {
               this.document.forms.renameform.folderpath.value=folderpath;
           }
           if (container == 'page') {
               this.document.forms.renameform.pagepath.value=folderpath;
               this.document.forms.renameform.pagesymb.value=pagesymb;
           }
           this.document.forms.renameform.submit();
       }
   }
   
   function markcopy(folderpath,index,oldtitle,container,pagesymb) {
       this.document.forms.renameform.markcopy.value=index;
       if (container == 'sequence') {
    this.document.forms.renameform.folderpath.value=folderpath;
       }
       if (container == 'page') {
    this.document.forms.renameform.pagepath.value=folderpath;
    this.document.forms.renameform.pagesymb.value=pagesymb;
       }
       this.document.forms.renameform.submit();
   }
   
 </script>  </script>
   
 ENDNEWSCRIPT  ENDNEWSCRIPT
Line 1227  ENDNEWSCRIPT Line 2374  ENDNEWSCRIPT
             &Apache::loncommon::bodytag('Course Documents','',$events,              &Apache::loncommon::bodytag('Course Documents','',$events,
  '','',$showdoc).   '','',$showdoc).
     &Apache::loncommon::help_open_menu('','','','',273,'RAT'));      &Apache::loncommon::help_open_menu('','','','',273,'RAT'));
   unless ($showdoc) {    my %allfiles = ();
     my %codebase = ();
     my ($upload_result,$upload_output);
     if ($allowed) {
         if (($env{'form.uploaddoc.filename'}) &&                                               ($env{'form.cmd'}=~/^upload_(\w+)/)) {
   # Process file upload - phase one - upload and parse primary file.  
             $upload_result = &process_file_upload(\$upload_output,$coursenum,
    $coursedom,\%allfiles,
    \%codebase,$1);
             if ($upload_result eq 'phasetwo') {
                 $r->print($upload_output);
             }
         } elsif ($env{'form.phasetwo'}) {
             my %newname = ();
             my %origname = ();
             my %attribs = ();
             my $updateflag = 0;
             my $residx = $env{'form.newidx'};
             my $primary_url = &Apache::lonnet::unescape($env{'form.primaryurl'});
   # Process file upload - phase two - gather secondary files.
             for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
                 if ($env{'form.embedded_item_'.$i.'.filename'}) {
                     my $javacodebase;
                     $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
                     $origname{$i} = &Apache::lonnet::unescape($env{'form.embedded_orig_'.$i});
                     if (exists($env{'form.embedded_codebase_'.$i})) {
                         $javacodebase =  &Apache::lonnet::unescape($env{'form.embedded_codebase_'.$i});  
                         $origname{$i} =~ s#^\Q$javacodebase\E/##; 
                     }
                     my @attributes = ();
                     if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
                         @attributes = split/:/,$env{'form.embedded_attrib_'.$i};
                     } else {
                         @attributes = ($env{'form.embedded_attrib_'.$i});
                     }
                     foreach (@attributes) {
                         push(@{$attribs{$i}},&Apache::lonnet::unescape($_));
                     }
                     if ($javacodebase) {
                         $codebase{$i} = $javacodebase;
                         $codebase{$i} =~ s#/$##;
                         $updateflag = 1;
                     }
                 }
                 unless ($newname{$i} eq $origname{$i}) {
                     $updateflag = 1;
                 }
             }
   # Process file upload - phase three - modify primary file
             if ($updateflag) {
                 my ($content,$rtncode);
                 my $updateflag = 0;
                 my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
                 if ($getstatus eq 'ok') {
                     foreach my $item (keys %newname) {
                         if ($newname{$item} ne $origname{$item}) {
                             my $attrib_regexp = '';
                             if (@{$attribs{$item}} > 1) {
                                 $attrib_regexp = join('|',@{$attribs{$item}});
                             } else {
                                 $attrib_regexp = $attribs{$item}[0];
                             }
                             if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
                             } 
                             $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi; 
                         }
                         if (exists($codebase{$item})) {
                             $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i;
                         }
                     }
   # Save edited file.
                     my $saveresult;
                     my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
                     my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
                     my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
                 } else {
                     &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus); 
                 }
             }
         }
     }
   
     unless ($showdoc ||  $upload_result eq 'phasetwo') {
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
        my %lt=&Apache::lonlocal::texthash(         my %lt=&Apache::lonlocal::texthash(
                 'uplm' => 'Upload a new main course document',                  'uplm' => 'Upload a new main course document',
                 'upls' => 'Upload a new supplemental course document',                  'upls' => 'Upload a new supplemental course document',
                 'impp' => 'Import a published document',                  'impp' => 'Import a document',
                   'pubd' => 'Published documents',
    'copm' => 'All documents out of a published map into this folder',
                 'spec' => 'Special documents',                  'spec' => 'Special documents',
                 'upld' => 'Upload Document',                  'upld' => 'Upload Document',
                 'srch' => 'Search',                  'srch' => 'Search',
                 'impo' => 'Import',                  'impo' => 'Import',
                 'selm' => 'Select Map',                  'selm' => 'Select Map',
                 'load' => 'Load Map',                  'load' => 'Load Map',
                   'reco' => 'Recover Deleted Resources',
                 'newf' => 'New Folder',                  'newf' => 'New Folder',
                   'newp' => 'New Composite Page',
                 'extr' => 'External Resource',                  'extr' => 'External Resource',
                 'syll' => 'Syllabus',                  'syll' => 'Syllabus',
                 'navc' => 'Navigate Contents',                  'navc' => 'Navigate Contents',
Line 1252  ENDNEWSCRIPT Line 2485  ENDNEWSCRIPT
                 'imsf' => 'Import IMS package',                  'imsf' => 'Import IMS package',
                 'file' =>  'File',                  'file' =>  'File',
                 'title' => 'Title',                  'title' => 'Title',
                 'comment' => 'Comment'                   'comment' => 'Comment',
                   'parse' => 'If HTML file, upload embedded images/multimedia files'
   );    );
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
     if ($allowed) {      if ($allowed) {
        my $dumpbut=&dumpbutton();         my $dumpbut=&dumpbutton();
          my $exportbut=&exportbutton();
        my %lt=&Apache::lonlocal::texthash(         my %lt=&Apache::lonlocal::texthash(
  'vc' => 'Verify Content',   'vc' => 'Verify Content',
  'cv' => 'Check/Set Resource Versions',   'cv' => 'Check/Set Resource Versions',
    'ls' => 'List Symbs',
   );    );
   
        my $folderpath=$ENV{'form.folderpath'};         my $folderpath=$env{'form.folderpath'};
        if (!$folderpath) {         if (!$folderpath) {
    if ($ENV{'form.folder'} eq '' ||     if ($env{'form.folder'} eq '' ||
        $ENV{'form.folder'} eq 'supplemental') {         $env{'form.folder'} eq 'supplemental') {
        $folderpath='default&'.         $folderpath='default&'.
    &Apache::lonnet::escape(&mt('Main Course Documents'));     &Apache::lonnet::escape(&mt('Main Course Documents'));
    }     }
        }         }
          unless ($env{'form.pagepath'}) {
              $containertag = '<input type="hidden" name="folderpath" value="" />';
              $uploadtag = '<input type="hidden" name="folderpath" value="'.$folderpath.'" />';
          }
   
        $r->print(<<ENDCOURSEVERIFY);         $r->print(<<ENDCOURSEVERIFY);
 <form name="renameform" method="post" action="/adm/coursedocs">  <form name="renameform" method="post" action="/adm/coursedocs">
 <input type="hidden" name="title" />  <input type="hidden" name="title" />
 <input type="hidden" name="cmd" />  <input type="hidden" name="cmd" />
 <input type="hidden" name="folderpath" />  <input type="hidden" name="markcopy" />
   $containertag
 </form>  </form>
 <form name="simpleedit" method="post" action="/adm/coursedocs">  <form name="simpleedit" method="post" action="/adm/coursedocs">
 <input type=hidden name="importdetail" value="">  <input type=hidden name="importdetail" value="">
 <input type="hidden" name="folderpath" value="$folderpath" />  $uploadtag
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="courseverify">  <form action="/adm/coursedocs" method="post" name="courseverify">
 <table bgcolor="#AAAAAA" width="100%" cellspacing="4" cellpadding="4">  <table bgcolor="#AAAAAA" width="100%" cellspacing="4" cellpadding="4">
Line 1287  ENDNEWSCRIPT Line 2529  ENDNEWSCRIPT
 </td><td bgcolor="#DDDDCC">  </td><td bgcolor="#DDDDCC">
     <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}      <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}
 $dumpbut  $dumpbut
   $exportbut
   </td><td bgcolor="#DDDDCC">
       <input type="submit" name="listsymbs" value="$lt{'ls'}" />
 </td></tr></table>  </td></tr></table>
 </form>  </form>
 ENDCOURSEVERIFY  ENDCOURSEVERIFY
Line 1299  ENDCOURSEVERIFY Line 2544  ENDCOURSEVERIFY
  $r->print('<tr><td bgcolor="#BBBBBB">');   $r->print('<tr><td bgcolor="#BBBBBB">');
 #  '<h2>'.&mt('Main Course Documents').  #  '<h2>'.&mt('Main Course Documents').
 #  ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');  #  ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');
        my $folder=$ENV{'form.folder'};         my $folder=$env{'form.folder'};
        if ($folder eq '' || $folder eq 'supplemental') {         if ($folder eq '' || $folder eq 'supplemental') {
            $folder='default';             $folder='default';
    $ENV{'form.folderpath'}='default&'.&Apache::lonnet::escape(&mt('Main Course Documents'));     $env{'form.folderpath'}='default&'.&Apache::lonnet::escape(&mt('Main Course Documents'));
        }         }
        my $postexec='';         my $postexec='';
        if ($folder eq 'default') {         if ($folder eq 'default') {
Line 1311  ENDCOURSEVERIFY Line 2556  ENDCOURSEVERIFY
            #$postexec='self.close();';             #$postexec='self.close();';
        }         }
        $hadchanges=0;         $hadchanges=0;
        &editor($r,$coursenum,$coursedom,$folder,$allowed);         &editor($r,$coursenum,$coursedom,$folder,$allowed,$upload_output);
        if ($hadchanges) {         if ($hadchanges) {
    &changewarning($r,$postexec);     &mark_hash_old()
        }         }
          &changewarning($r,$postexec);
        my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.         my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                      '.sequence';                       '.sequence';
          my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                        '.page';
    my $container='sequence';
    if ($env{'form.pagepath'}) {
       $container='page';
    }
    my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
        $r->print(<<ENDFORM);         $r->print(<<ENDFORM);
 <table cellspacing=4 cellpadding=4><tr>  <table cellspacing=4 cellpadding=4><tr>
 <th bgcolor="#DDDDDD">$lt{'uplm'}</th>  <th bgcolor="#DDDDDD">$lt{'uplm'}</th>
Line 1325  ENDCOURSEVERIFY Line 2578  ENDCOURSEVERIFY
 </tr>  </tr>
 <tr><td bgcolor="#DDDDDD">  <tr><td bgcolor="#DDDDDD">
 $lt{'file'}:<br />  $lt{'file'}:<br />
 <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">  <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
 <input type="file" name="uploaddoc" size="40">  <input type="file" name="uploaddoc" size="40">
 <br />  <br />
 $lt{'title'}:<br />  $lt{'title'}:<br />
 <input type="text" size="50" name="comment">  <input type="text" size="50" name="comment">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  $uploadtag
 <input type="hidden" name="cmd" value="upload_default">  <input type="hidden" name="cmd" value="upload_default">
   <br />
   <nobr>
   <label>$lt{'parse'}?
   <input type="checkbox" name="parserflag" />
   </label>
   </nobr>
   <br />
   <br />
 <nobr>  <nobr>
 <input type="submit" value="$lt{'upld'}">  <input type="submit" value="$lt{'upld'}">
  $help{'Uploading_From_Harddrive'}   $help{'Uploading_From_Harddrive'}
Line 1340  $lt{'title'}:<br /> Line 2601  $lt{'title'}:<br />
 </td>  </td>
 <td bgcolor="#DDDDDD">  <td bgcolor="#DDDDDD">
 <form action="/adm/coursedocs" method="post" name="simpleeditdefault">  <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  $lt{'pubd'}<br />
   $uploadtag
 <input type=button onClick="javascript:groupsearch()" value="$lt{'srch'}">  <input type=button onClick="javascript:groupsearch()" value="$lt{'srch'}">
 <nobr>  <nobr>
 <input type=button onClick="javascript:groupimport();" value="$lt{'impo'}">  <input type=button onClick="javascript:groupimport();" value="$lt{'impo'}">
Line 1348  $help{'Importing_LON-CAPA_Resource'} Line 2610  $help{'Importing_LON-CAPA_Resource'}
 </nobr>  </nobr>
 <p>  <p>
 <hr />  <hr />
 <input type="text" size="20" name="importmap"><br />  $lt{'copm'}<br />
   <input type="text" size="40" name="importmap"><br />
 <nobr><input type=button   <nobr><input type=button 
 onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"  onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
 value="$lt{'selm'}"> <input type="submit" name="loadmap" value="$lt{'load'}">  value="$lt{'selm'}"> <input type="submit" name="loadmap" value="$lt{'load'}">
 $help{'Load_Map'}</nobr>  $help{'Load_Map'}</nobr>
 </p>  </p>
 </form>  </form>
 </td><td bgcolor="#DDDDDD">  <hr />
 <form action="/adm/coursedocs" method="post" name="newfolder">  <form action="/adm/groupsort" method="post" name="recover">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1)" value="$lt{'reco'}" />
   </form>
   ENDFORM
          unless ($env{'form.pagepath'}) {
      $r->print(<<ENDFORM);
   <hr />
   <form action="/adm/coursedocs" method="post" name="newext">
   $uploadtag
   <input type=hidden name="importdetail" value="">
   <nobr>
   <input name="newext" type="button" onClick="javascript:makenewext('newext');"
   value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
   </nobr>
   </form>
   <br /><form action="/adm/imsimportdocs" method="post" name="ims">
   <input type="hidden" name="folder" value="$folder" />
   <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
   </nobr>
   </form>
   ENDFORM
          }
          $r->print('</td><td bgcolor="#DDDDDD">');
          unless ($env{'form.pagepath'}) {
              $r->print(<<ENDFORM);
   <br /><form action="/adm/coursedocs" method="post" name="newfolder">
   <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail" value="">  <input type=hidden name="importdetail" value="">
 <nobr>  <nobr>
 <input name="newfolder" type="button"  <input name="newfolder" type="button"
Line 1365  onClick="javascript:makenewfolder(this.f Line 2653  onClick="javascript:makenewfolder(this.f
 value="$lt{'newf'}" />$help{'Adding_Folders'}  value="$lt{'newf'}" />$help{'Adding_Folders'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newext">  <br /><form action="/adm/coursedocs" method="post" name="newpage">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail" value="">  <input type=hidden name="importdetail" value="">
 <nobr>  <nobr>
 <input name="newext" type="button" onClick="javascript:makenewext('newext');"  <input name="newpage" type="button"
 value="$lt{'extr'}" /> $help{'Adding_External_Resource'}  onClick="javascript:makenewpage(this.form,'$pageseq');"
   value="$lt{'newp'}" />$help{'Adding_Pages'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newsyl">  <br /><form action="/adm/coursedocs" method="post" name="newsyl">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  $uploadtag
 <input type=hidden name="importdetail"   <input type=hidden name="importdetail" 
 value="Syllabus=/public/$coursedom/$coursenum/syllabus">  value="Syllabus=/public/$coursedom/$coursenum/syllabus">
 <nobr>  <nobr>
Line 1382  value="Syllabus=/public/$coursedom/$cour Line 2671  value="Syllabus=/public/$coursedom/$cour
  $help{'Syllabus'}   $help{'Syllabus'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newnav">  <br /><form action="/adm/coursedocs" method="post" name="newnav">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  $uploadtag
 <input type=hidden name="importdetail"   <input type=hidden name="importdetail" 
 value="Navigate Content=/adm/navmaps">  value="Navigate Content=/adm/navmaps">
 <nobr>  <nobr>
Line 1391  value="Navigate Content=/adm/navmaps"> Line 2680  value="Navigate Content=/adm/navmaps">
 $help{'Navigate_Content'}  $help{'Navigate_Content'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newsmppg">  <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type=hidden name="importdetail" value="">
 <nobr>  <nobr>
 <input name="newsmppg" type="button" value="$lt{'sipa'}"  <input name="newsmppg" type="button" value="$lt{'sipa'}"
 onClick="javascript:makesmppage();" /> $help{'Simple Page'}  onClick="javascript:makesmppage();" /> $help{'Simple Page'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newsmpproblem">  <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type=hidden name="importdetail" value="">
 <nobr>  <nobr>
 <input name="newsmpproblem" type="button" value="$lt{'sipr'}"  <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
 onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}  onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newexamupload">  <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type=hidden name="importdetail" value="">
 <nobr>  <nobr>
 <input name="newexamupload" type="button" value="$lt{'scuf'}"  <input name="newexamupload" type="button" value="$lt{'scuf'}"
Line 1416  onClick="javascript:makeexamupload();" / Line 2705  onClick="javascript:makeexamupload();" /
 $help{'Score_Upload_Form'}  $help{'Score_Upload_Form'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newbul">  <br /><form action="/adm/coursedocs" method="post" name="newbul">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type=hidden name="importdetail" value="">
 <nobr>  <nobr>
 <input name="newbulletin" type="button" value="$lt{'bull'}"  <input name="newbulletin" type="button" value="$lt{'bull'}"
Line 1425  onClick="javascript:makebulboard();" /> Line 2714  onClick="javascript:makebulboard();" />
 $help{'Bulletin Board'}  $help{'Bulletin Board'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newaboutme">  <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  $uploadtag
 <input type=hidden name="importdetail"   <input type=hidden name="importdetail" 
 value="$plainname=/adm/$udom/$uname/aboutme">  value="$plainname=/adm/$udom/$uname/aboutme">
 <nobr>  <nobr>
Line 1434  value="$plainname=/adm/$udom/$uname/abou Line 2723  value="$plainname=/adm/$udom/$uname/abou
 $help{'My Personal Info'}  $help{'My Personal Info'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newaboutsomeone">  <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type=hidden name="importdetail" value="">
 <nobr>  <nobr>
 <input name="newaboutsomeone" type="button" value="$lt{'abou'}"   <input name="newaboutsomeone" type="button" value="$lt{'abou'}" 
 onClick="javascript:makeabout();" />  onClick="javascript:makeabout();" />
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/imsimportdocs" method="post" name="ims">  ENDFORM
 <input type="hidden" name="folder" value="$folder" />         }
 <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />         if ($env{'form.pagepath'}) {
              $r->print(<<ENDBLOCK);
   <form action="/adm/coursedocs" method="post" name="newsmpproblem">
   $uploadtag
   <input type=hidden name="importdetail" value="">
   <nobr>
   <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
   onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
 </nobr>  </nobr>
 </form>  </form>
 </td></tr>  <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
 </table>  $uploadtag
 ENDFORM  <input type=hidden name="importdetail" value="">
   <nobr>
   <input name="newexamupload" type="button" value="$lt{'scuf'}"
   onClick="javascript:makeexamupload();" />
   $help{'Score_Upload_Form'}
   </nobr>
   </form>
   ENDBLOCK
          }
          $r->print('</td></tr>'."\n".
   '</table>');
        $r->print('</td></tr>');         $r->print('</td></tr>');
     }      }
 # ----------------------------------------------------- Supplemental documents  # ----------------------------------------------------- Supplemental documents
Line 1457  ENDFORM Line 2763  ENDFORM
        $r->print('<tr><td bgcolor="#BBBBBB">');         $r->print('<tr><td bgcolor="#BBBBBB">');
 # '<h2>'.&mt('Supplemental Course Documents').  # '<h2>'.&mt('Supplemental Course Documents').
 #  ($allowed?' '.$help{'Supplemental'}:'').'</h2>');  #  ($allowed?' '.$help{'Supplemental'}:'').'</h2>');
        my $folder=$ENV{'form.folder'};         my $folder=$env{'form.folder'};
        unless ($folder=~/^supplemental/) {         unless ($folder=~/^supplemental/) {
    $folder='supplemental';     $folder='supplemental';
        }         }
        if ($folder =~ /^supplemental$/ &&         if ($folder =~ /^supplemental$/ &&
    $ENV{'form.folderpath'} =~ /^default\&/) {     $env{'form.folderpath'} =~ /^default\&/) {
    $ENV{'form.folderpath'}='supplemental&'.     $env{'form.folderpath'}='supplemental&'.
        &Apache::lonnet::escape(&mt('Supplemental Course Documents'));         &Apache::lonnet::escape(&mt('Supplemental Course Documents'));
        }         }
        &editor($r,$coursenum,$coursedom,$folder,$allowed);         &editor($r,$coursenum,$coursedom,$folder,$allowed);
Line 1480  ENDFORM Line 2786  ENDFORM
 <tr><td bgcolor="#DDDDDD">  <tr><td bgcolor="#DDDDDD">
 <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">  <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
 <input type="file" name="uploaddoc" size="40">  <input type="file" name="uploaddoc" size="40">
 <br />$lt{'comment'}:<br />  <br />
   <br />
   <nobr>
   <label>$lt{'parse'}?
   <input type="checkbox" name="parserflag" />
   </label>
   </nobr>
   <br /><br />
   $lt{'comment'}:<br />
 <textarea cols=50 rows=4 name='comment'>  <textarea cols=50 rows=4 name='comment'>
 </textarea>  </textarea>
 <br />  <br />
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type="hidden" name="cmd" value="upload_supplemental">  <input type="hidden" name="cmd" value="upload_supplemental">
 <nobr>  <nobr>
 <input type="submit" value="$lt{'upld'}">  <input type="submit" value="$lt{'upld'}">
Line 1494  ENDFORM Line 2808  ENDFORM
 </td>  </td>
 <td bgcolor="#DDDDDD">  <td bgcolor="#DDDDDD">
 <form action="/adm/coursedocs" method="post" name="supnewfolder">  <form action="/adm/coursedocs" method="post" name="supnewfolder">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail" value="">  <input type=hidden name="importdetail" value="">
 <nobr>  <nobr>
 <input name="newfolder" type="button"  <input name="newfolder" type="button"
Line 1502  onClick="javascript:makenewfolder(this.f Line 2816  onClick="javascript:makenewfolder(this.f
 value="$lt{'newf'}" /> $help{'Adding_Folders'}  value="$lt{'newf'}" /> $help{'Adding_Folders'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="supnewext">  <br /><form action="/adm/coursedocs" method="post" name="supnewext">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail" value="">  <input type=hidden name="importdetail" value="">
 <nobr>  <nobr>
 <input name="newext" type="button"   <input name="newext" type="button" 
Line 1511  onClick="javascript:makenewext('supnewex Line 2825  onClick="javascript:makenewext('supnewex
 value="$lt{'extr'}" /> $help{'Adding_External_Resource'}  value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="supnewsyl">  <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail"   <input type=hidden name="importdetail" 
 value="Syllabus=/public/$coursedom/$coursenum/syllabus">  value="Syllabus=/public/$coursedom/$coursenum/syllabus">
 <nobr>  <nobr>
Line 1520  value="Syllabus=/public/$coursedom/$cour Line 2834  value="Syllabus=/public/$coursedom/$cour
 $help{'Syllabus'}  $help{'Syllabus'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="subnewaboutme">  <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
 <input type="hidden" name="folderpath" value="$ENV{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail"   <input type=hidden name="importdetail" 
 value="$plainname=/adm/$udom/$uname/aboutme">  value="$plainname=/adm/$udom/$uname/aboutme">
 <nobr>  <nobr>
Line 1535  ENDSUPFORM Line 2849  ENDSUPFORM
        }         }
     }      }
     if ($allowed) {      if ($allowed) {
  $r->print('<form name="extimport"><input type="hidden" name="title"><input type="hidden" name="url"><input type="hidden" name="useform"></form>');   $r->print('<form method="POST" name="extimport" action="/adm/coursedocs"><input type="hidden" name="title" /><input type="hidden" name="url" /><input type="hidden" name="useform" /></form>');
     }      }
     $r->print('</table>');      $r->print('</table>');
   } else {    } else {
         unless ($upload_result eq 'phasetwo') {
 # -------------------------------------------------------- This is showdoc mode  # -------------------------------------------------------- This is showdoc mode
       $r->print("<h1>".&mt('Uploaded Document').'</h1><p>'.            $r->print("<h1>".&mt('Uploaded Document').' - '.
    &Apache::lonnet::gettitle($r->uri).'</h1><p>'.
 &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><p><table>".  &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><p><table>".
          &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table></p>');            &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table></p>');
         }
   }    }
  }   }
  $r->print('</body></html>');   $r->print('</body></html>');

Removed from v.1.135  
changed lines
  Added in v.1.218


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.