Diff for /loncom/interface/londocs.pm between versions 1.430 and 1.484.2.14

version 1.430, 2010/08/14 00:00:29 version 1.484.2.14, 2012/12/13 02:35:08
Line 26 Line 26
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
   
   
   
 package Apache::londocs;  package Apache::londocs;
   
 use strict;  use strict;
Line 41  use Apache::lonratedt(); Line 39  use Apache::lonratedt();
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::lonclonecourse;  use Apache::lonclonecourse;
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
   use Apache::lonnavdisplay();
   use Apache::lonuserstate();
 use HTML::Entities;  use HTML::Entities;
   use HTML::TokeParser;
 use GDBM_File;  use GDBM_File;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Cwd;  use Cwd;
Line 68  sub mapread { Line 69  sub mapread {
 }  }
   
 sub storemap {  sub storemap {
     my ($coursenum,$coursedom,$map)=@_;      my ($coursenum,$coursedom,$map,$contentchg)=@_;
       my $report;
       if (($contentchg) && ($map =~ /^default/)) {
          $report = 1;
       }
     my ($outtext,$errtext)=      my ($outtext,$errtext)=
       &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.        &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
       $map,1);        $map,1,$report);
     if ($errtext) { return ($errtext,2); }      if ($errtext) { return ($errtext,2); }
   
     $hadchanges=1;      $hadchanges=1;
Line 101  sub authorhosts { Line 106  sub authorhosts {
     my $allowed=0;      my $allowed=0;
     my $myhome=&Apache::lonnet::homeserver($ca,$cd);      my $myhome=&Apache::lonnet::homeserver($ca,$cd);
     my @ids=&Apache::lonnet::current_machine_ids();      my @ids=&Apache::lonnet::current_machine_ids();
     foreach my $id (@ids) { if ($id eq $myhome) { $allowed=1; } }      foreach my $id (@ids) {
                   if ($id eq $myhome) {
                       $allowed=1;
                       last;
                   }
               }
     if ($allowed) {      if ($allowed) {
  $home++;   $home++;
  $outhash{'home_'.$ca.'@'.$cd}=1;   $outhash{'home_'.$ca.':'.$cd}=1;
     } else {      } else {
  $outhash{'otherhome_'.$ca.'@'.$cd}=$myhome;   $outhash{'otherhome_'.$ca.':'.$cd}=$myhome;
  $other++;   $other++;
     }      }
  }   }
Line 115  sub authorhosts { Line 125  sub authorhosts {
 }  }
   
   
 sub dumpbutton {  
     my ($home,$other,%outhash)=&authorhosts();  
     my $crstype = &Apache::loncommon::course_type();  
     if ($home+$other==0) { return ''; }  
     if ($home) {  
         my $link =  
             "<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"dumpcourse\", \""  
            .&mt('Dump '.$crstype.' Documents to Construction Space')  
            ."\")'>"  
            .&mt('Dump '.$crstype.' Documents to Construction Space')  
            .'</a>';  
         return  
             $link.' '  
            .&Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs')  
            .'<br />';  
     } else {  
         return  
             &mt('Dump '.$crstype.' Documents to Construction Space: available on other servers');  
     }  
 }  
   
 sub clean {  sub clean {
     my ($title)=@_;      my ($title)=@_;
     $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs;      $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs;
Line 147  sub clean { Line 136  sub clean {
 sub dumpcourse {  sub dumpcourse {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Documents to Construction Space').      $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Content to Authoring Space')."\n".
       '<form name="dumpdoc" action="" method="post">');                &Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Content to Authoring Space')."\n");
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Documents to Construction Space'));      $r->print(&startContentScreen('tools'));
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     unless ($home) { return ''; }      unless ($home) {
           $r->print(&endContentScreen());
           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'}}) {
               $r->print(&endContentScreen());
               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'};
Line 176  sub dumpcourse { Line 171  sub dumpcourse {
     $newfilename=&clean($newfilename);      $newfilename=&clean($newfilename);
     $newfilename.='.'.$ext;      $newfilename.='.'.$ext;
     my @dirs=split(/\//,$newfilename);      my @dirs=split(/\//,$newfilename);
     my $path='/home/'.$ca.'/public_html';      my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca";
     my $makepath=$path;      my $makepath=$path;
     my $fail=0;      my $fail=0;
     for (my $i=0;$i<$#dirs;$i++) {      for (my $i=0;$i<$#dirs;$i++) {
Line 207  sub dumpcourse { Line 202  sub dumpcourse {
     }      }
  }   }
     } else {      } else {
           $r->print(&mt('Searching ...').'<br />');
           $r->rflush();
 # Input form  # Input form
           $r->print('<form name="dumpdoc" action="" method="post">'."\n");
  unless ($home==1) {   unless ($home==1) {
     $r->print(      $r->print('<div class="LC_left_float">'.
       '<h3>'.&mt('Select the Construction Space').'</h3><select name="authorspace">');        '<fieldset><legend>'.
                         &mt('Select the Authoring Space').
                         '</legend><select name="authorspace">');
  }   }
  foreach my $key (sort(keys(%outhash))) {   foreach my $key (sort(keys(%outhash))) {
     if ($key=~/^home_(.+)$/) {      if ($key=~/^home_(.+)$/) {
Line 219  sub dumpcourse { Line 219  sub dumpcourse {
   '<input type="hidden" name="authorspace" value="'.$1.'" />');    '<input type="hidden" name="authorspace" value="'.$1.'" />');
  } else {   } else {
     $r->print('<option value="'.$1.'">'.$1.' - '.      $r->print('<option value="'.$1.'">'.$1.' - '.
       &Apache::loncommon::plainname(split(/\@/,$1)).'</option>');        &Apache::loncommon::plainname(split(/\:/,$1)).'</option>');
  }   }
     }      }
  }   }
  unless ($home==1) {   unless ($home==1) {
     $r->print('</select>');      $r->print('</select></fieldset></div>'."\n");
  }   }
  my $title=$origcrsdata{'description'};   my $title=$origcrsdata{'description'};
  $title=~s/[\/\s]+/\_/gs;   $title=~s/[\/\s]+/\_/gs;
  $title=&clean($title);   $title=&clean($title);
  $r->print('<h3>'.&mt('Folder in Construction Space').'</h3>'   $r->print('<div class="LC_left_float">'.
                  .'<input type="text" size="50" name="authorfolder" value="'.$title.'" /><br />');                    '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.
                     '<input type="text" size="50" name="authorfolder" value="'.
                     $title.'" />'.
                     '</fieldset></div><br clear="all" />'."\n");
  &tiehash();   &tiehash();
  $r->print('<h3>'.&mt('Filenames in Construction Space').'</h3>'   $r->print('<h4>'.&mt('Filenames in Authoring Space').'</h4>'
                  .&Apache::loncommon::start_data_table()                   .&Apache::loncommon::start_data_table()
                  .&Apache::loncommon::start_data_table_header_row()                   .&Apache::loncommon::start_data_table_header_row()
                  .'<th>'.&mt('Internal Filename').'</th>'                   .'<th>'.&mt('Internal Filename').'</th>'
Line 260  sub dumpcourse { Line 263  sub dumpcourse {
  $r->print(&Apache::loncommon::end_data_table());   $r->print(&Apache::loncommon::end_data_table());
  &untiehash();   &untiehash();
  $r->print(   $r->print(
   '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype Documents").'" /></p></form>');    '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype Content").'" /></p></form>');
     }  
 }  
   
   
   
 sub exportbutton {  
     my $crstype = &Apache::loncommon::course_type();  
     return "<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"exportcourse\", \"".&mt('IMS Export')."\")'>".&mt('IMS Export')."</a>".  
     &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs').'<br />';  
 }  
   
   
   
 sub exportcourse {  
     my $r=shift;  
     my $crstype = &Apache::loncommon::course_type();  
     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();  
     if (!defined($navmap)) {  
         $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package').  
                   '<h2>'.&mt('IMS Export Failed').'</h2>'.  
                   '<div class="LC_error">');  
         if ($crstype eq 'Community') {  
             $r->print(&mt('Unable to retrieve information about community contents'));  
         } else {  
             $r->print(&mt('Unable to retrieve information about course contents'));  
         }  
         $r->print('</div><a href="/adm/coursedocs">');  
         if ($crstype eq 'Community') {  
             $r->print(&mt('Return to Community Editor'));  
         } else {  
             $r->print(&mt('Return to Course Editor'));  
         }  
         $r->print('</a>');  
         &Apache::lonnet::logthis('IMS export failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'});  
         return;  
     }  
     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 =   
                 '<p class="LC_warning">'  
                .&mt('As you did not select any content items or discussions'  
                    .' for export, an IMS package has not been created.')  
                .'</p>'  
                .'<p>'  
                .&mt('Please [_1]go back[_2] to select either content items'  
                    .' or discussions for export.'  
                        ,'<a href="javascript:history.go(-1)">'  
                        ,'</a>')  
                .'</p>';  
         } 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 .= '<p>'  
                            .&mt('[_1]Your IMS package[_2] is ready for download.'  
                                ,'<a href="'.$imszipfile.'">','</a>')  
                            .'</p>';  
                 if ($copyresult) {  
                     $outcome .= '<p class="LC_error">'  
                                .&mt('The following errors occurred during export - [_1]'  
                                    ,$copyresult)  
                                .'</p>';  
                 }  
             } else {  
                 $outcome = '<p class="LC_error">'  
                           .&mt('Unfortunately you will not be able to retrieve'  
                               .' an IMS archive of your course at this time,'  
                               .' because there was a problem creating a'  
                               .' manifest file.')  
                           .'</p>'  
                           .'<p><a href="javascript:history.go(-1)">'  
                           .&mt('Go Back')  
                           .'</a></p>';  
             }  
         }  
         $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package'));  
  $r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export'));  
         $r->print($outcome);  
         $r->print(&Apache::loncommon::end_page());  
     } else {  
         my $display='<form name="exportdoc" action="" method="post">'."\n".  
                     '<p>'.  
                     &mt('Choose which items you wish to export from your '.$crstype.'.').  
                     '</p>'.  
                     '<div class="LC_columnSection"><fieldset>'.  
                     '<legend>'.&mt('Content items').'</legend>'.  
                     '<input type="button" value="'.&mt('check all').'" '.  
                     'onclick="javascript:checkAll(document.exportdoc.archive)" />'.  
                     '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.  
                     ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset>';  
         if ($numdisc > 0) {  
             $display .= '<fieldset>'.  
                         '<legend>'.&mt('Discussion posts').'</legend>'.  
                         '<input type="button" value="'.&mt('check all').'"'.  
                         ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'.  
                         '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.  
                         ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" />'.  
                         '</fieldset>';  
         }  
         $display .= '</div>';  
         my $curRes;  
         my $depth = 0;  
         my $count = 0;  
         my $boards = 0;  
         my $startcount = 5;  
         my %parent = ();  
         my %children = ();  
         my $lastcontainer = $startcount;  
         $display .= &Apache::loncommon::start_data_table()  
                    .&Apache::loncommon::start_data_table_header_row()  
                    .'<th>'.&mt('Export content item?').'</th>';  
         if ($numdisc > 0) {  
             $display .= '<th>'.&mt('Export discussion posts?').'</th>';  
         }  
         $display .= &Apache::loncommon::end_data_table_header_row();  
         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/($match_domain)/($match_username)/(\d+)/bulletinboard$|) {  
                     unless ($ressymb =~ m|adm/wrapper/adm|) {  
                         $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';  
                     }  
                 }  
                 my $currelem = $count+$boards+$startcount;  
                 $display .= &Apache::loncommon::start_data_table_row()  
                            .'<td>'."\n"  
                            .'<input type="checkbox" name="archive" value="'.$count.'" ';  
                 if (($curRes->is_sequence()) || ($curRes->is_page())) {  
                     $lastcontainer = $currelem;  
                     $display .= 'onclick="javascript:propagateCheck('."'$currelem'".')"';  
                 }  
                 $display .= ' />'."\n";  
                 for (my $i=0; $i<$depth; $i++) {  
                     $display .= ('<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" alt="" />' x2)."\n";  
                 }  
                 if ($curRes->is_sequence()) {  
                     $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />&nbsp;'."\n";  
                 } elsif ($curRes->is_page()) {  
                     $display .= '<img src="/adm/lonIcons/navmap.page.open.gif" alt="" />&nbsp;'."\n";  
                 }  
                 $children{$parent{$depth}} .= $currelem.':';  
                 $display .= '&nbsp;'.$curRes->title().'</td>'."\n";  
   
                 # Existing discussion posts?  
                 if ($discussiontime{$ressymb} > 0) {  
                     $boards ++;  
                     $display .= '<td align="right">'  
                                .'<input type="checkbox" name="discussion" value="'.$count.'" />'  
                                .'</td>'."\n";  
                 } elsif ($numdisc > 0) {  
                     $display .= '<td>&nbsp;</td>'."\n";  
                 }  
                 $display .= &Apache::loncommon::end_data_table_row();  
             }  
         }  
         $display .= &Apache::loncommon::end_data_table();  
         my $scripttag = qq|  
 <script type="text/javascript">  
 // <![CDATA[  
 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>  
         |;  
  $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package',  
  $scripttag));  
  $r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export'));  
  $r->print($display.  
                   '<p><input type="hidden" name="finishexport" value="1" />'.  
                   '<input type="submit" name="exportcourse" value="'.  
                   &mt('Export').'" /></p></form>');  
     }  
 }  
   
 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 my $item (@hrefs) {  
                             $imsresources .=  
                      '        <file href="'.$item.'" />'."\n";  
                         }  
                         if (grep(/^$count$/,@$discussions)) {  
                             my $ressymb = $symb;  
                             my $mode;  
                             if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\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/($match_domain)/($match_username)/(\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,\%allfiles,\%codebase,$content);      $r->print(&endContentScreen());
     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';  
             }  
         }  
     }  
 }  
   
   
 sub group_import {  sub group_import {
     my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;      my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;
   
Line 1003  sub group_import { Line 309  sub group_import {
  join(':', ($name, $url, $ext, 'normal', 'res'));   join(':', ($name, $url, $ext, 'normal', 'res'));
  }   }
     }      }
     return &storemap($coursenum, $coursedom, $folder.'.'.$container);      return &storemap($coursenum, $coursedom, $folder.'.'.$container,1);
 }  }
   
 sub breadcrumbs {  sub breadcrumbs {
Line 1016  sub breadcrumbs { Line 322  sub breadcrumbs {
         @folders=split('&',$env{'form.folderpath'});          @folders=split('&',$env{'form.folderpath'});
     }      }
     my $folderpath;      my $folderpath;
     my $cpinfo='';  
     my $plain='';      my $plain='';
     my $randompick=-1;      my $randompick=-1;
     my $isencrypted=0;      my $isencrypted=0;
     my $ishidden=0;      my $ishidden=0;
     my $is_random_order=0;      my $is_random_order=0;
     if (!$allowed) {  
         my $description = $env{'course.'.$env{'request.course.id'}.'.description'};  
         &Apache::lonhtmlcommon::add_breadcrumb(  
                                                {'href' => '/adm/menu',  
                                                 'title'=> 'Go to main menu',  
                                                 'text' => $description,  
                                                });  
         $plain .= $description.' &gt;';  
     }  
     while (@folders) {      while (@folders) {
  my $folder=shift(@folders);   my $folder=shift(@folders);
     my $foldername=shift(@folders);      my $foldername=shift(@folders);
  if ($folderpath) {$folderpath.='&';}   if ($folderpath) {$folderpath.='&';}
  $folderpath.=$folder.'&'.$foldername;   $folderpath.=$folder.'&'.$foldername;
  my $url='/adm/coursedocs?folderpath='.          my $url;
     &escape($folderpath);          if ($allowed) {
     my $name=&unescape($foldername);              $url = '/adm/coursedocs?folderpath=';
           } else {
               $url = '/adm/supplemental?folderpath=';
           }
    $url .= &escape($folderpath);
    my $name=&unescape($foldername);
 # randompick number, hidden, encrypted, random order, is appended with ":"s to the foldername  # randompick number, hidden, encrypted, random order, is appended with ":"s to the foldername
      $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//;    $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//;
     if ($1 ne '') {   if ($1 ne '') {
                $randompick=$1;             $randompick=$1;
             } else {          } else {
                $randompick=-1;             $randompick=-1;
             }          }
             if ($2) { $ishidden=1; }          if ($2) { $ishidden=1; }
             if ($3) { $isencrypted=1; }          if ($3) { $isencrypted=1; }
     if ($4 ne '') { $is_random_order = 1; }   if ($4 ne '') { $is_random_order = 1; }
             if ($folder eq 'supplemental') {          if ($folder eq 'supplemental') {
                 $name = &mt('Supplemental '.$crstype.' Documents');              $name = &mt('Supplemental '.$crstype.' Content');
             }          }
     &Apache::lonhtmlcommon::add_breadcrumb(   &Apache::lonhtmlcommon::add_breadcrumb(
       {'href'=>$url.$cpinfo,        {'href'=>$url,
        'title'=>$name,         'title'=>$name,
        'text'=>$name,         'text'=>$name,
        'no_mt'=>1,         'no_mt'=>1,
Line 1062  sub breadcrumbs { Line 363  sub breadcrumbs {
     }      }
     $plain=~s/\&gt\;\s*$//;      $plain=~s/\&gt\;\s*$//;
     return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',      return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',
        undef, undef, 1 ),$randompick,$ishidden,$isencrypted,$plain,$is_random_order);         undef, undef, 1 ),$randompick,$ishidden,
                                                  $isencrypted,$plain,$is_random_order);
 }  }
   
 sub log_docs {  sub log_docs {
     return &Apache::lonnet::instructor_log('docslog',@_);      return &Apache::lonnet::write_log('course','docslog',@_);
 }  }
   
 {  {
Line 1126  sub log_docs { Line 428  sub log_docs {
     }      }
 }  }
   
   
   
   
   
 sub docs_change_log {  sub docs_change_log {
     my ($r)=@_;      my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath)=@_;
     my $folder=$env{'form.folder'};      my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);
     $r->print(&Apache::loncommon::start_page('Course Document Change Log'));      my $js = '<script type="text/javascript">'."\n".
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log'));               '// <![CDATA['."\n".
                &Apache::loncommon::display_filter_js('docslog')."\n".
                &editing_js($env{'user.domain'},$env{'user.name'},$supplementalflag)."\n".
                &history_tab_js()."\n".
                &Apache::lonratedt::editscript('simple')."\n".
                '// ]]>'."\n".
                '</script>'."\n";
       $r->print(&Apache::loncommon::start_page('Content Change Log',$js));
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content Change Log'));
       $r->print(&startContentScreen(($supplementalflag?'suppdocs':'docs')));
       my %orderhash;
       my $container='sequence';
       my $pathitem;
       if ($env{'form.pagepath'}) {
           $container='page';
           $pathitem = '<input type="hidden" name="pagepath" value="'.
                       &HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />';
       } else {
           my $folderpath=$env{'form.folderpath'};
           if ($folderpath eq '') {
               $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Documents'));
           }
           $pathitem = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';
       }
       my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";
       my $jumpto = $readfile;
       $jumpto =~ s{^/}{};
       my $tid = 1;
       if ($supplementalflag) {
           $tid = 2;
       }
       my ($breadcrumbtrail) = &breadcrumbs($allowed,$crstype);
       $r->print($breadcrumbtrail.
                 &generate_edit_table($tid,\%orderhash,undef,$iconpath,$jumpto,
                 $readfile));
     my %docslog=&Apache::lonnet::dump('nohist_docslog',      my %docslog=&Apache::lonnet::dump('nohist_docslog',
                                       $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'});
   
     if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); }      if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); }
   
     $r->print('<form action="/adm/coursedocs" method="post" name="docslog">'.  
               '<input type="hidden" name="docslog" value="1" />');  
   
     my %saveable_parameters = ('show' => 'scalar',);      my %saveable_parameters = ('show' => 'scalar',);
     &Apache::loncommon::store_course_settings('docs_log',      &Apache::loncommon::store_course_settings('docs_log',
                                               \%saveable_parameters);                                                \%saveable_parameters);
     &Apache::loncommon::restore_course_settings('docs_log',      &Apache::loncommon::restore_course_settings('docs_log',
                                                 \%saveable_parameters);                                                  \%saveable_parameters);
     if (!$env{'form.show'}) { $env{'form.show'}=10; }      if (!$env{'form.show'}) { $env{'form.show'}=10; }
   # FIXME: internationalization seems wrong here
     my %lt=('hiddenresource' => 'Resources hidden',      my %lt=('hiddenresource' => 'Resources hidden',
     'encrypturl'     => 'URL hidden',      'encrypturl'     => 'URL hidden',
     'randompick'     => 'Randomly pick',      'randompick'     => 'Randomly pick',
     'randomorder'    => 'Randomly ordered',      'randomorder'    => 'Randomly ordered',
     'set'            => 'set to',      'set'            => 'set to',
     'del'            => 'deleted');      'del'            => 'deleted');
     $r->print(&Apache::loncommon::display_filter().      my $filter = &Apache::loncommon::display_filter('docslog')."\n".
               '<input type="hidden" name="folder" value="'.$folder.'" />'.                   $pathitem."\n".
               '<input type="submit" value="'.&mt('Display').'" /></form>');                   '<input type="hidden" name="folder" value="'.$env{'form.folder'}.'" />'.
                    ('&nbsp;'x2).'<input type="submit" value="'.&mt('Display').'" />';
       $r->print('<div class="LC_left_float">'.
                 '<fieldset><legend>'.&mt('Display of Content Changes').'</legend>'."\n".
                 &makedocslogform($filter,1).
                 '</fieldset></div><br clear="all" />');
     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().      $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
               '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Folder').'</th><th>'.&mt('Before').'</th><th>'.                '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Folder').'</th><th>'.&mt('Before').'</th><th>'.
               &mt('After').'</th>'.                &mt('After').'</th>'.
Line 1202  sub docs_change_log { Line 537  sub docs_change_log {
                                   ':'.$docslog{$id}{'exe_udom'}.'</tt>'.                                    ':'.$docslog{$id}{'exe_udom'}.'</tt>'.
                   $send_msg_link.'</td><td>'.                    $send_msg_link.'</td><td>'.
                   $docslog{$id}{'logentry'}{'folder'}.'</td><td>');                    $docslog{$id}{'logentry'}{'folder'}.'</td><td>');
           my $is_supp = 0;
           if ($docslog{$id}{'logentry'}{'currentfolder'} =~ /^supplemental/) {
               $is_supp = 1;
           }
 # Before  # Before
  for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {   for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
     my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];      my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];
     my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];      my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];
     if ($oldname ne $newname) {      if ($oldname ne $newname) {
  $r->print(&LONCAPA::map::qtescape($oldname));                  my $shown = &LONCAPA::map::qtescape($oldname);
                   if ($is_supp) {
                       $shown = &Apache::loncommon::parse_supplemental_title($shown);
                   }
                   $r->print($shown);
     }      }
  }   }
  $r->print('<ul>');   $r->print('<ul>');
  for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {   for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
             if ($docslog{$id}{'logentry'}{'before_order_res_'.$idx}) {              if ($docslog{$id}{'logentry'}{'before_order_res_'.$idx}) {
  $r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'before_order_res_'.$idx}))[0]).'</li>');                  my $shown = &LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'before_order_res_'.$idx}))[0]);
                   if ($is_supp) {
                       $shown = &Apache::loncommon::parse_supplemental_title($shown);
                   }
                   $r->print('<li>'.$shown.'</li>');
     }      }
  }   }
  $r->print('</ul>');   $r->print('</ul>');
Line 1224  sub docs_change_log { Line 571  sub docs_change_log {
     my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];      my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];
     my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];      my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];
     if ($oldname ne '' && $oldname ne $newname) {      if ($oldname ne '' && $oldname ne $newname) {
  $r->print(&LONCAPA::map::qtescape($newname));                  my $shown = &LONCAPA::map::qtescape($newname);
                   if ($is_supp) {
                       $shown = &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($newname));
                   }
                   $r->print($shown);
     }      }
  }   }
  $r->print('<ul>');   $r->print('<ul>');
  for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {   for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
             if ($docslog{$id}{'logentry'}{'after_order_res_'.$idx}) {              if ($docslog{$id}{'logentry'}{'after_order_res_'.$idx}) {
  $r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'after_order_res_'.$idx}))[0]).'</li>');                  my $shown = &LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'after_order_res_'.$idx}))[0]);
                   if ($is_supp) {
                       $shown = &Apache::loncommon::parse_supplemental_title($shown);
                   }
                   $r->print('<li>'.$shown.'</li>');
     }      }
  }   }
  $r->print('</ul>');   $r->print('</ul>');
