Diff for /loncom/interface/londocs.pm between versions 1.375 and 1.470

version 1.375, 2009/07/08 07:51:01 version 1.470, 2011/12/25 18:19:38
Line 35  use Apache::Constants qw(:common :http); Line 35  use Apache::Constants qw(:common :http);
 use Apache::imsexport;  use Apache::imsexport;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
   use Apache::lonhtmlcommon;
 use LONCAPA::map();  use LONCAPA::map();
 use Apache::lonratedt();  use Apache::lonratedt();
 use Apache::lonxml;  use Apache::lonxml;
Line 116  sub authorhosts { Line 117  sub authorhosts {
   
 sub dumpbutton {  sub dumpbutton {
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     my $type = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     if ($home+$other==0) { return ''; }      if ($home+$other==0) { return ''; }
     if ($home) {      if ($home) {
  return '<input type="submit" name="dumpcourse" value="'.          my $link =
     &mt('Dump '.$type.' DOCS to Construction Space').'" />'.              "<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"dumpcourse\", \""
     &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs').'<br />';             .&mt('Dump '.$crstype.' Documents to Construction Space')
     } else {             ."\")'>"
  return '<div>'.             .&mt('Dump '.$crstype.' Documents to Construction Space')
      &mt('Dump '.$type.             .'</a>';
  ' DOCS to Construction Space: available on other servers').          return
  '</div>';              $link.' '
              .&Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs')
              .'<br />';
       } else {
           return
               &mt('Dump '.$crstype.' Documents to Construction Space: available on other servers');
     }      }
 }  }
   
Line 140  sub clean { Line 146  sub clean {
   
 sub dumpcourse {  sub dumpcourse {
     my ($r) = @_;      my ($r) = @_;
     my $type = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space').      $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Documents to Construction Space').
       '<form name="dumpdoc" action="" method="post">');        '<form name="dumpdoc" action="" method="post">');
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$type.' DOCS to Construction Space'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Documents to Construction Space'));
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     unless ($home) { return ''; }      unless ($home) { return ''; }
     my $origcrsid=$env{'request.course.id'};      my $origcrsid=$env{'request.course.id'};
Line 170  sub dumpcourse { Line 176  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 254  sub dumpcourse { Line 260  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 $type DOCS").'" /></p></form>');    '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype Documents").'" /></p></form>');
     }      }
 }  }
   
   
   
 sub exportbutton {  sub exportbutton {
     my $type = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     return '<input type="submit" name="exportcourse" value="'.      return "<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"exportcourse\", \"".&mt('IMS Export')."\")'>".&mt('IMS Export')."</a>".
             &mt('Export '.$type.' to IMS').'" />'.  
     &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs').'<br />';      &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs').'<br />';
 }  }
   
Line 271  sub exportbutton { Line 276  sub exportbutton {
   
 sub exportcourse {  sub exportcourse {
     my $r=shift;      my $r=shift;
     my $type = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my %discussiontime = &Apache::lonnet::dump('discussiontimes',      my %discussiontime = &Apache::lonnet::dump('discussiontimes',
                                                $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});                                                 $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});
     my $numdisc = keys(%discussiontime);      my $numdisc = keys(%discussiontime);
       my $numprobs = 0;
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     if (!defined($navmap)) {      if (!defined($navmap)) {
         $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package').          $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package').
                   '<h2>IMS Export Failed</h2>'.                    '<h2>'.&mt('IMS Export Failed').'</h2>'.
                   '<div class="LC_error">'.                    '<div class="LC_error">');
                   &mt('Unable to retrieve information about course contents').          if ($crstype eq 'Community') {
                   '</div><a href="/adm/coursedocs">'.&mt('Return to Course Editor').'</a>');              $r->print(&mt('Unable to retrieve information about community contents'));
         &Apache::lonnet::logthis('IMS export failed - could not create navmap object in '.lc($type).':'.$env{'request.course.id'});          } 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;          return;
     }      }
     my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);      my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
