Diff for /loncom/interface/londocs.pm between versions 1.447 and 1.484.2.6

version 1.447, 2010/12/11 14:28:12 version 1.484.2.6, 2012/05/29 20:56:34
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 HTML::Entities;  use HTML::Entities;
 use GDBM_File;  use GDBM_File;
 use Apache::lonlocal;  use Apache::lonlocal;
Line 101  sub authorhosts { Line 100  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 119  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 130  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 165  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 196  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 213  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 257  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') {      $r->print(&endContentScreen());
         $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);  
     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 1022  sub breadcrumbs { Line 322  sub breadcrumbs {
     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.$cpinfo,
        'title'=>$name,         'title'=>$name,
        'text'=>$name,         'text'=>$name,
Line 1062  sub breadcrumbs { Line 358  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 {
Line 1126  sub log_docs { Line 423  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('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;
       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 1238  sub docs_change_log { Line 565  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 580  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 {
Line 1462  sub update_parameter { Line 793  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 800  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 836  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)=@_;
     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 862  sub editor {
         $LONCAPA::map::resources[$idx]='';          $LONCAPA::map::resources[$idx]='';
     }      }
   
     my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) =  
     &breadcrumbs($allowed,$crstype);  
         $r->print($breadcrumbtrail);  
   
     unless ($allowed) {  
         $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 1635  sub editor { Line 968  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 1652  sub editor { Line 985  sub editor {
     &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) {
           my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";
           $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto,
                                          $readfile));
         &print_paste_buffer($r,$container);          &print_paste_buffer($r,$container);
       } 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 1703  sub process_file_upload { Line 1061  sub process_file_upload {
             $LONCAPA::map::resources[1]='';              $LONCAPA::map::resources[1]='';
         }          }
         if ($fatal) {          if ($fatal) {
             $$upload_output = '<p><span class="LC_error">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</span></p>';              $$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;              return;
         }          }
         my $destination = 'docs/';          my $destination = 'docs/';
Line 1729  sub process_file_upload { Line 1087  sub process_file_upload {
         } else {          } else {
             my ($filename) = ($env{'form.uploaddoc.filename'} =~ m{([^/]+)$});              my ($filename) = ($env{'form.uploaddoc.filename'} =~ m{([^/]+)$});
                           
             $$upload_output = '<p><span class="LC_error">'.&mt('Unable to save file [_1].','<span class="LC_filename">'.$filename.'</span>').'</span></p>';              $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('Unable to save file [_1].','<span class="LC_filename">'.$filename.'</span>').'</div>';
             return;              return;
         }          }
         my $ext='false';          my $ext='false';
Line 1748  sub process_file_upload { Line 1106  sub process_file_upload {
         ($errtext,$fatal)=&storemap($coursenum,$coursedom,          ($errtext,$fatal)=&storemap($coursenum,$coursedom,
     $folder.'.'.$container);      $folder.'.'.$container);
         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;              return;
         } else {          } else {
             if ($parseaction eq 'parse' && $mimetype eq 'text/html') {              if ($parseaction eq 'parse' && $mimetype eq 'text/html') {
Line 1775  sub process_file_upload { Line 1133  sub process_file_upload {
                 } else {                  } else {
                     $$upload_output .= &mt('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 $nextphase;      return $nextphase;
 }  }
   
   sub get_dir_list {
       my ($url,$coursenum,$coursedom,$newidx) = @_;
       my ($destination,$dir_root) = &embedded_destination();
       my ($dirlistref,$listerror) =  
           &Apache::lonnet::dirlist("$dir_root/$destination/$newidx",$coursedom,$coursenum,1);
       my @dir_lines;
       my $dirptr=16384;
       if (ref($dirlistref) eq 'ARRAY') {
           foreach my $dir_line (sort
                             {
                                 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]);
           }
       }
       return @dir_lines;
   }
   
 sub is_supplemental_title {  sub is_supplemental_title {
     my ($title) = @_;      my ($title) = @_;
     return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/);      return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/);
Line 1831  sub entryline { Line 1237  sub entryline {
     $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 1851  sub entryline { Line 1257  sub entryline {
     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 1915  sub entryline { Line 1320  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);   $form_start = '
    <form  action="/adm/coursedocs" method="post">     <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 1946  END Line 1353  END
 </td>  </td>
 <td>  <td>
    $form_start     $form_start
      $form_common
    $selectbox     $selectbox
    $form_end     $form_end
 </td>  </td>
Line 1968  END Line 1376  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);
  }   }
Line 2024  END Line 1437  END
     $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);      $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 2040  END Line 1453  END
                                                .':'.((&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).$cpinfo;
  $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 2081  END Line 1505  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.=$external."</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 2099  END Line 1537  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 2227  sub checkonthis { Line 1666  sub checkonthis {
   
 =item list_symbs()  =item list_symbs()
   
 List Symbs  List Content Identifiers
   
 =cut  =cut
   
Line 2235  sub list_symbs { Line 1674  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'));
     &startContentScreen($r,'tools');      $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 2246  sub list_symbs { Line 1685  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 ++;
           }
           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("\n</pre>\n");          $r->print(&Apache::loncommon::end_data_table());
     }      }
 }  }
   
Line 2258  sub list_symbs { Line 1711  sub list_symbs {
 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'));
    &startContentScreen($r,'tools');      $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 2294  sub checkversions { Line 1749  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"));
     &startContentScreen($r,'tools');      $r->print(&startContentScreen('tools'));
   
     my $header='';      my $header='';
     my $startsel='';      my $startsel='';
Line 2347  sub checkversions { Line 1802  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 2406  sub checkversions { Line 1863  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 2415  sub checkversions { Line 1873  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 2429  sub checkversions { Line 1892  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) {   if ($changes{$key}>$starttime) {
     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 2478  ENDHEADERS Line 1954  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 2492  ENDHEADERS Line 1967  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 2513  ENDHEADERS Line 1988  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 2595  $help{'Caching'}.'</p></form>'."\n\n"); Line 2070  $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 2630  sub create_form_ul { Line 2105  sub create_form_ul {
 #  #
   
 sub startContentScreen {  sub startContentScreen {
     my ($r,$mode)=@_;      my ($mode) = @_;
     $r->print('<ul class="LC_TabContentBigger" id="mainnav">');      my $output = '<ul class="LC_TabContentBigger" id="mainnav">';
     $r->print('<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>');      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";
     my $active = '';          $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";
 # does this user have privileges to modify docs?          $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>';
     my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});      } 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";
     my $onclick;          $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Content Editor').'</b></a></li>'."\n";
     my $href;          $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>';
     if ($allowed) {      }
         $r->print('<li '.(($mode eq 'docs')?' class="active"':'').      $output .= "\n".'</ul>'."\n";
                '><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>');      $output .= '<div class="LC_DocsBox" style="clear:both;margin:0;" id="contenteditor">'.
     }                 '<div id="maincoursedoc" style="margin:0 0;padding:0 0;">'.
     $r->print('<li '.(($mode eq 'supdocs')?' class="active"':'').                 '<div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">';
            '><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Documents').'</b></a></li>');      return $output;
     $r->print('</ul>');  
     $r->print('<div class="LC_Box" style="clear:both;margin:0;">'  
              .'<div id="maincoursedoc" style="margin:0 0;padding:0 0;">');  
     $r->print('<div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">');  
 }  }
   
 #  #
Line 2658  sub startContentScreen { Line 2129  sub startContentScreen {
 #  #
   
 sub endContentScreen {  sub endContentScreen {
    my ($r)=@_;      return '</div></div></div>';
    $r->print('</div></div></div>');  
 }  }
   
 sub supplemental_base {  sub supplemental_base {
     return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Documents'));      return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Content'));
 }  }
   
 sub handler {  sub handler {
Line 2671  sub handler { Line 2141  sub handler {
     &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
Line 2697  sub handler { Line 2174  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 {
 #  #
 # Done catching special calls  # Done catching special calls
 # The whole rest is for course and supplemental documents  # The whole rest is for course and supplemental documents and utilities menu
 # Get the parameters that may be needed  # Get the parameters that may be needed
 #  #
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['folderpath','pagepath',                                              ['folderpath','pagepath',
                                              'pagesymb','forcesupplement','forcestandard']);                                               'pagesymb','forcesupplement','forcestandard',
                                                'tools','symb','command']);
   
 # standard=1: this is a "new-style" course with an uploaded map as top level  # standard=1: this is a "new-style" course with an uploaded map as top level
 # standard=2: this is a "old-style" course, and there is nothing we can do  # standard=2: this is a "old-style" course, and there is nothing we can do
   
     my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);      my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
   
 # Decide whether this should display supplemental or main content  # Decide whether this should display supplemental or main content or utilities
 # supplementalflag=1: show supplemental documents  # supplementalflag=1: show supplemental documents
 # supplementalflag=0: show standard documents  # supplementalflag=0: show standard documents
   # toolsflag=1: show utilities
   
   
     my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);      my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);
Line 2745  sub handler { Line 2239  sub handler {
     if ($env{'form.forcestandard'})   { $supplementalflag=0; }      if ($env{'form.forcestandard'})   { $supplementalflag=0; }
     unless ($allowed) { $supplementalflag=1; }      unless ($allowed) { $supplementalflag=1; }
     unless ($standard) { $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?  # Where do we store these for when we come back?
     my $stored_folderpath='docs_folderpath';      my $stored_folderpath='docs_folderpath';
     if ($supplementalflag) {      if ($supplementalflag) {
        $stored_folderpath='docs_sup_folderpath';         $stored_folderpath='docs_sup_folderpath';
     }      }
          
 # 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($stored_folderpath,          &Apache::loncommon::restore_course_settings($stored_folderpath,
Line 2788  sub handler { Line 2360  sub handler {
        } else {         } else {
           $env{'form.folderpath'}='default';            $env{'form.folderpath'}='default';
        }         }
     }       }
   
 # Store this  # Store this
     &Apache::loncommon::store_course_settings($stored_folderpath,      unless ($toolsflag) {
                                                 {'pagepath' => 'scalar',          &Apache::loncommon::store_course_settings($stored_folderpath,
                                                  'folderpath' => 'scalar'});                                                    {'pagepath' => 'scalar',
                                                      'folderpath' => 'scalar'});
     if ($env{'form.folderpath'}) {          if ($env{'form.folderpath'}) {
  my (@folderpath)=split('&',$env{'form.folderpath'});      my (@folderpath)=split('&',$env{'form.folderpath'});
  $env{'form.foldername'}=&unescape(pop(@folderpath));      $env{'form.foldername'}=&unescape(pop(@folderpath));
  $env{'form.folder'}=pop(@folderpath);      $env{'form.folder'}=pop(@folderpath);
     }              $container='sequence';
     if ($env{'form.pagepath'}) {          }
         my (@pagepath)=split('&',$env{'form.pagepath'});          if ($env{'form.pagepath'}) {
         $env{'form.pagename'}=&unescape(pop(@pagepath));              my (@pagepath)=split('&',$env{'form.pagepath'});
         $env{'form.folder'}=pop(@pagepath);              $env{'form.pagename'}=&unescape(pop(@pagepath));
         $containertag = '<input type="hidden" name="pagepath" value="" />'.              $env{'form.folder'}=pop(@pagepath);
                 '<input type="hidden" name="pagesymb" value="" />';              $container='page';
         $uploadtag =               $containertag = '<input type="hidden" name="pagepath" value="" />'.
             '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'.                      '<input type="hidden" name="pagesymb" value="" />';
     '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />'.              $uploadtag = 
             '<input type="hidden" name="folderpath" value="" />';                  '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'.
     } else {          '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />'.
         my $folderpath=$env{'form.folderpath'};                  '<input type="hidden" name="folderpath" value="" />';
         if (!$folderpath) {          } else {
             if ($env{'form.folder'} eq '' ||              my $folderpath=$env{'form.folderpath'};
                 $env{'form.folder'} eq 'supplemental') {              if (!$folderpath) {
                 $folderpath='default&'.                  if ($env{'form.folder'} eq '' ||
                     &escape(&mt('Main '.$crstype.' Documents'));                      $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');
             }              }
         }          }
         $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 course data  
     my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};  
     my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};  
   
 # get personal data  # get personal data
     my $uname=$env{'user.name'};      my $uname=$env{'user.name'};
     my $udom=$env{'user.domain'};      my $udom=$env{'user.domain'};
     my $plainname=&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');",
                             };
           }
     }      }
 # -------------------------------------------------------------------- Body tag  # -------------------------------------------------------------------- Body tag
     $script = '<script type="text/javascript">'."\n"      $script = '<script type="text/javascript">'."\n"
Line 2864  sub handler { Line 2462  sub handler {
             href=>"/adm/coursedocs",text=>"$crstype Contents"});              href=>"/adm/coursedocs",text=>"$crstype Contents"});
   
         $r->print(&Apache::loncommon::start_page("$crstype Contents", $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')
         );          );
     } else {      } else {
Line 2912  sub handler { Line 2512  sub handler {
           my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};            my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
           my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};            my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
           my ($destination,$dir_root) = &embedded_destination();            my ($destination,$dir_root) = &embedded_destination();
           $r->print(&Apache::loncommon::modify_html_refs('coursedoc',$destination,            my $result = 
                                                          $docuname,$docudom,undef,                &Apache::loncommon::modify_html_refs('coursedoc',$destination,
                                                          $dir_root).                                                     $docuname,$docudom,undef,
                    &return_to_editor());                                                     $dir_root);
             $r->print($result.&return_to_editor());   
         } elsif ($env{'form.phase'} eq 'decompress_uploaded') {
             $uploadphase = 'decompress_phase_one';
             $r->print(&decompression_phase_one().
                       &return_to_editor());
         } elsif ($env{'form.phase'} eq 'decompress_cleanup') {
             $uploadphase = 'decompress_phase_two';
             $r->print(&decompression_phase_two().
                       &return_to_editor());
       }        }
   }    }
   
   unless ($showdoc || $uploadphase) {      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',
Line 2929  sub handler { Line 2542  sub handler {
                 'upld' => 'Import Document',                  'upld' => 'Import Document',
                 'srch' => 'Search',                  'srch' => 'Search',
                 'impo' => 'Import',                  'impo' => 'Import',
  'wish' => 'Import from Wishlist',                  'lnks' => 'Import from Stored Links',
                 'selm' => 'Select Map',                  'selm' => 'Select Map',
                 'load' => 'Load Map',                  'load' => 'Load Map',
                 'reco' => 'Recover Deleted Documents',                  'reco' => 'Recover Deleted Documents',
Line 2941  sub handler { Line 2554  sub handler {
                 '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 2973  FIUP Line 2586  FIUP
  </label>   </label>
 CHBO  CHBO
   
     my $fileuploada = "<input type='submit' value='".$lt{'upld'}."' /> $help{'Uploading_From_Harddrive'}";      my $fileuploada = "<br clear='all' /><input type='submit' value='".$lt{'upld'}."' /> $help{'Uploading_From_Harddrive'}";
  my $fileuploadform=(<<FUFORM);   my $fileuploadform=(<<FUFORM);
  <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">   <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
  <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="80" 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>
 FUFORM  FUFORM
     $fileuploadform .= &create_form_ul(&Apache::lonhtmlcommon::htmltag('li',$fileuploada,{class => 'LC_menubuttons_inline_text'})).'</form>';      $fileuploadform .= $fileuploada.'</form>';
   
  my $simpleeditdefaultform=(<<SEDFFORM);   my $simpleeditdefaultform=(<<SEDFFORM);
  <form action="/adm/coursedocs" method="post" name="simpleeditdefault">   <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
Line 2997  SEDFFORM Line 2610  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/wishlist.png" alt="'.$lt{wish}.'" onclick="javascript:open_Wishlist_Import();" />' => "<a class='LC_menubuttons_link' href='javascript:open_Wishlist_Import();'>$lt{'wish'}</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>" },
  );   );
  $simpleeditdefaultform .= &create_form_ul(&create_list_elements(@simpleeditdefaultforma));   $simpleeditdefaultform .= &create_form_ul(&create_list_elements(@simpleeditdefaultforma));
  $simpleeditdefaultform .=(<<SEDFFORM);   $simpleeditdefaultform .=(<<SEDFFORM);
  <hr />   <hr id="bb_hrule" style="width:0px;text-align:left;margin-left:0" />
  <p>  
  $lt{'copm'}<br />   $lt{'copm'}<br />
  <input type="text" size="40" name="importmap" /><br />   <input type="text" size="40" name="importmap" /><br />
  <span class="LC_nobreak"><input type="button"   <span class="LC_nobreak" style="float:left"><input type="button"
  onclick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"   onclick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
  value="$lt{'selm'}" /> <input type="submit" name="loadmap" value="$lt{'load'}" />   value="$lt{'selm'}" /> <input type="submit" name="loadmap" value="$lt{'load'}" />
  $help{'Load_Map'}</span>   $help{'Load_Map'}</span>
  </p>  
  </form>   </form>
 SEDFFORM  SEDFFORM
   
Line 3024  ERFORM Line 2635  ERFORM
   
     if ($allowed) {      if ($allowed) {
  &update_paste_buffer($coursenum,$coursedom);   &update_paste_buffer($coursenum,$coursedom);
        my %lt=&Apache::lonlocal::texthash(  
  'vc' => 'Verify Content',  
  'cv' => 'Check/Set Resource Versions',  
  'ls' => 'List Symbs',  
                                          'sl' => 'Show Log'  
   );  
   
  $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 3039  ERFORM Line 2643  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"));
     }      }
   
 # Generate the tabs  # Generate the tabs
     &startContentScreen($r,($supplementalflag?'supdocs':'docs'));      my $mode;
       if (($supplementalflag) && (!$allowed)) {
           &Apache::lonnavdisplay::startContentScreen($r,'supplemental');
       } else {
           $r->print(&startContentScreen(($supplementalflag?'suppdocs':'docs')));
       }
   
 #  #
   
Line 3084  HIDDENFORM Line 2693  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)">$lt{'reco'}</a>  
  </form>  
 RFORM  
   
  my $imspform=(<<IMSPFORM);   my $imspform=(<<IMSPFORM);
  <form action="/adm/imsimportdocs" method="post" name="ims">   <form action="/adm/imsimportdocs" method="post" name="ims">
  <input type="hidden" name="folder" value="$folder" />   <input type="hidden" name="folder" value="$folder" />
Line 3193  NROSTFORM Line 2794  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 3244  NGFFORM Line 2848  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));
   
   
         my @importdoc = (          my @importdoc = (
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:makenewext(\'newext\');" />'=>$extresourcesform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:makenewext(\'newext\');" />'=>$extresourcesform},
         {'<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/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:makeims();" />'=>$imspform},);
         $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc)) . '<hr/>' . $fileuploadform;          $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc)) . '<hr id="cc_hrule" style="width:0px;text-align:left;margin-left:0" />' . $fileuploadform;
   
  push @specialdocumentsforma, ({'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$newnavform},          @gradingforma=(
  {'<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/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/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/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));          );
       }          $gradingform = &create_form_ul(&create_list_elements(@gradingforma));
   
 if($env{'form.pagepath'}) {  
   
  @specialdocumentsforma=(  
  {'<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/scoreupfrm.png" alt="'.&mt('Score Upload Form').'" onclick="javascript:makeexamupload();" />'=>$newexuploadform}  
  );  
  $specialdocumentsform= &create_form_ul(&create_list_elements(@specialdocumentsforma));  
 }  
   
 my @tools = (          @communityforma=(
 # {'<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/bchat.png" alt="'.$lt{bull}.'" onclick="javascript:makebulboard();" />'=>$newbulform},
 # {'<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/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makebulboard();" />'=>$newaboutmeform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/recover.png" alt="'.$lt{reco}.'" onclick="javascript:groupopen(\''.$readfile.'\',1)" />'=>$recoverform},          {'<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 = (
                 'aa' => ['Import Documents',$fileuploadform],                  'aa' => ['Import Documents',$fileuploadform],
                 'bb' => ['Published Resources',$simpleeditdefaultform],                  'bb' => ['Published Resources',$simpleeditdefaultform],
                 'cc' => ['Special Documents',$specialdocumentsform],                  'cc' => ['Grading Resources',$gradingform],
  'dd' => ['Tools', &create_form_ul(&create_list_elements(@tools)).&generate_admin_options(\%help,\%env)],  
                 );                  );
 unless($env{'form.pagepath'}) {  unless ($env{'form.pagepath'}) {
     $orderhash{'00'} = ['Newfolder',$newfolderform];      $orderhash{'00'} = ['Newfolder',$newfolderform];
       $orderhash{'dd'} = ['Collaboration',$communityform];
       $orderhash{'ee'} = ['Special Documents',$specialdocumentsform];
 }  }
   
  $hadchanges=0;   $hadchanges=0;
        unless ($supplementalflag) {         unless (($supplementalflag || $toolsflag)) {
           my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype);            my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                                 $supplementalflag,\%orderhash,$iconpath);
           if ($error) {            if ($error) {
              $r->print('<p><span class="LC_error">'.$error.'</span></p>');               $r->print('<p><span class="LC_error">'.$error.'</span></p>');
           }            }
Line 3301  unless($env{'form.pagepath'}) { Line 2899  unless($env{'form.pagepath'}) {
           }            }
   
           &changewarning($r,'');            &changewarning($r,'');
           $r->print(&generate_edit_table('1',\%orderhash));  
         }          }
       }
  }  
   
 # Supplemental documents start here  # Supplemental documents start here
   
Line 3398  my @supimportdoc = ( Line 2994  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(\'supnewext\');" />'
             =>$supnewextform},              =>$supnewextform},
         );          );
 $supupdocform =  &create_form_ul(&create_list_elements(@supimportdoc)) . '<hr/>' . $supupdocform;  $supupdocform =  &create_form_ul(&create_list_elements(@supimportdoc)) . '<hr id="ee_hrule" style="width:0px;text-align:left;margin-left:0" />' . $supupdocform;
 my %suporderhash = (  my %suporderhash = (
  '00' => ['Supnewfolder', $supnewfolderform],   '00' => ['Supnewfolder', $supnewfolderform],
                 'ee' => ['Import Documents',$supupdocform],                  'ee' => ['Import Documents',$supupdocform],
                 'ff' => ['Special Documents',&create_form_ul(&create_list_elements(@specialdocs))]                  'ff' => ['Special Documents',&create_form_ul(&create_list_elements(@specialdocs))]
                 );                  );
         if ($supplementalflag) {          if ($supplementalflag) {
            my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype);             my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                                  $supplementalflag,\%suporderhash,$iconpath);
            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(&generate_edit_table('2',\%suporderhash));  
         }          }
     } elsif ($supplementalflag) {      } elsif ($supplementalflag) {
         my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype);          my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                               $supplementalflag,'',$iconpath);
         if ($error) {          if ($error) {
             $r->print('<p><span class="LC_error">'.$error.'</span></p>');              $r->print('<p><span class="LC_error">'.$error.'</span></p>');
         }          }
     }      }
   
     &endContentScreen($r);      $r->print(&endContentScreen());
   
     if ($allowed) {      if ($allowed) {
  $r->print('   $r->print('
Line 3429  my %suporderhash = ( Line 3026  my %suporderhash = (
   <input type="hidden" name="residx" />    <input type="hidden" name="residx" />
 </form>');  </form>');
     }      }
   } else {    } elsif ($showdoc) {
       unless ($uploadphase) {  
 # -------------------------------------------------------- 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>'.
 &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());
Line 3479  sub return_to_editor { Line 3074  sub return_to_editor {
            '</a></p>';             '</a></p>';
 }  }
   
 sub generate_admin_options {  sub decompression_info {
   my ($help_ref,$env_ref) = @_;      my ($destination,$dir_root) = &embedded_destination();
   my %lt=&Apache::lonlocal::texthash(      my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
                                          'vc' => 'Verify Content',      my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
                                          'cv' => 'Check/Set Resource Versions',      my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
                                          'ls' => 'List Symbs',      my $container='sequence';
                                          'sl' => 'Show Log',      my ($pathitem,$hiddenelem);
                                          'imse' => 'IMS Export',      my @hiddens = ('newidx','comment','position');
                                          'dcd' => 'Dump Course Documents to Construction Space: available on other servers'      if ($env{'form.pagepath'}) {
                                           );          $container='page';
   my %help = %{$help_ref};          $pathitem = 'pagepath';
   my %env = %{$env_ref};      } else {
   my $dumpbut=&dumpbutton();          $pathitem = 'folderpath';
   my $exportbut=&exportbutton();      }
   my @list = (      unshift(@hiddens,$pathitem);
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/verify.png" alt="'.$lt{vc}.'"  onclick=\'javascript:injectData(document.courseverify, "dummy", "verify", "'.$lt{'vc'}.'")\' />'       foreach my $item (@hiddens) {
         => "<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"verify\", \"$lt{'vc'}\")'>$lt{'vc'}</a>$help{'Verify_Content'}"},          if ($env{'form.'.$item}) {
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/resversion.png" alt="'.$lt{cv}.'"  onclick=\'javascript:injectData(document.courseverify, "dummy", "versions", "'.$lt{'cv'}.'")\' />'              $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'.
         =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"versions\", \"$lt{'cv'}\")'>$lt{'cv'}</a>$help{'Check_Resource_Versions'}"},                             $env{'form.'.$item}.'" />'."\n";
  );          }
   if($dumpbut ne ''){      }
   push @list, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dump.png" alt="'.$lt{dcd}.'" />'=>$dumpbut};      return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,
   }              $hiddenelem);
   push @list, ({'<img class="LC_noBorder LC_middle" src="/res/adm/pages/imsexport.png" alt="'.$lt{imse}.'" onclick="javascript:injectData(document.courseverify, \'dummy\', \'exportcourse\', \''.&mt('IMS Export').'\');" />'  }
           =>$exportbut},  
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/symbs.png" alt="'.$lt{ls}.'"  onclick=\'javascript:injectData(document.courseverify, "dummy", "listsymbs", "'.$lt{'ls'}.'")\'  />'  sub decompression_phase_one {
         =>"<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'}' />"},      my ($dir,$file,$warning,$error,$output);
  {'<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'}.'")\'  />'      my ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,$hiddenelem)=
         =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"docslog\", \"$lt{'sl'}\")'>$lt{'sl'}</a>"},          &decompression_info();
  );      if ($env{'form.archiveurl'} !~ m{^/uploaded/\Q$docudom/$docuname/docs/\E(?:default|supplemental|\d+).*/([^/]+)$}) {
   return '<form action="/adm/coursedocs" method="post" name="courseverify"><input type="hidden" id="dummy" />'.&create_form_ul(&create_list_elements(@list)).'</form>';          $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);
                   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 3524  sub generate_edit_table { Line 3279  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";
       if ($tid == 1) {
           $form .= '<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.'\');"'                  .' 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>';                  .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>'."\n";
         } else {          } else {
     $form .= '<li '.$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 3584  sub editing_js { Line 3366  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)',
                                         );                                          );
   
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
Line 3599  sub editing_js { Line 3382  sub editing_js {
     my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents';      my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents';
     my $toplevelsupp = &supplemental_base();      my $toplevelsupp = &supplemental_base();
   
       my $backtourl = '/adm/navmaps';
       if ($supplementalflag) {
           $backtourl = '/adm/supplemental';
       }
   
     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 3703  newWindow = window.open("","IMSimport"," Line 3491  newWindow = window.open("","IMSimport","
 newWindow.location.href = newlocation;  newWindow.location.href = newlocation;
 }  }
   
   
 function finishpick() {  function finishpick() {
 var title=this.document.forms.extimport.title.value;  var title=this.document.forms.extimport.title.value;
 var url=this.document.forms.extimport.url.value;  var url=this.document.forms.extimport.url.value;
Line 3773  this.document.forms.renameform.pagesymb. Line 3560  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 3827  function showPage(current, pageId, nav, Line 3649  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;
         if (nav == 'mainnav') {          if (nav == 'mainnav') {
             var storedpath = "$docs_folderpath";              var storedpath = "$docs_folderpath";
             if (storedpath == '') {              if (storedpath == '') {
Line 3861  function showPage(current, pageId, nav, Line 3684  function showPage(current, pageId, nav,
                 }                  }
             }              }
         }          }
           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 3905  sets @resources - array with the resourc Line 3853  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 3995  Check Versions Line 3918  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.447  
changed lines
  Added in v.1.484.2.6


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