Line 1238  sub docs_change_log { Line 593  sub docs_change_log {
     $r->print(&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'}))[0]).':<ul>');      $r->print(&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'}))[0]).':<ul>');
     foreach my $parameter ('randompick','hiddenresource','encrypturl','randomorder') {      foreach my $parameter ('randompick','hiddenresource','encrypturl','randomorder') {
  if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) {   if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) {
   # FIXME: internationalization seems wrong here
     $r->print('<li>'.      $r->print('<li>'.
       &mt($lt{$parameter}.' '.$lt{$docslog{$id}{'logentry'}{'parameter_action_'.$parameter}}.' [_1]',        &mt($lt{$parameter}.' '.$lt{$docslog{$id}{'logentry'}{'parameter_action_'.$parameter}}.' [_1]',
   $docslog{$id}{'logentry'}{'parameter_value_'.$parameter})    $docslog{$id}{'logentry'}{'parameter_value_'.$parameter})
Line 1252  sub docs_change_log { Line 608  sub docs_change_log {
         if (!($env{'form.show'} eq &mt('all')          if (!($env{'form.show'} eq &mt('all')
               || $shown<=$env{'form.show'})) { last; }                || $shown<=$env{'form.show'})) { last; }
     }      }
     $r->print(&Apache::loncommon::end_data_table());      $r->print(&Apache::loncommon::end_data_table()."\n".
                 &makesimpleeditform($pathitem)."\n".
                 '</div></div>');
       $r->print(&endContentScreen());
 }  }
   
 sub update_paste_buffer {  sub update_paste_buffer {
     my ($coursenum,$coursedom) = @_;      my ($coursenum,$coursedom,$folder) = @_;
   
     return if (!defined($env{'form.markcopy'}));      return if (!defined($env{'form.markcopy'}));
     return if (!defined($env{'form.copyfolder'}));      return if (!defined($env{'form.copyfolder'}));
Line 1271  sub update_paste_buffer { Line 630  sub update_paste_buffer {
     my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);      my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);
     if (&is_supplemental_title($title)) {      if (&is_supplemental_title($title)) {
         &Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title});          &Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title});
  ($title) = &parse_supplemental_title($title);   ($title) = &Apache::loncommon::parse_supplemental_title($title);
     } elsif ($env{'docs.markedcopy_supplemental'}) {      } elsif ($env{'docs.markedcopy_supplemental'}) {
         &Apache::lonnet::delenv('docs.markedcopy_supplemental');          &Apache::lonnet::delenv('docs.markedcopy_supplemental');
     }      }
     $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};      $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
   
     &Apache::lonnet::appenv({'docs.markedcopy_title' => $title,      (my $cmd,undef)=split('_',$env{'form.cmd'});
     'docs.markedcopy_url'   => $url});  
       my %addtoenv = (
                       'docs.markedcopy_title' => $title,
                       'docs.markedcopy_url'   => $url,
                       'docs.markedcopy_cmd'   => $cmd,
                      );
       &Apache::lonnet::delenv('docs.markedcopy_nested');
       &Apache::lonnet::delenv('docs.markedcopy_nestednames');
       if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) {
           my $prefix = $1;
           my $subdir =$2;
           if ($subdir eq '') {
               $subdir = $prefix;
           }
           my (%addedmaps,%removefrommap,%removeparam,%hierarchy,%titles,%allmaps);
           &contained_map_check($url,$folder,\%removefrommap,\%removeparam,\%addedmaps,
                                \%hierarchy,\%titles,\%allmaps);
           if (ref($hierarchy{$url}) eq 'HASH') {
               my ($nested,$nestednames);
               &recurse_uploaded_maps($url,$subdir,\%hierarchy,\%titles,\$nested,\$nestednames);
               $nested =~ s/\&$//;
               $nestednames =~ s/\Q___&&&___\E$//;
               if ($nested ne '') {
                   $addtoenv{'docs.markedcopy_nested'} = $nested;
               }
               if ($nestednames ne '') {
                   $addtoenv{'docs.markedcopy_nestednames'} = $nestednames;
               }
           }
       }
       &Apache::lonnet::appenv(\%addtoenv);
     delete($env{'form.markcopy'});      delete($env{'form.markcopy'});
 }  }
   
   sub recurse_uploaded_maps {
       my ($url,$dir,$hierarchy,$titlesref,$nestref,$namesref) = @_;
       if (ref($hierarchy->{$url}) eq 'HASH') {
           my @maps = map { $hierarchy->{$url}{$_}; } sort { $a <=> $b } (keys(%{$hierarchy->{$url}}));
           my @titles = map { $titlesref->{$url}{$_}; } sort { $a <=> $b } (keys(%{$titlesref->{$url}}));
           my (@uploaded,@names,%shorter);
           for (my $i=0; $i<@maps; $i++) {
               my ($inner) = ($maps[$i] =~ m{^/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_(\d+)\.(?:page|sequence)$});
               if ($inner ne '') {
                   push(@uploaded,$inner);
                   push(@names,&escape($titles[$i]));
                   $shorter{$maps[$i]} = $inner;
               }
           }
           $$nestref .= "$dir:".join(',',@uploaded).'&';
           $$namesref .= "$dir:".(join(',',@names)).'___&&&___';
           foreach my $map (@maps) {
               if ($shorter{$map} ne '') {
                   &recurse_uploaded_maps($map,$shorter{$map},$hierarchy,$titlesref,$nestref,$namesref);
               }
           }
       }
       return;
   }
   
 sub print_paste_buffer {  sub print_paste_buffer {
     my ($r,$container) = @_;      my ($r,$container,$folder,$coursedom,$coursenum) = @_;
     return if (!defined($env{'docs.markedcopy_url'}));      return if (!defined($env{'docs.markedcopy_url'}));
   
     $r->print('<fieldset>'      my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent);
              .'<legend>'.&mt('Clipboard').'</legend>'      my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1];
              .'<form name="pasteform" action="/adm/coursedocs" method="post">'  
              .'<input type="submit" name="pastemarked" value="'.&mt('Paste').'" /> '  
     );  
   
     my $type;  
     if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {      if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {
           $is_external = 1;
       }
   
       my ($canpaste,$nopaste,$othercrs,$areachange,$is_uploaded_map);
       if ($folder =~ /^supplemental/) {
           $canpaste = &supp_pasteable($env{'docs.markedcopy_url'});
           unless ($canpaste) {
               $nopaste = &mt('Paste into Supplemental Content unavailable for this type of content.');
           }
       } else {
           $canpaste = 1;
       }
   
       if ($canpaste) {
           if ($env{'docs.markedcopy_url'} =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {
               my $srcdom = $1;
               my $srcnum = $2;
               my $rem = $3;
               if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
                   $othercourse = 1;
                   if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
                       if ($canpaste) {
                           $othercrs = '<br />'.&mt('(from another course).');
                       }
                   } else {
                       $canpaste = 0;
                       $nopaste = &mt('Paste from another course unavailable.')
                   }
               }
               if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) {
                   my $prefix = $1;
                   $parent = $2;
                   if ($folder !~ /^\Q$prefix\E/) {
                       $areachange = 1;
                   }
                   $is_uploaded_map = 1;
               }
           }
       }
   
       $r->print('<fieldset>'
                .'<legend>'.&mt('Clipboard').'</legend>');
       my ($type,$buffer);
       if ($is_external) {
  $type = &mt('External Resource');   $type = &mt('External Resource');
  $r->print($type.': '.   $buffer = $type.': '.
   &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.    &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.
   &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')');                    &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')';
     }  else {      }  else {
  my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1];  
  my $icon = &Apache::loncommon::icon($extension);   my $icon = &Apache::loncommon::icon($extension);
  if ($extension eq 'sequence' &&   if ($extension eq 'sequence' &&
     $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {      $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {
Line 1307  sub print_paste_buffer { Line 759  sub print_paste_buffer {
     $icon .= '/navmap.folder.closed.gif';      $icon .= '/navmap.folder.closed.gif';
  }   }
  $icon = '<img src="'.$icon.'" alt="" class="LC_icon" />';   $icon = '<img src="'.$icon.'" alt="" class="LC_icon" />';
  $r->print($icon.$type.': '.  &parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'})));          $buffer = $icon.$type.': '.  &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}));
     }      }
     if ($container eq 'page') {      if ($canpaste) {
  $r->print('          $r->print('<form name="pasteform" action="/adm/coursedocs" method="post">'.$buffer);
           if (($is_uploaded_map) && (!$areachange)) {
               if ((!$othercourse) && ($env{'docs.markedcopy_cmd'} eq 'cut')) {
                   $r->print(('&nbsp;'x 4).'<span id="pasteoptionstext">'.
                             '<a href="javascript:showPasteOptions();" class="LC_menubuttons_link">'.
                             &mt('Show Paste Options').'</a></span><br />'.
                             '<div id="pasteoptions" class="LC_dccid">'.('&nbsp;'x 4).
                             '<label>'.
                             '<input type="radio" name="docs.markedcopy_options" value="new" checked="checked" />'.
                             &mt('Copy to new folder').'</label>'.('&nbsp;' x2).
                             '<label>'.
                             '<input type="radio" name="docs.markedcopy_options" value="move" />'.
                             &mt('Move old folder').'</label><br />');
                   if ($env{'docs.markedcopy_nested'}) {
                       $r->print('<br />'.&mt('Folder to paste contains sub-folders').
                                 '<br /><table border="0">');
                       my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested'});
                       my @titles = split(/\Q___&&&___\E/,$env{'docs.markedcopy_nestednames'});
                       my $lastdir = $parent;
                       my %depths = (
                                      $lastdir => 0,
                                    );
                       my (%display,%deps);
                       for (my $i=0; $i<@pastemaps; $i++) {
                           ($lastdir,my $subfolderstr) = split(/\:/,$pastemaps[$i]);
                           my ($namedir,$esctitlestr) = split(/\:/,$titles[$i]);
                           my @subfolders = split(/,/,$subfolderstr);
                           $deps{$lastdir} = \@subfolders;
                           my @subfoldertitles = map { &unescape($_); } split(/,/,$esctitlestr);
                           my $depth = $depths{$lastdir} + 1;
                           my $offset = int($depth * 4);
                           my $indent = ('&nbsp;' x $offset);
                           for (my $j=0; $j<@subfolders; $j++) {
                               $depths{$subfolders[$j]} = $depth;
                               $display{$subfolders[$j]} =
                                     '<tr><td>'.$indent.$subfoldertitles[$j].'&nbsp;</td>'.
                                     '<td><label>'.
                                     '<input type="radio" name="docs.markedcopy_'.$subfolders[$j].'" value="new" checked="checked" />'.&mt('Copy to new').'</label>'.('&nbsp;' x2).
                                     '<label>'.
                                     '<input type="radio" name="docs.markedcopy_'.$subfolders[$j].'" value="move" />'.
                                     &mt('Move old').'</label>'.
                                     '</td></tr>';
                           }
                       }
                       &recurse_print($r,$parent,\%deps,\%display);
                       $r->print('</table>');
                   }
                   $r->print('</div>');
               }
           }
           $r->print('<br /><input type="submit" name="pastemarked" value="'.&mt('Paste').'" />'.$othercrs);
           if ($container eq 'page') {
       $r->print('
  <input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />   <input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />
  <input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />   <input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />
 ');  ');
     } else {          } else {
  $r->print('      $r->print('
         <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />          <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />
 ');  ');
           }
           $r->print('</form>');
       } else {
           $r->print(&mt('Paste buffer contains:').' '.$buffer.
                     '<br /><p class="LC_info">'.$nopaste.'</p>');
       }
       $r->print('</fieldset>');
   }
   
   sub recurse_print {
       my ($r,$dir,$deps,$display) = @_;
       $r->print($display->{$dir}."\n");
       if (ref($deps->{$dir}) eq 'ARRAY') {
           foreach my $subdir (@{$deps->{$dir}}) {
               &recurse_print($r,$subdir,$deps,$display);
           }
       }
   }
   
   sub supp_pasteable {
       my ($url) = @_;
       if (($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//}) ||
           (($url =~ /\.sequence$/) && ($url =~ m{^/uploaded/})) ||
           ($url =~ m{^/uploaded/$match_domain/$match_courseid/(docs|supplemental)/(default|\d+)/\d+/}) ||
           ($url =~ m{^/adm/$match_domain/$match_username/aboutme}) ||
           ($url =~ m{^/public/$match_domain/$match_courseid/syllabus})) {
           return 1;
     }      }
     $r->print('</form></fieldset>');      return;
   }
   
   sub paste_popup_js {
       my %lt = &Apache::lonlocal::texthash(
                                             show => 'Show Paste Options',
                                             hide => 'Hide Paste Options',
                                           );
       return <<"END";
   
   function showPasteOptions() {
       document.getElementById('pasteoptions').style.display='block';
       document.getElementById('pasteoptions').style.textAlign='left';
       document.getElementById('pasteoptions').style.textFace='normal';
       document.getElementById('pasteoptionstext').innerHTML ='<a href="javascript:hidePasteOptions();" class="LC_menubuttons_link">$lt{'hide'}</a><br />';
       return;
   }
   
   function hidePasteOptions() {
       document.getElementById('pasteoptions').style.display='none';
       document.getElementById('pasteoptionstext').innerHTML ='<a href="javascript:showPasteOptions()" class="LC_menubuttons_link">$lt{'show'}</a>';
       return;
   }
   
   END
   
 }  }
   
   
 sub do_paste_from_buffer {  sub do_paste_from_buffer {
     my ($coursenum,$coursedom,$folder) = @_;      my ($coursenum,$coursedom,$folder,$container,$errors) = @_;
   
   # Early out if paste buffer is empty
     if (!$env{'form.pastemarked'}) {      if (!$env{'form.pastemarked'}) {
         return;          return ();
       }
   
   # Supplemental content may only include certain types of content
   # Early out if pasted content is not supported in Supplemental area
       if ($folder =~ /^supplemental/) {
           unless (&supp_pasteable($env{'docs.markedcopy_url'})) {
               return (&mt('Paste failed: content type is not supported within Supplemental Content'));
           }
     }      }
   
 # paste resource to end of list  # Prepare to paste resource at end of list
     my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'});      my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'});
     my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'});      my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'});
 # Maps need to be copied first  
     if (($url=~/\.(page|sequence)$/) && ($url=~/^\/uploaded\//)) {      my ($is_map,$srcdom,$srcnum,$prefixchg,%before,%after,%mapchanges,%tomove);
  $title=&mt('Copy of').' '.$title;      if ($url=~/\.(page|sequence)$/) {
  my $newid=$$.int(rand(100)).time;          $is_map = 1;
  my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/);      }
         if ($oldid =~ m{^(/uploaded/\Q$coursedom\E/\Q$coursenum\E/)(\D+)(\d+)$}) {      if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/([^/]+)}) {
             my $path = $1;          $srcdom = $1;
             my $prefix = $2;          $srcnum = $2;
             my $ancestor = $3;          my $oldprefix = $3;
             if (length($ancestor) > 10) {  # When paste buffer was populated using an active role in a different course
                 $ancestor = substr($ancestor,-10,10);  # check for mdc privilege in the course from which the resource was pasted
           if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
               unless ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
                   return (&mt('Paste failed: Item is from a different course which you do not have rights to edit.'));
             }              }
             $oldid = $path.$prefix.$ancestor;  
         }          }
         my $counter = 0;  # When pasting content from Main Content to Supplemental Content and vice versa
         my $newurl=$oldid.$newid.'.'.$ext;  # URLs will contain different paths (which depend on whether pasted item is
         my $is_unique = &uniqueness_check($newurl);  # a folder/page or a document.
         while (!$is_unique && $counter < 100) {          if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) {
             $counter ++;              $prefixchg = 1;
             $newid ++;              %before = ( map => 'default',
             $newurl = $oldid.$newid;                          doc => 'docs');
             $is_unique = &uniqueness_check($newurl);              %after =  ( map => 'supplemental',
                           doc => 'supplemental' );
           } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) {
               $prefixchg = 1;
               %before = ( map => 'supplemental',
                           doc => 'supplemental');
               %after  = ( map => 'default',
                           doc => 'docs');
           }
   
   # If pasting an uploaded map, get list of contained uploaded maps.
           my @nested;
           if ($env{'docs.markedcopy_nested'}) {
               my ($type) = ($oldprefix =~ /^(default|supplemental)/);
               my @items = split(/\&/,$env{'docs.markedcopy_nested'});
               my @deps = map { /\d+:([\d,]+$)/ } @items;
               foreach my $dep (@deps) {
                   if ($dep =~ /,/) {
                       push(@nested,split(/,/,$dep));
                   } else {
                       push(@nested,$dep);
                   }
               }
               foreach my $item (@nested) {
                   if ($env{'form.docs.markedcopy_'.$item} eq 'move') {
                       $tomove{$type.'_'.$item} = 1;
                   }
               }
         }          }
         if (!$is_unique) {      }
             if ($url=~/\.page$/) {  
                 return &mt('Paste failed: an error occurred creating a unique URL for the composite page');  # Maps need to be copied first
             } else {      my ($oldurl,%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies,
                 return &mt('Paste failed: an error occurred creating a unique URL for the folder');          %dbcopies,%zombies,%params,%docmoves,%mapmoves,%newsubdir,%newurls);
       $oldurl = $url;
       if ($is_map) {
           if ($folder =~ /^default/) {
               my $lastchange = &Apache::lonnet::get_coursechange($coursedom,$coursenum);
               if ($lastchange > $env{'request.course.tied'}) {
                   &reinit_role($coursedom,$coursenum,$env{"course.$env{'request.course.id'}.home"});
             }              }
         }          }
  my $storefn=$newurl;  # If pasting a map, check if map contains other maps
  $storefn=~s{^/\w+/$match_domain/$match_username/}{};          my (%allmaps,%hierarchy,%titles);
  my $paste_map_result =          if ($folder =~ /^default/) {
             &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn,              my $navmap = Apache::lonnavmaps::navmap->new();
        &Apache::lonnet::getfile($url));              if (defined($navmap)) {
         if ($paste_map_result eq '/adm/notfound.html') {                  foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_map() },1,0,1)) {
             if ($url=~/\.page$/) {                      $allmaps{$res->src()} = 1;
                 return &mt('Paste failed: an error occurred saving the composite page');                  }
             } else {  
                 return &mt('Paste failed: an error occurred saving the folder');  
             }              }
         }          }
  $url = $newurl;          &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
     }                               \%addedmaps,\%hierarchy,\%titles,\%allmaps);
           if ($url=~ m{^/uploaded/}) {
               my $newurl;
               unless ($env{'form.docs.markedcopy_options'} eq 'move') {
                   ($newurl,my $error) =
                       &get_newmap_url($url,$folder,$prefixchg,$coursedom,$coursenum,
                                       $srcdom,$srcnum,\$title,\%allmaps,\%newurls);
                   if ($error) {
                       return ($error);
                   }
                   if ($newurl ne '') {
                       if ($newurl ne $url) {
                           if ($newurl =~ /(?:default|supplemental)_(\d+).(?:sequence|page)$/) {
                               $newsubdir{$url} = $1;
                           }
                           $mapchanges{$url} = 1;
                       }
                   }
               }
               if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) ||
                   (($newurl ne '') && ($newurl ne $url))) {
                   unless (&url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,
                                             \%allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies,
                                             \%zombies,\%params,\%mapmoves,\%mapchanges,\%tomove,
                                             \%newsubdir,\%newurls)) {
                       $mapmoves{$url} = 1;
                   }
                   $url = $newurl;
               } elsif ($env{'docs.markedcopy_nested'}) {
                   &url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,\%allmaps,\%rewrites,
                                     \%retitles,\%copies,\%dbcopies,\%zombies,\%params,\%mapmoves,
                                     \%mapchanges,\%tomove,\%newsubdir,\%newurls);
               }
           } elsif ($url=~m {^/res/}) {
 # published maps can only exists once, so remove it from paste buffer when done  # published maps can only exists once, so remove it from paste buffer when done
     if (($url=~/\.(page|sequence)$/) && ($url=~m {^/res/})) {              &Apache::lonnet::delenv('docs.markedcopy');
  &Apache::lonnet::delenv('docs.markedcopy');  # if pasting published map (main content are only) check map is not already in course
               if ($folder =~ /^default/) {
                   if ($allmaps{$url}) {
                       return (&mt('Paste failed: only one instance of a particular published sequence or page is allowed within each course.'));
                   }
               }
           }
     }      }
     if ($url=~ m{/smppg$}) {      if ($url=~ m{/smppg$}) {
  my $db_name = &Apache::lonsimplepage::get_db_name($url);          my $db_name = &Apache::lonsimplepage::get_db_name($url);
  if ($db_name =~ /^smppage_/) {          if ($db_name =~ /^smppage_/) {
     #simple pages, need to copy the db contents to a new one.              #simple pages, need to copy the db contents to a new one.
     my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);              my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);
     my $now = time();              my $now = time();
     $db_name =~ s{_\d*$ }{_$now}x;              $db_name =~ s{_\d*$ }{_$now}x;
     my $result=&Apache::lonnet::put($db_name,\%contents,              my $dbresult=&Apache::lonnet::put($db_name,\%contents,
     $coursedom,$coursenum);                                              $coursedom,$coursenum);
     $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;              if ($dbresult eq 'ok') {
     $title=&mt('Copy of').' '.$title;                  $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;
  }                  $title=&mt('Copy of').' '.$title;
               } else {
                   return (&mt('Paste failed: An error occurred when copying the simple page.'));
               }
           }
     }      }
     $title = &LONCAPA::map::qtunescape($title);      $title = &LONCAPA::map::qtunescape($title);
     my $ext='false';      my $ext='false';
     if ($url=~m{^http(|s)://}) { $ext='true'; }      if ($url=~m{^http(|s)://}) { $ext='true'; }
     $url       = &LONCAPA::map::qtunescape($url);      $url       = &LONCAPA::map::qtunescape($url);
   
   # For uploaded files (excluding pages/sequences) path in copied file is changed
   # if paste is from Main to Supplemental (or vice versa), or if pasting between
   # courses.
   
       my $newidx;
       unless ($is_map) {
 # Now insert the URL at the bottom  # Now insert the URL at the bottom
     my $newidx = &LONCAPA::map::getresidx($url);          $newidx = &LONCAPA::map::getresidx($url);
     if ($env{'docs.markedcopy_supplemental'}) {          if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) {
         if ($folder =~ /^supplemental/) {              my $relpath = $1;
             $title = $env{'docs.markedcopy_supplemental'};              if ($relpath ne '') {
                   my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$});
                   my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/);
                   my $newprefix = $newloc;
                   if ($newloc eq 'default') {
                       $newprefix = 'docs';
                   }
                   if ($newdocsdir eq '') {
                       $newdocsdir = 'default';
                   }
                   if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
                       my $newpath = "$newprefix/$newdocsdir/$newidx/$rem";
                       $url =
                           &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,
                                                              &Apache::lonnet::getfile($oldurl));
                       if ($url eq '/adm/notfound.html') {
                           return (&mt('Paste failed: an error occurred saving the file.'));
                       } else {
                           my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$});
                           $newsubpath =~ s{/+$}{/};
                           $docmoves{$oldurl} = $newsubpath;
                       }
                   }
               }
           }
       }
   # Apply any changes to maps, or copy dependencies for uploaded HTML pages
       my ($result,$save_err);
       $result =
           &apply_fixups($folder,$is_map,$prefixchg,$coursedom,$coursenum,$oldurl,
                         $url,\%removefrommap,\%removeparam,\%rewrites,\%retitles,
                         \%copies,\%dbcopies,\%zombies,\%params,\%docmoves,
                         \%mapmoves,\%newsubdir,$errors,\%before,\%after);
       if ($result eq 'ok') {
           if ($is_map) {
               my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
                                               $folder.'.'.$container);
               return $errtext if ($fatal);
   
               if ($#LONCAPA::map::order<1) {
                   my $idx=&LONCAPA::map::getresidx();
                   if ($idx<=0) { $idx=1; }
                   $LONCAPA::map::order[0]=$idx;
                   $LONCAPA::map::resources[$idx]='';
               }
               $newidx = &LONCAPA::map::getresidx($url);
           }
           if ($env{'docs.markedcopy_supplemental'}) {
               if ($folder !~ /^supplemental/) {
                   (undef,undef,$title) =
                       &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'});
               }
           } else {
               if ($folder=~/^supplemental/) {
                   $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                          $env{'user.domain'}.'___&&&___'.$title;
               }
           }
           $LONCAPA::map::resources[$newidx]=      $title.':'.$url.':'.$ext.':normal:res';
           push(@LONCAPA::map::order, $newidx);
   
   # Store the result
           my ($errtext,$fatal) =
               &storemap($coursenum,$coursedom,$folder.'.'.$container,1);
           if ($fatal) {
               $save_err = $errtext;
           }
       }
   
       if ($env{'form.docs.markedcopy_options'} eq 'move') {
           &Apache::lonnet::delenv('docs.markedcopy');
           &Apache::lonnet::delenv('docs.markedcopy_nested');
           &Apache::lonnet::delenv('docs.markedcopy_nestednames');
       }
       return ($result,$save_err);
   }
   
   sub get_newmap_url {
       my ($url,$folder,$prefixchg,$coursedom,$coursenum,$srcdom,$srcnum,
           $titleref,$allmaps,$newurls) = @_;
       my $newurl;
       if ($url=~ m{^/uploaded/}) {
           $$titleref=&mt('Copy of').' '.$$titleref;
       }
       my $now = time;
       my $suffix=$$.int(rand(100)).$now;
       my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/);
       if ($oldid =~ m{^(/uploaded/$match_domain/$match_courseid/)(\D+)(\d+)$}) {
           my $path = $1;
           my $prefix = $2;
           my $ancestor = $3;
           if (length($ancestor) > 10) {
               $ancestor = substr($ancestor,-10,10);
           }
           my $newid;
           if ($prefixchg) {
               if ($folder =~ /^supplemental/) {
                   $prefix =~ s/^default/supplemental/;
               } else {
                   $prefix =~ s/^supplemental/default/;
               }
           }
           if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) {
               $newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext;
         } else {          } else {
             (undef,undef,$title) =              $newurl = "/uploaded/$coursedom/$coursenum/$prefix".$now.'.'.$ext;
                 &parse_supplemental_title($env{'docs.markedcopy_supplemental'});  
         }          }
     } else {          my $counter = 0;
         if ($folder=~/^supplemental/) {          my $is_unique = &uniqueness_check($newurl);
            $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'.          if ($folder =~ /^default/) {
                   $env{'user.domain'}.'___&&&___'.$title;              if ($allmaps->{$newurl}) {
                   $is_unique = 0;
               }
           }
           while ((!$is_unique || $allmaps->{$newurl} || $newurls->{$newurl}) && ($counter < 100)) {
               $counter ++;
               $suffix ++;
               if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) {
                   $newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext;
               } else {
                   $newurl = "/uploaded/$coursedom/$coursenum/$prefix".$ancestor.$suffix.'.'.$ext;
               }
               $is_unique = &uniqueness_check($newurl);
           }
           if ($is_unique) {
               $newurls->{$newurl} = 1;
           } else {
               if ($url=~/\.page$/) {
                   return (undef,&mt('Paste failed: an error occurred creating a unique URL for the composite page'));
               } else {
                   return (undef,&mt('Paste failed: an error occurred creating a unique URL for the folder'));
               }
         }          }
     }      }
       return ($newurl);
   }
   
     $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res';  sub dbcopy {
     push(@LONCAPA::map::order, $newidx);      my ($url,$coursedom,$coursenum) = @_;
     return 'ok';      if ($url=~ m{/smppg$}) {
 # Store the result          my $db_name = &Apache::lonsimplepage::get_db_name($url);
           if ($db_name =~ /^smppage_/) {
               #simple pages, need to copy the db contents to a new one.
               my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);
               my $now = time();
               $db_name =~ s{_\d*$ }{_$now}x;
               my $result=&Apache::lonnet::put($db_name,\%contents,
                                               $coursedom,$coursenum);
               $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;
           }
       }
       return $url;
 }  }
   
 sub uniqueness_check {  sub uniqueness_check {
Line 1433  sub uniqueness_check { Line 1218  sub uniqueness_check {
     return $unique;      return $unique;
 }  }
   
   sub contained_map_check {
       my ($url,$folder,$removefrommap,$removeparam,$addedmaps,$hierarchy,$titles,
           $allmaps) = @_;
       my $content = &Apache::lonnet::getfile($url);
       unless ($content eq '-1') {
           my $parser = HTML::TokeParser->new(\$content);
           $parser->attr_encoded(1);
           while (my $token = $parser->get_token) {
               next if ($token->[0] ne 'S');
               if ($token->[1] eq 'resource') {
                   next if ($token->[2]->{'type'} eq 'zombie');
                   my $ressrc = $token->[2]->{'src'};
                   if ($folder =~ /^supplemental/) {
                       unless (&supp_pasteable($ressrc)) {
                           $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                           next;
                       }
                   }
                   if ($ressrc =~ m{^/(res|uploaded)/.+\.(sequence|page)$}) {
                       if ($1 eq 'uploaded') {
                           $hierarchy->{$url}{$token->[2]->{'id'}} = $ressrc;
                           $titles->{$url}{$token->[2]->{'id'}} = $token->[2]->{'title'};
                       } else {
                           if ($allmaps->{$ressrc}) {
                               $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                           } elsif (ref($addedmaps->{$ressrc}) eq 'ARRAY') {
                               $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                           } else {
                               $addedmaps->{$ressrc} = [$url];
                           }
                       }
                       &contained_map_check($ressrc,$folder,$removefrommap,$removeparam,
                                            $addedmaps,$hierarchy,$titles,$allmaps);
                   }
               } elsif ($token->[1] eq 'param') {
                   if ($folder =~ /^supplemental/) {
                       if (ref($removeparam->{$url}{$token->[2]->{'to'}}) eq 'ARRAY') {
                           push(@{$removeparam->{$url}{$token->[2]->{'to'}}},$token->[2]->{'name'});
                       } else {
                           $removeparam->{$url}{$token->[2]->{'to'}} = [$token->[2]->{'name'}];
                       }
                   }
               }
           }
       }
       return;
   }
   
   sub reinit_role {
       my ($cdom,$cnum,$chome) = @_;
       my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum");
       unless ($ferr) {
           &Apache::loncommon::update_content_constraints($cdom,$cnum,$chome,$cdom.'_'.$cnum);
       }
       return;
   }
   
   sub url_paste_fixups {
       my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$allmaps,$rewrites,$retitles,$copies,
           $dbcopies,$zombies,$params,$mapmoves,$mapchanges,$tomove,$newsubdir,$newurls) = @_;
       my $checktitle;
       if (($prefixchg) &&
           ($oldurl =~ m{^/uploaded/$match_domain/$match_courseid/supplemental})) {
           $checktitle = 1;
       }
       my $skip;
       if ($oldurl =~ m{^\Q/uploaded/$cdom/$cnum/\E(default|supplemental)(_?\d*)\.(?:page|sequence)$}) {
           my $mapid = $1.$2;
           if ($tomove->{$mapid}) {
               $skip = 1;
           }
       }
       my $file = &Apache::lonnet::getfile($oldurl);
       return if ($file eq '-1');
       my $parser = HTML::TokeParser->new(\$file);
       $parser->attr_encoded(1);
       my $changed = 0;
       while (my $token = $parser->get_token) {
           next if ($token->[0] ne 'S');
           if ($token->[1] eq 'resource') {
               my $ressrc = $token->[2]->{'src'};
               next if ($ressrc eq '');
               my $id = $token->[2]->{'id'};
               my $title = $token->[2]->{'title'};
               if ($checktitle) {
                   if ($title =~ m{\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {
                       $retitles->{$oldurl}{$ressrc} = $id;
                   }
               }
               next if ($token->[2]->{'type'} eq 'external');
               if ($token->[2]->{'type'} eq 'zombie') {
                   next if ($skip);
                   $zombies->{$oldurl}{$ressrc} = $id;
                   $changed = 1;
               } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {
                   my $srcdom = $1;
                   my $srcnum = $2;
                   my $rem = $3;
                   my $newurl;
                   my $mapname;
                   if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) {
                       my $prefix = $1;
                       $mapname = $prefix.$2;
                       if ($tomove->{$mapname}) {
                           &url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps,
                                             $rewrites,$retitles,$copies,$dbcopies,$zombies,
                                             $params,$mapmoves,$mapchanges,$tomove,$newsubdir,
                                             $newurls);
                           next;
                       } else {
                           ($newurl,my $error) =
                               &get_newmap_url($ressrc,$folder,$prefixchg,$cdom,$cnum,
                                               $srcdom,$srcnum,\$title,$allmaps,$newurls);
                           if ($newurl =~ /(?:default|supplemental)_(\d+)\.(?:sequence|page)$/) {
                               $newsubdir->{$ressrc} = $1;
                           }
                           if ($error) {
                               next;
                           }
                       }
                   }
                   if (($srcdom ne $cdom) || ($srcnum ne $cnum) || ($prefixchg) ||
                       ($mapchanges->{$oldurl}) || (($newurl ne '') && ($newurl ne $oldurl))) {
   
                       if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) {
                           $rewrites->{$oldurl}{$ressrc} = $id;
                           $mapchanges->{$ressrc} = 1;
                           unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps,
                                                     $rewrites,$retitles,$copies,$dbcopies,$zombies,
                                                     $params,$mapmoves,$mapchanges,$tomove,$newsubdir,
                                                     $newurls)) {
                               $mapmoves->{$ressrc} = 1;
                           }
                           $changed = 1;
                       } else {
                           $rewrites->{$oldurl}{$ressrc} = $id;
                           $copies->{$oldurl}{$ressrc} = $id;
                           $changed = 1;
                       }
                   }
               } elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/(.+)$}) {
                   next if ($skip);
                   my $srcdom = $1;
                   my $srcnum = $2;
                   if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {
                       $rewrites->{$oldurl}{$ressrc} = $id;
                       $dbcopies->{$oldurl}{$ressrc} = $id;
                       $changed = 1;
                   }
               } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) {
                   next if ($skip);
                   my $srcdom = $1;
                   my $srcnum = $2;
                   if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {
                       $rewrites->{$oldurl}{$ressrc} = $id;
                       $dbcopies->{$oldurl}{$ressrc} = $id;
                       $changed = 1;
                   }
               }
           } elsif ($token->[1] eq 'param') {
               next if ($skip);
               my $to = $token->[2]->{'to'};
               if ($to ne '') {
                   if (ref($params->{$oldurl}{$to}) eq 'ARRAY') {
                       push(@{$params->{$oldurl}{$to}},$token->[2]->{'name'});
                   } else {
                       @{$params->{$oldurl}{$to}} = ($token->[2]->{'name'});
                   }
               }
           }
       }
       return $changed;
   }
   
   sub apply_fixups {
       my ($folder,$is_map,$prefixchg,$cdom,$cnum,$oldurl,$url,$removefrommap,
           $removeparam,$rewrites,$retitles,$copies,$dbcopies,$zombies,$params,
           $docmoves,$mapmoves,$newsubdir,$errors,$before,$after) = @_;
       foreach my $key (keys(%{$copies}),keys(%{$docmoves})) {
           my @allcopies;
           if (ref($copies->{$key}) eq 'HASH') {
               my %added;
               foreach my $innerkey (keys(%{$copies->{$key}})) {
                   if (($innerkey ne '') && (!$added{$innerkey})) {
                       push(@allcopies,$innerkey);
                       $added{$innerkey} = 1;
                   }
               }
               undef(%added);
           }
           if ($key eq $oldurl) {
               if ((exists($docmoves->{$key}))) {
                   unless (grep(/^\Q$oldurl\E/,@allcopies)) {
                       push(@allcopies,$oldurl);
                   }
               }
           }
           if (@allcopies > 0) {
               foreach my $item (@allcopies) {
                   my ($relpath,$oldsubdir,$fname) =
                       ($item =~ m{^(/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(default|\d+)/.*/)([^/]+)$});
                   if ($fname ne '') {
                       my $content = &Apache::lonnet::getfile($item);
                       unless ($content eq '-1') {
                           my $storefn;
                           if (($key eq $oldurl) && (ref($docmoves) eq 'HASH') && (exists($docmoves->{$key}))) {
                               $storefn = $docmoves->{$key};
                           } else {
                               $storefn = $relpath;
                               $storefn =~s{^/uploaded/$match_domain/$match_courseid/}{};
                               if ($prefixchg) {
                                   $storefn =~ s/^\Q$before->{'doc'}\E/$after->{'doc'}/;
                               }
                               if ($newsubdir->{$key}) {
                                   $storefn =~ s#^(docs|supplemental)/\Q$oldsubdir\E/#$1/$newsubdir->{$key}#;
                               }
                           }
                           &copy_dependencies($item,$storefn,$relpath,$errors,\$content);
                           my $copyurl =
                               &Apache::lonclonecourse::writefile($env{'request.course.id'},
                                                                  $storefn.$fname,$content);
                           if ($copyurl eq '/adm/notfound.html') {
                               if ((ref($docmoves) eq 'HASH') && (exists($docmoves->{$oldurl}))) {
                                   return &mt('Paste failed: an error occurred copying the file.');
                               } elsif (ref($errors) eq 'HASH') {
                                   $errors->{$item} = 1;
                               }
                           }
                       }
                   }
               }
           }
       }
       foreach my $key (keys(%{$mapmoves})) {
           my $storefn=$key;
           $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{};
           if ($prefixchg) {
               $storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/;
           }
           if ($newsubdir->{$key}) {
               $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir->{$key}/;
           }
           my $mapcontent = &Apache::lonnet::getfile($key);
           if ($mapcontent eq '-1') {
               if (ref($errors) eq 'HASH') {
                   $errors->{$key} = 1;
               }
           } else {
               my $newmap =
                   &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn,
                                                      $mapcontent);
               if ($newmap eq '/adm/notfound.html') {
                   if (ref($errors) eq 'HASH') {
                       $errors->{$key} = 1;
                   }
               }
           }
       }
       my %updates;
       if ($is_map) {
           foreach my $key (keys(%{$rewrites})) {
               $updates{$key} = 1;
           }
           foreach my $key (keys(%{$zombies})) {
               $updates{$key} = 1;
           }
           foreach my $key (keys(%{$removefrommap})) {
               $updates{$key} = 1;
           }
           foreach my $key (keys(%{$removeparam})) {
               $updates{$key} = 1;
           }
           foreach my $key (keys(%{$dbcopies})) {
               $updates{$key} = 1;
           }
           foreach my $key (keys(%{$retitles})) {
               $updates{$key} = 1;
           }
           foreach my $key (keys(%updates)) {
               my (%torewrite,%toretitle,%toremove,%remparam,%currparam,%zombie,%newdb);
               if (ref($rewrites->{$key}) eq 'HASH') {
                   %torewrite = %{$rewrites->{$key}};
               }
               if (ref($retitles->{$key}) eq 'HASH') {
                   %toretitle = %{$retitles->{$key}};
               }
               if (ref($removefrommap->{$key}) eq 'HASH') {
                   %toremove = %{$removefrommap->{$key}};
               }
               if (ref($removeparam->{$key}) eq 'HASH') {
                   %remparam = %{$removeparam->{$key}};
               }
               if (ref($zombies->{$key}) eq 'HASH') {
                   %zombie = %{$zombies->{$key}};
               }
               if (ref($dbcopies->{$key}) eq 'HASH') {
                   foreach my $item (keys(%{$dbcopies->{$key}})) {
                       $newdb{$item} = &dbcopy($item);
                   }
               }
               if (ref($params->{$key}) eq 'HASH') {
                   %currparam = %{$params->{$key}};
               }
               my ($errtext,$fatal) = &LONCAPA::map::mapread($key);
               if ($fatal) {
                   return $errtext;
               }
               for (my $i=0; $i<@LONCAPA::map::zombies; $i++) {
                   if (defined($LONCAPA::map::zombies[$i])) {
                       my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::zombies[$i]);
                       if ($zombie{$src} eq $i) {
                           undef($LONCAPA::map::zombies[$i]);
                       }
                   }
               }
               for (my $i=0; $i<@LONCAPA::map::resources; $i++) {
                   if (defined($LONCAPA::map::resources[$i])) {
                       my $changed;
                       my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$i]);
                       if ($toremove{$src} eq $i) {
                           splice(@LONCAPA::map::order,$i,1);
                           if (ref($currparam{$i}) eq 'ARRAY') {
                               foreach my $name (@{$currparam{$i}}) {
                                   &LONCAPA::map::delparameter($i,'parameter_'.$name);
                               }
                           }
                           next;
                       }
                       my $origsrc = $src;
                       if ((exists($toretitle{$src})) && ($toretitle{$src} eq $i)) {
                           if ($title =~ m{^\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {
                               $changed = 1;
                           }
                       }
                       if ((exists($torewrite{$src})) && ($torewrite{$src} eq $i)) {
                           $src =~ s{^/(uploaded|adm|public)/$match_domain/$match_courseid/}{/$1/$cdom/$cnum/};
                           if ($origsrc =~ m{^/uploaded/}) {
                               if ($prefixchg) {
                                   if ($src =~ /\.(page|sequence)$/) {
                                       $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'map'}\E#$1$after->{'map'}#;
                                   } else {
                                       $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'doc'}\E#$1$after->{'doc'}#;
                                   }
                               }
                               if ($newsubdir->{$origsrc}) {
                                   if ($src =~ /\.(page|sequence)$/) {
                                       $src =~ s#^(/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_)(\d+)#$1$newsubdir->{$origsrc}#;
                                   } else {
                                       $src =~ s#^(/uploaded/$match_domain/$match_courseid/\w+/)(\d+)#$1$newsubdir->{$origsrc}#;
                                   }
                               }
                           }
                           $changed = 1;
                       } elsif ($newdb{$src} ne '') {
                           $src = $newdb{$src};
                           $changed = 1;
                       }
                       if ($changed) {
                           $LONCAPA::map::resources[$i] = join(':',($title,$src,$ext,$type));
                       }
                   }
               }
               foreach my $idx (keys(%remparam)) {
                   if (ref($remparam{$idx}) eq 'ARRAY') {
                       foreach my $name (@{$remparam{$idx}}) {
                           &LONCAPA::map::delparameter($idx,'parameter_'.$name);
                       }
                   }
               }
               my $storefn;
               if ($key eq $oldurl) {
                   $storefn = $url;
                   $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{};
               } else {
                   $storefn = $key;
                   $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{};
                   if ($prefixchg) {
                       $storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/;
                   }
                   if ($newsubdir->{$key}) {
                       $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir->{$key}/;
                   }
               }
               my $report;
               if ($folder !~ /^supplemental/) {
                   $report = 1;
               }
               my ($outtext,$errtext) =
                   &LONCAPA::map::storemap("/uploaded/$cdom/$cnum/$storefn",1,$report);
               if ($errtext) {
                   return &mt('Paste failed: an error occurred saving the folder or page.');
               }
           }
       }
       return 'ok';
   }
   
   sub copy_dependencies {
       my ($item,$storefn,$relpath,$errors,$contentref) = @_;
       my $content;
       if (ref($contentref)) {
           $content = $$contentref;
       } else {
           $content = &Apache::lonnet::getfile($item);
       }
       unless ($content eq '-1') {
           my $mm = new File::MMagic;
           my $mimetype = $mm->checktype_contents($content);
           if ($mimetype eq 'text/html') {
               my (%allfiles,%codebase,$state);
               my $res = &Apache::lonnet::extract_embedded_items(undef,\%allfiles,\%codebase,\$content);
               if ($res eq 'ok') {
                   my ($numexisting,$numpathchanges,$existing);
                   (undef,$numexisting,$numpathchanges,$existing) =
                       &Apache::loncommon::ask_for_embedded_content(
                           '/adm/coursedocs',$state,\%allfiles,\%codebase,
                           {'error_on_invalid_names'   => 1,
                            'ignore_remote_references' => 1,
                            'docs_url'                 => $item,
                            'context'                  => 'paste'});
                   if ($numexisting > 0) {
                       if (ref($existing) eq 'HASH') {
                           foreach my $dep (keys(%{$existing})) {
                               my $depfile = $dep;
                               unless ($depfile =~ m{^\Q$relpath\E}) {
                                   $depfile = $relpath.$dep;
                               }
                               my $depcontent = &Apache::lonnet::getfile($depfile);
                               unless ($depcontent eq '-1') {
                                   my $storedep = $dep;
                                   $storedep =~ s{^\Q$relpath\E}{};
                                   my $dep_url =
                                       &Apache::lonclonecourse::writefile(
                                           $env{'request.course.id'},
                                           $storefn.$storedep,$depcontent);
                                   if ($dep_url eq '/adm/notfound.html') {
                                       if (ref($errors) eq 'HASH') {
                                           $errors->{$depfile} = 1;
                                       }
                                   } else {
                                       &copy_dependencies($depfile,$storefn,$relpath,$errors,\$depcontent);
                                   }
                               }
                           }
                       }
                   }
               }
           }
       }
       return;
   }
   
 my %parameter_type = ( 'randompick'     => 'int_pos',  my %parameter_type = ( 'randompick'     => 'int_pos',
        'hiddenresource' => 'string_yesno',         'hiddenresource' => 'string_yesno',
        'encrypturl'     => 'string_yesno',         'encrypturl'     => 'string_yesno',
Line 1462  sub update_parameter { Line 1699  sub update_parameter {
   
 sub handle_edit_cmd {  sub handle_edit_cmd {
     my ($coursenum,$coursedom) =@_;      my ($coursenum,$coursedom) =@_;
   
     my ($cmd,$idx)=split('_',$env{'form.cmd'});      my ($cmd,$idx)=split('_',$env{'form.cmd'});
   
     my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];      my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
Line 1470  sub handle_edit_cmd { Line 1706  sub handle_edit_cmd {
   
     if ($cmd eq 'del') {      if ($cmd eq 'del') {
  if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&   if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
     ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {      ($url!~/$LONCAPA::assess_page_seq_re/)) {
     &Apache::lonnet::removeuploadedurl($url);      &Apache::lonnet::removeuploadedurl($url);
  } else {   } else {
     &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);      &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
Line 1506  sub handle_edit_cmd { Line 1742  sub handle_edit_cmd {
 }  }
   
 sub editor {  sub editor {
     my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype)=@_;      my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype,
           $supplementalflag,$orderhash,$iconpath,$uploadtag)=@_;
     my $container= ($env{'form.pagepath'}) ? 'page'      my $container= ($env{'form.pagepath'}) ? 'page'
                            : 'sequence';                             : 'sequence';
   
       my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) =
           &breadcrumbs($allowed,$crstype);
       $r->print($breadcrumbtrail);
   
       my $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container";
   
       unless ($allowed) {
           $randompick = -1;
       }
   
     my ($errtext,$fatal) = &mapread($coursenum,$coursedom,      my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
     $folder.'.'.$container);      $folder.'.'.$container);
     return $errtext if ($fatal);      return $errtext if ($fatal);
Line 1521  sub editor { Line 1768  sub editor {
         $LONCAPA::map::resources[$idx]='';          $LONCAPA::map::resources[$idx]='';
     }      }
   
     my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order);  
     if ($allowed) {  
         ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) =  
     &breadcrumbs($allowed,$crstype);  
         $r->print($breadcrumbtrail);  
     } else {  
         $randompick = -1;  
     }  
   
 # ------------------------------------------------------------ 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
Line 1552  sub editor { Line 1790  sub editor {
  }   }
   
  if ($env{'form.pastemarked'}) {   if ($env{'form.pastemarked'}) {
             my $paste_res =              my %paste_errors;
                 &do_paste_from_buffer($coursenum,$coursedom,$folder);              my ($paste_res,$save_error) =
             if ($paste_res eq 'ok') {                  &do_paste_from_buffer($coursenum,$coursedom,$folder,$container,
                 ($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container);                                        \%paste_errors);
                 return $errtext if ($fatal);                  if ($save_error ne '') {
             } elsif ($paste_res ne '') {                      return $save_error;
                   }
               if ($paste_res ne 'ok') {
                 $r->print('<p><span class="LC_error">'.$paste_res.'</span></p>');                  $r->print('<p><span class="LC_error">'.$paste_res.'</span></p>');
             }              }
               if (keys(%paste_errors) > 0) {
                   $r->print('<p span class="LC_warning">'."\n".
                             &mt('The following files are either dependencies of a web page or references within a folder and/or composite page which could not be copied during the paste operation:')."\n".
                             '<ul>'."\n");
                   foreach my $key (sort(keys(%paste_errors))) {
                       $r->print('<li>'.$key.'</li>'."\n");
                   }
                   $r->print('</ul></p>'."\n");
               }
  }   }
   
  $r->print($upload_output);   $r->print($upload_output);
   
  if (&handle_edit_cmd()) {   if (&handle_edit_cmd()) {
     ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);              my $contentchg;
               if ($env{'form.cmd'} =~ /^(del|cut)_/) {
                   $contentchg = 1;
               }
       ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,$contentchg);
     return $errtext if ($fatal);      return $errtext if ($fatal);
  }   }
 # Group import/search  # Group import/search
Line 1592  sub editor { Line 1845  sub editor {
     $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;      $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
  }   }
  ($errtext,$fatal)=&storemap($coursenum,$coursedom,   ($errtext,$fatal)=&storemap($coursenum,$coursedom,
     $folder.'.'.$container);      $folder.'.'.$container,1);
  return $errtext if ($fatal);   return $errtext if ($fatal);
     } else {      } else {
  $r->print('<p><span class="LC_error">'.&mt('No map selected.').'</span></p>');   $r->print('<p><span class="LC_error">'.&mt('No map selected.').'</span></p>');
Line 1607  sub editor { Line 1860  sub editor {
     my $shown=0;      my $shown=0;
     if (($ishidden) || ($isencrypted) || ($randompick>=0) || ($is_random_order)) {      if (($ishidden) || ($isencrypted) || ($randompick>=0) || ($is_random_order)) {
  $r->print('<div class="LC_Box">'.   $r->print('<div class="LC_Box">'.
           '<ol class="LC_docs_parameters"><li style="font-weight:bold;">'.&mt('Parameters:').'</li>'.            '<ol class="LC_docs_parameters"><li class="LC_docs_parameters_title">'.&mt('Parameters:').'</li>'.
   ($randompick>=0?'<li>&bull;&nbsp;'.&mt('randomly pick [quant,_1,resource]',$randompick).'</li>':'').    ($randompick>=0?'<li>'.&mt('randomly pick [quant,_1,resource]',$randompick).'</li>':'').
   ($ishidden?'<li>&bull;&nbsp;'.&mt('contents hidden').'</li>':'').    ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
   ($isencrypted?'<li>&bull;&nbsp;'.&mt('URLs hidden').'</li>':'').    ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
   ($is_random_order?'<li>&bull;&nbsp;'.&mt('random order').'</li>':'').    ($is_random_order?'<li>'.&mt('random order').'</li>':'').
   '</ol></p>');    '</ol>');
         if ($randompick>=0) {          if ($randompick>=0) {
             $r->print('<p class="LC_warning">'              $r->print('<p class="LC_warning">'
                  .&mt('Caution: this folder is set to randomly pick a subset'                   .&mt('Caution: this folder is set to randomly pick a subset'
Line 1636  sub editor { Line 1889  sub editor {
         $r->print('</div>');          $r->print('</div>');
     }      }
   
     my $output;        my ($to_show,$output);
   
     &Apache::loncommon::start_data_table_count(); #setup a row counter       &Apache::loncommon::start_data_table_count(); #setup a row counter 
     foreach my $res (@LONCAPA::map::order) {      foreach my $res (@LONCAPA::map::order) {
Line 1646  sub editor { Line 1899  sub editor {
         unless ($name) {  $name=(split(/\//,$url))[-1]; }          unless ($name) {  $name=(split(/\//,$url))[-1]; }
         unless ($name) { $idx++; next; }          unless ($name) { $idx++; next; }
         $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,          $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,
                               $coursenum,$crstype);                                $coursenum,$coursedom,$crstype,
                                 $uploadtag,$supplementalflag);
         $idx++;          $idx++;
         $shown++;          $shown++;
     }      }
     &Apache::loncommon::end_data_table_count();      &Apache::loncommon::end_data_table_count();
           
     if ($shown) {      if ($shown) {
         $r->print(&Apache::loncommon::start_data_table());          $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')
                     .&Apache::loncommon::start_data_table(undef,'contentlist');
         if ($allowed) {          if ($allowed) {
             $r->print(&Apache::loncommon::start_data_table_header_row()              $to_show .= &Apache::loncommon::start_data_table_header_row()
                      .'<th colspan="2">'.&mt('Move').'</th>'                       .'<th colspan="2">'.&mt('Move').'</th>'
                      .'<th>'.&mt('Actions').'</th>'                       .'<th>'.&mt('Actions').'</th>'
                      .'<th colspan="2">'.&mt('Document').'</th>');                       .'<th colspan="2">'.&mt('Document').'</th>';
             if ($folder !~ /^supplemental/) {              if ($folder !~ /^supplemental/) {
                 $->print('<th colspan="4">'.&mt('Settings').'</th>');                  $to_show .= '<th colspan="4">'.&mt('Settings').'</th>';
             }              }
             $r->print(&Apache::loncommon::end_data_table_header_row());              $to_show .= &Apache::loncommon::end_data_table_header_row();
         }          }
         $r->print($output          $to_show .= $output.' '
                  .&Apache::loncommon::end_data_table()                   .&Apache::loncommon::end_data_table()
         );                   .'<br style="line-height:2px;" />'
                    .&Apache::loncommon::end_scrollbox();
     } else {      } else {
         $r->print('<p class="LC_info">'          $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')
                    .'<div class="LC_info" id="contentlist">'
                  .&mt('Currently no documents.')                   .&mt('Currently no documents.')
                  .'</p>'                   .'</div>'
         );                   .&Apache::loncommon::end_scrollbox();
       }
       my $tid = 1;
       if ($supplementalflag) {
           $tid = 2;
     }      }
     if ($allowed) {      if ($allowed) {
         &print_paste_buffer($r,$container);          my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";
           $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto,
                                          $readfile));
           &print_paste_buffer($r,$container,$folder,$coursedom,$coursenum);
       } else {
           if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
               #Function Box for Supplemental Content for users with mdc priv.
               my $funcname = &mt('Folder Editor');
               $r->print(
                   &Apache::loncommon::head_subbox(
                       &Apache::lonhtmlcommon::start_funclist().
                       &Apache::lonhtmlcommon::add_item_funclist(
                           '<a href="/adm/coursedocs?command=direct&forcesupplement=1&'.
                           'supppath='.&HTML::Entities::encode($env{'form.folderpath'}).'">'.
                           '<img src="/res/adm/pages/docs.png" alt="'.$funcname.'" class="LC_icon" />'.
                           '<span class="LC_menubuttons_inline_text">'.$funcname.'</span></a>').
                             &Apache::lonhtmlcommon::end_funclist()));
           }
           $r->print($to_show);
     }      }
     return;      return;
 }  }
Line 1682  sub editor { Line 1961  sub editor {
 sub process_file_upload {  sub process_file_upload {
     my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;      my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
 # upload a file, if present  # upload a file, if present
     my $parseaction;      my ($parseaction,$showupload,$nextphase,$mimetype);
    if ($env{'form.parserflag'}) {      if ($env{'form.parserflag'}) {
         $parseaction = 'parse';          $parseaction = 'parse';
     }      }
     my $phase_status;  
     my $folder=$env{'form.folder'};      my $folder=$env{'form.folder'};
     if ($folder eq '') {      if ($folder eq '') {
         $folder='default';          $folder='default';
Line 1705  sub process_file_upload { Line 1983  sub process_file_upload {
             $LONCAPA::map::resources[1]='';              $LONCAPA::map::resources[1]='';
         }          }
         if ($fatal) {          if ($fatal) {
             return 'failed';              $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</div>';
               return;
         }          }
         my $destination = 'docs/';          my $destination = 'docs/';
         if ($folder =~ /^supplemental/) {          if ($folder =~ /^supplemental/) {
Line 1716  sub process_file_upload { Line 1995  sub process_file_upload {
         } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {          } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
             $destination .=  $2.'/';              $destination .=  $2.'/';
         }          }
 # this is for a course, not a user, so set coursedoc flag  # this is for a course, not a user, so set context to coursedoc.
 # probably the only place in the system where this should be "1"  
         my $newidx=&LONCAPA::map::getresidx();          my $newidx=&LONCAPA::map::getresidx();
         $destination .= $newidx;          $destination .= $newidx;
         my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,          my $url=&Apache::lonnet::userfileupload('uploaddoc','coursedoc',$destination,
  $parseaction,$allfiles,   $parseaction,$allfiles,
  $codebase);   $codebase,undef,undef,undef,undef,
                                                   undef,undef,\$mimetype);
           if ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E.*/([^/]+)$}) {
               my $stored = $1;
               $showupload = '<p>'.&mt('Uploaded [_1]','<span class="LC_filename">'.
                             $stored.'</span>').'</p>';
           } else {
               my ($filename) = ($env{'form.uploaddoc.filename'} =~ m{([^/]+)$});
               
               $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('Unable to save file [_1].','<span class="LC_filename">'.$filename.'</span>').'</div>';
               return;
           }
         my $ext='false';          my $ext='false';
         if ($url=~m{^http://}) { $ext='true'; }          if ($url=~m{^http://}) { $ext='true'; }
  $url     = &LONCAPA::map::qtunescape($url);   $url     = &LONCAPA::map::qtunescape($url);
Line 1737  sub process_file_upload { Line 2026  sub process_file_upload {
     $comment.':'.$url.':'.$ext.':normal:res';      $comment.':'.$url.':'.$ext.':normal:res';
         $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;          $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
         ($errtext,$fatal)=&storemap($coursenum,$coursedom,          ($errtext,$fatal)=&storemap($coursenum,$coursedom,
     $folder.'.'.$container);      $folder.'.'.$container,1);
         if ($fatal) {          if ($fatal) {
             $$upload_output .= '<p><span class="LC_error">'.$errtext.'</span></p>';              $$upload_output = '<div class="LC_error" id="uploadfileresult">'.$errtext.'</div>';
             return 'failed';              return;
         } else {          } else {
             if ($parseaction eq 'parse') {              if ($parseaction eq 'parse' && $mimetype eq 'text/html') {
                   $$upload_output = $showupload;
                 my $total_embedded = scalar(keys(%{$allfiles}));                  my $total_embedded = scalar(keys(%{$allfiles}));
                 if ($total_embedded > 0) {                  if ($total_embedded > 0) {
                     my $num = 0;                      my $uploadphase = 'upload_embedded';
     my $state = '                      my $primaryurl = &HTML::Entities::encode($url,'<>&"');
    <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />      my $state = &embedded_form_elems($uploadphase,$primaryurl,$newidx); 
    <input type="hidden" name="cmd" value="upload_embedded" />                      my ($embedded,$num) = 
    <input type="hidden" name="newidx" value="'.$newidx.'" />                          &Apache::loncommon::ask_for_embedded_content(
    <input type="hidden" name="primaryurl" value="'.&escape($url).'" />                              '/adm/coursedocs',$state,$allfiles,$codebase,{'docs_url' => $url});
    <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';                      if ($embedded) {
     $phase_status = 'phasetwo';                          if ($num) {
                               $$upload_output .=
                     $$upload_output .=           '<p>'.&mt('This file contains embedded multimedia objects, which need to be uploaded.').'</p>'.$embedded;
  'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />'.                              $nextphase = $uploadphase;
  &Apache::loncommon::ask_for_embedded_content(                          } else {
                             '/adm/coursedocs',$state,$allfiles,$codebase);                              $$upload_output .= $embedded;
                           }
                       } else {
                           $$upload_output .= &mt('Embedded item(s) already present, so no additional upload(s) required').'<br />';
                       }
                 } else {                  } else {
                     $$upload_output .= 'No embedded items identified<br />';                      $$upload_output .= &mt('No embedded items identified').'<br />';
                 }                  }
                   $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>';
               } elsif (&Apache::loncommon::is_archive_file($mimetype)) {
                   $nextphase = 'decompress_uploaded';
                   my $position = scalar(@LONCAPA::map::order)-1;
                   my $noextract = &return_to_editor();
                   my $archiveurl = &HTML::Entities::encode($url,'<>&"');
                   my %archiveitems = (
                       folderpath => $env{'form.folderpath'},
                       pagepath   => $env{'form.pagepath'},
                       cmd        => $nextphase,
                       newidx     => $newidx,
                       position   => $position,
                       phase      => $nextphase,
                       comment    => $comment,
                   );
                   my ($destination,$dir_root) = &embedded_destination($coursenum,$coursedom);
                   my @current = &get_dir_list($url,$coursenum,$coursedom,$newidx); 
                   $$upload_output = $showupload.
                                     &Apache::loncommon::decompress_form($mimetype,
                                         $archiveurl,'/adm/coursedocs',$noextract,
                                         \%archiveitems,\@current);
             }              }
         }          }
     }      }
     return $phase_status;      return $nextphase;
 }  }
   
 sub process_secondary_uploads {  sub get_dir_list {
     my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;      my ($url,$coursenum,$coursedom,$newidx) = @_;
     my $folder=$env{'form.folder'};      my ($destination,$dir_root) = &embedded_destination();
     my $destination = 'docs/';      my ($dirlistref,$listerror) =  
     if ($folder =~ /^supplemental/) {          &Apache::lonnet::dirlist("$dir_root/$destination/$newidx",$coursedom,$coursenum,1);
         $destination = 'supplemental/';      my @dir_lines;
     }      my $dirptr=16384;
     if (($folder eq 'default') || ($folder eq 'supplemental')) {      if (ref($dirlistref) eq 'ARRAY') {
         $destination .= 'default/';          foreach my $dir_line (sort
     } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {                            {
         $destination .=  $2.'/';                                my ($afile)=split('&',$a,2);
                                 my ($bfile)=split('&',$b,2);
                                 return (lc($afile) cmp lc($bfile));
                             } (@{$dirlistref})) {
               my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$dir_line,16);
               $filename =~ s/\s+$//;
               next if ($filename =~ /^\.\.?$/); 
               my $isdir = 0;
               if ($dirptr&$testdir) {
                   $isdir = 1;
               }
               push(@dir_lines, [$filename,$dom,$isdir,$size,$mtime,$obs]);
           }
     }      }
     $destination .= $newidx;      return @dir_lines;
     my ($url,$filename);  
     $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);  
     ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$});  
     return $filename;  
 }  }
   
 sub is_supplemental_title {  sub is_supplemental_title {
Line 1791  sub is_supplemental_title { Line 2114  sub is_supplemental_title {
     return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/);      return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/);
 }  }
   
 sub parse_supplemental_title {  
     my ($title) = @_;  
   
     my ($foldertitle,$renametitle);  
     if ($title =~ /&amp;&amp;&amp;/) {  
  $title = &HTML::Entites::decode($title);  
     }  
  if ($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/) {  
  $renametitle=$4;  
  my ($time,$uname,$udom) = ($1,$2,$3);  
  $foldertitle=&Apache::lontexconvert::msgtexconverted($4);  
  my $name =  &Apache::loncommon::plainname($uname,$udom);  
  $name = &HTML::Entities::encode($name,'"<>&\'');  
         $renametitle = &HTML::Entities::encode($renametitle,'"<>&\'');  
  $title='<i>'.&Apache::lonlocal::locallocaltime($time).'</i> '.  
     $name.': <br />'.$foldertitle;  
     }  
     if (wantarray) {  
  return ($title,$foldertitle,$renametitle);  
     }  
     return $title;  
 }  
   
 # --------------------------------------------------------------- An entry line  # --------------------------------------------------------------- An entry line
   
 sub entryline {  sub entryline {
     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$crstype)=@_;      my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,
           $crstype,$uploadtag,$supplementalflag)=@_;
     my ($foldertitle,$pagetitle,$renametitle);      my ($foldertitle,$pagetitle,$renametitle);
     if (&is_supplemental_title($title)) {      if (&is_supplemental_title($title)) {
  ($title,$foldertitle,$renametitle) = &parse_supplemental_title($title);   ($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title);
  $pagetitle = $foldertitle;   $pagetitle = $foldertitle;
     } else {      } else {
  $title=&HTML::Entities::encode($title,'"<>&\'');   $title=&HTML::Entities::encode($title,'"<>&\'');
Line 1831  sub entryline { Line 2132  sub entryline {
   
     my $orderidx=$LONCAPA::map::order[$index];      my $orderidx=$LONCAPA::map::order[$index];
   
   
     $renametitle=~s/\\/\\\\/g;      $renametitle=~s/\\/\\\\/g;
     $renametitle=~s/\&quot\;/\\\"/g;      $renametitle=~s/\&quot\;/\\\"/g;
     $renametitle=~s/ /%20/g;      $renametitle=~s/ /%20/g;
     my $line=&Apache::loncommon::start_data_table_row();      my $line=&Apache::loncommon::start_data_table_row();
     my ($form_start,$form_end);      my ($form_start,$form_end,$form_common);
 # Edit commands  # Edit commands
     my ($container, $type, $esc_path, $path, $symb);      my ($container, $type, $esc_path, $path, $symb);
     if ($env{'form.folderpath'}) {      if ($env{'form.folderpath'}) {
Line 1848  sub entryline { Line 2148  sub entryline {
     }      }
     if ($env{'form.pagepath'}) {      if ($env{'form.pagepath'}) {
         $type = $container = 'page';          $type = $container = 'page';
         $esc_path=&escape($path = $env{'form.pagepath'});          $esc_path=&escape($env{'form.pagepath'});
  $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"');   $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"');
         $symb=&escape($env{'form.pagesymb'});  
     }      }
     my $cpinfo='';      if (!$supplementalflag && $residx) {
           my $currurl = $url;
           $currurl =~ s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};
           my $path = 'uploaded/'.
                      $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
                      $env{'course.'.$env{'request.course.id'}.'.num'}.'/';
           $symb = &Apache::lonnet::encode_symb($path.$folder.".$container",
                                                $residx,
                                                &Apache::lonnet::declutter($currurl));
       }
       my %lt;
     if ($allowed) {      if ($allowed) {
  my $incindex=$index+1;   my $incindex=$index+1;
  my $selectbox='';   my $selectbox='';
  if (($folder!~/^supplemental/) &&   if (($#LONCAPA::map::order>0) &&
     ($#LONCAPA::map::order>0) &&  
     ((split(/\:/,      ((split(/\:/,
      $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1]       $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1]
      ne '') &&       ne '') &&
Line 1876  sub entryline { Line 2184  sub entryline {
     }      }
     $selectbox.='</select>';      $selectbox.='</select>';
  }   }
  my %lt=&Apache::lonlocal::texthash(   %lt=&Apache::lonlocal::texthash(
                 'up' => 'Move Up',                  'up' => 'Move Up',
  'dw' => 'Move Down',   'dw' => 'Move Down',
  'rm' => 'Remove',   'rm' => 'Remove',
                 'ct' => 'Cut',                  'ct' => 'Cut',
  'rn' => 'Rename',   'rn' => 'Rename',
  'cp' => 'Copy');   'cp' => 'Copy',
                   'ex' => 'External Resource',
                   'ed' => 'Edit',
                   'pr' => 'Preview',
                   'sv' => 'Save',
                   'ul' => 'URL',
                   'ti' => 'Title', 
                   );
  my $nocopy=0;   my $nocopy=0;
         my $nocut=0;          my $nocut=0;
         if ($url=~/\.(page|sequence)$/) {          my $noremove=0;
     if ($url =~ m{/res/}) {          if ($url=~ m{^/res/.+\.(page|sequence)$}) {
  # no copy for published maps              # no copy for published maps
  $nocopy = 1;              $nocopy=1;
     } else {          }
  foreach my $item (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url),1)) {  
     my ($title,$url,$ext,$type)=split(/\:/,$item);  
     if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {  
  $nocopy=1;  
  last;  
     }  
  }  
     }  
  }  
         if ($url=~/^\/res\/lib\/templates\//) {          if ($url=~/^\/res\/lib\/templates\//) {
            $nocopy=1;             $nocopy=1;
            $nocut=1;             $nocut=1;
         }          }
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           if ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") {
               if ($env{'form.folderpath'} =~ /^default&[^\&]+$/) {
                   my %curr_groups = &Apache::longroup::coursegroups();
                   if (keys(%curr_groups) > 0) {
                       $noremove=1;
                   }
                   $nocut=1;
                   $nocopy=1;
               }
           } elsif ($url =~ m{^\Q/uploaded/$cdom/$cnum/group_folder_\E(\w+)\.sequence$}) {
               my $group = $1;
               if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+$/) {
                   my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
                   if (keys(%curr_group) > 0) {
                       $noremove=1;
                   }
               }
               $nocut=1;
               $nocopy=1;
           } elsif ($url =~ m{^\Q/adm/$cdom/$cnum/\E(\w+)/smppg$}) {
               my $group = $1;
               if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&\Qgroup_folder_$group\E\&[^\&]+$/) {
                   my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
                   my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group});
                   if (keys(%groupsettings) > 0) {
                       $noremove=1;
                   }
                   $nocut=1;
                   $nocopy=1;
               }
           } elsif ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&group_folder_(\w+)\&/) {
               my $group = $1;
               my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
               if ($url =~ /group_boards_\Q$group\E/) {
                   my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
                   my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group});
                   if (keys(%groupsettings) > 0) {
                       if (ref($groupsettings{'functions'}) eq 'HASH') {
                           if ($groupsettings{'functions'}{'discussion'} eq 'on') {
                               $noremove=1;
                           }
                       }
                   }
                   $nocut=1;
                   $nocopy=1;
               }
           }
         my $copylink='&nbsp;';          my $copylink='&nbsp;';
         my $cutlink='&nbsp;';          my $cutlink='&nbsp;';
           my $removelink='&nbsp;';
   
  my $skip_confirm = 0;   my $skip_confirm = 0;
  if ( $folder =~ /^supplemental/   if ( $folder =~ /^supplemental/
Line 1920  sub entryline { Line 2276  sub entryline {
   
  if (!$nocopy) {   if (!$nocopy) {
     $copylink=(<<ENDCOPY);      $copylink=(<<ENDCOPY);
 <a href='javascript:markcopy("$esc_path","$index","$renametitle","$container","$symb","$folder");' class="LC_docs_copy">$lt{'cp'}</a>  <a href="javascript:markcopy('$esc_path','$index','$renametitle','$container','$symb','$folder');" class="LC_docs_copy">$lt{'cp'}</a>
 ENDCOPY  ENDCOPY
         }          }
  if (!$nocut) {   if (!$nocut) {
     $cutlink=(<<ENDCUT);      $cutlink=(<<ENDCUT);
 <a href='javascript:cutres("$esc_path","$index","$renametitle","$container","$symb","$folder",$skip_confirm);' class="LC_docs_cut">$lt{'ct'}</a>  <a href="javascript:cutres('$esc_path','$index','$renametitle','$container','$symb','$folder',$skip_confirm);" class="LC_docs_cut">$lt{'ct'}</a>
 ENDCUT  ENDCUT
         }          }
  $form_start = (<<END);          if (!$noremove) {
    <form  action="/adm/coursedocs" method="post">              $removelink=(<<ENDREM);
   <a href='javascript:removeres("$esc_path","$index","$renametitle","$container","$symb",$skip_confirm);' class="LC_docs_remove">$lt{'rm'}</a>
   ENDREM
           }
    $form_start = '
      <form action="/adm/coursedocs" method="post">
   ';
           $form_common=(<<END);
    <input type="hidden" name="${type}path" value="$path" />     <input type="hidden" name="${type}path" value="$path" />
    <input type="hidden" name="${type}symb" value="$symb" />     <input type="hidden" name="${type}symb" value="$symb" />
    <input type="hidden" name="setparms" value="$orderidx" />     <input type="hidden" name="setparms" value="$orderidx" />
Line 1939  END Line 2302  END
  $line.=(<<END);   $line.=(<<END);
 <td>  <td>
 <div class="LC_docs_entry_move">  <div class="LC_docs_entry_move">
   <a href='/adm/coursedocs?cmd=up_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb$cpinfo'>    <a href='/adm/coursedocs?cmd=up_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb'>
     <img src="${iconpath}move_up.gif" alt='$lt{'up'}' class="LC_icon" />      <img src="${iconpath}move_up.gif" alt="$lt{'up'}" class="LC_icon" />
   </a>    </a>
 </div>  </div>
 <div class="LC_docs_entry_move">  <div class="LC_docs_entry_move">
   <a href='/adm/coursedocs?cmd=down_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb$cpinfo'>    <a href='/adm/coursedocs?cmd=down_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb'>
     <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' class="LC_icon" />      <img src="${iconpath}move_down.gif" alt="$lt{'dw'}" class="LC_icon" />
   </a>    </a>
 </div>  </div>
 </td>  </td>
 <td>  <td>
    $form_start     $form_start
      $form_common
    $selectbox     $selectbox
    $form_end     $form_end
 </td>  </td>
 <td class="LC_docs_entry_commands">  <td class="LC_docs_entry_commands">
    <a href='javascript:removeres("$esc_path","$index","$renametitle","$container","$symb",$skip_confirm);' class="LC_docs_remove">$lt{'rm'}</a>  $removelink
 $cutlink  $cutlink
    <a href='javascript:changename("$esc_path","$index","$renametitle","$container","$symb");' class="LC_docs_rename">$lt{'rn'}</a>     <a href='javascript:changename("$esc_path","$index","$renametitle","$container","$symb");' class="LC_docs_rename">$lt{'rn'}</a>
 $copylink  $copylink
Line 1973  END Line 2337  END
     my $pagearg;      my $pagearg;
     my $pagefile;      my $pagefile;
     if ($uploaded) {      if ($uploaded) {
  if ($extension eq 'sequence') {          if (($extension eq 'sequence') || ($extension eq 'page')) {
     $icon=$iconpath.'/navmap.folder.closed.gif';              $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;
     $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/;              my $containerarg = $1;
     $url='/adm/coursedocs?';      if ($extension eq 'sequence') {
     $folderarg=$1;          $icon=$iconpath.'navmap.folder.closed.gif';
     $isfolder=1;                  $folderarg=$containerarg;
         } elsif ($extension eq 'page') {                  $isfolder=1;
             $icon=$iconpath.'/page.gif';              } else {
             $url=~/\Q$coursenum\E\/([\/\w]+)\.page$/;                  $icon=$iconpath.'page.gif';
             $pagearg=$1;                  $pagearg=$containerarg;
             $url='/adm/coursedocs?';                  $ispage=1;
             $ispage=1;              }
               if ($allowed) {
                   $url='/adm/coursedocs?';
               } else {
                   $url='/adm/supplemental?';
               }
  } else {   } else {
     &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);      &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
  }   }
     }      }
   
       my $editlink;
     my $orig_url = $url;      my $orig_url = $url;
     $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};      $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
     my $external = ($url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/});      my $external = ($url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/});
     if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {      if (!$supplementalflag && $residx && $symb) {
  my $symb=&Apache::lonnet::symbclean(          if ($container eq 'page') {
           &Apache::lonnet::declutter('uploaded/'.              $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
            $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.              $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
            $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.          } 
            '.sequence').          if ((!$isfolder) && (!$ispage)) {
            '___'.$residx.'___'.      (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
    &Apache::lonnet::declutter($url));      $url=&Apache::lonnet::clutter($url);
  (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);      if ($url=~/^\/*uploaded\//) {
  $url=&Apache::lonnet::clutter($url);          $url=~/\.(\w+)$/;
  if ($url=~/^\/*uploaded\//) {          my $embstyle=&Apache::loncommon::fileembstyle($1);
     $url=~/\.(\w+)$/;          if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
     my $embstyle=&Apache::loncommon::fileembstyle($1);      $url='/adm/wrapper'.$url;
     if (($embstyle eq 'img') || ($embstyle eq 'emb')) {          } elsif ($embstyle eq 'ssi') {
  $url='/adm/wrapper'.$url;      #do nothing with these
     } elsif ($embstyle eq 'ssi') {          } elsif ($url!~/\.(sequence|page)$/) {
  #do nothing with these      $url='/adm/coursedocs/showdoc'.$url;
     } elsif ($url!~/\.(sequence|page)$/) {          }
  $url='/adm/coursedocs/showdoc'.$url;      } elsif ($url=~m|^/ext/|) {
     }          $url='/adm/wrapper'.$url;
  } elsif ($url=~m|^/ext/|) {          $external = 1;
     $url='/adm/wrapper'.$url;       }
     $external = 1;              if (&Apache::lonnet::symbverify($symb,$url)) {
  }                  $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
         if (&Apache::lonnet::symbverify($symb,$url)) {              } else {
     $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);                  $url='';
         } else {              }
             $url='';  
         }          }
  if ($container eq 'page') {  
     my $symb=$env{'form.pagesymb'};  
   
     $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);  
     $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);  
  }  
     }      }
     my ($parameterset,$rand_order_text) = ('&nbsp;', '&nbsp;');      my ($rand_pick_text,$rand_order_text);
     if ($isfolder || $extension eq 'sequence') {      if ($isfolder || $extension eq 'sequence') {
  my $foldername=&escape($foldertitle);   my $foldername=&escape($foldertitle);
  my $folderpath=$env{'form.folderpath'};   my $folderpath=$env{'form.folderpath'};
Line 2044  END Line 2407  END
                                               'parameter_encrypturl'))[0]=~/^yes$/i)                                                'parameter_encrypturl'))[0]=~/^yes$/i)
                                                .':'.((&LONCAPA::map::getparameter($orderidx,                                                 .':'.((&LONCAPA::map::getparameter($orderidx,
                                               'parameter_randomorder'))[0]=~/^yes$/i);                                                'parameter_randomorder'))[0]=~/^yes$/i);
  $url.='folderpath='.&escape($folderpath).$cpinfo;   $url.='folderpath='.&escape($folderpath);
  $parameterset='<label>'.&mt('Randomly Pick: ').          my $rpicknum = (&LONCAPA::map::getparameter($orderidx,
     '<input type="text" size="4" onchange="this.form.changeparms.value='."'randompick'".';this.form.submit()" name="randompick_'.$orderidx.'" value="'.                                                     'parameter_randompick'))[0];
     (&LONCAPA::map::getparameter($orderidx,          my $rpckchk;
                                               'parameter_randompick'))[0].          if ($rpicknum) {
                                               '" />'.              $rpckchk = ' checked="checked"';
 '<a href="javascript:void(0)">'.&mt('Save').'</a></label>';          }
           my $formname = 'edit_rpick_'.$orderidx;
    $rand_pick_text = 
   '<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".
   $form_common."\n".
   '<span class="LC_nobreak"><label><input type="checkbox" name="randpickon_'.$orderidx.'" id="rpick_'.$orderidx.'" onclick="'."updatePick(this.form,'$orderidx','check');".'"'.$rpckchk.' /> '.&mt('Randomly Pick').'</label><input type="hidden" name="randompick_'.$orderidx.'" id="rpicknum_'.$orderidx.'" value="'.$rpicknum.'" />';
           if ($rpicknum ne '') {
               $rand_pick_text .= ':&nbsp;<a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>';
           }
           $rand_pick_text .= '</span></form>';
     my $ro_set=      my $ro_set=
     ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');      ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');
  $rand_order_text ='   $rand_order_text = 
 <span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" onclick="this.form.changeparms.value=\'randomorder\';this.form.submit()" '.$ro_set.' /> '.&mt('Random Order').' </label></span>';  $form_start.
   $form_common.'
   <span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" onclick="'."this.form.changeparms.value='randomorder';this.form.submit()".'" '.$ro_set.' /> '.&mt('Random Order').' </label></span></form>';
     }      }
     if ($ispage) {      if ($ispage) {
         my $pagename=&escape($pagetitle);          my $pagename=&escape($pagetitle);
Line 2062  END Line 2436  END
         my $folderpath=$env{'form.folderpath'};          my $folderpath=$env{'form.folderpath'};
         if ($folderpath) { $pagepath = $folderpath.'&' };          if ($folderpath) { $pagepath = $folderpath.'&' };
         $pagepath.=$pagearg.'&'.$pagename;          $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='.&escape($pagepath).   $url.='pagepath='.&escape($pagepath).
     '&amp;pagesymb='.&escape($symb).$cpinfo;      '&amp;pagesymb='.&escape($symb);
     }      }
     if (($external) && ($allowed)) {      if ($allowed) {
  my $form = ($folder =~ /^default/)? 'newext' : 'supnewext';          my $fileloc =
  $external = '&nbsp;<a class="LC_docs_ext_edit" href="javascript:edittext(\''.$form.'\',\''.$residx.'\',\''.&escape($title).'\',\''.&escape($orig_url).'\');" >'.&mt('Edit').'</a>';              &Apache::lonnet::declutter(&Apache::lonnet::filelocation('',$orig_url));
     } else {  
  undef($external);          if ($external) {
               $editlink = <<"EXTLNK";
               &nbsp;
               <a class="LC_docs_ext_edit" href="javascript:editext('$residx');">
               $lt{'ed'}</a>
               <form action="/adm/coursedocs" method="post" name="editext_$residx">
               <fieldset id="uploadext$residx" style="display: none;" />
               <input type="hidden" name="active" value="aa" />
               <span class="LC_nobreak">
               <span class="LC_docs_ext_edit">$lt{'ul'}&nbsp;</span>
               <input type="text" size="40" name="exturl" id="exturl_$residx" value="$orig_url" />&nbsp;
               <a class="LC_docs_ext_edit" href="javascript:extUrlPreview('exturl_$residx');">$lt{'pr'}</a></span>
               </span><br />
               <span class="LC_nobreak">
               <span class="LC_docs_ext_edit">$lt{'ti'}&nbsp;</span>
               <input type="text" size="40" name="exttitle" value="$title" />
               $uploadtag
               <input type="hidden" name="importdetail" value="" />
               <input type="button" value="$lt{'sv'}" onclick="javascript:setExternal(this.form,'$residx')" />
               </span>
               </fieldset>
               </form>
   EXTLNK
           } else {
               my ($cfile,$home,$switchserver,$forceedit,$forceview) =
                   &Apache::lonnet::can_edit_resource($fileloc,$coursenum,$coursedom,$orig_url);
               if (($cfile ne '') && ($symb ne '')) {
                   my $jscall =
                       &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,
                                                               $switchserver,
                                                               $forceedit,
                                                               undef,$symb);
                   if ($jscall) {
                       $editlink = '&nbsp;<a class="LC_docs_ext_edit" href="javascript:'.
                                   $jscall.'" >'.&mt('Edit').'</a>';
                   }
               }
           }
     }      }
     my $reinit;      my $reinit;
     if ($crstype eq 'Community') {      if ($crstype eq 'Community') {
Line 2086  END Line 2488  END
     } else {      } else {
         $reinit = &mt('(re-initialize course to access)');          $reinit = &mt('(re-initialize course to access)');
     }        }  
     $line.='      $line.='<td>';
   <td>      if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
     '.($url?'<a href="'.$url.'">':'').'<img src="'.$icon.'" alt="" class="LC_icon" />'.($url?'</a>':'').'         $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>';
   </td>      } elsif ($url) {
   <td>         $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes',
     '.($url?"<a href=\"$url\">":'').$title.($url?'</a>':' <span class="LC_docs_reinit_warn">'.$reinit.'</span>').$external."                                               '<img src="'.$icon.'" alt="" class="LC_icon" />',600,500);
   </td>";      } else {
          $line.='<img src="'.$icon.'" alt="" class="LC_icon" />';
       }
       $line.='</td><td>';
       if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
          $line.='<a href="'.$url.'">'.$title.'</a>';
       } elsif ($url) {
          $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes',
                                                $title,600,500);
       } else {
          $line.=$title.' <span class="LC_docs_reinit_warn">'.$reinit.'</span>';
       }
       $line.=$editlink."</td>";
       $rand_pick_text = '&nbsp;' if ($rand_pick_text eq '');
       $rand_order_text = '&nbsp;' if ($rand_order_text eq '');
     if (($allowed) && ($folder!~/^supplemental/)) {      if (($allowed) && ($folder!~/^supplemental/)) {
   my %lt=&Apache::lonlocal::texthash(    my %lt=&Apache::lonlocal::texthash(
        'hd' => 'Hidden',         'hd' => 'Hidden',
Line 2104  END Line 2520  END
  $line.=(<<ENDPARMS);   $line.=(<<ENDPARMS);
   <td class="LC_docs_entry_parameter">    <td class="LC_docs_entry_parameter">
     $form_start      $form_start
       $form_common
     <label><input type="checkbox" name="hiddenresource_$orderidx" onclick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label>      <label><input type="checkbox" name="hiddenresource_$orderidx" onclick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label>
     $form_end      $form_end
   </td>      <br />
   <td class="LC_docs_entry_parameter">  
     $form_start      $form_start
       $form_common
     <label><input type="checkbox" name="encrypturl_$orderidx" onclick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label>      <label><input type="checkbox" name="encrypturl_$orderidx" onclick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label>
     $form_end      $form_end
   </td>    </td>
   <td class="LC_docs_entry_parameter">$form_start $rand_order_text $form_end</td>    <td class="LC_docs_entry_parameter">$rand_pick_text<br />
   <td class="LC_docs_entry_parameter">$form_start $parameterset $form_end</td>                                        $rand_order_text</td>
 ENDPARMS  ENDPARMS
     }      }
     $line.=&Apache::loncommon::end_data_table_row();      $line.=&Apache::loncommon::end_data_table_row();
Line 2232  sub checkonthis { Line 2649  sub checkonthis {
   
 =item list_symbs()  =item list_symbs()
   
 List Symbs  List Content Identifiers
   
 =cut  =cut
   
Line 2240  sub list_symbs { Line 2657  sub list_symbs {
     my ($r) = @_;      my ($r) = @_;
   
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Symb List'));      $r->print(&Apache::loncommon::start_page('List of Content Identifiers'));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content Identifiers'));
       $r->print(&startContentScreen('tools'));
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     if (!defined($navmap)) {      if (!defined($navmap)) {
         $r->print('<h2>'.&mt('Retrieval of List Failed').'</h2>'.          $r->print('<h2>'.&mt('Retrieval of List Failed').'</h2>'.
Line 2250  sub list_symbs { Line 2668  sub list_symbs {
                   '</div>');                    '</div>');
         &Apache::lonnet::logthis('Symb list failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'});          &Apache::lonnet::logthis('Symb list failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'});
     } else {      } else {
         $r->print("<pre>\n");          $r->print('<h4 class="LC_info">'.&mt("$crstype Content Identifiers").'</h4>'.
                     &Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_header_row().
                     '<th>'.&mt('Title').'</th><th>'.&mt('Identifier').'</th>'.
                     &Apache::loncommon::end_data_table_header_row()."\n");
           my $count;
         foreach my $res ($navmap->retrieveResources()) {          foreach my $res ($navmap->retrieveResources()) {
             $r->print($res->compTitle()."\t".$res->symb()."\n");              $r->print(&Apache::loncommon::start_data_table_row().
                         '<td>'.$res->compTitle().'</td>'.
                         '<td>'.$res->symb().'</td>'.
                         &Apache::loncommon::start_data_table_row());
               $count ++;
         }          }
         $r->print("\n</pre>\n");          if (!$count) {
               $r->print(&Apache::loncommon::start_data_table_row().
                         '<td colspan="2">'.&mt("$crstype is empty").'</td>'.
                         &Apache::loncommon::end_data_table_row()); 
           }
           $r->print(&Apache::loncommon::end_data_table());
     }      }
     $r->print('<hr /><a href="/adm/coursedocs">'.&mt('Back to Course Editor').'</a>');  
 }  }
   
   
 sub verifycontent {  sub verifycontent {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
    $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents'));      $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents'));
    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents'));
       $r->print(&startContentScreen('tools'));
       $r->print('<h4 class="LC_info">'.&mt($crstype.' content verification').'</h4>'); 
    $hashtied=0;     $hashtied=0;
    undef %alreadyseen;     undef %alreadyseen;
    %alreadyseen=();     %alreadyseen=();
    &tiehash();     &tiehash();
      
    foreach my $key (keys(%hash)) {     foreach my $key (keys(%hash)) {
        if ($hash{$key}=~/\.(page|sequence)$/) {         if ($hash{$key}=~/\.(page|sequence)$/) {
    if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) {     if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) {
Line 2283  sub verifycontent { Line 2717  sub verifycontent {
        }         }
    }     }
    &untiehash();     &untiehash();
    $r->print(     $r->print('<p class="LC_success">'.&mt('Done').'</p>');
        '<p class="LC_success">'.&mt('Done').'</p>'  
       .'<hr />'  
       .'<p><a href="/adm/coursedocs">'  
   .&mt('Back to Course Editor')  
       .'</a></p>'  
    );  
 }  }
   
   
Line 2304  sub checkversions { Line 2732  sub checkversions {
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page("Check $crstype Document Versions"));      $r->print(&Apache::loncommon::start_page("Check $crstype Document Versions"));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Document Versions"));      $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Document Versions"));
       $r->print(&startContentScreen('tools'));
   
     my $header='';      my $header='';
     my $startsel='';      my $startsel='';
     my $monthsel='';      my $monthsel='';
Line 2355  sub checkversions { Line 2785  sub checkversions {
         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 Saved').'</h1>');      $r->print(&Apache::loncommon::confirmwrapper(
                   &Apache::lonhtmlcommon::confirm_success(&mt('Your Version Settings have been Saved'))));
  } else {   } else {
     $r->print('<h1><span class="LC_error">'.&mt('An Error Occured while Attempting to Save your Version Settings').'</span></h1>');      $r->print(&Apache::loncommon::confirmwrapper(
                   &Apache::lonhtmlcommon::confirm_success(&mt('An Error Occured while Attempting to Save your Version Settings'),1)));
  }   }
  &mark_hash_old();   &mark_hash_old();
     }      }
Line 2414  sub checkversions { Line 2846  sub checkversions {
        'lw' => 'Version changes since last Week',         'lw' => 'Version changes since last Week',
        'sy' => 'Version changes since Yesterday',         'sy' => 'Version changes since Yesterday',
                'al' => 'All Resources (possibly large output)',                 'al' => 'All Resources (possibly large output)',
                  'cd' => 'Change display', 
        'sd' => 'Display',         'sd' => 'Display',
        'fi' => 'File',         'fi' => 'File',
        'md' => 'Modification Date',         'md' => 'Modification Date',
Line 2423  sub checkversions { Line 2856  sub checkversions {
 'sv' => 'Set Versions to be used in '.$crstype.' according to Selections below',  'sv' => 'Set Versions to be used in '.$crstype.' according to Selections below',
 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',  'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',
 'sc' => 'Set all Resource Versions to current Version (Fix Versions)',  'sc' => 'Set all Resource Versions to current Version (Fix Versions)',
        'di' => 'Differences');         'di' => 'Differences',
          'save' => 'Save changes',
                  'vers' => 'Version choice(s) for specific resources', 
          'act' => 'Actions');
     $r->print(<<ENDHEADERS);      $r->print(<<ENDHEADERS);
   <h4 class="LC_info">$header</h4>
 <form action="/adm/coursedocs" method="post">  <form action="/adm/coursedocs" method="post">
 <input type="hidden" name="versions" value="1" />  <input type="hidden" name="versions" value="1" />
 <input type="submit" name="setmostrecent" value="$lt{'sm'}" />  <div class="LC_left_float">
 <input type="submit" name="setcurrent" value="$lt{'sc'}" /><hr />  <fieldset>
   <legend>$lt{'cd'}</legend>
 <select name="timerange">  <select name="timerange">
 <option value='all' $allsel>$lt{'al'}</option>  <option value='all' $allsel>$lt{'al'}</option>
 <option value="-1" $startsel>$lt{'st'}</option>  <option value="-1" $startsel>$lt{'st'}</option>
Line 2437  sub checkversions { Line 2875  sub checkversions {
 <option value="86400" $daysel>$lt{'sy'}</option>  <option value="86400" $daysel>$lt{'sy'}</option>
 </select>  </select>
 <input type="submit" name="display" value="$lt{'sd'}" />  <input type="submit" name="display" value="$lt{'sd'}" />
 <h3>$header</h3>  </fieldset>
 <input type="submit" name="setversions" value="$lt{'sv'}" />  </div>
   <div class="LC_left_float">
   <fieldset>
   <legend>$lt{'act'}</legend>
   $lt{'sm'}: <input type="submit" name="setmostrecent" value="Go" /><br />
   $lt{'sc'}: <input type="submit" name="setcurrent" value="Go" />
   </fieldset>
   </div>
   <br clear="all" />
   <hr />
   <h4>$lt{'vers'}</h4>
   <input type="submit" name="setversions" value="$lt{'save'}" />
 <table border="0">  <table border="0">
 ENDHEADERS  ENDHEADERS
       #number of columns for version history
       my $num_ver_col = 1;
       $r->print(
       &Apache::loncommon::start_data_table().
       &Apache::loncommon::start_data_table_header_row().
       '<th>'.&mt('Resources').'</th>'.
       "<th>$lt{'mr'}</th>".
       "<th>$lt{'ve'}</th>".
       "<th>$lt{'vu'}</th>".
       '<th colspan="'.$num_ver_col.'">'.&mt('History').'</th>'.
       '</b>');
     foreach my $key (sort(keys(%changes))) {      foreach my $key (sort(keys(%changes))) {
  if ($changes{$key}>$starttime) {          #excludes not versionable problems from resource version history:
           next unless ($changes{$key}>$starttime && $key !~ /^\/res\/lib\/templates/);
     my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);      my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
     my $currentversion=&Apache::lonnet::getversion($key);      my $currentversion=&Apache::lonnet::getversion($key);
     if ($currentversion<0) {      if ($currentversion<0) {
  $currentversion=&mt('Could not be determined.');                  $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>';
     }      }
     my $linkurl=&Apache::lonnet::clutter($key);      my $linkurl=&Apache::lonnet::clutter($key);
     $r->print(          $r->print(
       '<tr><td colspan="5"><br /><br /><font size="+1"><b>'.              &Apache::loncommon::end_data_table_header_row().
       &Apache::lonnet::gettitle($linkurl).              &Apache::loncommon::start_data_table_row().
                       '</b></font></td></tr>'.              '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br>'.
                       '<tr><td>&nbsp;&nbsp;&nbsp;</td>'.              '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'.
                       '<td colspan="4">'.              '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br>('.
                       '<a href="'.$linkurl.'" target="cat">'.$linkurl.              &Apache::lonlocal::locallocaltime(&Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate')).')</span></td>'.
       '</a></td></tr>'.              '<td align="right">');
                       '<tr><td></td>'.  
                       '<td title="'.$lt{'md'}.'">'.  
       &Apache::lonlocal::locallocaltime(  
                            &Apache::lonnet::metadata($root.'.'.$extension,  
                                                      'lastrevisiondate')  
                                                         ).  
                       '</td>'.  
                       '<td title="'.$lt{'mr'}.'"><span class="LC_nobreak">Most Recent: '.  
                       '<font size="+1">'.$currentversion.'</font>'.  
                       '</span></td>'.  
                       '<td title="'.$lt{'ve'}.'"><span class="LC_nobreak">In '.$crstype.': '.  
                       '<font size="+1">');  
 # Used in course  # Used in course
     my $usedversion=$hash{'version_'.$linkurl};      my $usedversion=$hash{'version_'.$linkurl};
     if (($usedversion) && ($usedversion ne 'mostrecent')) {      if (($usedversion) && ($usedversion ne 'mostrecent')) {
  $r->print($usedversion);                  if($usedversion != $currentversion){
                       $r->print('<span class="LC_warning">'.$usedversion.'</span>');
                   }else{
                       $r->print($usedversion);
                   }
     } else {      } else {
  $r->print($currentversion);   $r->print($currentversion);
     }      }
     $r->print('</font></span></td><td title="'.$lt{'vu'}.'">'.      $r->print('</td><td title="'.$lt{'vu'}.'">');
                       '<span class="LC_nobreak">Use: ');  
 # 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,
Line 2486  ENDHEADERS Line 2938  ENDHEADERS
        '' => '',         '' => '',
        'mostrecent' => &mt('most recent'),         'mostrecent' => &mt('most recent'),
        map {$_,$_} (1..$currentversion)}));         map {$_,$_} (1..$currentversion)}));
     $r->print('</span></td></tr><tr><td></td>');  
     my $lastold=1;      my $lastold=1;
     for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {      for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
  my $url=$root.'.'.$prevvers.'.'.$extension;   my $url=$root.'.'.$prevvers.'.'.$extension;
Line 2500  ENDHEADERS Line 2951  ENDHEADERS
             # each of the four columns              # each of the four columns
             my $entries_per_col = 0;              my $entries_per_col = 0;
             my $num_entries = ($currentversion-$lastold);              my $num_entries = ($currentversion-$lastold);
             if ($num_entries % 4 == 0) {              if ($num_entries % $num_ver_col == 0) {
                 $entries_per_col = $num_entries/4;                  $entries_per_col = $num_entries/$num_ver_col;
             } else {              } else {
                 $entries_per_col = $num_entries/4 + 1;                  $entries_per_col = $num_entries/$num_ver_col + 1;
             }              }
             my $entries_count = 0;              my $entries_count = 0;
             $r->print('<td valign="top"><font size="-2">');              $r->print('<td valign="top"><span class="LC_fontsize_medium">');
             my $cols_output = 1;              my $cols_output = 1;
             for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {              for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
  my $url=$root.'.'.$prevvers.'.'.$extension;   my $url=$root.'.'.$prevvers.'.'.$extension;
Line 2521  ENDHEADERS Line 2972  ENDHEADERS
                     $r->print(' <a href="/adm/diff?filename='.                      $r->print(' <a href="/adm/diff?filename='.
       &Apache::lonnet::clutter($root.'.'.$extension).        &Apache::lonnet::clutter($root.'.'.$extension).
       '&versionone='.$prevvers.        '&versionone='.$prevvers.
       '">'.&mt('Diffs').'</a>');        '" target="diffs">'.&mt('Diffs').'</a>');
  }   }
  $r->print('</span><br />');   $r->print('</span><br />');
                 if (++$entries_count % $entries_per_col == 0) {                  if (++$entries_count % $entries_per_col == 0) {
                     $r->print('</font></td>');                      $r->print('</span></td>');
                     if ($cols_output != 4) {                      if ($cols_output != $num_ver_col) {
                         $r->print('<td valign="top"><font size="-2">');                          $r->print('<td valign="top"><span class="LC_fontsize_medium">');
                         $cols_output++;                          $cols_output++;
                     }                      }
                 }                  }
     }      }
             while($cols_output++ < 4) {              while($cols_output++ < $num_ver_col) {
                 $r->print('</font></td><td><font>')                  $r->print('</span></td><td>');
             }              }
     $r->print('</font></td></tr>'."\n");  
  }   }
     }      }
     $r->print('</table></form>');      $r->print('</td>'.&Apache::loncommon::end_data_table_row().
     $r->print('<p class="LC_success">'.&mt('Done').'</p>');              &Apache::loncommon::end_data_table().
               '<input type="submit" name="setversions" value="'.$lt{'save'}.'" />');
   
     &untiehash();      &untiehash();
 }  }
Line 2603  $help{'Caching'}.'</p></form>'."\n\n"); Line 3054  $help{'Caching'}.'</p></form>'."\n\n");
 sub init_breadcrumbs {  sub init_breadcrumbs {
     my ($form,$text)=@_;      my ($form,$text)=@_;
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs",      &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1",
     text=>&Apache::loncommon::course_type().' Editor',      text=>&Apache::loncommon::course_type().' Editor',
     faq=>273,      faq=>273,
     bug=>'Instructor Interface',      bug=>'Instructor Interface',
Line 2614  sub init_breadcrumbs { Line 3065  sub init_breadcrumbs {
     bug=>'Instructor Interface'});      bug=>'Instructor Interface'});
 }  }
   
   # subroutine to list form elements
   sub create_list_elements {
      my @formarr = @_;
      my $list = '';
      foreach my $button (@formarr){
           foreach my $picture (keys(%{$button})) {
               $list .= &Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text', id => ''});
           }
      }
      return $list;
   }
   
   # subroutine to create ul from list elements
   sub create_form_ul {
      my $list = shift;
      my $ul = &Apache::lonhtmlcommon::htmltag('ul',$list, {class => 'LC_ListStyleNormal'});
      return $ul;
   }
   
   #
   # Start tabs
   #
   
   sub startContentScreen {
       my ($mode) = @_;
       my $output = '<ul class="LC_TabContentBigger" id="mainnav">';
       if (($mode eq 'navmaps') || ($mode eq 'supplemental')) {
           $output .= '<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Overview').'&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
           $output .= '<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Search').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
           $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>';
       } else {
           $output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Editor').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
           $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Content Editor').'</b></a></li>'."\n";
           $output .= '<li '.(($mode eq 'tools')?' class="active"':'').'><a href="/adm/coursedocs?tools=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Utilities').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
                      '><a href="/adm/coursedocs?tools=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Utilities').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>';
       }
       $output .= "\n".'</ul>'."\n";
       $output .= '<div class="LC_DocsBox" style="clear:both;margin:0;" id="contenteditor">'.
                  '<div id="maincoursedoc" style="margin:0 0;padding:0 0;">'.
                  '<div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">';
       return $output;
   }
   
   #
   # End tabs
   #
   
   sub endContentScreen {
       return '</div></div></div>';
   }
   
   sub supplemental_base {
       return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Content'));
   }
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
   
   # get course data
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
       my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
       my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
   
   # graphics settings
       $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL').'/');
   
   #
 # --------------------------------------------- Initialize help topics for this  # --------------------------------------------- Initialize help topics for this
     foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',      foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',
                'Adding_External_Resource','Navigate_Content',                 'Adding_External_Resource','Navigate_Content',
                'Adding_Folders','Docs_Overview', 'Load_Map',                 'Adding_Folders','Docs_Overview', 'Load_Map',
                'Supplemental','Score_Upload_Form','Adding_Pages',                 'Supplemental','Score_Upload_Form','Adding_Pages',
                'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',                         'Importing_LON-CAPA_Resource','Importing_IMS_Course',
                          'Uploading_From_Harddrive',
                'Check_Resource_Versions','Verify_Content') {                 'Check_Resource_Versions','Verify_Content') {
  $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);   $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);
     }      }
Line 2648  sub handler { Line 3159  sub handler {
     $help{'Group Portfolio'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');      $help{'Group Portfolio'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');      $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
   
 # does this user have privileges to modify docs      
     my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});      my $allowed;
   if ($allowed && $env{'form.verify'}) {  # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.
       unless ($r->uri eq '/adm/supplemental') {
           # does this user have privileges to modify content.  
           $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
       }
   
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['chooseserver',
                                               'inhibitmenu']);
     if ($allowed && $env{'form.chooseserver'}) {
         &choose_dump_server($r);
         return OK;
     } elsif ($allowed && $env{'form.verify'}) {
       &init_breadcrumbs('verify','Verify Content');        &init_breadcrumbs('verify','Verify Content');
       &verifycontent($r);        &verifycontent($r);
   } elsif ($allowed && $env{'form.listsymbs'}) {    } elsif ($allowed && $env{'form.listsymbs'}) {
       &init_breadcrumbs('listsymbs','List Symbs');        &init_breadcrumbs('listsymbs','List Content IDs');
       &list_symbs($r);        &list_symbs($r);
   } elsif ($allowed && $env{'form.docslog'}) {    } elsif ($allowed && $env{'form.docslog'}) {
       &init_breadcrumbs('docslog','Show Log');        &init_breadcrumbs('docslog','Show Log');
       &docs_change_log($r);        my $folder = $env{'form.folder'};
         if ($folder eq '') {
             $folder='default';
         }
         &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath);
   } elsif ($allowed && $env{'form.versions'}) {    } elsif ($allowed && $env{'form.versions'}) {
       &init_breadcrumbs('versions','Check/Set Resource Versions');        &init_breadcrumbs('versions','Check/Set Resource Versions');
       &checkversions($r);        &checkversions($r);
   } elsif ($allowed && $env{'form.dumpcourse'}) {    } elsif ($allowed && $env{'form.dumpcourse'}) {
       &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Documents to Construction Space');        &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Content to Authoring Space');
       &dumpcourse($r);        &dumpcourse($r);
   } elsif ($allowed && $env{'form.exportcourse'}) {    } elsif ($allowed && $env{'form.exportcourse'}) {
       &init_breadcrumbs('exportcourse','IMS Export');        &init_breadcrumbs('exportcourse','IMS Export');
       &exportcourse($r);        &Apache::imsexport::exportcourse($r);
   } else {    } else {
 # is this a standard course?  #
   # Done catching special calls
   # The whole rest is for course and supplemental documents and utilities menu
   # Get the parameters that may be needed
   #
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                               ['folderpath','pagepath',
                                                'pagesymb','forcesupplement','forcestandard',
                                                'tools','symb','command']);
   
   # standard=1: this is a "new-style" course with an uploaded map as top level
   # standard=2: this is a "old-style" course, and there is nothing we can do
   
     my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);      my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
     my $forcestandard = 0;  
     my $forcesupplement;  # Decide whether this should display supplemental or main content or utilities
   # supplementalflag=1: show supplemental documents
   # supplementalflag=0: show standard documents
   # toolsflag=1: show utilities
   
   
       my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);
       if (($env{'form.folderpath'}=~/^default/) || $env{'form.folderpath'} eq "" || ($env{'form.pagepath'})) {
          $supplementalflag=0;
       }
       if ($env{'form.forcesupplement'}) { $supplementalflag=1; }
       if ($env{'form.forcestandard'})   { $supplementalflag=0; }
       unless ($allowed) { $supplementalflag=1; }
       unless ($standard) { $supplementalflag=1; }
       my $toolsflag=0;
       if ($env{'form.tools'}) { $toolsflag=1; }
   
     my $script='';      my $script='';
     my $showdoc=0;      my $showdoc=0;
       my $addentries = {};
       my $container;
     my $containertag;      my $containertag;
     my $uploadtag;      my $uploadtag;
   
   # Do we directly jump somewhere?
   
      if ($env{'form.command'} eq 'direct') {
          my ($mapurl,$id,$resurl);
          if ($env{'form.symb'} ne '') {
              ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($env{'form.symb'});
              if ($resurl=~/\.(sequence|page)$/) {
                  $mapurl=$resurl;
              } elsif ($resurl eq 'adm/navmaps') {
                  $mapurl=$env{'course.'.$env{'request.course.id'}.'.url'};
              }
              my $mapresobj;
              my $navmap = Apache::lonnavmaps::navmap->new();
              if (ref($navmap)) {
                  $mapresobj = $navmap->getResourceByUrl($mapurl);
              }
              $mapurl=~s{^.*/([^/]+)\.(\w+)$}{$1};
              my $type=$2;
              my $path;
              if (ref($mapresobj)) {
                  my $pcslist = $mapresobj->map_hierarchy();
                  if ($pcslist ne '') {
                      foreach my $pc (split(/,/,$pcslist)) {
                          next if ($pc <= 1);
                          my $res = $navmap->getByMapPc($pc);
                          if (ref($res)) {
                              my $thisurl = $res->src();
                              $thisurl=~s{^.*/([^/]+)\.\w+$}{$1}; 
                              my $thistitle = $res->title();
                              $path .= '&'.
                                       &Apache::lonhtmlcommon::entity_encode($thisurl).'&'.
                                       &Apache::lonhtmlcommon::entity_encode($thistitle).
                                       ':'.$res->randompick().
                                       ':'.$res->randomout().
                                       ':'.$res->encrypted().
                                       ':'.$res->randomorder();
                          }
                      }
                  }
                  $path .= '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
                       &Apache::lonhtmlcommon::entity_encode($mapresobj->title()).
                       ':'.$mapresobj->randompick().
                       ':'.$mapresobj->randomout().
                       ':'.$mapresobj->encrypted().
                       ':'.$mapresobj->randomorder();
              } else {
                  my $maptitle = &Apache::lonnet::gettitle($mapurl);
                  $path = '&default&...::::'.
                      '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
                      &Apache::lonhtmlcommon::entity_encode($maptitle).'::::';
              }
              $path = 'default&'.
                      &Apache::lonhtmlcommon::entity_encode('Main Course Documents').
                      $path;
              if ($type eq 'sequence') {
                  $env{'form.folderpath'}=$path;
                  $env{'form.pagepath'}='';
              } else {
                  $env{'form.pagepath'}=$path;
                  $env{'form.folderpath'}='';
              }
          } elsif ($env{'form.supppath'} ne '') {
              $env{'form.folderpath'}=$env{'form.supppath'};
          }
      } elsif ($env{'form.command'} eq 'editdocs') {
           $env{'form.folderpath'} = 'default&'.
                                     &Apache::lonhtmlcommon::entity_encode('Main Course Content');
           $env{'form.pagepath'}='';
      } elsif ($env{'form.command'} eq 'editsupp') {
           $env{'form.folderpath'} = 'default&'.
                                     &Apache::lonhtmlcommon::entity_encode('Supplemental Content');
           $env{'form.pagepath'}='';
      }
   
   # Where do we store these for when we come back?
       my $stored_folderpath='docs_folderpath';
       if ($supplementalflag) {
          $stored_folderpath='docs_sup_folderpath';
       }
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},  
     ['folderpath','pagepath',  
      'pagesymb']);  
 # No folderpath, no pagepath, see if we have something stored  # No folderpath, no pagepath, see if we have something stored
     if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) {      if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) {
         &Apache::loncommon::restore_course_settings('docs_folderpath',          &Apache::loncommon::restore_course_settings($stored_folderpath,
                                               {'folderpath' => 'scalar'});                                                {'folderpath' => 'scalar'});
     }      }
      
   # If we are not allowed to make changes, all we can see are supplemental docs
     if (!$allowed) {      if (!$allowed) {
         unless($env{'form.folderpath'} =~ /^supplemental/) {          $env{'form.pagepath'}='';
             $env{'form.folderpath'} = '';          unless ($env{'form.folderpath'} =~ /^supplemental/) {
               $env{'form.folderpath'} = &supplemental_base();
         }          }
     }      }
   # If we still not have a folderpath, see if we can resurrect at pagepath
     if (!$env{'form.folderpath'} && $allowed) {      if (!$env{'form.folderpath'} && $allowed) {
         &Apache::loncommon::restore_course_settings('docs_folderpath',          &Apache::loncommon::restore_course_settings($stored_folderpath,
                                               {'pagepath' => 'scalar'});                                                {'pagepath' => 'scalar'});
     }      }
     if ($env{'form.pagepath'}) {  # Make the zeroth entry in supplemental docs page paths, so we can get to top level
        $env{'form.folderpath'}='';  
     }  
     if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {      if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {
         $env{'form.folderpath'} = 'supplemental&'.          $env{'form.folderpath'} = &supplemental_base()
                                   &escape(&mt('Supplemental '.$crstype.' Documents')).'&'.                                    .'&'.
                                   $env{'form.folderpath'};                                    $env{'form.folderpath'};
     }      }
     &Apache::loncommon::store_course_settings('docs_folderpath',  # If after all of this, we still don't have any paths, make them
                                                 {'pagepath' => 'scalar',      unless (($env{'form.pagepath'}) || ($env{'form.folderpath'})) {
                                                  'folderpath' => 'scalar'});         if ($supplementalflag) {
     if ($env{'form.folderpath'}) {            $env{'form.folderpath'}=&supplemental_base();
  my (@folderpath)=split('&',$env{'form.folderpath'});         } else {
  $env{'form.foldername'}=&unescape(pop(@folderpath));            $env{'form.folderpath'}='default';
  $env{'form.folder'}=pop(@folderpath);  
     }  
     if ($env{'form.pagepath'}) {  
         my (@pagepath)=split('&',$env{'form.pagepath'});  
         $env{'form.pagename'}=&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="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'.  
     '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />';  
     }  
     if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {  
        $showdoc='/'.$1;  
     }  
     if ($showdoc) { # got called in sequence from course  
  $allowed=0;   
     } else {  
        if (($env{'form.folder'}=~/^(?:group|default)_/) ||  
           ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {  
            $forcestandard = 1;  
        }  
        $forcesupplement=($env{'form.folder'}=~/^supplemental_/);  
   
        if ($allowed) {  
          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);  
          $script=&Apache::lonratedt::editscript('simple');  
        }         }
     }      }
   
 # subroutine to list form elements  # Store this
 sub create_list_elements {      unless ($toolsflag) {
    my @formarr = @_;           &Apache::loncommon::store_course_settings($stored_folderpath,
    my $list = '';                                                    {'pagepath' => 'scalar',
    for my $button (@formarr){                                                     'folderpath' => 'scalar'});
  for my $picture(keys %$button) {          if ($env{'form.folderpath'}) {
  #my $link = Apache::lonhtmlcommon::htmltag('a' ,$button->{$picture}, {href => "test"});       my (@folderpath)=split('&',$env{'form.folderpath'});
  $list .= Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text'});      $env{'form.foldername'}=&unescape(pop(@folderpath));
  }      $env{'form.folder'}=pop(@folderpath);
    }              $container='sequence';
    return $list;          }
 }          if ($env{'form.pagepath'}) {
               my (@pagepath)=split('&',$env{'form.pagepath'});
 # subroutine to create ul from list elements              $env{'form.pagename'}=&unescape(pop(@pagepath));
 sub create_form_ul {              $env{'form.folder'}=pop(@pagepath);
    my $list = shift;              $container='page';
    my $ul = Apache::lonhtmlcommon::htmltag('ul',$list, {class => 'LC_ListStyleNormal'});              $containertag = '<input type="hidden" name="pagepath" value="" />'.
    return $ul;                      '<input type="hidden" name="pagesymb" value="" />';
 }              $uploadtag = 
                   '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'.
 # get course data          '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />'.
     my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};                  '<input type="hidden" name="folderpath" value="" />';
     my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};          } else {
               my $folderpath=$env{'form.folderpath'};
               if (!$folderpath) {
                   if ($env{'form.folder'} eq '' ||
                       $env{'form.folder'} eq 'supplemental') {
                       $folderpath='default&'.
                           &escape(&mt('Main '.$crstype.' Documents'));
                   }
               }
               $containertag = '<input type="hidden" name="folderpath" value="" />';
               $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';
           }
           if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
              $showdoc='/'.$1;
           }
           if ($showdoc) { # got called in sequence from course
       $allowed=0; 
           } else {
               if ($allowed) {
                   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
                   $script=&Apache::lonratedt::editscript('simple');
               }
           }
       }
   
 # 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=&escape(&Apache::loncommon::plainname($uname,$udom));      my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom));
   
 # graphics settings  
   
     $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");  
   
     if ($allowed) {      if ($allowed) {
  $script .= &editing_js($udom,$uname);          if ($toolsflag) {
               $script .= &inject_data_js();
               my ($home,$other,%outhash)=&authorhosts();
               if (!$home && $other) {
                   my @hosts;
                   foreach my $aurole (keys(%outhash)) {
                       unless(grep(/^\Q$outhash{$aurole}\E/,@hosts)) {
                           push(@hosts,$outhash{$aurole});
                       }
                   }
                   $script .= &dump_switchserver_js(@hosts); 
               }
           } else {
               my @tabids;
               if ($supplementalflag) {
                   @tabids = ('002','ee2','ff2');
               } else {
                   @tabids = ('aa1','bb1','cc1','ff1');
                   unless ($env{'form.pagepath'}) {
                       unshift(@tabids,'001');
                       push(@tabids,('dd1','ee1'));
                   }
               }
               my $tabidstr = join("','",@tabids);
       $script .= &editing_js($udom,$uname,$supplementalflag).
                          &history_tab_js().
                          &inject_data_js().
                          &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr);
               $addentries = {
                               onload   => "javascript:resize_scrollbox('contentscroll','1','1');",
                             };
           }
           if ($env{'docs.markedcopy_url'}) {
               $script .= &paste_popup_js();
           }
           my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'.
                                &mt('Switch server?');
     }      }
 # -------------------------------------------------------------------- Body tag  # -------------------------------------------------------------------- Body tag
     $script = '<script type="text/javascript">'."\n"      $script = '<script type="text/javascript">'."\n"
Line 2785  sub create_form_ul { Line 3447  sub create_form_ul {
   
     # Breadcrumbs      # Breadcrumbs
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     if ($allowed) {      unless ($showdoc) {
         &Apache::lonhtmlcommon::add_breadcrumb({          &Apache::lonhtmlcommon::add_breadcrumb({
             href=>"/adm/coursedocs",text=>"$crstype Editor"});              href=>"/adm/coursedocs",text=>"$crstype Contents"});
   
         $r->print(&Apache::loncommon::start_page("$crstype Editor", $script,          $r->print(&Apache::loncommon::start_page("$crstype Contents", $script,
                                                  {'force_register' => $showdoc,})                                                   {'force_register' => $showdoc,
                                                     'add_entries'    => $addentries,
                                                    })
                  .&Apache::loncommon::help_open_menu('','',273,'RAT')                   .&Apache::loncommon::help_open_menu('','',273,'RAT')
                  .&Apache::lonhtmlcommon::breadcrumbs(                   .&Apache::lonhtmlcommon::breadcrumbs(
                      'Editing the Table of Contents for your '.$crstype,                       'Editing '.$crstype.' Contents',
                      'Docs_Adding_Course_Doc')                       'Docs_Adding_Course_Doc')
         );          );
     } elsif ($showdoc) {      } else {
         $r->print(&Apache::loncommon::start_page("$crstype documents",undef,          $r->print(&Apache::loncommon::start_page("$crstype documents",undef,
                                                 {'force_register' => $showdoc,}));                                                  {'force_register' => $showdoc,}));
     } else {  
         my $folder=$env{'form.folder'};  
         if ($folder eq '' || $folder eq 'supplemental') {  
             $env{'form.folderpath'} = 'supplemental&'.  
                                       &escape(&mt('Supplemental '.$crstype.' Documents'));  
         }  
         my ($breadcrumbtrail) = &breadcrumbs($allowed,$crstype);  
         $r->print(&Apache::loncommon::start_page("Supplemental documents").  
                   $breadcrumbtrail);  
     }      }
   
   my %allfiles = ();    my %allfiles = ();
   my %codebase = ();    my %codebase = ();
   my ($upload_result,$upload_output);    my ($upload_result,$upload_output,$uploadphase);
   if ($allowed) {    if ($allowed) {
       if (($env{'form.uploaddoc.filename'}) &&        if (($env{'form.uploaddoc.filename'}) &&
   ($env{'form.cmd'}=~/^upload_(\w+)/)) {    ($env{'form.cmd'}=~/^upload_(\w+)/)) {
 # Process file upload - phase one - upload and parse primary file.            my $context = $1; 
             # Process file upload - phase one - upload and parse primary file.
   undef($hadchanges);    undef($hadchanges);
           $upload_result = &process_file_upload(\$upload_output,$coursenum,            $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom,
  $coursedom,\%allfiles,                                                \%allfiles,\%codebase,$context);
  \%codebase,$1);  
   if ($hadchanges) {    if ($hadchanges) {
       &mark_hash_old();        &mark_hash_old();
   }    }
           if ($upload_result eq 'phasetwo') {            $r->print($upload_output);
               $r->print($upload_output);        } elsif ($env{'form.phase'} eq 'upload_embedded') {
           }            # Process file upload - phase two - upload embedded objects 
       } elsif ($env{'form.phasetwo'}) {            $uploadphase = 'check_embedded';
           my %newname = ();            my $primaryurl = &HTML::Entities::encode($env{'form.primaryurl'},'<>&"');   
           my %origname = ();            my $state = &embedded_form_elems($uploadphase,$primaryurl,
           my %attribs = ();                                             $env{'form.newidx'});
           my $updateflag = 0;            my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
           my $residx = $env{'form.newidx'};            my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
           my $primary_url = &unescape($env{'form.primaryurl'});            my ($destination,$dir_root) = &embedded_destination();
 # Process file upload - phase two - gather secondary files.            my $url_root = '/uploaded/'.$docudom.'/'.$docuname;
           for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {            my $actionurl = '/adm/coursedocs';
               if ($env{'form.embedded_item_'.$i.'.filename'}) {            my ($result,$flag) = 
                   my $javacodebase;                &Apache::loncommon::upload_embedded('coursedoc',$destination,
                   $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);                    $docuname,$docudom,$dir_root,$url_root,undef,undef,undef,$state,
                   $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});                    $actionurl);
                   if (exists($env{'form.embedded_codebase_'.$i})) {            $r->print($result.&return_to_editor());
                       $javacodebase =  &unescape($env{'form.embedded_codebase_'.$i});        } elsif ($env{'form.phase'} eq 'check_embedded') {
                       $origname{$i} =~ s#^\Q$javacodebase\E/##;            # Process file upload - phase three - modify references in HTML file
                   }            $uploadphase = 'modified_orightml';
                   my @attributes = ();            my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
                   if ($env{'form.embedded_attrib_'.$i} =~ /:/) {            my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
                       @attributes = split(/:/,$env{'form.embedded_attrib_'.$i});            my ($destination,$dir_root) = &embedded_destination();
                   } else {            my $result = 
                       @attributes = ($env{'form.embedded_attrib_'.$i});                &Apache::loncommon::modify_html_refs('coursedoc',$destination,
                   }                                                     $docuname,$docudom,undef,
                   foreach my $attr (@attributes) {                                                     $dir_root);
                       push(@{$attribs{$i}},&unescape($attr));            $r->print($result.&return_to_editor());   
                   }        } elsif ($env{'form.phase'} eq 'decompress_uploaded') {
                   if ($javacodebase) {            $uploadphase = 'decompress_phase_one';
                       $codebase{$i} = $javacodebase;            $r->print(&decompression_phase_one().
                       $codebase{$i} =~ s#/$##;                      &return_to_editor());
                       $updateflag = 1;        } elsif ($env{'form.phase'} eq 'decompress_cleanup') {
                   }            $uploadphase = 'decompress_phase_two';
               }            $r->print(&decompression_phase_two().
               unless ($newname{$i} eq $origname{$i}) {                      &return_to_editor());
                   $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; #' stupid emacs  
                       }  
                   }  
 # 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') {    if ($allowed && $toolsflag) {
         $r->print(&startContentScreen('tools'));
         $r->print(&generate_admin_menu($crstype));
         $r->print(&endContentScreen());
     } elsif ((!$showdoc) && (!$uploadphase)) {
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
        my %lt=&Apache::lonlocal::texthash(         my %lt=&Apache::lonlocal::texthash(
                 'uplm' => 'Upload a new main '.lc($crstype).' document',                  'uplm' => 'Upload a new main '.lc($crstype).' document',
                 'upls' => 'Upload a new supplemental '.lc($crstype).' document',                  'upls' => 'Upload a new supplemental '.lc($crstype).' document',
                 'impp' => 'Import a document',                  'impp' => 'Import a document',
  'copm' => 'All documents out of a published map into this folder',   'copm' => 'All documents out of a published map into this folder',
                 'upld' => 'Import Document',                  'upfi' => 'Upload File',
                   'upld' => 'Import Content',
                 'srch' => 'Search',                  'srch' => 'Search',
                 'impo' => 'Import',                  'impo' => 'Import',
  'book' => 'Import Bookmarks',                  'lnks' => 'Import from Stored Links',
                   'impm' => 'Import from Assembled Map',
                 'selm' => 'Select Map',                  'selm' => 'Select Map',
                 'load' => 'Load Map',                  'load' => 'Load Map',
                 'reco' => 'Recover Deleted Documents',                  'reco' => 'Recover Deleted Documents',
Line 2919  sub create_form_ul { Line 3546  sub create_form_ul {
                 'sipa' => 'Simple Course Page',                  'sipa' => 'Simple Course Page',
                 'sipr' => 'Simple Problem',                  'sipr' => 'Simple Problem',
                 'drbx' => 'Drop Box',                  'drbx' => 'Drop Box',
                 'scuf' => 'Score Upload Form',                  'scuf' => 'External Scores (handgrade, upload, clicker)',
                 'bull' => 'Discussion Board',                  'bull' => 'Discussion Board',
                 'mypi' => 'My Personal Information Page',                  'mypi' => 'My Personal Information Page',
                 'grpo' => 'Group Portfolio',                  'grpo' => 'Group Portfolio',
Line 2927  sub create_form_ul { Line 3554  sub create_form_ul {
  'abou' => 'Personal Information Page for a User',   'abou' => 'Personal Information Page for a User',
                 'imsf' => 'IMS Import',                  'imsf' => 'IMS Import',
                 'imsl' => 'Import IMS package',                  'imsl' => 'Import IMS package',
                   'cms'  => 'Origin of IMS package',
                 'file' =>  'File',                  'file' =>  'File',
                   'se'   => 'Select',
                 'title' => 'Title',                  'title' => 'Title',
                 'comment' => 'Comment',                  'comment' => 'Comment',
                   'url'  => 'URL',
                   'prev' => 'Preview',
                   'lnk'  => 'Add Link',
                 'parse' => 'Upload embedded images/multimedia files if HTML file',                  'parse' => 'Upload embedded images/multimedia files if HTML file',
  'nd' => 'Upload Document',   'nd' => 'Upload Document',
  'pm' => 'Published Map',   'pm' => 'Published Map',
Line 2950  FIUP Line 3582  FIUP
  <input type="checkbox" name="parserflag" checked="checked" /> $lt{'parse'}   <input type="checkbox" name="parserflag" checked="checked" /> $lt{'parse'}
  </label>   </label>
 CHBO  CHBO
           my $imsfolder = $env{'form.folder'};
     my $fileuploada = "<input type='submit' value='".$lt{'upld'}."' /> $help{'Uploading_From_Harddrive'}";          if ($imsfolder eq '') {
  my $fileuploadform=(<<FUFORM);              $imsfolder = 'default';
  <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">          }
           my $imspform=(<<IMSFORM);
           <a class="LC_menubuttons_link" href="javascript:toggleUpload('ims');">
           $lt{'imsf'}</a> $help{'Importing_IMS_Course'}
           <form name="uploadims" action="/adm/imsimportdocs" method="post" enctype="multipart/form-data" target="IMSimport">
           <fieldset id="uploadimsform" style="display: none;" />
           <legend>$lt{'imsf'}</legend>
           $fileupload
           <br />
           <p>
           $lt{'cms'}:&nbsp;
           <select name="source">
           <option value="-1" selected="selected">$lt{'se'}</option>
           <option value="bb5">Blackboard 5</option>
           <option value="bb6">Blackboard 6</option>
           <option value="angel5">ANGEL 5.5</option>
           <option value="webctce4">WebCT 4 Campus Edition</option>
           </select>
           <input type="hidden" name="folder" value="$imsfolder" />
           </p>
           <input type="hidden" name="phase" value="one" />
           <input type="button" value="$lt{'imsl'}" onclick="makeims(this.form);" />
           </fieldset>
           </form>
   IMSFORM
   
           my $fileuploadform=(<<FUFORM);
           <a class="LC_menubuttons_link" href="javascript:toggleUpload('doc');">
           $lt{'upfi'}</a> $help{'Uploading_From_Harddrive'}
           <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
           <fieldset id="uploaddocform" style="display: none;" />
           <legend>$lt{'upfi'}</legend>
  <input type="hidden" name="active" value="aa" />   <input type="hidden" name="active" value="aa" />
  $fileupload   $fileupload
  <br />   <br />
  $lt{'title'}:<br />   $lt{'title'}:<br />
  <input type="text" size="50" name="comment" />   <input type="text" size="60" name="comment" />
  $uploadtag   $uploadtag
  <input type="hidden" name="cmd" value="upload_default" />   <input type="hidden" name="cmd" value="upload_default" />
  <br />   <br />
  <span class="LC_nobreak">   <span class="LC_nobreak" style="float:left">
  $checkbox   $checkbox
  </span>   </span>
           <br clear="all" />
           <input type="submit" value="$lt{'upld'}" />
           </fieldset>
           </form>
 FUFORM  FUFORM
     #$list .= Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text'});  
     #$fileuploadform .= create_form_ul(create_list_elements(@fileuploada));  
     $fileuploadform .= create_form_ul(Apache::lonhtmlcommon::htmltag('li',$fileuploada,{class => 'LC_menubuttons_inline_text'}));  
  $fileuploadform .= (<<FUFORM);  
  </form>  
 FUFORM  
   
  my $simpleeditdefaultform=(<<SEDFFORM);          my $importpubform=(<<SEDFFORM);
  <form action="/adm/coursedocs" method="post" name="simpleeditdefault">          <a class="LC_menubuttons_link" href="javascript:toggleMap();">
  <input type="hidden" name="active" value="bb" />          $lt{'impm'}</a>$help{'Load_Map'}
           <form action="/adm/coursedocs" method="post" name="mapimportform">
           <fieldset id="importmapform" style="display: none;" />
           <legend>$lt{'impm'}</legend>
           <input type="hidden" name="active" value="bb" />
           $lt{'copm'}<br />
           <span class="LC_nobreak">
           <input type="text" name="importmap" size="40" value=""
           onfocus="this.blur();openbrowser('mapimportform','importmap','sequence,page','');" />
           &nbsp;<a href="javascript:openbrowser('mapimportform','importmap','sequence,page','');">$lt{'selm'}</a><br />
           <input type="submit" name="loadmap" value="$lt{'load'}" />
           </fieldset>
           </form>
   
 SEDFFORM  SEDFFORM
   
  my @simpleeditdefaultforma = (    my @simpleeditdefaultforma = ( 
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => "$uploadtag<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => "$uploadtag<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" },
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'"  onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'"  onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/vbkm.png" alt="'.$lt{book}.'" onclick="javascript:groupopen(0,1,1);" />' => "<a class='LC_menubuttons_link' href='javascript:groupopen(0,1,1);'>$lt{'book'}</a>" },          { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{lnks}.'" onclick="javascript:open_StoredLinks_Import();" />' => "<a class='LC_menubuttons_link' href='javascript:open_StoredLinks_Import();'>$lt{'lnks'}</a>" },
  );          { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap();" />' => $importpubform }
  $simpleeditdefaultform .= create_form_ul(create_list_elements(@simpleeditdefaultforma));          );
  $simpleeditdefaultform .=(<<SEDFFORM);          $importpubform = &create_form_ul(&create_list_elements(@importpubforma));
  <hr />  
  <p>  
  $lt{'copm'}<br />  
  <input type="text" size="40" name="importmap" /><br />  
  <span class="LC_nobreak"><input type="button"  
  onclick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"  
  value="$lt{'selm'}" /> <input type="submit" name="loadmap" value="$lt{'load'}" />  
  $help{'Load_Map'}</span>  
  </p>  
  </form>  
 SEDFFORM  
   
  my $extresourcesform=(<<ERFORM);        my $extresourcesform=(<<ERFORM);
  <form action="/adm/coursedocs" method="post" name="newext">        <a class="LC_menubuttons_link" href="javascript:toggleUpload('ext');">$lt{'extr'}</a>$help{'Adding_External_Resource'}
  $uploadtag        <form action="/adm/coursedocs" method="post" name="newext">
  <input type="hidden" name="importdetail" value="" />        <fieldset id="uploadextform" style="display: none;" />
  <a class="LC_menubuttons_link" href="javascript:makenewext('newext');">$lt{'extr'}</a>$help{'Adding_External_Resource'}        <legend>$lt{'extr'}</legend>
  </form>        <input type="hidden" name="active" value="aa" />
         $lt{'url'}:<br />
         <input type="text" size="60" name="exturl" id="exturl" value="http://" />
         <input type="button" name="view" value="$lt{'prev'}" onclick="javascript:extUrlPreview('exturl');" /><br />
         $lt{'title'}:<br />
         <input type="text" size="60" name="exttitle" value="$lt{'extr'}" />
         $uploadtag
         <br />
         <input type="hidden" name="importdetail" value="" />
         <input type="button" value="$lt{'lnk'}" onclick="javascript:setExternal(this.form,0)" />
         </fieldset>
         </form>
 ERFORM  ERFORM
   
     if ($allowed) {  
  &update_paste_buffer($coursenum,$coursedom);  
        my %lt=&Apache::lonlocal::texthash(  
  'vc' => 'Verify Content',  
  'cv' => 'Check/Set Resource Versions',  
  'ls' => 'List Symbs',  
                                          'sl' => 'Show Log'  
   );  
   
        my $folderpath=$env{'form.folderpath'};      if ($allowed) {
        if (!$folderpath) {          my $folder = $env{'form.folder'};
    if ($env{'form.folder'} eq '' ||          if ($folder eq '') {
        $env{'form.folder'} eq 'supplemental') {              $folder='default';
        $folderpath='default&'.          }
    &escape(&mt('Main '.$crstype.' Documents'));   &update_paste_buffer($coursenum,$coursedom,$folder);
    }  
        }  
        unless ($env{'form.pagepath'}) {  
            $containertag = '<input type="hidden" name="folderpath" value="" />';  
            $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';  
        }  
  $r->print(<<HIDDENFORM);   $r->print(<<HIDDENFORM);
  <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" />
Line 3033  ERFORM Line 3694  ERFORM
    <input type="hidden" name="copyfolder" />     <input type="hidden" name="copyfolder" />
    $containertag     $containertag
  </form>   </form>
  <form name="simpleedit" method="post" action="/adm/coursedocs">  
    <input type="hidden" name="importdetail" value="" />  
    $uploadtag  
  </form>  
 HIDDENFORM  HIDDENFORM
           $r->print(&makesimpleeditform($uploadtag)."\n".
                     &makedocslogform($uploadtag."\n".
                                      '<input type="hidden" name="folder" value="'.
                                      $env{'form.folder'}.'" />'."\n"));
     }      }
 # --------------------------------------------------------- Main tab structure  
    # Generate the tabs
     my $activeClass = 1;      my $mode;
     my $active = '';      if (($supplementalflag) && (!$allowed)) {
     my %tabtitles = (          &Apache::lonnavdisplay::startContentScreen($r,'supplemental');
                        main => {      } else {
                                  Course => &mt('Main Course Documents'),          $r->print(&startContentScreen(($supplementalflag?'suppdocs':'docs')));
                                  Community => &mt('Main Community Documents'),      }
                                },  
                        supplemental => {  #
                                  Course => &mt('Supplemental Course Documents'),          
                                  Community => &mt('Supplemental Community Documents'),      my $savefolderpath;
                                },  
                     );  
     if ($allowed) {      if ($allowed) {
         $r->print('<ul class="LC_TabContentBigger" id="mainnav">');  
         if (($standard) && ($allowed) && (!$forcesupplement) && (($env{'form.folderpath'}=~/^default/) || $env{'form.folderpath'}eq"" || ($env{'form.pagepath'}))) {  
             if($activeClass == 1){  
                 $active = 'class="active"';  
         $activeClass = 0;  
     }  
         }  
         $r->print('<li '.$active  
                . ' onmouseover="javascript:showPage(this,\'mainCourseDocuments\',\'mainnav\',\'maincoursedoc\');"'  
                . ' onclick="javascript:showPage(this,\'mainCourseDocuments\',\'mainnav\',\'maincoursedoc\');"><a href="#"><b>'.$tabtitles{'main'}{$crstype}.'</b></a></li>');  
         $active = '';  
         if (!$forcestandard || ($env{'form.folderpath'}=~/^supplemental/)) {  
             if($activeClass == 1){  
                 $active = 'class="active"';  
             }  
         }  
         $r->print('<li '.$active  
             .' onmouseover="javascript:showPage(this,\'supplCourseDocuments\',\'mainnav\',\'maincoursedoc\');"'  
             .' onclick="javascript:showPage(this,\'supplCourseDocuments\',\'mainnav\',\'maincoursedoc\');"><a href="#"><b>'.$tabtitles{'supplemental'}{$crstype}.'</b></a></li>');  
         $r->print('</ul>');  
     } else {  
         $r->print('<br />');  
     }  
     $r->print('<div class="LC_Box" style="clear:both;margin:0;">'  
              .'<div id="maincoursedoc" style="margin:0 0;padding:0 0;">');  
 # --------------------------------------------------------- Standard documents  
        my $savefolderpath;  
        $active = 'style="display: none;"';  
        if($activeClass == 0){  
           $active = 'style="display: block;"';  
        }  
        if ($allowed) {  
        $r->print('<div class="LC_ContentBox" id="mainCourseDocuments" '.$active.'>');  
        my $folder=$env{'form.folder'};         my $folder=$env{'form.folder'};
        if ($folder eq '' || $folder=~/^supplemental/) {         if ($folder eq '' || $supplementalflag) {
            $folder='default';             $folder='default';
    $savefolderpath = $env{'form.folderpath'};     $savefolderpath = $env{'form.folderpath'};
    $env{'form.folderpath'}='default&'.&escape($tabtitles{'main'}{$crstype});     $env{'form.folderpath'}='default&'.&escape(&mt('Content'));
            $uploadtag = '<input type="hidden" name="folderpath" value="'.             $uploadtag = '<input type="hidden" name="folderpath" value="'.
        &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';         &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
        }         }
Line 3116  HIDDENFORM Line 3744  HIDDENFORM
  }   }
  my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;   my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
   
   
   
  my $recoverform=(<<RFORM);  
  <form action="/adm/groupsort" method="post" name="recover">  
  <a class="LC_menubuttons_link" href="javascript:groupopen('$readfile',1,0)">$lt{'reco'}</a>  
  </form>  
 RFORM  
   
  my $imspform=(<<IMSPFORM);  
  <form action="/adm/imsimportdocs" method="post" name="ims">  
  <input type="hidden" name="folder" value="$folder" />  
  <a class="LC_menubuttons_link" href="javascript:makeims();">$lt{'imsf'}</a>  
  </form>  
 IMSPFORM  
   
  my $newnavform=(<<NNFORM);   my $newnavform=(<<NNFORM);
  <form action="/adm/coursedocs" method="post" name="newnav">   <form action="/adm/coursedocs" method="post" name="newnav">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
Line 3225  NROSTFORM Line 3838  NROSTFORM
   
 my $specialdocumentsform;  my $specialdocumentsform;
 my @specialdocumentsforma;  my @specialdocumentsforma;
   my $gradingform;
   my @gradingforma;
   my $communityform;
   my @communityforma;
 my $newfolderform;  my $newfolderform;
 my $newfolderb;  my $newfolderb;
   
        unless ($env{'form.pagepath'}) {   my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
    my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');  
   
  my $newpageform=(<<NPFORM);   my $newpageform=(<<NPFORM);
  <form action="/adm/coursedocs" method="post" name="newpage">   <form action="/adm/coursedocs" method="post" name="newpage">
Line 3276  NGFFORM Line 3892  NGFFORM
  @specialdocumentsforma=(   @specialdocumentsforma=(
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'"  onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'"  onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.newsyl.submit()" />'=>$newsylform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.newsyl.submit()" />'=>$newsylform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/groupportfolio.png" alt="'.$lt{grpo}.'" onclick="document.newgroupfiles.submit()" />'=>$newgroupfileform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$newnavform},
  );           {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},
           );
       }          $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));
  push @specialdocumentsforma, ({'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$newnavform},  
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},  
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},  
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform},  
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform},  
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/bchat.png" alt="'.$lt{bull}.'" onclick="javascript:makebulboard();" />'=>$newbulform},  
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makebulboard();" />'=>$newaboutmeform},  
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/aboutme.png" alt="'.$lt{abou}.'" onclick="javascript:makeabout();" />'=>$newaboutsomeoneform},  
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/clst.png" alt="'.$lt{rost}.'" onclick="document.newroster.submit()" />'=>$newrosterform},);  
   
  $specialdocumentsform = create_form_ul(create_list_elements(@specialdocumentsforma));  
   
 if($env{'form.pagepath'}) {  
           my @importdoc = (
  @specialdocumentsforma=(          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleUpload(\'ext\');" />'=>$extresourcesform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.&mt('Simple Problem').'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:toggleUpload(\'ims\');" />'=>$imspform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.&mt('Score Upload Form').'" onclick="javascript:makeexamupload();" />'=>$newexuploadform}          {'<img class="LC_noBorder_LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform,
  );          });
  $specialdocumentsform= create_form_ul(create_list_elements(@specialdocumentsforma));          $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc));
 }  
           @gradingforma=(
 my @tools = (          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},
 # {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" />'=>$extresourcesform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform},
 # {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" />'=>$imspform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/recover.png" alt="'.$lt{reco}.'" onclick="javascript:groupopen(\''.$readfile.'\',1,0)" />'=>$recoverform},  
  );          );
           $gradingform = &create_form_ul(&create_list_elements(@gradingforma));
 my @importdoc = (  
     {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:makenewext(\'newext\');" />'=>$extresourcesform},          @communityforma=(
     {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:makeims();" />'=>$imspform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/bchat.png" alt="'.$lt{bull}.'" onclick="javascript:makebulboard();" />'=>$newbulform},
 );          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makebulboard();" />'=>$newaboutmeform},
 $fileuploadform =  create_form_ul(create_list_elements(@importdoc)) . '<hr/>' . $fileuploadform;          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/aboutme.png" alt="'.$lt{abou}.'" onclick="javascript:makeabout();" />'=>$newaboutsomeoneform},
           {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/clst.png" alt="'.$lt{rost}.'" onclick="document.newroster.submit()" />'=>$newrosterform},
           {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/groupportfolio.png" alt="'.$lt{grpo}.'" onclick="document.newgroupfiles.submit()" />'=>$newgroupfileform},
           );
           $communityform = &create_form_ul(&create_list_elements(@communityforma));
   
 my %orderhash = (  my %orderhash = (
  '00' => ['Newfolder',$newfolderform],                  'aa' => ['Import Content',$fileuploadform],
                 'aa' => ['Import Documents',$fileuploadform],                  'bb' => ['Published Content',$importpubform],
                 'bb' => ['Published Resources',$simpleeditdefaultform],                  'cc' => ['Grading Resources',$gradingform],
                 'cc' => ['Special Documents',$specialdocumentsform],  
  'dd' => ['Tools', create_form_ul(create_list_elements(@tools)).&generate_admin_options($containertag,$uploadtag,\%help,\%env)],  
                 );                  );
 my $tid='1';  unless ($env{'form.pagepath'}) {
       $orderhash{'00'} = ['Newfolder',$newfolderform];
       $orderhash{'dd'} = ['Collaboration',$communityform];
       $orderhash{'ee'} = ['Special Documents',$specialdocumentsform];
   }
   
  $hadchanges=0;   $hadchanges=0;
         my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype);         unless (($supplementalflag || $toolsflag)) {
        if ($error) {            my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
            $r->print('<p><span class="LC_error">'.$error.'</span></p>');                                $supplementalflag,\%orderhash,$iconpath,$uploadtag);
        }            if ($error) {
        if ($hadchanges) {               $r->print('<p><span class="LC_error">'.$error.'</span></p>');
            &mark_hash_old();            }
        }            if ($hadchanges) {
                &mark_hash_old();
             }
   
        &changewarning($r,'');            &changewarning($r,'');
 $r->print(&generate_edit_table($tid,\%orderhash));          }
       }
   
   # Supplemental documents start here
   
 $r->print('</div>');  
  }  
        if ($env{'form.pagepath'}) {  
        }  
 # ----------------------------------------------------- Supplemental documents  
        $active = 'style="display: none;"';  
        if($activeClass == 1){  
           $active = 'style="display: block;"';  
        }  
        $r->print('<div class="LC_ContentBox" id="supplCourseDocuments" '.$active.'>');  
        my $folder=$env{'form.folder'};         my $folder=$env{'form.folder'};
        unless ($folder=~/^supplemental/) {         unless ($supplementalflag) {
    $folder='supplemental';     $folder='supplemental';
        }         }
        if ($folder =~ /^supplemental$/ &&         if ($folder =~ /^supplemental$/ &&
    (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {     (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {
           $env{'form.folderpath'} = 'supplemental&'.            $env{'form.folderpath'} = &supplemental_base();
                                     &escape(&mt('Supplemental '.$crstype.' Documents'));  
        } elsif ($allowed) {         } elsif ($allowed) {
   $env{'form.folderpath'} = $savefolderpath;    $env{'form.folderpath'} = $savefolderpath;
        }         }
Line 3361  $r->print('</div>'); Line 3969  $r->print('</div>');
   
    my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');     my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
   
  my $supupdocformbtn = "<input type='submit' value='".$lt{'upld'}."' />$help{'Uploading_From_Harddrive'}";  
  my $supupdocform=(<<SUPDOCFORM);   my $supupdocform=(<<SUPDOCFORM);
           <a class="LC_menubuttons_link" href="javascript:toggleUpload('suppdoc');">
           $lt{'upfi'}</a> $help{'Uploading_From_Harddrive'}
  <form action="/adm/coursedocs" method="post" name="supuploaddocument" enctype="multipart/form-data">   <form action="/adm/coursedocs" method="post" name="supuploaddocument" enctype="multipart/form-data">
           <fieldset id="uploadsuppdocform" style="display: none;" />
           <legend>$lt{'upfi'}</legend>
  <input type="hidden" name="active" value="ee" />   <input type="hidden" name="active" value="ee" />
  $fileupload   $fileupload
  <br />   <br />
Line 3377  $r->print('</div>'); Line 3988  $r->print('</div>');
  <br />   <br />
  <input type="hidden" name="folderpath" value="$path" />   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="cmd" value="upload_supplemental" />   <input type="hidden" name="cmd" value="upload_supplemental" />
 SUPDOCFORM          <input type='submit' value="$lt{'upld'}" />
  $supupdocform .=  create_form_ul(Apache::lonhtmlcommon::htmltag('li',$supupdocformbtn,{class => 'LC_menubuttons_inline_text'}))."</form>";          </form>
   
  my $supnewfolderform=(<<SNFFORM);   my $supnewfolderform=(<<SNFFORM);
  <form action="/adm/coursedocs" method="post" name="supnewfolder">   <form action="/adm/coursedocs" method="post" name="supnewfolder">
Line 3390  SUPDOCFORM Line 4001  SUPDOCFORM
  </form>   </form>
 SNFFORM  SNFFORM
   
           my $supextform=(<<ERFORM);
  my $supnewextform=(<<SNEFORM);          <a class="LC_menubuttons_link" href="javascript:toggleUpload('suppext');">$lt{'extr'}</a>$help{'Adding_External_Resource'}
  <form action="/adm/coursedocs" method="post" name="supnewext">          <form action="/adm/coursedocs" method="post" name="newsuppext">
  <input type="hidden" name="active" value="ff" />          <fieldset id="uploadsuppextform" style="display: none;" />
  <input type="hidden" name="folderpath" value="$path" />          <legend>$lt{'extr'}</legend>
  <input type="hidden" name="importdetail" value="" />          <input type="hidden" name="active" value="ee" />
  <a class="LC_menubuttons_link" href="javascript:makenewext('supnewext');">$lt{'extr'}</a> $help{'Adding_External_Resource'}          $lt{'url'}:<br />
  </form>          <input type="text" size="60" name="exturl" id="exturl" value="http://" />
 SNEFORM          <input type="button" name="view" value="$lt{'prev'}" onclick="javascript:extUrlPreview('exturl');" /><br />
           $lt{'title'}:<br />
           <input type="text" size="60" name="exttitle" value="$lt{'extr'}" />
           $uploadtag
           <br />
           <input type="hidden" name="importdetail" value="" />
           <input type="button" value="$lt{'lnk'}" onclick="javascript:setExternal(this.form,0)" />
           </fieldset>
           </form>
   ERFORM
   
  my $supnewsylform=(<<SNSFORM);   my $supnewsylform=(<<SNSFORM);
  <form action="/adm/coursedocs" method="post" name="supnewsyl">   <form action="/adm/coursedocs" method="post" name="supnewsyl">
Line 3430  my @specialdocs = ( Line 4050  my @specialdocs = (
             =>$supnewaboutmeform},              =>$supnewaboutmeform},
  );   );
 my @supimportdoc = (  my @supimportdoc = (
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:makenewext(\'supnewext\');" />'   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:makenewext(\'supext\');" />'
             =>$supnewextform},              =>$supextform},
                   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'suppdoc\');" />'
               =>$supupdocform},
         );          );
 $supupdocform =  create_form_ul(create_list_elements(@supimportdoc)) . '<hr/>' . $supupdocform;  $supupdocform =  &create_form_ul(&create_list_elements(@supimportdoc));
 my %suporderhash = (  my %suporderhash = (
  '00' => ['Supnewfolder', $supnewfolderform],   '00' => ['Supnewfolder', $supnewfolderform],
                 'ee' => ['Import Documents',$supupdocform],                  'ee' => ['Import Content',$supupdocform],
                 'ff' => ['Special Documents',create_form_ul(create_list_elements(@specialdocs))]                  'ff' => ['Special Documents',&create_form_ul(&create_list_elements(@specialdocs))]
                 );                  );
           if ($supplementalflag) {
         my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype);             my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
         if ($error) {                                 $supplementalflag,\%suporderhash,$iconpath,$uploadtag);
             $r->print('<p><span class="LC_error">'.$error.'</span></p>');             if ($error) {
                 $r->print('<p><span class="LC_error">'.$error.'</span></p>');
              }
         }          }
         my $tid='2';      } elsif ($supplementalflag) {
         $r->print(&generate_edit_table($tid,\%suporderhash));          my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
     } else {                              $supplementalflag,'',$iconpath,$uploadtag);
         my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype);  
         if ($error) {          if ($error) {
             $r->print('<p><span class="LC_error">'.$error.'</span></p>');              $r->print('<p><span class="LC_error">'.$error.'</span></p>');
         }          }
     }      }
   
       $r->print(&endContentScreen());
 $r->print('</div>');  
 $r->print('</div></div>');  
   
   
     if ($allowed) {      if ($allowed) {
  $r->print('   $r->print('
Line 3467  $r->print('</div></div>'); Line 4087  $r->print('</div></div>');
   <input type="hidden" name="residx" />    <input type="hidden" name="residx" />
 </form>');  </form>');
     }      }
   } else {    } elsif ($showdoc) {
       unless ($upload_result eq 'phasetwo') {  
 # -------------------------------------------------------- This is showdoc mode  # -------------------------------------------------------- This is showdoc mode
           $r->print("<h1>".&mt('Uploaded Document').' - '.        $r->print("<h1>".&mt('Uploaded Document').' - '.
  &Apache::lonnet::gettitle($r->uri).'</h1><p>'.   &Apache::lonnet::gettitle($r->uri).'</h1><p class="LC_warning">'.
 &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><table>".  &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><table>".
           &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table>');                  &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table>');
       }  
   }    }
  }   }
  $r->print(&Apache::loncommon::end_page());   $r->print(&Apache::loncommon::end_page());
  return OK;   return OK;
 }  }
   
 sub generate_admin_options {  sub embedded_form_elems {
   my ($containertag,$uploadtag,$help_ref,$env_ref) = @_;      my ($phase,$primaryurl,$newidx) = @_;
  my %lt=&Apache::lonlocal::texthash(      my $folderpath = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
                                          'vc' => 'Verify Content',      return <<STATE;
                                          'cv' => 'Check/Set Resource Versions',      <input type="hidden" name="folderpath" value="$folderpath" />
                                          'ls' => 'List Symbs',      <input type="hidden" name="cmd" value="upload_embedded" />
                                          'sl' => 'Show Log',      <input type="hidden" name="newidx" value="$newidx" />
                                          'imse' => 'IMS Export',      <input type="hidden" name="phase" value="$phase" />
                                          'dcd' => 'Dump Course Documents to Construction Space: available on other servers'      <input type="hidden" name="primaryurl" value="$primaryurl" />
                                           );  STATE
   my %help = %{$help_ref};  }
   my %env = %{$env_ref};  
   my $dumpbut=&dumpbutton();  sub embedded_destination {
   my $exportbut=&exportbutton();      my $folder=$env{'form.folder'};
   my @list = (      my $destination = 'docs/';
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/verify.png" alt="'.$lt{vc}.'"  onclick=\'javascript:injectData(document.courseverify, "dummy", "verify", "'.$lt{'vc'}.'")\' />'       if ($folder =~ /^supplemental/) {
         => "<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"verify\", \"$lt{'vc'}\")'>$lt{'vc'}</a>$help{'Verify_Content'}"},          $destination = 'supplemental/';
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/resversion.png" alt="'.$lt{cv}.'"  onclick=\'javascript:injectData(document.courseverify, "dummy", "versions", "'.$lt{'cv'}.'")\' />'      }
         =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"versions\", \"$lt{'cv'}\")'>$lt{'cv'}</a>$help{'Check_Resource_Versions'}"},      if (($folder eq 'default') || ($folder eq 'supplemental')) {
  );          $destination .= 'default/';
   if($dumpbut ne ''){      } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
   push @list, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dump.png" alt="'.$lt{dcd}.'" />'=>$dumpbut};          $destination .=  $2.'/';
   }      }
   push @list, ({'<img class="LC_noBorder LC_middle" src="/res/adm/pages/imsexport.png" alt="'.$lt{imse}.'" class="LC_menubuttons_link" href=\'javascript:injectData(document.courseverify, "dummy", "exportcourse", "'.&mt('IMS Export').'")\' />'      $destination .= $env{'form.newidx'};
           =>$exportbut},      my $dir_root = '/userfiles';
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/symbs.png" alt="'.$lt{ls}.'"  onclick=\'javascript:injectData(document.courseverify, "dummy", "listsymbs", "'.$lt{'ls'}.'")\'  />'      return ($destination,$dir_root);
         =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"listsymbs\", \"$lt{'ls'}\")'>$lt{'ls'}</a><input type='hidden' name='folder' value='$env{'form.folder'}' />"},  }
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/document-properties.png" alt="'.$lt{sl}.'"  onclick=\'javascript:injectData(document.courseverify, "dummy", "docslog", "'.$lt{'sl'}.'")\'  />'  
         =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"docslog\", \"$lt{'sl'}\")'>$lt{'sl'}</a>"},  sub return_to_editor {
  );      my $actionurl = '/adm/coursedocs';
   return '<form action="/adm/coursedocs" method="post" name="courseverify"><input type="hidden" id="dummy" />'.create_form_ul(create_list_elements(@list)).'</form>';      return '<p><form name="backtoeditor" method="post" action="'.$actionurl.'" />'."\n". 
              '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /></form>'."\n".
              '<a href="javascript:document.backtoeditor.submit();">'.&mt('Return to Editor').
              '</a></p>';
   }
   
   sub decompression_info {
       my ($destination,$dir_root) = &embedded_destination();
       my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
       my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
       my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
       my $container='sequence';
       my ($pathitem,$hiddenelem);
       my @hiddens = ('newidx','comment','position');
       if ($env{'form.pagepath'}) {
           $container='page';
           $pathitem = 'pagepath';
       } else {
           $pathitem = 'folderpath';
       }
       unshift(@hiddens,$pathitem);
       foreach my $item (@hiddens) {
           if ($env{'form.'.$item}) {
               $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'.
                              $env{'form.'.$item}.'" />'."\n";
           }
       }
       return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,
               $hiddenelem);
   }
   
   sub decompression_phase_one {
       my ($dir,$file,$warning,$error,$output);
       my ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,$hiddenelem)=
           &decompression_info();
       if ($env{'form.archiveurl'} !~ m{^/uploaded/\Q$docudom/$docuname/\E(?:docs|supplemental)/(?:default|\d+).*/([^/]+)$}) {
           $error = &mt('Archive file "[_1]" not in the expected location.',$env{'form.archiveurl'});
       } else {
           my $file = $1;
           $output = 
               &Apache::loncommon::process_decompression($docudom,$docuname,$file,
                                                         $destination,$dir_root,
                                                         $hiddenelem);
           if ($env{'form.autoextract_camtasia'}) {
               $output .= &remove_archive($docudom,$docuname,$container);
           }
       }
       if ($error) {
           $output .= '<p class="LC_error">'.&mt('Not extracted.').'<br />'.
                      $error.'</p>'."\n";
       }
       if ($warning) {
           $output .= '<p class="LC_warning">'.$warning.'</p>'."\n";
       }
       return $output;
   }
   
   sub decompression_phase_two {
       my ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,$hiddenelem)=
           &decompression_info();
       my $output;
       if ($env{'form.archivedelete'}) {
           $output = &remove_archive($docudom,$docuname,$container);
       }
       $output .= 
           &Apache::loncommon::process_extracted_files('coursedocs',$docudom,$docuname,
                                                       $destination,$dir_root,$hiddenelem);
       return $output;
   }
   
   sub remove_archive {
       my ($docudom,$docuname,$container) = @_;
       my $map = $env{'form.folder'}.'.'.$container;
       my ($output,$delwarning,$delresult,$url);
       my ($errtext,$fatal) = &mapread($docuname,$docudom,$map);
       if ($fatal) {
           if ($container eq 'page') {
               $delwarning = &mt('An error occurred retrieving the contents of the current page.');
           } else {
               $delwarning = &mt('An error occurred retrieving the contents of the current folder.');
           }
           $delwarning .= &mt('As a result the archive file has not been removed.');
       } else {
           my $currcmd = $env{'form.cmd'};
           my $position = $env{'form.position'};
           if ($position > 0) { 
               $env{'form.cmd'} = 'del_'.$position;
               my ($title,$url,@rrest) = 
                   split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$position]]);
               if (&handle_edit_cmd($docuname,$docudom)) {
                   ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1);
                   if ($fatal) {
                       if ($container eq 'page') {
                           $delwarning = &mt('An error occurred updating the contents of the current page.');
                       } else {
                           $delwarning = &mt('An error occurred updating the contents of the current folder.');
                       }
                   } else {
                       $delresult = &mt('Archive file removed.');
                   }
               }
           }
           $env{'form.cmd'} = $currcmd;
       }
       if ($delwarning) {
           $output = '<p class="LC_warning">'.
                      $delwarning.
                      '</p>';
       }
       if ($delresult) {
           $output .= '<p class="LC_info">'.
                      $delresult.
                      '</p>';
       }
       return $output;
 }  }
   
   sub generate_admin_menu {
       my ($crstype) = @_;
       my $lc_crstype = lc($crstype);
       my ($home,$other,%outhash)=&authorhosts();
       my %lt=&Apache::lonlocal::texthash (
                                            'vc'   => 'Verify Content',
                                            'cv'   => 'Check/Set Resource Versions',
                                            'ls'   => 'List Resource Identifiers',
                                            'imse' => 'Export contents to IMS Archive',
                                            'dcd'  => "Dump $crstype Content to Authoring Space",
                                          );
       my ($candump,$dumpurl);
       if ($home + $other > 0) {
           $candump = 'F';
           if ($home) {
               $dumpurl = "javascript:injectData(document.courseverify,'dummy','dumpcourse','$lt{'dcd'}')";
           } else {
               my @hosts;
               foreach my $aurole (keys(%outhash)) {
                   unless(grep(/^\Q$outhash{$aurole}\E/,@hosts)) {
                       push(@hosts,$outhash{$aurole});
                   }  
               }
               if (@hosts == 1) {
                   my $switchto = '/adm/switchserver?otherserver='.$hosts[0].
                                  '&amp;role='.
                                  &HTML::Entities::encode($env{'request.role'},'"<>&').'&amp;origurl='.
                                  &HTML::Entities::encode('/adm/coursedocs?dumpcourse=1','"<>&');
                   $dumpurl = "javascript:dump_needs_switchserver('$switchto')";
               } else {
                   $dumpurl = "javascript:choose_switchserver_window()";
               }
           }
       }
       my @menu=
           ({  categorytitle=>'Administration',
               items =>[
                   {   linktext   => $lt{'vc'},
                       url        => "javascript:injectData(document.courseverify,'dummy','verify','$lt{'vc'}')",
                       permission => 'F',
                       help       => 'Verify_Content',
                       icon       => 'verify.png',
                       linktitle  => 'Verify contents can be retrieved/rendered',
                   },
                   {   linktext => $lt{'cv'},
                       url => "javascript:injectData(document.courseverify,'dummy','versions','$lt{'cv'}')",
                       permission => 'F',
                       help       => 'Check_Resource_Versions',
                       icon       => 'resversion.png',
                       linktitle  => "View version information for resources in your $lc_crstype, and fix/unfix use of specific versions",
                   },
                   {   linktext   => $lt{'ls'},
                       url        => "javascript:injectData(document.courseverify,'dummy','listsymbs','$lt{'ls'}')",
                       permission => 'F',
                       #help => '',
                       icon       => 'symbs.png',
                       linktitle  => "List the unique identifier used for each resource instance in your $lc_crstype"
                   },
                   ]
           },
           {   categorytitle=>'Export',
               items =>[
                   {   linktext   => $lt{'imse'},
                       url => "javascript:injectData(document.courseverify,'dummy','exportcourse','$lt{'imse'}')",
                       permission => 'F',
                       help       => 'Docs_Export_Course_Docs',
                       icon       => 'imsexport.png',
                       linktitle  => $lt{'imse'},
                   },
                   {   linktext   => $lt{'dcd'},
                       url        => $dumpurl,
                       permission => $candump,
                       #help => '',
                       icon       => 'dump.png',
                       linktitle  => $lt{'dcd'},
                   },
                   ]
           });
       return '<form action="/adm/coursedocs" method="post" name="courseverify">'."\n".
              '<input type="hidden" id="dummy" />'."\n".
              &Apache::lonhtmlcommon::generate_menu(@menu)."\n".
              '</form>';
   }
   
 sub generate_edit_table {  sub generate_edit_table {
     my ($tid,$orderhash_ref) = @_;      my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile) = @_;
     return unless(ref($orderhash_ref) eq 'HASH');      return unless(ref($orderhash_ref) eq 'HASH');
     my %orderhash = %{$orderhash_ref};      my %orderhash = %{$orderhash_ref};
     my $form;      my $form;
Line 3526  sub generate_edit_table { Line 4340  sub generate_edit_table {
     if($env{'form.active'} ne ''){      if($env{'form.active'} ne ''){
         $activetab = $env{'form.active'};          $activetab = $env{'form.active'};
     }      }
     $form = '<div class="LC_Box" style="margin-right:0">';      my $backicon = $iconpath.'clickhere.gif';
     $form .= '<ul id="navigation'.$tid.'" class="LC_TabContent">';      my $backtext = &mt('To Overview');
     foreach my $name (sort(keys(%orderhash))){      $form = '<div class="LC_Box" style="margin:0;">'.
                '<ul id="navigation'.$tid.'" class="LC_TabContent">'."\n".
                '<li class="goback">'.
                '<a href="javascript:toContents('."'$jumpto'".');">'.
                '<img src="'.$backicon.'" class="LC_icon" style="border: none; vertical-align: top;"'.
                '  alt="'.$backtext.'" />'.$backtext.'</a></li>'."\n".
                '<li>'.
                '<a href="javascript:groupopen('."'$readfile'".',1);">'.
                &mt('Undo Delete').'</a></li>'."\n";
       if ($env{'form.docslog'}) {
           $form .= '<li class="active">';
       } else {
           $form .= '<li>';
       }
       $form .= '<a href="javascript:toggleHistoryDisp(1);">'.
                &mt('History').'</a></li>'."\n";
       if ($env{'form.docslog'}) {
           $form .= '<li><a href="javascript:toggleHistoryDisp(0);">'.
                    &mt('Edit').'</a></li>'."\n";
       }
       foreach my $name (reverse(sort(keys(%orderhash)))) {
         if($name ne '00'){          if($name ne '00'){
             if($activetab eq '' || $activetab ne $name){              if($activetab eq '' || $activetab ne $name){
                $active = '';                 $active = '';
             }elsif($activetab eq $name){              }elsif($activetab eq $name){
                $active = 'class="active"';                 $active = 'class="active"';
             }              }
             $form .= '<li '.$active              $form .= '<li style="float:right" '.$active
                 .' onmouseover="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"'                  .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>'."\n";
                 .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>';  
         } else {          } else {
     $form .= '<li '.$active.'>'.${$orderhash{$name}}[1].'</li>';      $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n";
   
  }   }
     }      }
     $form .= '</ul>';      $form .= '</ul>'."\n";
     $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; clear: both;">';      $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; overflow: hidden; clear:right">'."\n";
   
       if ($to_show ne '') {
           $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'."\n";
       }
     foreach my $field (keys(%orderhash)){      foreach my $field (keys(%orderhash)){
  if($field ne '00'){   if($field ne '00'){
             if($activetab eq '' || $activetab ne $field){              if($activetab eq '' || $activetab ne $field){
                 $active = 'style="display: none;"';                  $active = 'style="display: none;float:left"';
             }elsif($activetab eq $field){              }elsif($activetab eq $field){
                 $active = 'style="display:block;"';                  $active = 'style="display:block;float:left"';
             }              }
             $form .= '<div id="'.$field.$tid.'"'              $form .= '<div id="'.$field.$tid.'"'
                     .' class="LC_ContentBox" '.$active.'>'.${$orderhash{$field}}[1]                      .' class="LC_ContentBox" '.$active.'>'.${$orderhash{$field}}[1]
                     .'</div>';                      .'</div>'."\n";
         }          }
     }      }
     $form .= '</div></div>';      unless ($env{'form.docslog'}) {
           $form .= '</div></div>'."\n";
       }
     return $form;      return $form;
 }  }
   
 sub editing_js {  sub editing_js {
     my ($udom,$uname) = @_;      my ($udom,$uname,$supplementalflag) = @_;
     my $now = time();      my $now = time();
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                           p_mnf => 'Name of New Folder',                                            p_mnf => 'Name of New Folder',
                                           t_mnf => 'New Folder',                                            t_mnf => 'New Folder',
                                           p_mnp => 'Name of New Page',                                            p_mnp => 'Name of New Page',
                                           t_mnp => 'New Page',                                            t_mnp => 'New Page',
                                           p_mxu => 'Title for the Uploaded Score',                                            p_mxu => 'Title for the External Score',
                                           p_msp => 'Name of Simple Course Page',                                            p_msp => 'Name of Simple Course Page',
                                           p_msb => 'Title for the Problem',                                            p_msb => 'Title for the Problem',
                                           p_mdb => 'Title for the Drop Box',                                            p_mdb => 'Title for the Drop Box',
Line 3586  sub editing_js { Line 4424  sub editing_js {
                                           p_ctr1a => 'WARNING: Cutting a resource makes associated grades and scores inaccessible!',                                            p_ctr1a => 'WARNING: Cutting a resource makes associated grades and scores inaccessible!',
                                           p_ctr1b => 'Grades remain inaccessible if resource is pasted into another folder.',                                            p_ctr1b => 'Grades remain inaccessible if resource is pasted into another folder.',
                                           p_ctr2a => 'Cut[_98]',                                            p_ctr2a => 'Cut[_98]',
                                           p_ctr2b => '?[_98]'                                            p_ctr2b => '?[_98]',
                                             rpck    => 'Enter number to pick (e.g., 3)',
                                             imsfile => 'You must choose an IMS package for import',
                                             imscms  => 'You must select which Course Management System was the source of the IMS package',
                                             invurl  => 'Invalid URL',
                                             titbl   => 'Title is blank',
                                         );                                          );
   
       my $crstype = &Apache::loncommon::course_type();
       my $docs_folderpath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'},'<>&"');
       my $docs_pagepath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.pagepath'},'<>&"');
       my $main_container_page;
       if ($docs_folderpath eq '') {
           if ($docs_pagepath ne '') {
               $main_container_page = 1;
           }
       }
       my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents';
       my $toplevelsupp = &supplemental_base();
   
       my $backtourl = '/adm/navmaps';
       if ($supplementalflag) {
           $backtourl = '/adm/supplemental';
       }
   
       my $fieldsets = "'ext','doc','ims'";
       if ($supplementalflag) {
           $fieldsets = "'suppext','suppdoc'";
       }
   
       my $urlregexp = <<'ENDREGEXP';
   /^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i
   ENDREGEXP
   
     return <<ENDNEWSCRIPT;      return <<ENDNEWSCRIPT;
 function makenewfolder(targetform,folderseq) {  function makenewfolder(targetform,folderseq) {
     var foldername=prompt('$lt{"p_mnf"}','$lt{"t_mnf"}');      var foldername=prompt('$lt{"p_mnf"}','$lt{"t_mnf"}');
Line 3606  function makenewpage(targetform,folderse Line 4475  function makenewpage(targetform,folderse
     }      }
 }  }
   
 function makenewext(targetname) {  function editext(residx) {
     this.document.forms.extimport.useform.value=targetname;      if (document.getElementById('uploadext'+residx)) {
     this.document.forms.extimport.title.value='';          var curr = document.getElementById('uploadext'+residx).style.display;
     this.document.forms.extimport.url.value='';          if (curr == 'none') {
     this.document.forms.extimport.residx.value='';              disp = 'block';
     window.open('/adm/rat/extpickframe.html');          } else {
 }              disp = 'none';
           }
 function edittext(targetname,residx,title,url) {          document.getElementById('uploadext'+residx).style.display=disp;
     this.document.forms.extimport.useform.value=targetname;      }
     this.document.forms.extimport.residx.value=residx;      resize_scrollbox('contentscroll','1','1');
     this.document.forms.extimport.url.value=url;      return;
     this.document.forms.extimport.title.value=title;  
     window.open('/adm/rat/extpickframe.html');  
 }  }
   
 function makeexamupload() {  function makeexamupload() {
Line 3686  function makeabout() { Line 4553  function makeabout() {
 }  }
 }  }
   
 function makeims() {  function toggleUpload(caller) {
 var caller = document.forms.ims.folder.value;      var blocks = Array($fieldsets);
 var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";      for (var i=0; i<blocks.length; i++) {
 newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");          var disp = 'none';
 newWindow.location.href = newlocation;          if (caller == blocks[i]) {
               var curr = document.getElementById('upload'+caller+'form').style.display;
               if (curr == 'none') {
                   disp='block';
               }
           }
           document.getElementById('upload'+blocks[i]+'form').style.display=disp;
       }
       resize_scrollbox('contentscroll','1','1');
       return;
   }
   
   function toggleMap() {
       var disp = 'none';
       var curr = document.getElementById('importmapform').style.display;
       if (curr == 'none') {
           disp='block';
       }
       document.getElementById('importmapform').style.display=disp;
       resize_scrollbox('contentscroll','1','1');
       return;
   }
   
   
   function extUrlPreview(caller) {
       if (document.getElementById(caller)) {
           var url = document.getElementById(caller).value;
           var regexp = $urlregexp;
           if (regexp.test(url)) {
               openMyModal(url,500,400,'yes');
           } else {
               alert("$lt{'invurl'}");
           }
       }
 }  }
   
   function makeims(imsform) {
       if ((imsform.uploaddoc.value == '')  || (!imsform.uploaddoc.value)) {
           alert("$lt{'imsfile'}");
           return;
       }
       if (imsform.source.selectedIndex == 0) {
           alert("$lt{'imscms'}");
           return;
       }
       newWindow = window.open('', 'IMSimport',"HEIGHT=700,WIDTH=750,scrollbars=yes");
       imsform.submit();
   }
   
 function finishpick() {  function setExternal(extform,residx) {
 var title=this.document.forms.extimport.title.value;      var title=extform.exttitle.value;
 var url=this.document.forms.extimport.url.value;      if (!String.trim) {
 var form=this.document.forms.extimport.useform.value;          String.prototype.trim = function() {return this.replace(\/^\\s+|\\s+$\/g, "");};    }
 var residx=this.document.forms.extimport.residx.value;      var url=extform.exturl.value;
 eval('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+'='+residx+'";this.document.forms.'+form+'.submit();');      var regexp = $urlregexp;
       if (title == null || title.trim()=="") {
           alert("$lt{'titbl'}");
           extform.exttitle.focus();
           return;
       }
       if (regexp.test(url)) {
           url = escape(url);
           if (residx > 0) {
               eval("extform.importdetail.value=title+'='+url+'='+residx;extform.submit();");
           } else {
               eval("extform.importdetail.value=title+'='+url;extform.submit();");
           }
       } else {
           alert("$lt{'invurl'}");
           extform.exturl.focus();
           return;
       }
 }  }
   
 function changename(folderpath,index,oldtitle,container,pagesymb) {  function changename(folderpath,index,oldtitle,container,pagesymb) {
Line 3763  this.document.forms.renameform.pagesymb. Line 4692  this.document.forms.renameform.pagesymb.
 this.document.forms.renameform.submit();  this.document.forms.renameform.submit();
 }  }
   
   function updatePick(targetform,index,caller) {
       var pickitem = document.getElementById('rpick_'+index);
       var picknumitem = document.getElementById('rpicknum_'+index);
       if (pickitem.checked) {
           var picknum=prompt('$lt{"rpck"}',picknumitem.value);
           if (picknum == '' || picknum == null) {
               if (caller == 'check') {
                   pickitem.checked=false;
                   return;
               }
           } else {
               picknum.toString();
               var regexdigit=/^\\d+\$/;
               if (regexdigit.test(picknum)) {
                   picknumitem.value = picknum;
                   targetform.changeparms.value='randompick';
                   targetform.submit();
               } else {
                   if (caller == 'check') {
                       pickitem.checked=false;
                   }
                   return;
               }
           }
       } else {
           picknumitem.value = 0;
           targetform.changeparms.value='randompick';
           targetform.submit();
       }
   }
   
 function unselectInactive(nav) {  function unselectInactive(nav) {
 currentNav = document.getElementById(nav);  currentNav = document.getElementById(nav);
 currentLis = currentNav.getElementsByTagName('LI');  currentLis = currentNav.getElementsByTagName('LI');
 for (i = 0; i < currentLis.length; i++) {  for (i = 0; i < currentLis.length; i++) {
  if(currentLis[i].className == 'right active' || currentLis[i].className == 'right'){          if (currentLis[i].className == 'goback') {
               currentLis[i].className = 'goback';
           } else {
       if (currentLis[i].className == 'right active' || currentLis[i].className == 'right') {
  currentLis[i].className = 'right';   currentLis[i].className = 'right';
  }else{      } else {
  currentLis[i].className = 'i';   currentLis[i].className = 'i';
  }      }
           }
 }  }
 }  }
   
Line 3817  function showPage(current, pageId, nav, Line 4781  function showPage(current, pageId, nav,
  current.className = 'active';   current.className = 'active';
  currentData = document.getElementById(pageId);   currentData = document.getElementById(pageId);
  currentData.style.display = 'block';   currentData.style.display = 'block';
           activeTab = pageId;
           toggleUpload();
           toggleMap();
           if (nav == 'mainnav') {
               var storedpath = "$docs_folderpath";
               if (storedpath == '') {
                   storedpath = "$docs_pagepath";
               }
               var storedpage = "$main_container_page";
               var reg = new RegExp("^supplemental");
               if (pageId == 'mainCourseDocuments') {
                   if (storedpage == 1) {
                       document.simpleedit.folderpath.value = '';
                       document.uploaddocument.folderpath.value = '';
                   } else {
                       if (reg.test(storedpath)) {
                           document.simpleedit.folderpath.value = '$toplevelmain';
                           document.uploaddocument.folderpath.value = '$toplevelmain';
                           document.newext.folderpath.value = '$toplevelmain';
                       } else {
                           document.simpleedit.folderpath.value = storedpath;
                           document.uploaddocument.folderpath.value = storedpath;
                           document.newext.folderpath.value = storedpath;
                       }
                   }
               } else {
                   if (reg.test(storedpath)) {
                       document.simpleedit.folderpath.value = storedpath;
                       document.supuploaddocument.folderpath.value = storedpath;
                       document.supnewext.folderpath.value = storedpath;
                   } else {
                       document.simpleedit.folderpath.value = '$toplevelsupp';
                       document.supuploaddocument.folderpath.value = '$toplevelsupp';
                       document.supnewext.folderpath.value = '$toplevelsupp';
                   }
               }
           }
           resize_scrollbox('contentscroll','1','0');
  return false;   return false;
 }  }
   
 function injectData(current, hiddenField, name, value) {  function toContents(jumpto) {
  currentElement = document.getElementById(hiddenField);      var newurl = '$backtourl';
  currentElement.name = name;      if (jumpto != '') {
  currentElement.value = value;          newurl = newurl+'?postdata='+jumpto;
  current.submit();  ;
       }
       location.href=newurl;
 }  }
   
 ENDNEWSCRIPT  ENDNEWSCRIPT
 }  }
   
   sub history_tab_js {
       return <<"ENDHIST";
   function toggleHistoryDisp(choice) {
       document.docslogform.docslog.value = choice;
       document.docslogform.submit();
       return;
   }
   
   ENDHIST
   }
   
   sub inject_data_js {
       return <<ENDINJECT;
   
   function injectData(current, hiddenField, name, value) {
           currentElement = document.getElementById(hiddenField);
           currentElement.name = name;
           currentElement.value = value;
           current.submit();
   }
   
   ENDINJECT
   }
   
   sub dump_switchserver_js {
       my @hosts = @_;
       my %lt = &Apache::lonlocal::texthash(
           dump => 'Dumping to Authoring Space requires switching server.',
           swit => 'Switch server?',
           duco => 'Dump content to Authoring Space',
           yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',
           chos => 'Choose server',
       );
       my $role = $env{'request.role'};
       my $js = <<"ENDSWJS";
   <script type="text/javascript">
   function write_switchserver() {
       var server;
       if (document.setserver.posshosts.length > 0) {
           for (var i=0; i<document.setserver.posshosts.length; i++) {
               if (document.setserver.posshosts[i].checked) {
                   server = document.setserver.posshosts[i].value;
               }
          }
          opener.document.location.href="/adm/switchserver?otherserver="+server+"&role=$role&origurl=/adm/coursedocs";
       }
       window.close();
   }
   </script>
   
   ENDSWJS
   
       my $startpage = &Apache::loncommon::start_page('Choose server',$js,
                                                      {'only_body' => 1,
                                                       'js_ready'  => 1,});
       my $endpage = &Apache::loncommon::end_page({'js_ready'  => 1});
   
       my $hostpicker;
       my $count = 0;
       foreach my $host (sort(@hosts)) {
           my $checked;
           if ($count == 0) {
               $checked = ' checked="checked"';
           }
           $hostpicker .= '<label><input type="radio" name="posshosts" value="'.
                          $host.'"'.$checked.' />'.$host.'</label>&nbsp;&nbsp;';
           $count++;
       }
       
       return <<"ENDSWITCHJS";
   
   function dump_needs_switchserver(url) {
       if (url!='' && url!= null) {
           if (confirm("$lt{'dump'}\\n$lt{'swit'}")) {
               go(url);
           }
       }
       return;
   }
   
   function choose_switchserver_window() {
       newWindow = window.open('','ChooseServer','height=400,width=500,scrollbars=yes')
       newWindow.document.open();
       newWindow.document.writeln('$startpage');
       newWindow.document.write('<h3>$lt{'duco'}<\\/h3>\\n'+
          '<p>$lt{'yone'}<\\/p>\\n'+
          '<div class="LC_left_float"><fieldset><legend>$lt{'chos'}<\\/legend>\\n'+
          '<form name="setserver" method="post" action="" \\/>\\n'+
          '$hostpicker\\n'+
          '<br \\/><br \\/>\\n'+
          '<input type="button" name="makeswitch" value="$lt{'swit'}" '+
          'onclick="write_switchserver();" \\/>\\n'+
          '<\\/form><\\/fieldset><\\/div><br clear="all" \\/>\\n');
       newWindow.document.writeln('$endpage');
       newWindow.document.close();
       newWindow.focus();
   }
   
   ENDSWITCHJS
   }
   
   sub makedocslogform {
       my ($formelems,$docslog) = @_;
       return <<"LOGSFORM";
    <form action="/adm/coursedocs" method="post" name="docslogform">
      <input type="hidden" name="docslog" value="$docslog" />
      $formelems
    </form>
   LOGSFORM
   }
   
   sub makesimpleeditform {
       my ($formelems) = @_;
       return <<"SIMPFORM";
    <form name="simpleedit" method="post" action="/adm/coursedocs">
      <input type="hidden" name="importdetail" value="" />
      $formelems
    </form>
   SIMPFORM
   }
   
 1;  1;
 __END__  __END__
   
Line 3861  sets @resources - array with the resourc Line 4987  sets @resources - array with the resourc
   
 Return hash with valid author names  Return hash with valid author names
   
 =item dumpbutton()  
   
 Generate "dump" button  
   
 =item clean()  =item clean()
   
 =item dumpcourse()  =item dumpcourse()
   
     Actually dump course      Actually dump course
   
   
 =item exportbutton()  
   
     Generate "export" button  
   
 =item exportcourse()  
   
 =item create_ims_store()  
   
 =item build_package()  
   
 =item get_dependencies()  
   
 =item process_content()  
   
 =item replicate_content()  
   
 =item extract_media()  
   
 =item store_template()  
   
 =item group_import()  =item group_import()
   
     Imports the given (name, url) resources into the course      Imports the given (name, url) resources into the course
Line 3909  Generate "dump" button Line 5010  Generate "dump" button
   
 =item do_paste_from_buffer()  =item do_paste_from_buffer()
   
   =item get_newmap_url()
   
   =item dbcopy()
   
   =item uniqueness_check()
   
   =item contained_map_check()
   
   =item reinit_role()
   
   =item url_paste_fixups()
   
   =item apply_fixups()
   
   =item copy_dependencies()
   
 =item update_parameter()  =item update_parameter()
   
 =item handle_edit_cmd()  =item handle_edit_cmd()
Line 3921  Generate "dump" button Line 5038  Generate "dump" button
   
 =item is_supplemental_title()  =item is_supplemental_title()
   
 =item parse_supplemental_title()  
   
 =item entryline()  =item entryline()
   
 =item tiehash()  =item tiehash()
Line 3951  Check Versions Line 5066  Check Versions
   
 Breadcrumbs for special functions  Breadcrumbs for special functions
   
   =item create_list_elements()
   
   =item create_form_ul()
   
   =item startContentScreen() 
   
   =item endContentScreen()
   
   =item supplemental_base()
   
   =item embedded_form_elems()
   
   =item embedded_destination()
   
   =item return_to_editor()
   
   =item decompression_info()
   
   =item decompression_phase_one()
   
   =item decompression_phase_two()
   
   =item remove_archive()
   
   =item generate_admin_menu()
   
   =item generate_edit_table()
   
   =item editing_js()
   
   =item history_tab_js()
   
   =item inject_data_js()
   
   =item dump_switchserver_js()
   
   =item resize_scrollbox_js()
   
   =item makedocslogform()
   
   =item makesimpleeditform()
   
 =back  =back
   
 =cut  =cut

Removed from v.1.430  
changed lines
  Added in v.1.484.2.14


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

Internal Server Error

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

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

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