Line 295  sub exportcourse { Line 311  sub exportcourse {
         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['archive','discussion']);                                              ['archive','discussion']);
   
           my $format = $env{'form.format'};
         my @exportitems = &Apache::loncommon::get_env_multiple('form.archive');          my @exportitems = &Apache::loncommon::get_env_multiple('form.archive');
         my @discussions = &Apache::loncommon::get_env_multiple('form.discussion');          my @discussions = &Apache::loncommon::get_env_multiple('form.discussion');
         if (@exportitems == 0 && @discussions == 0) {          if (@exportitems == 0 && @discussions == 0) {
             $outcome = '<br />As you did not select any content items or discussions for export, an IMS package has not been created.  Please <a href="javascript:history.go(-1)">go back</a> to select either content items or discussions for export';              $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 {          } else {
             my $now = time;              my $now = time;
             my %symbs;              my %symbs;
Line 306  sub exportcourse { Line 333  sub exportcourse {
             my $imsresources;              my $imsresources;
             my $tempexport;              my $tempexport;
             my $copyresult;              my $copyresult;
             my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport);              my $testbank;
               my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport,$format,\$testbank);
             if ($manifestok) {              if ($manifestok) {
                 &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest);                  &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest,$format,$testbank);
                 close($ims_manifest);                  close($ims_manifest);
   
 #Create zip file in prtspool  #Create zip file in prtspool
Line 322  sub exportcourse { Line 350  sub exportcourse {
                 close(OUTPUT);                  close(OUTPUT);
                 chdir $cwd;                  chdir $cwd;
                 $outcome .= '<p>'                  $outcome .= '<p>'
                            .&mt('Download the zip file from [_1]IMS '.lc($type).' archive[_2]'                             .&mt('[_1]Your IMS package[_2] is ready for download.'
                                ,'<a href="'.$imszipfile.'">','</a>')                                 ,'<a href="'.$imszipfile.'">','</a>')
                            .'</p>';                             .'</p>';
                 if ($copyresult) {                  if ($copyresult) {
Line 332  sub exportcourse { Line 360  sub exportcourse {
                                .'</p>';                                 .'</p>';
                 }                  }
             } else {              } else {
                 $outcome = '<br />'.&mt('Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.').'<br />';                  $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 '.lc($type).' to IMS content package'));          $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package'));
  $r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package'));   $r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export'));
         $r->print($outcome);          $r->print($outcome);
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
     } else {      } else {
         my $display;          my $display='<form name="exportdoc" action="" method="post">'."\n".
         $display = '<form name="exportdoc" action="" method="post">'."\n";                      '<p>'.
         $display .= '<p>'                      &mt('Choose which items you wish to export from your '.$crstype.'.').
                    .&mt('Choose which items you wish to export from your '.$type.'.')                      '</p>'.
                    .'</p>';                      '<div class="LC_columnSection"><fieldset>'.
         $display .= '<div class="LC_columnSection"><fieldset>'.  
                     '<legend>'.&mt('Content items').'</legend>'.                      '<legend>'.&mt('Content items').'</legend>'.
                     '<input type="button" value="'.&mt('check all').'" '.                      '<input type="button" value="'.&mt('check all').'" '.
                     'onclick="javascript:checkAll(document.exportdoc.archive)" />'.                      'onclick="javascript:checkAll(document.exportdoc.archive)" />'.
                     '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.                      '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.
                     ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset>'.                      ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset>';
                     '<fieldset>'.          if ($numdisc > 0) {
                     '<legend>'.&mt('Discussion posts').'</legend>'.              $display .= '<fieldset>'.
                     '<input type="button" value="'.&mt('check all').'"'.                          '<legend>'.&mt('Discussion posts').'</legend>'.
                     ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'.                          '<input type="button" value="'.&mt('check all').'"'.
                     '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.                          ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'.
                     ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" />'.                          '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.
                     '</fieldset></div>';                          ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" />'.
                           '</fieldset>';
           }
           $display .= '</div>';
         my $curRes;          my $curRes;
         my $depth = 0;          my $depth = 0;
         my $count = 0;          my $count = 0;
Line 368  sub exportcourse { Line 406  sub exportcourse {
         my $lastcontainer = $startcount;          my $lastcontainer = $startcount;
         $display .= &Apache::loncommon::start_data_table()          $display .= &Apache::loncommon::start_data_table()
                    .&Apache::loncommon::start_data_table_header_row()                     .&Apache::loncommon::start_data_table_header_row()
                    .'<th>'.&mt('Export content item?').'</th>'                     .'<th>'.&mt('Export content item?').'</th>';
                    .'<th>';  
         if ($numdisc > 0) {          if ($numdisc > 0) {
             $display .= &mt('Export discussion posts?');              $display .= '<th>'.&mt('Export discussion posts?').'</th>';
         } else {  
              $display .= '&nbsp;';  
         }          }
         $display .= '</th>'          $display .= &Apache::loncommon::end_data_table_header_row();
                    .&Apache::loncommon::end_data_table_header_row();  
         while ($curRes = $it->next()) {          while ($curRes = $it->next()) {
             if (ref($curRes)) {              if (ref($curRes)) {
                 $count ++;                  $count ++;
Line 397  sub exportcourse { Line 431  sub exportcourse {
                         $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';                          $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                     }                      }
                 }                  }
                   my $currelem = $count+$boards+$startcount;
                 $display .= &Apache::loncommon::start_data_table_row()                  $display .= &Apache::loncommon::start_data_table_row()
                            .'<td>'."\n"                             .'<td>'."\n"
                            .'<input type="checkbox" name="archive" value="'.$count.'" ';                             .'<input type="checkbox" name="archive" value="'.$count.'" ';
                 if (($curRes->is_sequence()) || ($curRes->is_page())) {                  if (($curRes->is_sequence()) || ($curRes->is_page())) {
                     my $checkitem = $count + $boards + $startcount;                      $lastcontainer = $currelem;
                     $display .= 'onclick="javascript:propagateCheck('."'$checkitem'".')"';                      $display .= 'onclick="javascript:propagateCheck('."'$currelem'".')"';
                   } elsif ($curRes->is_problem()) {
                       $numprobs ++; 
                 }                  }
                 $display .= ' />'."\n";                  $display .= ' />'."\n";
                 for (my $i=0; $i<$depth; $i++) {                  for (my $i=0; $i<$depth; $i++) {
                     $display .= '<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" alt="" />'                      $display .= ('<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" alt="" />' x2)."\n";
                                .'<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" alt="" />'."\n";  
                 }                  }
                 if ($curRes->is_sequence()) {                  if ($curRes->is_sequence()) {
                     $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />&nbsp;'."\n";                      $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />&nbsp;'."\n";
                     $lastcontainer = $count + $startcount + $boards;  
                 } elsif ($curRes->is_page()) {                  } elsif ($curRes->is_page()) {
                     $display .= '<img src="/adm/lonIcons/navmap.page.open.gif" alt="" />&nbsp;'."\n";                      $display .= '<img src="/adm/lonIcons/navmap.page.open.gif" alt="" />&nbsp;'."\n";
                     $lastcontainer = $count + $startcount + $boards;  
                 }                  }
                 my $currelem = $count+$boards+$startcount;  
                 $children{$parent{$depth}} .= $currelem.':';                  $children{$parent{$depth}} .= $currelem.':';
                 $display .= '&nbsp;'.$curRes->title().'</td>'."\n";                  $display .= '&nbsp;'.$curRes->title().'</td>'."\n";
   
                 # Existing discussion posts?                  # Existing discussion posts?
                 if ($discussiontime{$ressymb} > 0) {                  if ($discussiontime{$ressymb} > 0) {
                     $boards ++;                      $boards ++;
                     $currelem = $count+$boards+$startcount;  
                     $display .= '<td align="right">'                      $display .= '<td align="right">'
                                .'<input type="checkbox" name="discussion" value="'.$count.'" />'                                 .'<input type="checkbox" name="discussion" value="'.$count.'" />'
                                .'</td>'."\n";                                 .'</td>'."\n";
                 } else {                  } elsif ($numdisc > 0) {
                     $display .= '<td>&nbsp;</td>'."\n";                      $display .= '<td>&nbsp;</td>'."\n";
                 }                  }
                 $display .= &Apache::loncommon::end_data_table_row();                  $display .= &Apache::loncommon::end_data_table_row();
Line 489  function containerCheck(item) { Line 521  function containerCheck(item) {
 // ]]>  // ]]>
 </script>  </script>
         |;          |;
  $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package',   $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package',
  $scripttag));   $scripttag));
  $r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package'));   $r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export'));
           if ($numprobs > 0) {
               $display .= '<p><span class="LC_nobreak">'.
                           &mt('Export format for LON-CAPA problems:').
                           '<label><input type="radio" name="format" value="xml" checked="checked" />'.
                           '&nbsp;'.&mt('XML').'</label>'.('&nbsp;' x3).
                           '<label><input type="radio" name="format" value="html" />'.
                           '&nbsp;'.&mt('HTML').'</label>'.('&nbsp;' x3).
                           '<label><input type="radio" name="format" value="plaintext" />'.
                           '&nbsp;'.&mt('Text').'</label></span></p>';
           }
  $r->print($display.   $r->print($display.
                   '<p><input type="hidden" name="finishexport" value="1" />'.                    '<p><input type="hidden" name="finishexport" value="1" />'.
                   '<input type="submit" name="exportcourse" value="'.                    '<input type="submit" name="exportcourse" value="'.
                   &mt('Export '.$type.' DOCS').'" /></p></form>');                    &mt('Export').'" /></p></form>');
     }      }
 }  }
   
 sub create_ims_store {  sub create_ims_store {
     my ($now,$manifestok,$outcome,$tempexport) = @_;      my ($now,$manifestok,$outcome,$tempexport,$format,$testbank) = @_;
     $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports';      $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports';
     my $ims_manifest;      my $ims_manifest;
     if (!-e $$tempexport) {      if (!-e $$tempexport) {
Line 544  sub create_ims_store { Line 586  sub create_ims_store {
 '  <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n".  '  <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n".
 '    <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'.  '    <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'.
 ' structure="hierarchical">'."\n".  ' structure="hierarchical">'."\n".
 '      <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>'  '      <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>';
           if ($format eq 'plaintext') {
               my $testbankfilename = $$tempexport.'/testbank.txt';
               $$testbank = Apache::File->new('>'.$testbankfilename);
           }
     } else {      } else {
         $$outcome .= 'An error occurred opening the IMS manifest file.<br />'          $$outcome .= 'An error occurred opening the IMS manifest file.<br />'
 ;  ;
Line 553  sub create_ims_store { Line 599  sub create_ims_store {
 }  }
   
 sub build_package {  sub build_package {
     my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult,$ims_manifest) = @_;      my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult,
           $ims_manifest,$format,$testbank) = @_;
 # first iterator to look for dependencies  # first iterator to look for dependencies
     my $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);      my $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
     my $curRes;      my $curRes;
Line 592  sub build_package { Line 639  sub build_package {
     $count = 0;      $count = 0;
     my $imsresources;      my $imsresources;
     my $pkgdepth;      my $pkgdepth;
       my $currdirpath = 'Top';
     while ($curRes = $it->next()) {      while ($curRes = $it->next()) {
         if ($curRes == $it->BEGIN_MAP()) {          if ($curRes == $it->BEGIN_MAP()) {
             $prevdepth = $depth;              $prevdepth = $depth;
Line 629  sub build_package { Line 677  sub build_package {
               '<title>'.$curRes->title().'</title>';                '<title>'.$curRes->title().'</title>';
                 print $ims_manifest "\n".$itementry;                  print $ims_manifest "\n".$itementry;
   
                 unless ($curRes->is_sequence()) {                  if ($curRes->is_sequence()) {
                       $currdirpath = 'Top';
                       my $pcslist = $curRes->map_hierarchy();
                       if ($pcslist ne '') {
                           foreach my $pc (split(/,/,$pcslist),$curRes->map_pc()) {
                               next if ($pc <= 1);
                               my $res = $navmap->getByMapPc($pc);
                               if (ref($res)) {
                                   my $encloser = $res->title();
                                   if ($encloser) {
                                       if ($currdirpath) {
                                           $currdirpath .= ' -> ';
                                       }
                                       $currdirpath .= $encloser;
                                   }
                               }
                           }
                       }
                   } else {
                     my $content_file;                      my $content_file;
                     my @hrefs = ();                      my @hrefs = ();
                     &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport);                      &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport,$format,$currdirpath,$testbank);
                     if ($content_file) {                      if ($content_file) {
                         $imsresources .= "\n".                          $imsresources .= "\n".
                      '   <resource identifier="RES-'.$env{'request.course.id'}.'-'.$count.                       '   <resource identifier="RES-'.$env{'request.course.id'}.'-'.$count.
Line 693  sub get_dependencies { Line 759  sub get_dependencies {
 }  }
   
 sub process_content {  sub process_content {
     my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_;      my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport,$format,$currdirpath,$testbank) = @_;
     my $content_type;      my $content_type;
     my $message;      my $message;
     my @uploads = ();      my @uploads = ();
Line 750  sub process_content { Line 816  sub process_content {
             $canedit= 1;              $canedit= 1;
         }          }
 # only include problem code where current user is author  # only include problem code where current user is author
         if ($canedit) {          if (($format eq 'html') || ($format eq 'plaintext')) {
             $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource');              my $title = $curRes->title;
         } else {              $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,$format,$currdirpath,$title,$testbank);
             $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit');          } elsif ($format eq 'xml') {
               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-) {      } elsif ($symb =~ m-uploaded/$cdom/$cnum-) {
         $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');          $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
Line 773  sub process_content { Line 844  sub process_content {
 }  }
   
 sub replicate_content {  sub replicate_content {
     my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_;      my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller,$currdirpath,
           $title,$testbank) = @_;
     my ($map,$ind,$url);      my ($map,$ind,$url);
     if ($caller eq 'templateupload') {      if ($caller eq 'templateupload') {
         $url = $symb;          $url = $symb;
Line 817  sub replicate_content { Line 889  sub replicate_content {
                 } else {                  } else {
                     $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n";                      $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n";
                 }                  }
             } elsif ($caller eq 'noedit') {              } elsif (($caller eq 'noedit') || ($caller eq 'html') || 
                        ($caller eq 'plaintext')) {
 # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this.  # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this.
                   my %form = (
                                grade_symb     => $symb,
                                grade_courseid => $cdom.'_'.$cnum,
                                grade_domain   => $env{'user.domain'},
                                grade_username => $env{'user.name'},
                                grade_imsexport => 1,
                                instructor_comments => 'hide',
                              );
                   my $feedurl=&Apache::lonnet::clutter($url);
                   my ($userview,$response)=&Apache::lonnet::ssi_body($feedurl,%form);
                   if (ref($response)) {
                       if ($response->is_success) {
                           $content = $userview;
                           $content =~ s/\Qonchange="javascript:setSubmittedPart('\E[^\']+\Q');"\E//g;
                           $content =~ s/^\s*[\n\r]+$//;
                           if ($caller eq 'plaintext') {
                               my @lines = split(/[\n\r]+/,$content);
                               my @tosave;
                               my $foilcounter = 0;
                               my @alphabet = ('a'..'z');
                               my $mc_answer;
                               foreach my $line (@lines) {
                                   next if ($line =~ /^\s*$/);
                                   if ($line =~ m{(|\Q<\label>\E)\Q<br />Incorrect:<label>\E}) {
                                       $foilcounter ++;
                                   } elsif ($line =~ m{(|\Q</label>\E)\Q<br />Correct:<b><label>\E}) {
                                       $foilcounter ++;
                                       $mc_answer = $alphabet[$foilcounter-1];
                                   } elsif ($line !~ m{\Q</label>\E(|\Q</b>\E)\Q<br />\E}) {
                                       $line =~ s/^(\s+|\s+)$//g;
                                       $line =~ s{^\Q<b>\E([^<]+)\Q</b>\E$}{1};
                                       $tosave[$foilcounter] .= $line.' ';
                                   }
                                   $content = join("\t",@tosave);
                                   if ($mc_answer) {
                                       $content .= "\t".$mc_answer."\n";
                                   }
                               }
                               if (@tosave) {
                                   my $qtype;
                                   if ($mc_answer) {
                                       $qtype = 'MC';
                                   }
                                   $content = $currdirpath."\t".$title."\t$qtype\t".join("\t",@tosave);
                                   if ($mc_answer) {
                                       $content .= "\t".$mc_answer;
                                   } 
                                   $content .= "\n";
                               }
                           } else {
                               $content = '<html><body>'.$content.'</body></html>';
                           }
                           if (($caller eq 'plaintext') && ($testbank)) {
                               print $testbank $content;
                           }
                       } else {
                           $content = 'Not the owner of this resource';
                       }
                   } else {
                       $content = 'Not the owner of this resource';
                   }
                 $repstatus = 'ok';                  $repstatus = 'ok';
                 $content = 'Not the owner of this resource';  
             }              }
             if ($repstatus eq 'ok') {              if ($repstatus eq 'ok') {
                 print $copiedfile $content;                  print $copiedfile $content;
Line 878  sub extract_media { Line 1011  sub extract_media {
                 $repstatus = 'ok';                  $repstatus = 'ok';
             }              }
         } elsif ($caller eq 'uploaded') {          } elsif ($caller eq 'uploaded') {
   
             $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode);              $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode);
         }          }
         if ($repstatus eq 'ok') {          if ($repstatus eq 'ok') {
Line 980  sub group_import { Line 1112  sub group_import {
 }  }
   
 sub breadcrumbs {  sub breadcrumbs {
     my ($where,$allowed,$type)=@_;      my ($allowed,$crstype)=@_;
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     my (@folders);      my (@folders);
     if ($env{'form.pagepath'}) {      if ($env{'form.pagepath'}) {
Line 995  sub breadcrumbs { Line 1127  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);
Line 1014  sub breadcrumbs { Line 1155  sub breadcrumbs {
             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') {
                 if ($allowed) {                  $name = &mt('Supplemental '.$crstype.' Documents');
                     $name = &mt('Supplemental '.$type.' Documents');  
                 } else {  
                     $name = &mt($type.' Documents');  
                 }  
             }              }
     &Apache::lonhtmlcommon::add_breadcrumb(      &Apache::lonhtmlcommon::add_breadcrumb(
       {'href'=>$url.$cpinfo,        {'href'=>$url.$cpinfo,
Line 1030  sub breadcrumbs { Line 1167  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',
        'LC_docs_path', 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 1118  sub docs_change_log { Line 1255  sub docs_change_log {
     &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',
Line 1206  sub docs_change_log { Line 1344  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 1254  sub print_paste_buffer { Line 1393  sub print_paste_buffer {
     my ($r,$container) = @_;      my ($r,$container) = @_;
     return if (!defined($env{'docs.markedcopy_url'}));      return if (!defined($env{'docs.markedcopy_url'}));
   
     $r->print(<<ENDPASTE);      $r->print('<fieldset>'
 <form name="pasteform" action="/adm/coursedocs" method="post"><p>               .'<legend>'.&mt('Clipboard').'</legend>'
 ENDPASTE               .'<form name="pasteform" action="/adm/coursedocs" method="post">'
     $r->print('<input type="submit" name="pastemarked" value="'.&mt('Paste').'" /> ');               .'<input type="submit" name="pastemarked" value="'.&mt('Paste').'" /> '
       );
   
     my $type;      my $type;
     if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {      if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {
Line 1271  ENDPASTE Line 1411  ENDPASTE
  if ($extension eq 'sequence' &&   if ($extension eq 'sequence' &&
     $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {      $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {
     $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));      $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
     $icon .= '/folder_closed.gif';      $icon .= '/navmap.folder.closed.gif';
  }   }
  $icon = '<img src="'.$icon.'" alt="" class="LC_icon" />';   $icon = '<img src="'.$icon.'" alt="" class="LC_icon" />';
  $r->print($icon.$type.': '.  &parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'})));   $r->print($icon.$type.': '.  &parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'})));
Line 1286  ENDPASTE Line 1426  ENDPASTE
         <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />          <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />
 ');  ');
     }      }
     $r->print('</p></form>');      $r->print('</form></fieldset>');
 }  }
   
 sub do_paste_from_buffer {  sub do_paste_from_buffer {
Line 1437  sub handle_edit_cmd { Line 1577  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 1473  sub handle_edit_cmd { Line 1613  sub handle_edit_cmd {
 }  }
   
 sub editor {  sub editor {
     my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$type)=@_;      my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype,
           $supplementalflag,$orderhash)=@_;
     my $container= ($env{'form.pagepath'}) ? 'page'      my $container= ($env{'form.pagepath'}) ? 'page'
                            : 'sequence';                             : 'sequence';
   
Line 1489  sub editor { Line 1629  sub editor {
         $LONCAPA::map::resources[$idx]='';          $LONCAPA::map::resources[$idx]='';
     }      }
   
     my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order)=      my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) =
  &breadcrumbs($folder,$allowed,$type);      &breadcrumbs($allowed,$crstype);
     $r->print($breadcrumbtrail);          $r->print($breadcrumbtrail);
   
       unless ($allowed) {
           $randompick = -1;
       }
   
 # ------------------------------------------------------------ Process commands  # ------------------------------------------------------------ Process commands
   
Line 1569  sub editor { Line 1713  sub editor {
     my $idx=0;      my $idx=0;
     my $shown=0;      my $shown=0;
     if (($ishidden) || ($isencrypted) || ($randompick>=0) || ($is_random_order)) {      if (($ishidden) || ($isencrypted) || ($randompick>=0) || ($is_random_order)) {
  $r->print('<p>'.&mt('Parameters').':<ul>'.   $r->print('<div class="LC_Box">'.
   ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').            '<ol class="LC_docs_parameters"><li class="LC_docs_parameters_title">'.&mt('Parameters:').'</li>'.
     ($randompick>=0?'<li>'.&mt('randomly pick [quant,_1,resource]',$randompick).'</li>':'').
   ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').    ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
   ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').    ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
   '</ul></p>');    ($is_random_order?'<li>'.&mt('random order').'</li>':'').
     }    '</ol>');
     if ($randompick>=0) {          if ($randompick>=0) {
  $r->print('<p>'.&mt('Caution: this folder is set to randomly pick a subset of resources. Adding or removing resources from this folder will change the set of resources that the students see, resulting in spurious or missing credit for completed problems, not limited to ones you modify. Do not modify the contents of this folder if it is in active student use.').'</p>');              $r->print('<p class="LC_warning">'
     }                   .&mt('Caution: this folder is set to randomly pick a subset'
     if ($is_random_order) {                       .' of resources. Adding or removing resources from this'
  $r->print('<p>'.&mt('Caution: this folder is set to randomly order its contents. Adding or removing resources from this folder will change the order of resources shown.').'</p>');                       .' folder will change the set of resources that the'
                        .' students see, resulting in spurious or missing credit'
                        .' for completed problems, not limited to ones you'
                        .' modify. Do not modify the contents of this folder if'
                        .' it is in active student use.')
                    .'</p>'
               );
           }
           if ($is_random_order) {
               $r->print('<p class="LC_warning">'
                    .&mt('Caution: this folder is set to randomly order its'
                        .' contents. Adding or removing resources from this folder'
                        .' will change the order of resources shown.')
                    .'</p>'
               );
           }
           $r->print('</div>');
     }      }
     $r->print('<table class="LC_docs_editor">');  
       my ($to_show,$output);
   
       &Apache::loncommon::start_data_table_count(); #setup a row counter 
     foreach my $res (@LONCAPA::map::order) {      foreach my $res (@LONCAPA::map::order) {
  my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);          my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
  $name=&LONCAPA::map::qtescape($name);          $name=&LONCAPA::map::qtescape($name);
  $url=&LONCAPA::map::qtescape($url);          $url=&LONCAPA::map::qtescape($url);
  unless ($name) {  $name=(split(/\//,$url))[-1]; }          unless ($name) {  $name=(split(/\//,$url))[-1]; }
  unless ($name) { $idx++; next; }          unless ($name) { $idx++; next; }
  $r->print(&entryline($idx,$name,$url,$folder,$allowed,$res,          $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,
      $coursenum));                                $coursenum,$crstype);
  $idx++;          $idx++;
  $shown++;          $shown++;
     }      }
     unless ($shown) {      &Apache::loncommon::end_data_table_count();
  $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');      
       if ($shown) {
           $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')
                     .&Apache::loncommon::start_data_table(undef,'contentlist');
           if ($allowed) {
               $to_show .= &Apache::loncommon::start_data_table_header_row()
                        .'<th colspan="2">'.&mt('Move').'</th>'
                        .'<th>'.&mt('Actions').'</th>'
                        .'<th colspan="2">'.&mt('Document').'</th>';
               if ($folder !~ /^supplemental/) {
                   $to_show .= '<th colspan="4">'.&mt('Settings').'</th>';
               }
               $to_show .= &Apache::loncommon::end_data_table_header_row();
           }
           $to_show .= $output.' '
                    .&Apache::loncommon::end_data_table()
                    .'<br style="line-height:2px;" />'
                    .&Apache::loncommon::end_scrollbox();
       } else {
           $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')
                    .'<div class="LC_info" id="contentlist">'
                    .&mt('Currently no documents.')
                    .'</div>'
                    .&Apache::loncommon::end_scrollbox();
       }
       my $tid = 1;
       if ($supplementalflag) {
           $tid = 2;
     }      }
     $r->print("\n</table>\n");  
     if ($allowed) {      if ($allowed) {
           $r->print(&generate_edit_table($tid,$orderhash,$to_show));
         &print_paste_buffer($r,$container);          &print_paste_buffer($r,$container);
       } else {
           $r->print($to_show);
     }      }
     return;      return;
 }  }
Line 1606  sub editor { Line 1799  sub editor {
 sub process_file_upload {  sub process_file_upload {
     my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;      my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
 # upload a file, if present  # upload a file, if present
     my $parseaction;      my ($parseaction,$showupload,$nextphase,$mimetype);
    if ($env{'form.parserflag'}) {      if ($env{'form.parserflag'}) {
         $parseaction = 'parse';          $parseaction = 'parse';
     }      }
     my $phase_status;  
     my $folder=$env{'form.folder'};      my $folder=$env{'form.folder'};
     if ($folder eq '') {      if ($folder eq '') {
         $folder='default';          $folder='default';
Line 1629  sub process_file_upload { Line 1821  sub process_file_upload {
             $LONCAPA::map::resources[1]='';              $LONCAPA::map::resources[1]='';
         }          }
         if ($fatal) {          if ($fatal) {
             return 'failed';              $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</div>';
               return;
         }          }
         my $destination = 'docs/';          my $destination = 'docs/';
         if ($folder =~ /^supplemental/) {          if ($folder =~ /^supplemental/) {
Line 1640  sub process_file_upload { Line 1833  sub process_file_upload {
         } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {          } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
             $destination .=  $2.'/';              $destination .=  $2.'/';
         }          }
 # this is for a course, not a user, so set coursedoc flag  # this is for a course, not a user, so set context to coursedoc.
 # probably the only place in the system where this should be "1"  
         my $newidx=&LONCAPA::map::getresidx();          my $newidx=&LONCAPA::map::getresidx();
         $destination .= $newidx;          $destination .= $newidx;
         my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,          my $url=&Apache::lonnet::userfileupload('uploaddoc','coursedoc',$destination,
  $parseaction,$allfiles,   $parseaction,$allfiles,
  $codebase);   $codebase,undef,undef,undef,undef,
                                                   undef,undef,\$mimetype);
           if ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E.*/([^/]+)$}) {
               my $stored = $1;
               $showupload = '<p>'.&mt('Uploaded [_1]','<span class="LC_filename">'.
                             $stored.'</span>').'</p>';
           } else {
               my ($filename) = ($env{'form.uploaddoc.filename'} =~ m{([^/]+)$});
               
               $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('Unable to save file [_1].','<span class="LC_filename">'.$filename.'</span>').'</div>';
               return;
           }
         my $ext='false';          my $ext='false';
         if ($url=~m{^http://}) { $ext='true'; }          if ($url=~m{^http://}) { $ext='true'; }
  $url     = &LONCAPA::map::qtunescape($url);   $url     = &LONCAPA::map::qtunescape($url);
Line 1663  sub process_file_upload { Line 1866  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 'failed';              return;
         } else {          } else {
             if ($parseaction eq 'parse') {              if ($parseaction eq 'parse' && $mimetype eq 'text/html') {
                 my $total_embedded = keys(%{$allfiles});                  $$upload_output = $showupload;
                   my $total_embedded = scalar(keys(%{$allfiles}));
                 if ($total_embedded > 0) {                  if ($total_embedded > 0) {
                     my $num = 0;                      my $uploadphase = 'upload_embedded';
     my $state = '                      my $primaryurl = &HTML::Entities::encode($url,'<>&"');
    <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />      my $state = &embedded_form_elems($uploadphase,$primaryurl,$newidx); 
    <input type="hidden" name="cmd" value="upload_embedded" />                      my ($embedded,$num) = 
    <input type="hidden" name="newidx" value="'.$newidx.'" />                          &Apache::loncommon::ask_for_embedded_content(
    <input type="hidden" name="primaryurl" value="'.&escape($url).'" />                              '/adm/coursedocs',$state,$allfiles,$codebase,{'docs_url' => $url});
    <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';                      if ($embedded) {
     $phase_status = 'phasetwo';                          if ($num) {
                               $$upload_output .=
                     $$upload_output .=           '<p>'.&mt('This file contains embedded multimedia objects, which need to be uploaded.').'</p>'.$embedded;
  'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />'.                              $nextphase = $uploadphase;
  &Apache::loncommon::ask_for_embedded_content(                          } else {
                             '/adm/coursedocs',$state,$allfiles,$codebase);                              $$upload_output .= $embedded;
                           }
                       } else {
                           $$upload_output .= &mt('Embedded item(s) already present, so no additional upload(s) required').'<br />';
                       }
                 } else {                  } else {
                     $$upload_output .= 'No embedded items identified<br />';                      $$upload_output .= &mt('No embedded items identified').'<br />';
                 }                  }
                   $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>';
             }              }
         }          }
     }      }
     return $phase_status;      return $nextphase;
 }  
   
 sub process_secondary_uploads {  
     my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;  
     my $folder=$env{'form.folder'};  
     my $destination = 'docs/';  
     if ($folder =~ /^supplemental/) {  
         $destination = 'supplemental/';  
     }  
     if (($folder eq 'default') || ($folder eq 'supplemental')) {  
         $destination .= 'default/';  
     } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {  
         $destination .=  $2.'/';  
     }  
     $destination .= $newidx;  
     my ($url,$filename);  
     $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);  
     ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$});  
     return $filename;  
 }  }
   
 sub is_supplemental_title {  sub is_supplemental_title {
Line 1728  sub parse_supplemental_title { Line 1918  sub parse_supplemental_title {
  $foldertitle=&Apache::lontexconvert::msgtexconverted($4);   $foldertitle=&Apache::lontexconvert::msgtexconverted($4);
  my $name =  &Apache::loncommon::plainname($uname,$udom);   my $name =  &Apache::loncommon::plainname($uname,$udom);
  $name = &HTML::Entities::encode($name,'"<>&\'');   $name = &HTML::Entities::encode($name,'"<>&\'');
           $renametitle = &HTML::Entities::encode($renametitle,'"<>&\'');
  $title='<i>'.&Apache::lonlocal::locallocaltime($time).'</i> '.   $title='<i>'.&Apache::lonlocal::locallocaltime($time).'</i> '.
     $name.': <br />'.$foldertitle;      $name.': <br />'.$foldertitle;
     }      }
Line 1740  sub parse_supplemental_title { Line 1931  sub parse_supplemental_title {
 # --------------------------------------------------------------- An entry line  # --------------------------------------------------------------- An entry line
   
 sub entryline {  sub entryline {
     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;      my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$crstype)=@_;
   
     my ($foldertitle,$pagetitle,$renametitle);      my ($foldertitle,$pagetitle,$renametitle);
     if (&is_supplemental_title($title)) {      if (&is_supplemental_title($title)) {
  ($title,$foldertitle,$renametitle) = &parse_supplemental_title($title);   ($title,$foldertitle,$renametitle) = &parse_supplemental_title($title);
Line 1759  sub entryline { Line 1949  sub entryline {
     $renametitle=~s/\\/\\\\/g;      $renametitle=~s/\\/\\\\/g;
     $renametitle=~s/\&quot\;/\\\"/g;      $renametitle=~s/\&quot\;/\\\"/g;
     $renametitle=~s/ /%20/g;      $renametitle=~s/ /%20/g;
     my $line='<tr>';      my $line=&Apache::loncommon::start_data_table_row();
     my ($form_start,$form_end);      my ($form_start,$form_end);
 # Edit commands  # Edit commands
     my ($container, $type, $esc_path, $path, $symb);      my ($container, $type, $esc_path, $path, $symb);
Line 1772  sub entryline { Line 1962  sub entryline {
     }      }
     if ($env{'form.pagepath'}) {      if ($env{'form.pagepath'}) {
         $type = $container = 'page';          $type = $container = 'page';
         $esc_path=&escape($path = $env{'form.pagepath'});          $esc_path=&escape($env{'form.pagepath'});
  $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"');   $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"');
         $symb=&escape($env{'form.pagesymb'});          $symb=&escape($env{'form.pagesymb'});
     }      }
Line 1862  END Line 2052  END
         $form_end = '</form>';          $form_end = '</form>';
  $line.=(<<END);   $line.=(<<END);
 <td>  <td>
    <table class="LC_docs_entry_move">  <div class="LC_docs_entry_move">
       <tr>    <a href='/adm/coursedocs?cmd=up_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb$cpinfo'>
          <td>      <img src="${iconpath}move_up.gif" alt='$lt{'up'}' class="LC_icon" />
             <a href='/adm/coursedocs?cmd=up_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb$cpinfo'><img src="${iconpath}move_up.gif" alt='$lt{'up'}' class="LC_icon" /></a>    </a>
          </td>  </div>
       </tr>  <div class="LC_docs_entry_move">
       <tr>    <a href='/adm/coursedocs?cmd=down_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb$cpinfo'>
         <td>      <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' class="LC_icon" />
            <a href='/adm/coursedocs?cmd=down_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb$cpinfo'><img src="${iconpath}move_down.gif" alt='$lt{'dw'}' class="LC_icon" /></a>    </a>
         </td>  </div>
       </tr>  
     </table>  
 </td>  </td>
 <td>  <td>
    $form_start     $form_start
Line 1900  END Line 2088  END
     my $pagefile;      my $pagefile;
     if ($uploaded) {      if ($uploaded) {
  if ($extension eq 'sequence') {   if ($extension eq 'sequence') {
     $icon=$iconpath.'/folder_closed.gif';      $icon=$iconpath.'/navmap.folder.closed.gif';
     $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/;      $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/;
     $url='/adm/coursedocs?';      $url='/adm/coursedocs?';
     $folderarg=$1;      $folderarg=$1;
Line 2000  END Line 2188  END
  $url.='pagepath='.&escape($pagepath).   $url.='pagepath='.&escape($pagepath).
     '&amp;pagesymb='.&escape($symb).$cpinfo;      '&amp;pagesymb='.&escape($symb).$cpinfo;
     }      }
     if ($external) {      if (($external) && ($allowed)) {
  my $form = ($folder =~ /^default/)? 'newext' : 'supnewext';   my $form = ($folder =~ /^default/)? 'newext' : 'supnewext';
  $external = '&nbsp;<a class="LC_docs_ext_edit" href="javascript:edittext(\''.$form.'\',\''.$residx.'\',\''.&escape($title).'\',\''.&escape($orig_url).'\');" >'.&mt('Edit').'</a>';   $external = '&nbsp;<a class="LC_docs_ext_edit" href="javascript:edittext(\''.$form.'\',\''.$residx.'\',\''.&escape($title).'\',\''.&escape($orig_url).'\');" >'.&mt('Edit').'</a>';
     } else {      } else {
  undef($external);   undef($external);
     }      }
     $line.='      my $reinit;
   <td class="LC_docs_entry_icon">      if ($crstype eq 'Community') {
     '.($url?'<a href="'.$url.'">':'').'<img src="'.$icon.'" alt="" class="LC_icon" />'.($url?'</a>':'').'          $reinit = &mt('(re-initialize community to access)');
   </td>      } else {
   <td class="LC_docs_entry_title">          $reinit = &mt('(re-initialize course to access)');
     '.($url?"<a href=\"$url\">":'').$title.($url?'</a>':' <span class="LC_docs_reinit_warn">'.&mt('(re-initialize course to access)').'</span>').$external."      }  
   </td>";      $line.='<td>';
       if ($url=~m{/adm/coursedocs}) {
          $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>';
       } elsif ($url) {
          $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes',
                                                '<img src="'.$icon.'" alt="" class="LC_icon" />',600,500);
       } else {
          $line.='<img src="'.$icon.'" alt="" class="LC_icon" />';
       }
       $line.='</td><td>';
       if ($url=~m{/adm/coursedocs}) {
          $line.='<a href="'.$url.'">'.$title.'</a>';
       } elsif ($url) {
          $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes',
                                                $title,600,500);
       } else {
          $line.=$title.' <span class="LC_docs_reinit_warn">'.$reinit.'</span>';
       }
       $line.=$external."</td>";
     if (($allowed) && ($folder!~/^supplemental/)) {      if (($allowed) && ($folder!~/^supplemental/)) {
   my %lt=&Apache::lonlocal::texthash(    my %lt=&Apache::lonlocal::texthash(
        'hd' => 'Hidden',         'hd' => 'Hidden',
Line 2026  END Line 2232  END
     $form_start      $form_start
     <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
     <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">$form_start $parameterset $form_end<br />
   <td class="LC_docs_entry_parameter">$form_start $parameterset $form_end</td>                                        $form_start $rand_order_text $form_end</td>
 ENDPARMS  ENDPARMS
     }      }
     $line.="</tr>";      $line.=&Apache::loncommon::end_data_table_row();
     return $line;      return $line;
 }  }
   
Line 2159  List Symbs Line 2364  List Symbs
 sub list_symbs {  sub list_symbs {
     my ($r) = @_;      my ($r) = @_;
   
     my $type = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Symb List'));      $r->print(&Apache::loncommon::start_page('Symb List'));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List'));
       &startContentScreen($r,'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>'.
                   '<div class="LC_error">'.                    '<div class="LC_error">'.
                   &mt('Unable to retrieve information about course contents').                    &mt('Unable to retrieve information about course contents').
                   '</div>');                    '</div>');
         &Apache::lonnet::logthis('Symb list failed - could not create navmap object in '.lc($type).':'.$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("<pre>\n");
         foreach my $res ($navmap->retrieveResources()) {          foreach my $res ($navmap->retrieveResources()) {
     $r->print($res->compTitle()."\t".$res->symb()."\n");              $r->print($res->compTitle()."\t".$res->symb()."\n");
         }          }
         $r->print("\n</pre>\n");          $r->print("\n</pre>\n");
     }      }
     $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>');  
 }  }
   
   
 sub verifycontent {  sub verifycontent {
     my ($r) = @_;      my ($r) = @_;
     my $type = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
    my $loaderror=&Apache::lonnet::overloaderror($r);     $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents'));
    if ($loaderror) { return $loaderror; }     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents'));
    $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));     &startContentScreen($r,'tools');
    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$type.' Documents'));  
    $hashtied=0;     $hashtied=0;
    undef %alreadyseen;     undef %alreadyseen;
    %alreadyseen=();     %alreadyseen=();
Line 2195  sub verifycontent { Line 2399  sub verifycontent {
        if ($hash{$key}=~/\.(page|sequence)$/) {         if ($hash{$key}=~/\.(page|sequence)$/) {
    if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) {     if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) {
        $r->print('<hr /><span class="LC_error">'.         $r->print('<hr /><span class="LC_error">'.
  &mt('The following sequence or page is included more than once in your '.$type.': ').   &mt('The following sequence or page is included more than once in your '.$crstype.':').' '.
  &unescape($hash{$key}).'</span><br />'.   &unescape($hash{$key}).'</span><br />'.
  &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));   &mt('Note that grading records for problems included in this sequence or folder will overlap.').'<hr />');
    }     }
        }         }
        if (($key=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$key})})) {         if (($key=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$key})})) {
Line 2205  sub verifycontent { Line 2409  sub verifycontent {
        }         }
    }     }
    &untiehash();     &untiehash();
    $r->print('<h1>'.&mt('Done').'.</h1>'.'<a href="/adm/coursedocs">'.     $r->print('<p class="LC_success">'.&mt('Done').'</p>');
      &mt('Return to DOCS').'</a>');  
 }  }
   
   
Line 2218  sub devalidateversioncache { Line 2421  sub devalidateversioncache {
   
 sub checkversions {  sub checkversions {
     my ($r) = @_;      my ($r) = @_;
     my $type = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));      $r->print(&Apache::loncommon::start_page("Check $crstype Document Versions"));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $type Document Versions"));      $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Document Versions"));
       &startContentScreen($r,'tools');
   
     my $header='';      my $header='';
     my $startsel='';      my $startsel='';
     my $monthsel='';      my $monthsel='';
Line 2281  sub checkversions { Line 2486  sub checkversions {
     &changewarning($r,'');      &changewarning($r,'');
     if ($env{'form.timerange'} eq 'all') {      if ($env{'form.timerange'} eq 'all') {
 # show all documents  # show all documents
  $header=&mt('All Documents in '.$type);   $header=&mt('All Documents in '.$crstype);
  $allsel=1;   $allsel=1;
  foreach my $key (keys(%hash)) {   foreach my $key (keys(%hash)) {
     if ($key=~/^ids\_(\/res\/.+)$/) {      if ($key=~/^ids\_(\/res\/.+)$/) {
Line 2326  sub checkversions { Line 2531  sub checkversions {
   $env{'course.'.$env{'request.course.id'}.'.domain'},    $env{'course.'.$env{'request.course.id'}.'.domain'},
   $env{'course.'.$env{'request.course.id'}.'.num'});    $env{'course.'.$env{'request.course.id'}.'.num'});
     my %lt=&Apache::lonlocal::texthash      my %lt=&Apache::lonlocal::texthash
       ('st' => 'Version changes since start of '.$type,        ('st' => 'Version changes since start of '.$crstype,
        'lm' => 'Version changes since last Month',         'lm' => 'Version changes since last Month',
        'lw' => 'Version changes since last Week',         'lw' => 'Version changes since last Week',
        'sy' => 'Version changes since Yesterday',         'sy' => 'Version changes since Yesterday',
Line 2335  sub checkversions { Line 2540  sub checkversions {
        'fi' => 'File',         'fi' => 'File',
        'md' => 'Modification Date',         'md' => 'Modification Date',
                'mr' => 'Most recently published Version',                 'mr' => 'Most recently published Version',
        've' => 'Version used in '.$type,         've' => 'Version used in '.$crstype,
                'vu' => 'Set Version to be used in '.$type,                 'vu' => 'Set Version to be used in '.$crstype,
 'sv' => 'Set Versions to be used in '.$type.' 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');
Line 2384  ENDHEADERS Line 2589  ENDHEADERS
                       '<td title="'.$lt{'mr'}.'"><span class="LC_nobreak">Most Recent: '.                        '<td title="'.$lt{'mr'}.'"><span class="LC_nobreak">Most Recent: '.
                       '<font size="+1">'.$currentversion.'</font>'.                        '<font size="+1">'.$currentversion.'</font>'.
                       '</span></td>'.                        '</span></td>'.
                       '<td title="'.$lt{'ve'}.'"><span class="LC_nobreak">In '.$type.': '.                        '<td title="'.$lt{'ve'}.'"><span class="LC_nobreak">In '.$crstype.': '.
                       '<font size="+1">');                        '<font size="+1">');
 # Used in course  # Used in course
     my $usedversion=$hash{'version_'.$linkurl};      my $usedversion=$hash{'version_'.$linkurl};
Line 2398  ENDHEADERS Line 2603  ENDHEADERS
 # Set version  # Set version
     $r->print(&Apache::loncommon::select_form($setversions{$linkurl},      $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
       'set_version_'.$linkurl,        'set_version_'.$linkurl,
       ('select_form_order' =>        {'select_form_order' =>
        ['',1..$currentversion,'mostrecent'],         ['',1..$currentversion,'mostrecent'],
        '' => '',         '' => '',
        'mostrecent' => 'most recent',         'mostrecent' => &mt('most recent'),
        map {$_,$_} (1..$currentversion))));         map {$_,$_} (1..$currentversion)}));
     $r->print('</span></td></tr><tr><td></td>');      $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++) {
Line 2438  ENDHEADERS Line 2643  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) {
Line 2456  ENDHEADERS Line 2661  ENDHEADERS
  }   }
     }      }
     $r->print('</table></form>');      $r->print('</table></form>');
     $r->print('<h1>'.&mt('Done').'.</h1>');      $r->print('<p class="LC_success">'.&mt('Done').'</p>');
   
     &untiehash();      &untiehash();
 }  }
Line 2521  sub init_breadcrumbs { Line 2726  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",
     text=>"Edit ".&Apache::loncommon::course_type(),      text=>&Apache::loncommon::course_type().' Editor',
     faq=>273,      faq=>273,
     bug=>'Instructor Interface',      bug=>'Instructor Interface',
                                             help => 'Docs_Adding_Course_Doc'});                                              help => 'Docs_Adding_Course_Doc'});
Line 2531  sub init_breadcrumbs { Line 2736  sub init_breadcrumbs {
     bug=>'Instructor Interface'});      bug=>'Instructor Interface'});
 }  }
   
   # subroutine to list form elements
   sub create_list_elements {
      my @formarr = @_;
      my $list = '';
      for my $button (@formarr){
           for my $picture(keys %$button) {
               $list .= &Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text'});
           }
      }
      return $list;
   }
   
   # subroutine to create ul from list elements
   sub create_form_ul {
      my $list = shift;
      my $ul = &Apache::lonhtmlcommon::htmltag('ul',$list, {class => 'LC_ListStyleNormal'});
      return $ul;
   }
   
   #
   # Start tabs
   #
   
   sub startContentScreen {
       my ($r,$mode)=@_;
       $r->print('<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>');
   
       my $active = '';
   # does this user have privileges to modify docs?
       my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
   
       my $onclick;
       my $href;
   
       if ($allowed) {
           $r->print('<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>');
       }
       $r->print('<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>');
       $r->print('<li'.(($mode eq 'courseindex')?' class="active"':'').'><a href="/adm/indexcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Index').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>');
       $r->print('<li '.(($mode eq 'supdocs')?' class="active"':'').
              '><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Documents').'</b></a></li>');
       $r->print('</ul>');
       $r->print('<div class="LC_DocsBox" style="clear:both;margin:0;" id="contenteditor">'
                .'<div id="maincoursedoc" style="margin:0 0;padding:0 0">');
       $r->print('<div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">');
   }
   
   #
   # End tabs
   #
   
   sub endContentScreen {
      my ($r)=@_;
      $r->print('</div></div></div>');
   }
   
   sub supplemental_base {
       return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Documents'));
   }
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
     my $type = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
   
   
   #
 # --------------------------------------------- Initialize help topics for this  # --------------------------------------------- Initialize help topics for this
     foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',      foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',
                'Adding_External_Resource','Navigate_Content',                 'Adding_External_Resource','Navigate_Content',
Line 2580  sub handler { Line 2844  sub handler {
       &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().' DOCS to Construction Space');        &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Documents to Construction Space');
       &dumpcourse($r);        &dumpcourse($r);
   } elsif ($allowed && $env{'form.exportcourse'}) {    } elsif ($allowed && $env{'form.exportcourse'}) {
       &init_breadcrumbs('exportcourse','Export '.&Apache::loncommon::course_type().' to IMS');        &init_breadcrumbs('exportcourse','IMS Export');
       &exportcourse($r);        &exportcourse($r);
   } else {    } else {
 # is this a standard course?  #
   # Done catching special calls
   # The whole rest is for course and supplemental documents
   # Get the parameters that may be needed
   #
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                               ['folderpath','pagepath',
                                                'pagesymb','forcesupplement','forcestandard',
                                                'symb','command']);
   
   # standard=1: this is a "new-style" course with an uploaded map as top level
   # standard=2: this is a "old-style" course, and there is nothing we can do
   
     my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);      my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
     my $forcestandard = 0;  
     my $forcesupplement;  # Decide whether this should display supplemental or main content
   # supplementalflag=1: show supplemental documents
   # supplementalflag=0: show standard documents
   
   
       my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);
       if (($env{'form.folderpath'}=~/^default/) || $env{'form.folderpath'} eq "" || ($env{'form.pagepath'})) {
          $supplementalflag=0;
       }
       if ($env{'form.forcesupplement'}) { $supplementalflag=1; }
       if ($env{'form.forcestandard'})   { $supplementalflag=0; }
       unless ($allowed) { $supplementalflag=1; }
       unless ($standard) { $supplementalflag=1; }
   
     my $script='';      my $script='';
     my $showdoc=0;      my $showdoc=0;
       my $addentries = {};
     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'} eq '') {
              $mapurl = $env{'course.'.$env{'request.course.id'}.'.url'};
          } else {
              ($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'}='';
          }
      }
   
   # Where do we store these for when we come back?
       my $stored_folderpath='docs_folderpath';
       if ($supplementalflag) {
          $stored_folderpath='docs_sup_folderpath';
       }
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},  
     ['folderpath','pagepath',  
      'pagesymb']);  
 # No folderpath, no pagepath, see if we have something stored  # No folderpath, no pagepath, see if we have something stored
     if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) {      if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) {
         &Apache::loncommon::restore_course_settings('docs_folderpath',          &Apache::loncommon::restore_course_settings($stored_folderpath,
                                               {'folderpath' => 'scalar'});                                                {'folderpath' => 'scalar'});
     }      }
     if (!$env{'form.folderpath'}) {     
         &Apache::loncommon::restore_course_settings('docs_folderpath',  # If we are not allowed to make changes, all we can see are supplemental docs
                                               {'pagepath' => 'scalar'});      if (!$allowed) {
           $env{'form.pagepath'}='';
           unless ($env{'form.folderpath'} =~ /^supplemental/) {
               $env{'form.folderpath'} = &supplemental_base();
           }
     }      }
     if ($env{'form.pagepath'}) {  # If we still not have a folderpath, see if we can resurrect at pagepath
        $env{'form.folderpath'}='';      if (!$env{'form.folderpath'} && $allowed) {
           &Apache::loncommon::restore_course_settings($stored_folderpath,
                                                 {'pagepath' => 'scalar'});
     }      }
   # Make the zeroth entry in supplemental docs page paths, so we can get to top level
     if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {      if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {
         $env{'form.folderpath'} = 'supplemental&'.          $env{'form.folderpath'} = &supplemental_base()
                                   &escape(&mt('Supplemental '.$type.' Documents')).'&'.                                    .'&'.
                                   $env{'form.folderpath'};                                    $env{'form.folderpath'};
     }      }
     &Apache::loncommon::store_course_settings('docs_folderpath',  # If after all of this, we still don't have any paths, make them
       unless (($env{'form.pagepath'}) || ($env{'form.folderpath'})) {
          if ($supplementalflag) {
             $env{'form.folderpath'}=&supplemental_base();
          } else {
             $env{'form.folderpath'}='default';
          }
       } 
   
   # Store this
       &Apache::loncommon::store_course_settings($stored_folderpath,
                                                 {'pagepath' => 'scalar',                                                  {'pagepath' => 'scalar',
                                                  'folderpath' => '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));
Line 2630  sub handler { Line 3005  sub handler {
         $env{'form.pagename'}=&unescape(pop(@pagepath));          $env{'form.pagename'}=&unescape(pop(@pagepath));
         $env{'form.folder'}=pop(@pagepath);          $env{'form.folder'}=pop(@pagepath);
         $containertag = '<input type="hidden" name="pagepath" value="" />'.          $containertag = '<input type="hidden" name="pagepath" value="" />'.
     '<input type="hidden" name="pagesymb" value="" />';                  '<input type="hidden" name="pagesymb" value="" />';
         $uploadtag = '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'.          $uploadtag = 
     '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />';              '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'.
       '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />'.
               '<input type="hidden" name="folderpath" value="" />';
       } else {
           my $folderpath=$env{'form.folderpath'};
           if (!$folderpath) {
               if ($env{'form.folder'} eq '' ||
                   $env{'form.folder'} eq 'supplemental') {
                   $folderpath='default&'.
                       &escape(&mt('Main '.$crstype.' Documents'));
               }
           }
           $containertag = '<input type="hidden" name="folderpath" value="" />';
           $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';
     }      }
     if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {      if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
        $showdoc='/'.$1;         $showdoc='/'.$1;
     }      }
     unless ($showdoc) { # got called from remote      if ($showdoc) { # got called in sequence from course
        if (($env{'form.folder'}=~/^(?:group|default)_/) ||   $allowed=0; 
           ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {      } else {
            $forcestandard = 1;  
        }  
        $forcesupplement=($env{'form.folder'}=~/^supplemental_/);  
   
        if ($allowed) {         if ($allowed) {
          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);           &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
          $script=&Apache::lonratedt::editscript('simple');           $script=&Apache::lonratedt::editscript('simple');
        }         }
     } else { # got called in sequence from course  
        $allowed=0;  
     }      }
   
 # get course data  # get course data
Line 2666  sub handler { Line 3048  sub handler {
     $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");      $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
   
     if ($allowed) {      if ($allowed) {
  $script .= &editing_js($udom,$uname);          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).
                      &resize_contentdiv_js($tabidstr);
           $addentries = {
                           onload   => "javascript:resize_contentdiv('contentscroll','1','1');",
                         };
     }      }
 # -------------------------------------------------------------------- Body tag  # -------------------------------------------------------------------- Body tag
     $script = '<script type="text/javascript">'."\n"      $script = '<script type="text/javascript">'."\n"
Line 2674  sub handler { Line 3071  sub handler {
               .$script."\n"                .$script."\n"
               .'// ]]>'."\n"                .'// ]]>'."\n"
               .'</script>'."\n";                .'</script>'."\n";
     my $brcrum = [{href=>"/adm/createuser",text=>"$type Documents"}];  
     $r->print(&Apache::loncommon::start_page("$type Documents", $script,      # Breadcrumbs
     {'force_register' => $showdoc,      &Apache::lonhtmlcommon::clear_breadcrumbs();
                                      'bread_crumbs' => $brcrum}).      unless ($showdoc) {
       &Apache::loncommon::help_open_menu('','',273,'RAT'));          &Apache::lonhtmlcommon::add_breadcrumb({
               href=>"/adm/coursedocs",text=>"$crstype Contents"});
   
           $r->print(&Apache::loncommon::start_page("$crstype Contents", $script,
                                                    {'force_register' => $showdoc,
                                                     'add_entries'    => $addentries,
                                                    })
                    .&Apache::loncommon::help_open_menu('','',273,'RAT')
                    .&Apache::lonhtmlcommon::breadcrumbs(
                        'Editing the Table of Contents for your '.$crstype,
                        'Docs_Adding_Course_Doc')
           );
       } else {
           $r->print(&Apache::loncommon::start_page("$crstype documents",undef,
                                                   {'force_register' => $showdoc,}));
       }
   
   my %allfiles = ();    my %allfiles = ();
   my %codebase = ();    my %codebase = ();
   my ($upload_result,$upload_output);    my ($upload_result,$upload_output,$uploadphase);
   if ($allowed) {    if ($allowed) {
       if (($env{'form.uploaddoc.filename'}) &&        if (($env{'form.uploaddoc.filename'}) &&
   ($env{'form.cmd'}=~/^upload_(\w+)/)) {    ($env{'form.cmd'}=~/^upload_(\w+)/)) {
 # Process file upload - phase one - upload and parse primary file.            my $context = $1; 
             # Process file upload - phase one - upload and parse primary file.
   undef($hadchanges);    undef($hadchanges);
           $upload_result = &process_file_upload(\$upload_output,$coursenum,            $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom,
  $coursedom,\%allfiles,                                                \%allfiles,\%codebase,$context);
  \%codebase,$1);  
   if ($hadchanges) {    if ($hadchanges) {
       &mark_hash_old();        &mark_hash_old();
   }    }
           if ($upload_result eq 'phasetwo') {            $r->print($upload_output);
               $r->print($upload_output);        } elsif ($env{'form.phase'} eq 'upload_embedded') {
           }            # Process file upload - phase two - upload embedded objects 
       } elsif ($env{'form.phasetwo'}) {            $uploadphase = 'check_embedded';
           my %newname = ();            my $primaryurl = &HTML::Entities::encode($env{'form.primaryurl'},'<>&"');   
           my %origname = ();            my $state = &embedded_form_elems($uploadphase,$primaryurl,
           my %attribs = ();                                             $env{'form.newidx'});
           my $updateflag = 0;            my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
           my $residx = $env{'form.newidx'};            my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
           my $primary_url = &unescape($env{'form.primaryurl'});            my ($destination,$dir_root) = &embedded_destination();
 # Process file upload - phase two - gather secondary files.            my $url_root = '/uploaded/'.$docudom.'/'.$docuname;
           for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {            my $actionurl = '/adm/coursedocs';
               if ($env{'form.embedded_item_'.$i.'.filename'}) {            my ($result,$flag) = 
                   my $javacodebase;                &Apache::loncommon::upload_embedded('coursedoc',$destination,
                   $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);                    $docuname,$docudom,$dir_root,$url_root,undef,undef,undef,$state,
                   $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});                    $actionurl);
                   if (exists($env{'form.embedded_codebase_'.$i})) {            $r->print($result.&return_to_editor());
                       $javacodebase =  &unescape($env{'form.embedded_codebase_'.$i});        } elsif ($env{'form.phase'} eq 'check_embedded') {
                       $origname{$i} =~ s#^\Q$javacodebase\E/##;            # Process file upload - phase three - modify references in HTML file
                   }            $uploadphase = 'modified_orightml';
                   my @attributes = ();            my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
                   if ($env{'form.embedded_attrib_'.$i} =~ /:/) {            my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
                       @attributes = split(/:/,$env{'form.embedded_attrib_'.$i});            my ($destination,$dir_root) = &embedded_destination();
                   } else {            $r->print(&Apache::loncommon::modify_html_refs('coursedoc',$destination,
                       @attributes = ($env{'form.embedded_attrib_'.$i});                                                           $docuname,$docudom,undef,
                   }                                                           $dir_root).
                   foreach my $attr (@attributes) {                     &return_to_editor());
                       push(@{$attribs{$i}},&unescape($attr));  
                   }  
                   if ($javacodebase) {  
                       $codebase{$i} = $javacodebase;  
                       $codebase{$i} =~ s#/$##;  
                       $updateflag = 1;  
                   }  
               }  
               unless ($newname{$i} eq $origname{$i}) {  
                   $updateflag = 1;  
               }  
           }  
 # Process file upload - phase three - modify primary file  
           if ($updateflag) {  
               my ($content,$rtncode);  
               my $updateflag = 0;  
               my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);  
               if ($getstatus eq 'ok') {  
                   foreach my $item (keys(%newname)) {  
                       if ($newname{$item} ne $origname{$item}) {  
                           my $attrib_regexp = '';  
                           if (@{$attribs{$item}} > 1) {  
                               $attrib_regexp = join('|',@{$attribs{$item}});  
                           } else {  
                               $attrib_regexp = $attribs{$item}[0];  
                           }  
                           if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {  
                           }  
                           $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi;  
                       }  
                       if (exists($codebase{$item})) {  
                           $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs  
                       }  
                   }  
 # Save edited file.  
                   my $saveresult;  
                   my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};  
                   my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};  
                   my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);  
               } else {  
                   &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus);  
               }  
           }  
       }        }
   }    }
   
   unless ($showdoc ||  $upload_result eq 'phasetwo') {    unless ($showdoc || $uploadphase) {  
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
        my %lt=&Apache::lonlocal::texthash(         my %lt=&Apache::lonlocal::texthash(
                 'uplm' => 'Upload a new main '.lc($type).' document',                  'uplm' => 'Upload a new main '.lc($crstype).' document',
                 'upls' => 'Upload a new supplemental '.lc($type).' document',                  'upls' => 'Upload a new supplemental '.lc($crstype).' document',
                 'impp' => 'Import a document',                  'impp' => 'Import a document',
                 'pubd' => 'Published Documents',  
  'copm' => 'All documents out of a published map into this folder',   'copm' => 'All documents out of a published map into this folder',
                 'upld' => 'Upload Document',                  'upld' => 'Import Document',
                 'srch' => 'Search',                  'srch' => 'Search',
                 'impo' => 'Import',                  'impo' => 'Import',
  'book' => 'Import Bookmarks',   'wish' => 'Import from Wishlist',
                 'selm' => 'Select Map',                  'selm' => 'Select Map',
                 'load' => 'Load Map',                  'load' => 'Load Map',
                 'reco' => 'Recover Deleted Resources',                  'reco' => 'Recover Deleted Documents',
                 'newf' => 'New Folder',                  'newf' => 'New Folder',
                 'newp' => 'New Composite Page',                  'newp' => 'New Composite Page',
                 'extr' => 'External Resource',                  'extr' => 'External Resource',
                 'syll' => 'Syllabus',                  'syll' => 'Syllabus',
                 'navc' => 'Navigate Contents',                  'navc' => 'Table of Contents',
                 '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',
                 'rost' => 'Course Roster',                  'rost' => 'Course Roster',
  'abou' => 'Personal Information Page for a User',   'abou' => 'Personal Information Page for a User',
                 'imsf' => 'Import IMS package',                  'imsf' => 'IMS Import',
                   'imsl' => 'Import IMS package',
                 'file' =>  'File',                  'file' =>  'File',
                 'title' => 'Title',                  'title' => 'Title',
                 'comment' => 'Comment',                  'comment' => 'Comment',
                 'parse' => 'Upload embedded images/multimedia files if HTML file!',                  'parse' => 'Upload embedded images/multimedia files if HTML file',
  'nd' => 'Upload Document',   'nd' => 'Upload Document',
  'pm' => 'Published Map',   'pm' => 'Published Map',
  'sd' => 'Special Document',   'sd' => 'Special Document',
  'mo' => 'More Options',   'mo' => 'More Options',
  'hao' => 'Hide all Options'  
   );    );
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
  my $fileupload=(<<FIUP);   my $fileupload=(<<FIUP);
Line 2822  FIUP Line 3190  FIUP
  </label>   </label>
 CHBO  CHBO
   
       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="50" name="comment" />   <input type="text" size="60" name="comment" />
  $uploadtag   $uploadtag
  <input type="hidden" name="cmd" value="upload_default" />   <input type="hidden" name="cmd" value="upload_default" />
  <br />   <br />
  <span class="LC_nobreak">   <span class="LC_nobreak" style="float:left">
  $checkbox   $checkbox
  </span>   </span>
  <br />  
  <br />  
  <span class="LC_nobreak">  
  <input type="submit" value="$lt{'upld'}" />  
  $help{'Uploading_From_Harddrive'}  
  </span>  
  </form>  
 FUFORM  FUFORM
       $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">
  <input type="hidden" name="active" value="bb" />   <input type="hidden" name="active" value="bb" />
  $lt{'pubd'}<br />  SEDFFORM
  $uploadtag   my @simpleeditdefaultforma = ( 
  <input type="button" onclick="javascript:groupsearch()" value="$lt{'srch'}" />   { '<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>" },
  <br />   { '<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'}" },
  <span class="LC_nobreak">   { '<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>" },
  <input type="button" onclick="javascript:groupimport();" value="$lt{'impo'}" />   );
  $help{'Importing_LON-CAPA_Resource'}   $simpleeditdefaultform .= &create_form_ul(&create_list_elements(@simpleeditdefaultforma));
  </span>   $simpleeditdefaultform .=(<<SEDFFORM);
  <br />   <hr id="bb_hrule" style="width:0px;text-align:left;margin-left:0" />
  <input type="button" onclick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />  
  <hr />  
  <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
   
  my $extresourcesform=(<<ERFORM);        my $extresourcesform=(<<ERFORM);
  <form action="/adm/coursedocs" method="post" name="newext">        <form action="/adm/coursedocs" method="post" name="newext">
  $uploadtag        $uploadtag
  <input type="hidden" name="importdetail" value="" />        <input type="hidden" name="importdetail" value="" />
  <span class="LC_nobreak">        <a class="LC_menubuttons_link" href="javascript:makenewext('newext');">$lt{'extr'}</a>$help{'Adding_External_Resource'}
  <input name="newext" type="button" onclick="javascript:makenewext('newext');"        </form>
  value="$lt{'extr'}" /> $help{'Adding_External_Resource'}  
  </span>  
  </form>  
 ERFORM  ERFORM
   
   
     if ($allowed) {      if ($allowed) {
  &update_paste_buffer($coursenum,$coursedom);   &update_paste_buffer($coursenum,$coursedom);
        my %lt=&Apache::lonlocal::texthash(         my %lt=&Apache::lonlocal::texthash(
Line 2889  ERFORM Line 3246  ERFORM
                                          'sl' => 'Show Log'                                           'sl' => 'Show Log'
   );    );
   
        my $folderpath=$env{'form.folderpath'};  
        if (!$folderpath) {  
    if ($env{'form.folder'} eq '' ||  
        $env{'form.folder'} eq 'supplemental') {  
        $folderpath='default&'.  
    &escape(&mt('Main '.$type.' Documents'));  
    }  
        }  
        unless ($env{'form.pagepath'}) {  
            $containertag = '<input type="hidden" name="folderpath" value="" />';  
            $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';  
        }  
  $r->print(<<HIDDENFORM);   $r->print(<<HIDDENFORM);
  <form name="renameform" method="post" action="/adm/coursedocs">   <form name="renameform" method="post" action="/adm/coursedocs">
    <input type="hidden" name="title" />     <input type="hidden" name="title" />
Line 2915  ERFORM Line 3260  ERFORM
  </form>   </form>
 HIDDENFORM  HIDDENFORM
     }      }
 # --------------------------------------------------------- Main tab structure  
     my $activeClass = 1;  # Generate the tabs
     my $active = '';      &startContentScreen($r,($supplementalflag?'supdocs':'docs'));
     $r->print('<ul class="LC_TabContentBigger" id="mainnav">');  
     if (($standard) && ($allowed) && (!$forcesupplement) && (($env{'form.folderpath'}=~/^default/) || ($env{'form.pagepath'}))) {  
         if($activeClass == 1){  #
            $active = 'class="active"';  
    $activeClass = 0;      my $savefolderpath;
  }  
     }      if ($allowed) {
     $r->print('<li '.$active.' onclick="javascript:showPage(this,\'mainCourseDocuments\',\'mainnav\',\'maincoursedoc\');">'.&mt('Main Course Documents').'</li>');  
     $active = '';  
     if (!$forcestandard || ($env{'form.folderpath'}=~/^supplemental/)) {  
         if($activeClass == 1){  
            $active = 'class="active"';  
         }  
     }  
     $r->print('<li '.$active.' onclick="javascript:showPage(this,\'supplCourseDocuments\',\'mainnav\',\'maincoursedoc\');">'.&mt('Supplemental Course Documents').'</li>');  
     $r->print('</ul><div class="clear LC_Box"><div id="maincoursedoc" style="margin:0 0;padding:0 0;">');  
 # --------------------------------------------------------- Standard documents  
        my $savefolderpath;  
        my $active = 'style="display: none;"';  
        if($activeClass == 0){  
           $active = 'style="display: block;"';  
        }  
        $r->print('<div class="LC_ContentBox" id="mainCourseDocuments" '.$active.'>');  
        my $folder=$env{'form.folder'};         my $folder=$env{'form.folder'};
        if ($folder eq '' || $folder=~/^supplemental/) {         if ($folder eq '' || $supplementalflag) {
            $folder='default';             $folder='default';
    $savefolderpath = $env{'form.folderpath'};     $savefolderpath = $env{'form.folderpath'};
    $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));     $env{'form.folderpath'}='default&'.&escape(&mt('Content'));
            $uploadtag = '<input type="hidden" name="folderpath" value="'.             $uploadtag = '<input type="hidden" name="folderpath" value="'.
        &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';         &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
        }         }
Line 2974  HIDDENFORM Line 3303  HIDDENFORM
   
  my $recoverform=(<<RFORM);   my $recoverform=(<<RFORM);
  <form action="/adm/groupsort" method="post" name="recover">   <form action="/adm/groupsort" method="post" name="recover">
  <input type="button" name="recovermap" onclick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />   <a class="LC_menubuttons_link" href="javascript:groupopen('$readfile',1)">$lt{'reco'}</a>
  </form>   </form>
 RFORM  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" />
  <input name="imsimport" type="button" value="$lt{'imsf'}" onclick="javascript:makeims();" />   <a class="LC_menubuttons_link" href="javascript:makeims();">$lt{'imsf'}</a>
  </form>   </form>
 IMSPFORM  IMSPFORM
   
Line 2991  IMSPFORM Line 3320  IMSPFORM
  $uploadtag   $uploadtag
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'navc'}=/adm/navmaps" />   value="$lt{'navc'}=/adm/navmaps" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:document.newnav.submit()">$lt{'navc'}</a>
  <input name="newnav" type="submit" value="$lt{'navc'}" />  
  $help{'Navigate_Content'}   $help{'Navigate_Content'}
  </span>  
  </form>   </form>
 NNFORM  NNFORM
  my $newsmppageform=(<<NSPFORM);   my $newsmppageform=(<<NSPFORM);
Line 3002  NNFORM Line 3329  NNFORM
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
  $uploadtag   $uploadtag
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:makesmppage();"> $lt{'sipa'}</a>
  <input name="newsmppg" type="button" value="$lt{'sipa'}"   $help{'Simple Page'}
  onclick="javascript:makesmppage();" /> $help{'Simple Page'}  
  </span>  
  </form>   </form>
 NSPFORM  NSPFORM
   
Line 3014  NSPFORM Line 3339  NSPFORM
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
  $uploadtag   $uploadtag
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:makesmpproblem();">$lt{'sipr'}</a>
  <input name="newsmpproblem" type="button" value="$lt{'sipr'}"   $help{'Simple Problem'}
  onclick="javascript:makesmpproblem();" />$help{'Simple Problem'}  
  </span>  
  </form>   </form>
   
 NSPROBFORM  NSPROBFORM
Line 3027  NSPROBFORM Line 3350  NSPROBFORM
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
  $uploadtag   $uploadtag
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:makedropbox();">$lt{'drbx'}</a>
  <input name="newdropbox" type="button" value="$lt{'drbx'}"  
  onclick="javascript:makedropbox();" />  
  </span>  
  </form>   </form>
 NDBFORM  NDBFORM
   
Line 3039  NDBFORM Line 3359  NDBFORM
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
  $uploadtag   $uploadtag
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:makeexamupload();">$lt{'scuf'}</a>
  <input name="newexamupload" type="button" value="$lt{'scuf'}"  
  onclick="javascript:makeexamupload();" />  
  $help{'Score_Upload_Form'}   $help{'Score_Upload_Form'}
  </span>  
  </form>   </form>
 NEXUFORM  NEXUFORM
   
Line 3052  NEXUFORM Line 3369  NEXUFORM
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
  $uploadtag   $uploadtag
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:makebulboard();" >$lt{'bull'}</a>
  <input name="newbulletin" type="button" value="$lt{'bull'}"  
  onclick="javascript:makebulboard();" />  
  $help{'Bulletin Board'}   $help{'Bulletin Board'}
  </span>  
  </form>   </form>
 NBFORM  NBFORM
   
Line 3066  NBFORM Line 3380  NBFORM
  $uploadtag   $uploadtag
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$plainname=/adm/$udom/$uname/aboutme" />   value="$plainname=/adm/$udom/$uname/aboutme" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:document.newaboutme.submit()">$lt{'mypi'}</a>
  <input name="newaboutme" type="submit" value="$lt{'mypi'}" />  
  $help{'My Personal Information Page'}   $help{'My Personal Information Page'}
  </span>  
  </form>   </form>
 NAMFORM  NAMFORM
   
Line 3078  NAMFORM Line 3390  NAMFORM
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
  $uploadtag   $uploadtag
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:makeabout();">$lt{'abou'}</a>
  <input name="newaboutsomeone" type="button" value="$lt{'abou'}"   
  onclick="javascript:makeabout();" />  
  </span>  
  </form>   </form>
 NASOFORM  NASOFORM
   
Line 3092  NASOFORM Line 3401  NASOFORM
  $uploadtag   $uploadtag
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'rost'}=/adm/viewclasslist" />   value="$lt{'rost'}=/adm/viewclasslist" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:document.newroster.submit()">$lt{'rost'}</a>
  <input name="newroster" type="submit" value="$lt{'rost'}" />  
  $help{'Course Roster'}   $help{'Course Roster'}
  </span>  
  </form>   </form>
 NROSTFORM  NROSTFORM
   
 my $specialdocumentsform;  my $specialdocumentsform;
   my @specialdocumentsforma;
   my $gradingform;
   my @gradingforma;
   my $communityform;
   my @communityforma;
 my $newfolderform;  my $newfolderform;
   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">
  <input type="hidden" name="folderpath" value="$path" />   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:makenewpage(document.newpage,'$pageseq');">$lt{'newp'}</a>
  <input name="newpage" type="button"   $help{'Adding_Pages'}
  onclick="javascript:makenewpage(this.form,'$pageseq');"  
  value="$lt{'newp'}" />$help{'Adding_Pages'}  
  </span>  
  </form>   </form>
 NPFORM  NPFORM
   
   
  $newfolderform=(<<NFFORM);   $newfolderform=(<<NFFORM);
  <form action="/adm/coursedocs" method="post" name="newfolder">   <form action="/adm/coursedocs" method="post" name="newfolder">
  <input type="hidden" name="folderpath" value="$path" />   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <input type="hidden" name="active" value="aa" />   <input type="hidden" name="active" value="aa" />
  <span class="LC_nobreak">   <a href="javascript:makenewfolder(document.newfolder,'$folderseq');">$lt{'newf'}</a>$help{'Adding_Folders'}
  <input name="newfolder" type="button"  
  onclick="javascript:makenewfolder(this.form,'$folderseq');"  
  value="$lt{'newf'}" />$help{'Adding_Folders'}  
  </span>  
  </form>   </form>
 NFFORM  NFFORM
   
Line 3137  NFFORM Line 3443  NFFORM
  $uploadtag   $uploadtag
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" />   value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:document.newsyl.submit()">$lt{'syll'}</a>
  <input name="newsyl" type="submit" value="$lt{'syll'}" />   
  $help{'Syllabus'}   $help{'Syllabus'}
  </span>  
  </form>   </form>
 NSYLFORM  NSYLFORM
   
Line 3150  NSYLFORM Line 3455  NSYLFORM
  $uploadtag   $uploadtag
  <input type="hidden" name="importdetail"   <input type="hidden" name="importdetail"
  value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />   value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:document.newgroupfiles.submit()">$lt{'grpo'}</a>
  <input name="newgroupfiles" type="submit" value="$lt{'grpo'}" />  
  $help{'Group Portfolio'}   $help{'Group Portfolio'}
  </span>  
  </form>   </form>
 NGFFORM  NGFFORM
    @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/syllabus.png" alt="'.$lt{syll}.'" onclick="document.newsyl.submit()" />'=>$newsylform},
    {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$newnavform},
           {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},
           );
           $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));
   
   
           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/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:makeims();" />'=>$imspform},);
           $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc)) . '<hr id="cc_hrule" style="width:0px;text-align:left;margin-left:0" />' . $fileuploadform;
   
           @gradingforma=(
           {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},
           {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform},
           {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform},
   
           );
           $gradingform = &create_form_ul(&create_list_elements(@gradingforma));
   
           @communityforma=(
          {'<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},
           {'<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));
   
  $specialdocumentsform="<br />$newpageform<br />$newsylform<br />$newgroupfileform";  
       }  
  $specialdocumentsform.="<br />$newnavform<br />$newsmppageform  my @tools = (
  <br />$newsmpproblemform<br />$newdropboxform  # {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" />'=>$extresourcesform},
         <br />$newexuploadform<br />$newbulform  # {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" />'=>$imspform},
         <br />$newaboutmeform<br />$newaboutsomeoneform   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/recover.png" alt="'.$lt{reco}.'" onclick="javascript:groupopen(\''.$readfile.'\',1)" />'=>$recoverform},
         <br />$newrosterform";   );
 if($env{'form.pagepath'}) {  
  $specialdocumentsform="<br />$newsmpproblemform<br />$newexuploadform";  
 }  
   
 my %orderhash = (  my %orderhash = (
                 'aa' => ['Upload Document',$fileuploadform.'<br />'.$newfolderform],                  'aa' => ['Import Documents',$fileuploadform],
                 'bb' => ['Published Documents',$simpleeditdefaultform],                  'bb' => ['Published Resources',$simpleeditdefaultform],
                 'cc' => ['Special Documents',$specialdocumentsform],                  'cc' => ['Grading Resources',$gradingform],
  'dd' => ['Tools',$extresourcesform.'<br />'.$imspform.'<br />'.$recoverform.'<br />'.&generate_admin_options($containertag,$uploadtag,\%help,\%env)],   'ff' => ['Tools', &create_form_ul(&create_list_elements(@tools)).&generate_admin_options(\%help,\%env)],
                 'zz' => ['Hide all Options'],  
                 );                  );
 my $tid='1';  unless ($env{'form.pagepath'}) {
 my $varcd = 'Main Course Documents';      $orderhash{'00'} = ['Newfolder',$newfolderform];
 $r->print(&generate_edit_table($tid,$varcd,\%orderhash));      $orderhash{'dd'} = ['Community Resources',$communityform];
       $orderhash{'ee'} = ['Special Documents',$specialdocumentsform];
   }
   
  $hadchanges=0;   $hadchanges=0;
         my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$type);         unless ($supplementalflag) {
        if ($error) {            my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
            $r->print('<p><span class="LC_error">'.$error.'</span></p>');                                $supplementalflag,\%orderhash);
        }            if ($error) {
        if ($hadchanges) {               $r->print('<p><span class="LC_error">'.$error.'</span></p>');
            &mark_hash_old();            }
        }            if ($hadchanges) {
                &mark_hash_old();
             }
   
             &changewarning($r,'');
           }
       }
   
   # Supplemental documents start here
   
        &changewarning($r,'');  
  $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',  
                      &mt('Editing the Table of Contents for your '.$type)));  
 $r->print('</div>');  
        if ($env{'form.pagepath'}) {  
        }  
 # ----------------------------------------------------- Supplemental documents  
        my $active = 'style="display: none;"';  
        if($activeClass == 1){  
           $active = 'style="display: block;"';  
        }  
        $r->print('<div class="LC_ContentBox" id="supplCourseDocuments" '.$active.'>');  
        my $folder=$env{'form.folder'};         my $folder=$env{'form.folder'};
        unless ($folder=~/^supplemental/) {         unless ($supplementalflag) {
    $folder='supplemental';     $folder='supplemental';
        }         }
        if ($folder =~ /^supplemental$/ &&         if ($folder =~ /^supplemental$/ &&
    (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {     (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {
           $env{'form.folderpath'} = 'supplemental&'.            $env{'form.folderpath'} = &supplemental_base();
                                     &escape(&mt('Supplemental '.$type.' Documents'));         } elsif ($allowed) {
        }else{  
   $env{'form.folderpath'} = $savefolderpath;    $env{'form.folderpath'} = $savefolderpath;
        }         }
        $env{'form.pagepath'} = '';         $env{'form.pagepath'} = '';
Line 3218  $r->print('</div>'); Line 3545  $r->print('</div>');
   
    my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');     my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
   
    my $supupdocformbtn = "<input type='submit' value='".$lt{'upld'}."' />$help{'Uploading_From_Harddrive'}";
  my $supupdocform=(<<SUPDOCFORM);   my $supupdocform=(<<SUPDOCFORM);
  <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">   <form action="/adm/coursedocs" method="post" name="supuploaddocument" enctype="multipart/form-data">
  <input type="hidden" name="active" value="ee" />   <input type="hidden" name="active" value="ee" />
  $fileupload   $fileupload
  <br />   <br />
Line 3229  $r->print('</div>'); Line 3557  $r->print('</div>');
  </span>   </span>
  <br /><br />   <br /><br />
  $lt{'comment'}:<br />   $lt{'comment'}:<br />
  <textarea cols="50" rows="4" name="comment">   <textarea cols="50" rows="4" name="comment"></textarea>
  </textarea>  
  <br />   <br />
  <input type="hidden" name="folderpath" value="$path" />   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="cmd" value="upload_supplemental" />   <input type="hidden" name="cmd" value="upload_supplemental" />
  <span class="LC_nobreak">  
  <input type="submit" value="$lt{'upld'}" />  
  $help{'Uploading_From_Harddrive'}  
  </span>  
  </form>  
 SUPDOCFORM  SUPDOCFORM
    $supupdocform .=  &create_form_ul(&Apache::lonhtmlcommon::htmltag('li',$supupdocformbtn,{class => 'LC_menubuttons_inline_text'}))."</form>";
   
  my $supnewfolderform=(<<SNFFORM);   my $supnewfolderform=(<<SNFFORM);
  <form action="/adm/coursedocs" method="post" name="supnewfolder">   <form action="/adm/coursedocs" method="post" name="supnewfolder">
  <input type="hidden" name="active" value="ee" />   <input type="hidden" name="active" value="ee" />
  <input type="hidden" name="folderpath" value="$path" />   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a> 
  <input name="newfolder" type="button"   $help{'Adding_Folders'}
  onclick="javascript:makenewfolder(this.form,'$folderseq');"  
  value="$lt{'newf'}" /> $help{'Adding_Folders'}  
  </span>  
  </form>   </form>
 SNFFORM  SNFFORM
   
   
  my $supnewextform=(<<SNEFORM);   my $supnewextform=(<<SNEFORM);
  <form action="/adm/coursedocs" method="post" name="supnewext">   <form action="/adm/coursedocs" method="post" name="supnewext">
  <input type="hidden" name="active" value="ff" />   <input type="hidden" name="active" value="ff" />
  <input type="hidden" name="folderpath" value="$path" />   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:makenewext('supnewext');">$lt{'extr'}</a> $help{'Adding_External_Resource'}
  <input name="newext" type="button"   
  onclick="javascript:makenewext('supnewext');"  
  value="$lt{'extr'}" /> $help{'Adding_External_Resource'}  
  </span>  
  </form>   </form>
 SNEFORM  SNEFORM
   
Line 3274  SNEFORM Line 3590  SNEFORM
  <input type="hidden" name="folderpath" value="$path" />   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="Syllabus=/public/$coursedom/$coursenum/syllabus" />   value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:document.supnewsyl.submit()">$lt{'syll'}</a>
  <input name="newsyl" type="submit" value="$lt{'syll'}" />  
  $help{'Syllabus'}   $help{'Syllabus'}
  </span>  
  </form>   </form>
 SNSFORM  SNSFORM
   
  my $supnewaboutmeform=(<<SNAMFORM);   my $supnewaboutmeform=(<<SNAMFORM);
  <form action="/adm/coursedocs" method="post" name="subnewaboutme">   <form action="/adm/coursedocs" method="post" name="supnewaboutme">
  <input type="hidden" name="active" value="ff" />   <input type="hidden" name="active" value="ff" />
  <input type="hidden" name="folderpath" value="$path" />   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$plainname=/adm/$udom/$uname/aboutme" />   value="$plainname=/adm/$udom/$uname/aboutme" />
  <span class="LC_nobreak">   <a class="LC_menubuttons_link" href="javascript:document.supnewaboutme.submit()">$lt{'mypi'}</a>
  <input name="newaboutme" type="submit" value="$lt{'mypi'}" />  
  $help{'My Personal Information Page'}   $help{'My Personal Information Page'}
  </span>  
  </form>   </form>
 SNAMFORM  SNAMFORM
   
   
   my @specialdocs = (
    {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.supnewsyl.submit()" />'
               =>$supnewsylform},
    {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="document.supnewaboutme.submit()" />'
               =>$supnewaboutmeform},
    );
   my @supimportdoc = (
    {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:makenewext(\'supnewext\');" />'
               =>$supnewextform},
           );
   $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 = (
                 'ee' => ['Upload Document',$supupdocform.'<br />'.$supnewfolderform],   '00' => ['Supnewfolder', $supnewfolderform],
                 'ff' => ['Special Documents',$supnewextform.'<br />'.$supnewsylform.'<br />'.$supnewaboutmeform],                  'ee' => ['Import Documents',$supupdocform],
                 'zz' => ['Hide all Options'],                  'ff' => ['Special Documents',&create_form_ul(&create_list_elements(@specialdocs))]
                 );                  );
           if ($supplementalflag) {
              my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                                  $supplementalflag,\%suporderhash);
              if ($error) {
                 $r->print('<p><span class="LC_error">'.$error.'</span></p>');
              }
           }
       } elsif ($supplementalflag) {
           my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                               $supplementalflag);
           if ($error) {
               $r->print('<p><span class="LC_error">'.$error.'</span></p>');
           }
       }
   
 my $tid='2';      &endContentScreen($r);
 my $varscd = 'Supplemental Course Documents';  
   
 $r->print(&generate_edit_table($tid,$varscd,\%suporderhash));  
 my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$type);  
        if ($error) {  
            $r->print('<p><span class="LC_error">'.$error.'</span></p>');  
        }  
 $r->print('</div>');  
  }  
 $r->print('</div>');  
     if ($allowed) {      if ($allowed) {
  $r->print('   $r->print('
 <form method="post" name="extimport" action="/adm/coursedocs">  <form method="post" name="extimport" action="/adm/coursedocs">
Line 3323  $r->print('</div>'); Line 3650  $r->print('</div>');
 </form>');  </form>');
     }      }
   } else {    } else {
       unless ($upload_result eq 'phasetwo') {        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>'.
Line 3336  $r->print('</div>'); Line 3663  $r->print('</div>');
  return OK;   return OK;
 }  }
   
   sub embedded_form_elems {
       my ($phase,$primaryurl,$newidx) = @_;
       my $folderpath = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
       return <<STATE;
       <input type="hidden" name="folderpath" value="$folderpath" />
       <input type="hidden" name="cmd" value="upload_embedded" />
       <input type="hidden" name="newidx" value="$newidx" />
       <input type="hidden" name="phase" value="$phase" />
       <input type="hidden" name="primaryurl" value="$primaryurl" />
   STATE
   }
   
   sub embedded_destination {
       my $folder=$env{'form.folder'};
       my $destination = 'docs/';
       if ($folder =~ /^supplemental/) {
           $destination = 'supplemental/';
       }
       if (($folder eq 'default') || ($folder eq 'supplemental')) {
           $destination .= 'default/';
       } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
           $destination .=  $2.'/';
       }
       $destination .= $env{'form.newidx'};
       my $dir_root = '/userfiles';
       return ($destination,$dir_root);
   }
   
   sub return_to_editor {
       my $actionurl = '/adm/coursedocs';
       return '<p><form name="backtoeditor" method="post" action="'.$actionurl.'" />'."\n". 
              '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /></form>'."\n".
              '<a href="javascript:document.backtoeditor.submit();">'.&mt('Return to Editor').
              '</a></p>';
   }
   
 sub generate_admin_options {  sub generate_admin_options {
   my ($containertag,$uploadtag,$help_ref,$env_ref) = @_;    my ($help_ref,$env_ref) = @_;
  my %lt=&Apache::lonlocal::texthash(    my %lt=&Apache::lonlocal::texthash(
                                          'vc' => 'Verify Content',                                           'vc' => 'Verify Content',
                                          'cv' => 'Check/Set Resource Versions',                                           'cv' => 'Check/Set Resource Versions',
                                          'ls' => 'List Symbs',                                           'ls' => 'List Symbs',
                                          'sl' => 'Show Log'                                           'sl' => 'Show Log',
                                            'imse' => 'IMS Export',
                                            'dcd' => 'Dump Course Documents to Construction Space: available on other servers'
                                           );                                            );
   my %help = %{$help_ref};    my %help = %{$help_ref};
   my %env = %{$env_ref};    my %env = %{$env_ref};
   my $dumpbut=&dumpbutton();    my $dumpbut=&dumpbutton();
   my $exportbut=&exportbutton();    my $exportbut=&exportbutton();
   return (<<ENDOPTIONFORM);    my @list = (
  <form action="/adm/coursedocs" method="post" name="courseverify">   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/verify.png" alt="'.$lt{vc}.'"  onclick=\'javascript:injectData(document.courseverify, "dummy", "verify", "'.$lt{'vc'}.'")\' />' 
            <input type="submit" name="verify" value="$lt{'vc'}" />$help{'Verify_Content'}<br />          => "<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"verify\", \"$lt{'vc'}\")'>$lt{'vc'}</a>$help{'Verify_Content'}"},
            <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}<br />   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/resversion.png" alt="'.$lt{cv}.'"  onclick=\'javascript:injectData(document.courseverify, "dummy", "versions", "'.$lt{'cv'}.'")\' />'
            $dumpbut          =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"versions\", \"$lt{'cv'}\")'>$lt{'cv'}</a>$help{'Check_Resource_Versions'}"},
            $exportbut   );
           <input type="submit" name="listsymbs" value="$lt{'ls'}" />    if($dumpbut ne ''){
           <input type="hidden" name="folder" value="$env{'form.folder'}" /><br />    push @list, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dump.png" alt="'.$lt{dcd}.'" />'=>$dumpbut};
           <input type="submit" name="docslog" value="$lt{'sl'}" />    }
  </form>    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').'\');" />'
 ENDOPTIONFORM            =>$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'}.'")\'  />'
           =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"listsymbs\", \"$lt{'ls'}\")'>$lt{'ls'}</a><input type='hidden' name='folder' value='$env{'form.folder'}' />"},
    {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/document-properties.png" alt="'.$lt{sl}.'"  onclick=\'javascript:injectData(document.courseverify, "dummy", "docslog", "'.$lt{'sl'}.'")\'  />'
           =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"docslog\", \"$lt{'sl'}\")'>$lt{'sl'}</a>"},
    );
     return '<form action="/adm/coursedocs" method="post" name="courseverify"><input type="hidden" id="dummy" />'.&create_form_ul(&create_list_elements(@list)).'</form>';
   
 }  }
   
   
 sub generate_edit_table {  sub generate_edit_table {
     my ($tid,$varcd,$orderhash_ref) = @_;      my ($tid,$orderhash_ref,$to_show) = @_;
       return unless(ref($orderhash_ref) eq 'HASH');
     my %orderhash = %{$orderhash_ref};      my %orderhash = %{$orderhash_ref};
     my $form;      my $form;
     my $activetab;      my $activetab;
Line 3372  sub generate_edit_table { Line 3744  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"><h4 class="LC_hcell">'.&mt($varcd).'</h4>';      $form = '<div class="LC_Box" style="margin:0;">'.
     $form .= '<ul id="navigation'.$tid.'" class="LC_TabContent">';               '<ul id="navigation'.$tid.'" class="LC_TabContent">';
     foreach my $name (sort(keys(%orderhash))){      foreach my $name (reverse(sort(keys(%orderhash)))) {
         if($name eq 'zz'){          if($name ne '00'){
             if($activetab ne ''){  
                $active = 'class="right"';  
             }else{  
                $active = 'class="right active"';  
             }  
             $form .= '<li onclick="javascript:hideAll(this, \'navigation'.$tid.'\' ,\'content'.$tid.'\');" '.$active.'>'.&mt(${$orderhash{$name}}[0]).'</li>';  
         }else{  
             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.' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');">'.&mt(${$orderhash{$name}}[0]).'</li>';              $form .= '<li style="float:right" '.$active
         }                  .' onmouseover="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"'
                   .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>';
           } else {
       $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>';
   
    }
     }      }
     $form .= '</ul>';      $form .= '</ul>';
     $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0;">';      $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; overflow: hidden; clear:right">';
   
       if ($to_show ne '') {
           $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>';
       }
     foreach my $field (keys(%orderhash)){      foreach my $field (keys(%orderhash)){
  if($field ne 'zz'){   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>';
         }          }
     }      }
     $form .= '</div></div>';      $form .= '</div></div>';
Line 3418  sub editing_js { Line 3792  sub editing_js {
                                           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 3437  sub editing_js { Line 3811  sub editing_js {
                                           p_ctr2b => '?[_98]'                                            p_ctr2b => '?[_98]'
                                         );                                          );
   
       my $crstype = &Apache::loncommon::course_type();
       my $docs_folderpath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'},'<>&"');
       my $docs_pagepath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.pagepath'},'<>&"');
       my $main_container_page;
       if ($docs_folderpath eq '') {
           if ($docs_pagepath ne '') {
               $main_container_page = 1;
           }
       }
       my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents';
       my $toplevelsupp = &supplemental_base();
   
     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 3641  for (i = 0; i < currentDivs.length; i++) Line 4027  for (i = 0; i < currentDivs.length; i++)
   
 function openTabs(pageId) {  function openTabs(pageId) {
  tabnav = document.getElementById(pageId).getElementsByTagName('UL');   tabnav = document.getElementById(pageId).getElementsByTagName('UL');
  if(tabnav.length > 0 ){   if(tabnav.length > 2 ){
  currentNav = document.getElementById(tabnav[0].id);   currentNav = document.getElementById(tabnav[1].id);
  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 == 'active') {   if(currentLis[i].className == 'active') {
  funcString = currentLis[i].onclick.toString();   funcString = currentLis[i].onclick.toString();
  tab = funcString.split('"');   tab = funcString.split('"');
                                   if(tab.length < 2) {
                                      tab = funcString.split("'");
                                   }
  currentData = document.getElementById(tab[1]);   currentData = document.getElementById(tab[1]);
         currentData.style.display = 'block';          currentData.style.display = 'block';
  }   }
Line 3662  function showPage(current, pageId, nav, Line 4051  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') {
               var storedpath = "$docs_folderpath";
               if (storedpath == '') {
                   storedpath = "$docs_pagepath";
               }
               var storedpage = "$main_container_page";
               var reg = new RegExp("^supplemental");
               if (pageId == 'mainCourseDocuments') {
                   if (storedpage == 1) {
                       document.simpleedit.folderpath.value = '';
                       document.uploaddocument.folderpath.value = '';
                   } else {
                       if (reg.test(storedpath)) {
                           document.simpleedit.folderpath.value = '$toplevelmain';
                           document.uploaddocument.folderpath.value = '$toplevelmain';
                           document.newext.folderpath.value = '$toplevelmain';
                       } else {
                           document.simpleedit.folderpath.value = storedpath;
                           document.uploaddocument.folderpath.value = storedpath;
                           document.newext.folderpath.value = storedpath;
                       }
                   }
               } else {
                   if (reg.test(storedpath)) {
                       document.simpleedit.folderpath.value = storedpath;
                       document.supuploaddocument.folderpath.value = storedpath;
                       document.supnewext.folderpath.value = storedpath;
                   } else {
                       document.simpleedit.folderpath.value = '$toplevelsupp';
                       document.supuploaddocument.folderpath.value = '$toplevelsupp';
                       document.supnewext.folderpath.value = '$toplevelsupp';
                   }
               }
           }
           resize_contentdiv('contentscroll','1','0');
  return false;   return false;
 }  }
   
   function injectData(current, hiddenField, name, value) {
    currentElement = document.getElementById(hiddenField);
    currentElement.name = name;
    currentElement.value = value;
    current.submit();
   }
   
 ENDNEWSCRIPT  ENDNEWSCRIPT
 }  }
   
   sub resize_contentdiv_js {
       my ($tabidstr) = @_;
       my $viewport_js = &Apache::loncommon::viewport_geometry_js();
       return <<ENDRESIZESCRIPT;
   
   window.onresize=resizeContentEditor;
   
   var activeTab;
   
   $viewport_js
   
   function resize_contentdiv(scrollboxname,chkw,chkh) {
       var scrollboxid = 'div_'+scrollboxname;
       var scrolltableid = 'table_'+scrollboxname;
       var scrollbox;
       var scrolltable;
   
       if (document.getElementById("contenteditor") == null) {
           return;
       }
   
       if (document.getElementById(scrollboxid) == null) {
           return;
       } else {
           scrollbox = document.getElementById(scrollboxid);
       }
   
       if (document.getElementById(scrolltableid) == null) {
           return;
       } else {
           scrolltable = document.getElementById(scrolltableid);
       }
   
       init_geometry();
       var vph = Geometry.getViewportHeight();
       var vpw = Geometry.getViewportWidth();
   
       var alltabs = ['$tabidstr'];
       var listwchange;
       if (chkw == 1) {
           var contenteditorw = document.getElementById("contenteditor").offsetWidth;
           var contentlistw;
           var contentlistid = document.getElementById("contentlist");
           if (contentlistid != null) {
               contentlistw = document.getElementById("contentlist").offsetWidth;
           }
           var contentlistwstart = contentlistw;
   
           var scrollboxw = scrollbox.offsetWidth;
           var scrollboxscrollw = scrollbox.scrollWidth;
   
           var offsetw = parseInt(vpw * 0.015);
           var paddingw = parseInt(vpw * 0.09);
   
           var minscrollboxw = 250;
   
           var maxtabw = 0;
           var actabw = 0;
           for (var i=0; i<alltabs.length; i++) {
               if (activeTab == alltabs[i]) {
                   actabw = document.getElementById(alltabs[i]).offsetWidth;
                   if (actabw > maxtabw) {
                       maxtabw = actabw;
                   }
               } else {
                   if (document.getElementById(alltabs[i]) != null) {
                       var thistab = document.getElementById(alltabs[i]);
                       thistab.style.visibility = 'hidden';
                       thistab.style.display = 'block';
                       var tabw = document.getElementById(alltabs[i]).offsetWidth;
                       thistab.style.display = 'none';
                       thistab.style.visibility = '';
                       if (tabw > maxtabw) {
                           maxtabw = tabw;
                       }
                   }
               }
           }
   
           if (maxtabw > 0) {
               var newscrollboxw;
               if (maxtabw+paddingw+scrollboxscrollw<contenteditorw) {
                   newscrollboxw = contenteditorw-paddingw-maxtabw;
                   if (newscrollboxw < minscrollboxw) {
                       newscrollboxw = minscrollboxw;
                   }
                   scrollbox.style.width = newscrollboxw+"px";
                   if (newscrollboxw != scrollboxw) {
                       var newcontentlistw = newscrollboxw-offsetw;
                       contentlistid.style.width = newcontentlistw+"px";
                   }
               } else {
                   newscrollboxw = contenteditorw-paddingw-maxtabw;
                   if (newscrollboxw < minscrollboxw) {
                       newscrollboxw = minscrollboxw;
                   }
                   scrollbox.style.width = newscrollboxw+"px";
                   if (newscrollboxw != scrollboxw) {
                       var newcontentlistw = newscrollboxw-offsetw;
                       contentlistid.style.width = newcontentlistw+"px";
                   }
               }
   
               if (newscrollboxw != scrollboxw) {
                   var newscrolltablew = newscrollboxw+offsetw;
                   scrolltable.style.width = newscrolltablew+"px";
               }
           }
   
           if (contentlistid.offsetWidth != contentlistwstart) {
               listwchange = 1;
           }
   
           if (activeTab == 'cc1') {
               if (document.getElementById('cc_hrule') != null) {
                   document.getElementById('cc_hrule').style.width=actabw+"px";
               }
           } else {
               if (activeTab == 'bb1') {
                   if (document.getElementById('bb_hrule') != null) {
                       document.getElementById('bb_hrule').style.width=actabw+"px";
                   }
               } else {
                   if (activeTab == 'ee2') {
                       if (document.getElementById('ee_hrule') != null) {
                           document.getElementById('ee_hrule').style.width=actabw+"px";
                       }
                   }
               }
           }
       }
       if ((chkh == 1) || (listwchange)) {
           var primaryheight = document.getElementById("LC_nav_bar").offsetHeight;
           var secondaryheight = document.getElementById("LC_secondary_menu").offsetHeight;
           var crumbsheight = document.getElementById("LC_breadcrumbs").offsetHeight;
           var dccidheight = document.getElementById("dccid").offsetHeight;
   
           var uploadresultheight = 0;
           if (document.getElementById("uploadfileresult") != null) {
               uploadresultheight = document.getElementById("uploadfileresult").offsetHeight;
           }
           var tabbedheight = document.getElementById("tabbededitor").offsetHeight;
           var contenteditorheight = document.getElementById("contenteditor").offsetHeight;
           var scrollboxheight = scrollbox.offsetHeight;
           var scrollboxscrollheight = scrollbox.scrollHeight;
           var freevspace = vph-(primaryheight+secondaryheight+crumbsheight+dccidheight+uploadresultheight+tabbedheight+contenteditorheight);
   
           var minvscrollbox = 200;
           var offsetv = 20;
           var newscrollboxheight;
           if (freevspace < 0) {
               newscrollboxheight = scrollboxheight+freevspace-offsetv;
               if (newscrollboxheight < minvscrollbox) {
                   newscrollboxheight = minvscrollbox;
               }
               scrollbox.style.height = newscrollboxheight + "px";
           } else {
               if (scrollboxscrollheight > scrollboxheight) {
                   if (freevspace > offsetv) {
                       newscrollboxheight = scrollboxheight+freevspace-offsetv;
                       if (newscrollboxheight < minvscrollbox) {
                           newscrollboxheight = minvscrollbox;
                       }
                       scrollbox.style.height = newscrollboxheight+"px";
                   }
               }
           }
           scrollboxheight = scrollbox.offsetHeight;
           var contentlistheight = document.getElementById("contentlist").offsetHeight;
   
           if (scrollboxscrollheight <= scrollboxheight) {
               if ((contentlistheight+offsetv)<scrollboxheight) {
                   newscrollheight = contentlistheight+offsetv;
                   scrollbox.style.height = newscrollheight+"px";
               }
           }
       }
       return;
   }
   
   function resizeContentEditor() {
       var timer;
       clearTimeout(timer)
       timer=setTimeout('resize_contentdiv("contentscroll","1","1")',500);
   }
   
   ENDRESIZESCRIPT
       return;
   }
   
 1;  1;
 __END__  __END__
   

Removed from v.1.375  
changed lines
  Added in v.1.470


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