Diff for /loncom/interface/londocs.pm between versions 1.132 and 1.200

version 1.132, 2004/07/01 21:54:24 version 1.200, 2005/08/01 17:24:18
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=&clean($newfilename);
     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 181  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 201  sub dumpcourse { Line 210  sub dumpcourse {
     $r->print(      $r->print(
   '<input type="hidden" name="authorspace" value="'.$1.'" />');    '<input type="hidden" name="authorspace" value="'.$1.'" />');
  } else {   } else {
     $r->print('<option value="'.$1.'">'.$_.'</option>');      $r->print('<option value="'.$1.'">'.$1.' - '.
         &Apache::loncommon::plainname(split(/\@/,$1)).'</option>');
  }   }
     }      }
  }   }
Line 210  sub dumpcourse { Line 220  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 219  sub dumpcourse { Line 229  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 235  sub dumpcourse { Line 246  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 242  sub group_import { Line 900  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 256  sub group_import { Line 935  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 272  sub breadcrumbs { Line 964  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 280  sub breadcrumbs { Line 972  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 358  sub editor { Line 1062  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)$/)) {
  &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 424  sub editor { Line 1144  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 458  sub editor { Line 1180  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 476  sub editor { Line 1198  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 486  sub editor { Line 1208  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[$_]);
            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 .=  $1.'/';
       }
       $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 510  sub entryline { Line 1386  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 521  sub entryline { Line 1398  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 546  sub entryline { Line 1445  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');
           if ($env{'form.pagepath'}) {
               $line.=(<<END);
   <form name="entry_$index" action="/adm/coursedocs" method="post">
   <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" />
   <td><table border='0' cellspacing='2' cellpadding='0'>
   <tr><td bgcolor="#DDDDDD">
   <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>
   <tr><td bgcolor="#DDDDDD">
   <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>
   </table></td>
   <td>$selectbox
   </td><td bgcolor="#DDDDDD">
   <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
   <font size="-2" color="#990000">$lt{'rm'}</font></a>
   <a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
   <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>
   <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>
   <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
   END
           } else {
               $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="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" />  <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&folderpath=$folderpath$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&folderpath=$folderpath$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("$folderpath","$index","$renametitle","sequence");'>
 <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("$folderpath","$index","$renametitle","sequence");'>
 <font size="-2" color="#009900">$lt{'rn'}</font></a></td>  <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>
   <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>
   <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
 END  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';
           $url=~/$coursenum\/([\/\w]+)\.sequence$/;      $url=~/$coursenum\/([\/\w]+)\.sequence$/;
           $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 {
       &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 603  END Line 1550  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) {
  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>'.
Line 623  END Line 1600  END
     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 647  ENDPARMS Line 1620  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 665  sub untiehash { Line 1646  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 677  sub checkonthis { Line 1659  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 689  sub checkonthis { Line 1671  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 720  sub checkonthis { Line 1699  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 743  sub verifycontent { Line 1722  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 760  sub verifycontent { Line 1747  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 776  sub checkversions { Line 1771  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 833  sub checkversions { Line 1832  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 864  sub checkversions { Line 1863  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 939  ENDHEADERS Line 1938  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 1000  ENDHEADERS Line 2001  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 2062  sub handler {
   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_'.$_);
Line 1043  sub handler { Line 2079  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'}) {    if ($env{'form.verify'}) {
       &verifycontent($r);        &verifycontent($r);
   } elsif ($ENV{'form.versions'}) {    } elsif ($env{'form.versions'}) {
       &checkversions($r);        &checkversions($r);
   } elsif ($ENV{'form.dumpcourse'}) {    } elsif ($env{'form.dumpcourse'}) {
       &dumpcourse($r);        &dumpcourse($r);
     } elsif ($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 $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?  # does this user have privileges to post, etc?
        $allowed=&Apache::lonnet::allowed('mdc',$ENV{'request.course.id'});         $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 1088  sub handler { Line 2140  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 1124  function makenewfolder(targetform,folder Line 2177  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 1175  function makeabout() { Line 2236  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 1197  function finishpick() { Line 2262  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();
       }
   }
   
   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();          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 1223  ENDNEWSCRIPT Line 2327  ENDNEWSCRIPT
   $r->print('</head>'.    $r->print('</head>'.
             &Apache::loncommon::bodytag('Course Documents','',$events,              &Apache::loncommon::bodytag('Course Documents','',$events,
  '','',$showdoc).   '','',$showdoc).
     &Apache::loncommon::help_open_faq(273).      &Apache::loncommon::help_open_menu('','','','',273,'RAT'));
     &Apache::loncommon::help_open_bug('RAT'));    my %allfiles = ();
   unless ($showdoc) {    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 1250  ENDNEWSCRIPT Line 2439  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',
   );    );
   
        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 1285  ENDNEWSCRIPT Line 2482  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></tr></table>  </td></tr></table>
 </form>  </form>
 ENDCOURSEVERIFY  ENDCOURSEVERIFY
Line 1297  ENDCOURSEVERIFY Line 2495  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 1309  ENDCOURSEVERIFY Line 2507  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 1323  ENDCOURSEVERIFY Line 2529  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 1338  $lt{'title'}:<br /> Line 2552  $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 1346  $help{'Importing_LON-CAPA_Resource'} Line 2561  $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/groupsort" method="post" name="recover">
   <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>
   <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);
 <form action="/adm/coursedocs" method="post" name="newfolder">  <form action="/adm/coursedocs" method="post" name="newfolder">
 <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 1363  onClick="javascript:makenewfolder(this.f Line 2604  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">  <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">  <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 1381  value="Syllabus=/public/$coursedom/$cour Line 2623  value="Syllabus=/public/$coursedom/$cour
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newnav">  <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 1390  $help{'Navigate_Content'} Line 2632  $help{'Navigate_Content'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newsmppg">  <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'}"
Line 1398  onClick="javascript:makesmppage();" /> $ Line 2640  onClick="javascript:makesmppage();" /> $
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newsmpproblem">  <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'}"
Line 1406  onClick="javascript:makesmpproblem();" / Line 2648  onClick="javascript:makesmpproblem();" /
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newexamupload">  <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 1415  $help{'Score_Upload_Form'} Line 2657  $help{'Score_Upload_Form'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newbul">  <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 1424  $help{'Bulletin Board'} Line 2666  $help{'Bulletin Board'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newaboutme">  <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 1433  $help{'My Personal Info'} Line 2675  $help{'My Personal Info'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="newaboutsomeone">  <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>  <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 1455  ENDFORM Line 2714  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 1478  ENDFORM Line 2737  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 1492  ENDFORM Line 2759  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 1501  value="$lt{'newf'}" /> $help{'Adding_Fol Line 2768  value="$lt{'newf'}" /> $help{'Adding_Fol
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="supnewext">  <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 1510  value="$lt{'extr'}" /> $help{'Adding_Ext Line 2777  value="$lt{'extr'}" /> $help{'Adding_Ext
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="supnewsyl">  <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 1519  $help{'Syllabus'} Line 2786  $help{'Syllabus'}
 </nobr>  </nobr>
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="subnewaboutme">  <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 1533  ENDSUPFORM Line 2800  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.132  
changed lines
  Added in v.1.200


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