Diff for /loncom/interface/londocs.pm between versions 1.252 and 1.278.2.2

version 1.252, 2006/11/13 22:32:56 version 1.278.2.2, 2007/06/29 19:51:06
Line 42  use HTML::Entities; Line 42  use HTML::Entities;
 use GDBM_File;  use GDBM_File;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Cwd;  use Cwd;
 use LONCAPA;  use LONCAPA qw(:DEFAULT :match);
   
 my $iconpath;  my $iconpath;
   
Line 99  sub authorhosts { Line 99  sub authorhosts {
  $ca=$env{'user.name'};   $ca=$env{'user.name'};
  $cd=$env{'user.domain'};   $cd=$env{'user.domain'};
     } else {      } else {
  ($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/);   ($cd,$ca)=($realm=~/^\/($match_domain)\/($match_username)$/);
     }      }
     my $allowed=0;      my $allowed=0;
     my $myhome=&Apache::lonnet::homeserver($ca,$cd);      my $myhome=&Apache::lonnet::homeserver($ca,$cd);
Line 147  sub dumpcourse { Line 147  sub dumpcourse {
     my $type = &Apache::loncommon::course_type();      my $type = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space').      $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space').
       '<form name="dumpdoc" method="post">');        '<form name="dumpdoc" method="post">');
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$type.' DOCS 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 234  sub dumpcourse { Line 235  sub dumpcourse {
     my ($ext)=($_=~/\.(\w+)$/);      my ($ext)=($_=~/\.(\w+)$/);
     my $title=$hash{'title_'.$hash{      my $title=$hash{'title_'.$hash{
  'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};   'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};
     $title=~s/&colon;/:/g;  
     $r->print('<td>'.($title?$title:'&nbsp;').'</td>');      $r->print('<td>'.($title?$title:'&nbsp;').'</td>');
     if (!$title) {      if (!$title) {
  $title=$_;   $title=$_;
Line 315  sub exportcourse { Line 315  sub exportcourse {
             }              }
         }          }
         $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package'));          $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package'));
    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package'));
         $r->print($outcome);          $r->print($outcome);
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
     } else {      } else {
Line 364  sub exportcourse { Line 365  sub exportcourse {
             if (ref($curRes)) {              if (ref($curRes)) {
                 my $symb = $curRes->symb();                  my $symb = $curRes->symb();
                 my $ressymb = $symb;                  my $ressymb = $symb;
                 if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {                  if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) {
                     unless ($ressymb =~ m|adm/wrapper/adm|) {                      unless ($ressymb =~ m|adm/wrapper/adm|) {
                         $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';                          $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                     }                      }
Line 456  function containerCheck(item) { Line 457  function containerCheck(item) {
         |;          |;
  $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package',   $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package',
  $scripttag));   $scripttag));
    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package'));
  $r->print($display.'</table>'.   $r->print($display.'</table>'.
                   '<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="'.
Line 610  sub build_package { Line 612  sub build_package {
                         if (grep/^$count$/,@$discussions) {                          if (grep/^$count$/,@$discussions) {
                             my $ressymb = $symb;                              my $ressymb = $symb;
                             my $mode;                              my $mode;
                             if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {                              if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) {
                                 unless ($ressymb =~ m|adm/wrapper/adm|) {                                  unless ($ressymb =~ m|adm/wrapper/adm|) {
                                     $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';                                      $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                                 }                                  }
Line 695  sub process_content { Line 697  sub process_content {
         }          }
     } elsif ($symb =~ m-lib/templates/examupload\.problem$-) {      } elsif ($symb =~ m-lib/templates/examupload\.problem$-) {
         $content_type = 'examupload';          $content_type = 'examupload';
     } elsif ($symb =~ m-adm/(\w+)/(\w+)/(\d+)/bulletinboard$-) {      } elsif ($symb =~ m-adm/($match_domain)/($match_username)/(\d+)/bulletinboard$-) {
         $content_type = 'bulletinboard';          $content_type = 'bulletinboard';
         my $contents =  &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2);          my $contents =  &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2);
         if ($contents) {          if ($contents) {
Line 902  sub store_template { Line 904  sub store_template {
 # Imports the given (name, url) resources into the course  # Imports the given (name, url) resources into the course
 # coursenum, coursedom, and folder must precede the list  # coursenum, coursedom, and folder must precede the list
 sub group_import {  sub group_import {
     my $coursenum = shift;      my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;
     my $coursedom = shift;  
     my $folder = shift;      while (@files) {
     my $container = shift;   my $name = shift(@files);
     my $caller = shift;   my $url  = shift(@files);
     while (@_) {   #FIXME check if file exists before overwriting, might be restoring it
  my $name = shift;          if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) 
  my $url = shift;       && ($caller eq 'londocs')
         if (($url =~ m#^/uploaded/$coursedom/$coursenum/(default_\d+\.)(page|sequence)$#) && ($caller eq 'londocs')) {       && (!&Apache::lonnet::stat_file($url))) {
       
             my $errtext = '';              my $errtext = '';
             my $fatal = 0;              my $fatal = 0;
             my $newmapstr = '<map>'."\n".              my $newmapstr = '<map>'."\n".
Line 933  sub group_import { Line 936  sub group_import {
     my $idx = &LONCAPA::map::getresidx($url);      my $idx = &LONCAPA::map::getresidx($url);
     $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;      $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
     my $ext = 'false';      my $ext = 'false';
     if ($url=~/^http:\/\//) { $ext = 'true'; }      if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }
     $url =~ s/:/\&colon;/g;      $url  = &LONCAPA::map::qtunescape($url);
     $name =~ s/:/\&colon;/g;      $name = &LONCAPA::map::qtunescape($name);
     $LONCAPA::map::resources[$idx] =       $LONCAPA::map::resources[$idx] = 
  join ':', ($name, $url, $ext, 'normal', 'res');   join ':', ($name, $url, $ext, 'normal', 'res');
  }   }
Line 964  sub breadcrumbs { Line 967  sub breadcrumbs {
     my $randompick=-1;      my $randompick=-1;
     my $isencrypted=0;      my $isencrypted=0;
     my $ishidden=0;      my $ishidden=0;
       my $is_random_order=0;
     while (@folders) {      while (@folders) {
  my $folder=shift(@folders);   my $folder=shift(@folders);
  my $foldername=shift(@folders);   my $foldername=shift(@folders);
Line 973  sub breadcrumbs { Line 977  sub breadcrumbs {
     &escape($folderpath);      &escape($folderpath);
             my $name=&unescape($foldername);              my $name=&unescape($foldername);
 # randompick number, hidden, encrypted is appended with ":"s to the foldername  # randompick number, hidden, encrypted is appended with ":"s to the foldername
             $name=~s/\:(\d*)\:(\w*)\:(\w*)$//;              $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//;
             if ($1 ne '') {               if ($1 ne '') { 
                $randompick=$1;                 $randompick=$1;
             } else {              } else {
Line 981  sub breadcrumbs { Line 985  sub breadcrumbs {
             }              }
             if ($2) { $ishidden=1; }              if ($2) { $ishidden=1; }
             if ($3) { $isencrypted=1; }              if ($3) { $isencrypted=1; }
               if ($4 ne '') { $is_random_order = 1; }
     &Apache::lonhtmlcommon::add_breadcrumb(      &Apache::lonhtmlcommon::add_breadcrumb(
       {'href'=>$url.$cpinfo,        {'href'=>$url.$cpinfo,
        'title'=>$name,         'title'=>$name,
        'text'=>'<font size="+1">'.         'text'=>'<font size="+1">'.
    $name.'</font>'     $name.'</font>',
          'no_mt'=>1,
        });         });
  $plain.=$name.' &gt; ';   $plain.=$name.' &gt; ';
     }      }
     $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'),$randompick,$ishidden,$isencrypted,$plain);         'LC_docs_path'),$randompick,$ishidden,$isencrypted,$plain,$is_random_order);
 }  }
   
 sub log_docs {  sub log_docs {
Line 1025  sub log_docs { Line 1031  sub log_docs {
   
     sub log_differences {      sub log_differences {
         my ($plain)=@_;          my ($plain)=@_;
         my %storehash=('folder' => $plain);          my %storehash=('folder' => $plain,
                          'currentfolder' => $env{'form.folder'});
         if ($parmidx) {          if ($parmidx) {
            $storehash{'parameter_res'}=$oldresources[$parmidx];             $storehash{'parameter_res'}=$oldresources[$parmidx];
            foreach my $parm (keys %parmaction) {             foreach my $parm (keys %parmaction) {
Line 1060  sub log_docs { Line 1067  sub log_docs {
 #  #
 sub docs_change_log {  sub docs_change_log {
     my ($r)=@_;      my ($r)=@_;
       my $folder=$env{'form.folder'};
     $r->print(&Apache::loncommon::start_page('Course Document Change Log'));      $r->print(&Apache::loncommon::start_page('Course Document Change Log'));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log'));
                                                                                                                               
     my %docslog=&Apache::lonnet::dump('nohist_docslog',      my %docslog=&Apache::lonnet::dump('nohist_docslog',
                                       $env{'course.'.$env{'request.course.id'}.'.domain'},                                        $env{'course.'.$env{'request.course.id'}.'.domain'},
                                       $env{'course.'.$env{'request.course.id'}.'.num'});                                        $env{'course.'.$env{'request.course.id'}.'.num'});
                                                                                                                               
     if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); }      if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); }
                                                                                                                               
     $r->print('<form action="/adm/coursedocs" method="post" name="docslog">'.      $r->print('<form action="/adm/coursedocs" method="post" name="docslog">'.
               '<input type="hidden" name="docslog" value="1" />');                '<input type="hidden" name="docslog" value="1" />');
                                                                                                                               
     my %saveable_parameters = ('show' => 'scalar',);      my %saveable_parameters = ('show' => 'scalar',);
     &Apache::loncommon::store_course_settings('docs_log',      &Apache::loncommon::store_course_settings('docs_log',
                                               \%saveable_parameters);                                                \%saveable_parameters);
     &Apache::loncommon::restore_course_settings('docs_log',      &Apache::loncommon::restore_course_settings('docs_log',
                                                 \%saveable_parameters);                                                  \%saveable_parameters);
     if (!$env{'form.show'}) { $env{'form.show'}=10; }      if (!$env{'form.show'}) { $env{'form.show'}=10; }
                                                                                                                                   my %lt=('hiddenresource' => 'Resources hidden',
     my $countselect =      'encrypturl'     => 'URL hidden',
         &Apache::lonmeta::selectbox('show',$env{'form.show'},undef,      'randompick'     => 'Randomly pick',
                                     (&mt('all'),10,20,50,100,1000,10000));      'randomorder'    => 'Randomly ordered',
                                                                                                                                   'set'            => 'set to',
     $r->print('<nobr>'.&mt('[_1] Records',$countselect).'</nobr>'.      'del'            => 'deleted');
       $r->print(&Apache::loncommon::display_filter().
                 '<input type="hidden" name="folder" value="'.$folder.'" />'.
               '<input type="submit" value="'.&mt('Display').'" /></form>');                '<input type="submit" value="'.&mt('Display').'" /></form>');
     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().      $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
               '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Folder').'</th><th>'.&mt('Before').'</th><th>'.                '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Folder').'</th><th>'.&mt('Before').'</th><th>'.
Line 1091  sub docs_change_log { Line 1100  sub docs_change_log {
               &Apache::loncommon::end_data_table_header_row());                &Apache::loncommon::end_data_table_header_row());
     my $shown=0;      my $shown=0;
     foreach my $id (sort { $docslog{$b}{'exe_time'}<=>$docslog{$a}{'exe_time'} } (keys(%docslog))) {      foreach my $id (sort { $docslog{$b}{'exe_time'}<=>$docslog{$a}{'exe_time'} } (keys(%docslog))) {
    if ($env{'form.displayfilter'} eq 'currentfolder') {
       if ($docslog{$id}{'logentry'}{'currentfolder'} ne $folder) { next; }
    }
         my @changes=keys(%{$docslog{$id}{'logentry'}});          my @changes=keys(%{$docslog{$id}{'logentry'}});
           if ($env{'form.displayfilter'} eq 'containing') {
       my $wholeentry=$docslog{$id}{'exe_uname'}.':'.$docslog{$id}{'exe_udom'}.':'.
    &Apache::loncommon::plainname($docslog{$id}{'exe_uname'},$docslog{$id}{'exe_udom'});
       foreach my $key (@changes) {
    $wholeentry.=':'.$docslog{$id}{'logentry'}{$key};
       }
       if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }         
    }
         my $count = 0;          my $count = 0;
         my $time =          my $time =
             &Apache::lonlocal::locallocaltime($docslog{$id}{'exe_time'});              &Apache::lonlocal::locallocaltime($docslog{$id}{'exe_time'});
Line 1151  sub docs_change_log { Line 1171  sub docs_change_log {
  $r->print('</ul>');   $r->print('</ul>');
  if ($docslog{$id}{'logentry'}{'parameter_res'}) {   if ($docslog{$id}{'logentry'}{'parameter_res'}) {
     $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]') {      foreach my $parameter ('randompick','hiddenresource','encrypturl','randomorder') {
  if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) {   if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) {
     $r->print('<li>'.$parameter.' '.$docslog{$id}{'logentry'}{'parameter_action_'.$parameter}.' '.      $r->print('<li>'.
       $docslog{$id}{'logentry'}{'parameter_value_'.$parameter}.'</li>');        &mt($lt{$parameter}.' '.$lt{$docslog{$id}{'logentry'}{'parameter_action_'.$parameter}}.' [_1]',
     $docslog{$id}{'logentry'}{'parameter_value_'.$parameter})
         .'</li>');
  }   }
     }      }
     $r->print('</ul>');      $r->print('</ul>');
Line 1191  sub editor { Line 1213  sub editor {
  $env{'form.markedcopy_title'}=$title;   $env{'form.markedcopy_title'}=$title;
  $env{'form.markedcopy_url'}=$url;   $env{'form.markedcopy_url'}=$url;
     }      }
     my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain)=&breadcrumbs($folder);      my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order)=&breadcrumbs($folder);
     $r->print($breadcrumbtrail);      $r->print($breadcrumbtrail);
     if ($fatal) {      if ($fatal) {
    $r->print('<p><font color="red">'.$errtext.'</font></p>');     $r->print('<p><font color="red">'.$errtext.'</font></p>');
Line 1205  sub editor { Line 1227  sub editor {
     if ($env{'form.changeparms'}) {      if ($env{'form.changeparms'}) {
  my $idx=$env{'form.setparms'};   my $idx=$env{'form.setparms'};
 # set parameters  # set parameters
  if ($env{'form.randpick_'.$idx}) {   if ($env{'form.changeparms'} eq 'randompick') {
     &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');      if ($env{'form.randpick_'.$idx}) {
                     &remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx});   &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
  } else {   &remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx});
     &LONCAPA::map::delparameter($idx,'parameter_randompick');      } else {
                     &remember_parms($idx,'randompick','del');   &LONCAPA::map::delparameter($idx,'parameter_randompick');
    &remember_parms($idx,'randompick','del');
       }
    }
    if ($env{'form.changeparms'} eq 'hiddenresource') {
       if ($env{'form.hidprs_'.$idx}) {
    &LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
    &remember_parms($idx,'hiddenresource','set',$env{'form.hidprs_'.$idx});
       } else {
    &LONCAPA::map::delparameter($idx,'parameter_hiddenresource');
    &remember_parms($idx,'hiddenresource','del');
       }
    }
    if ($env{'form.changeparms'} eq 'encrypturl') {
       if ($env{'form.encprs_'.$idx}) {
    &LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
    &remember_parms($idx,'encrypturl','set',$env{'form.encprs_'.$idx});
       } else {
    &LONCAPA::map::delparameter($idx,'parameter_encrypturl');
    &remember_parms($idx,'encrypturl','del');
       }
    }
    if ($env{'form.changeparms'} eq 'randomorder') {
       if ($env{'form.randorder_'.$idx}) {
    &LONCAPA::map::storeparameter($idx,'parameter_randomorder','yes','string_yesno');
    &remember_parms($idx,'randomorder','set',$env{'form.randorder_'.$idx});
       } else {
    &LONCAPA::map::delparameter($idx,'parameter_randomorder');
    &remember_parms($idx,'randomorder','del');
       }
  }   }
  if ($env{'form.hidprs_'.$idx}) {  
     &LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');  
                     &remember_parms($idx,'hiddenresource','set',$env{'form.hidprs_'.$idx});  
   } else {  
     &LONCAPA::map::delparameter($idx,'parameter_hiddenresource');  
                     &remember_parms($idx,'hiddenresource','del');  
   }  
  if ($env{'form.encprs_'.$idx}) {  
     &LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');  
                     &remember_parms($idx,'encrypturl','set',$env{'form.encprs_'.$idx});  
   } else {  
     &LONCAPA::map::delparameter($idx,'parameter_encrypturl');  
                     &remember_parms($idx,'encrypturl','del');  
   }  
 # store the changed version  # store the changed version
  ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);   ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
  if ($fatal) {   if ($fatal) {
Line 1285  sub editor { Line 1322  sub editor {
     $url=~/^(.+)\.(\w+)$/;      $url=~/^(.+)\.(\w+)$/;
     my $newurl=$1.$newid.'.'.$2;      my $newurl=$1.$newid.'.'.$2;
     my $storefn=$newurl;      my $storefn=$newurl;
                     $storefn=~s/^\/\w+\/\w+\/\w+\///;                      $storefn=~s{^/\w+/$match_domain/$match_username/}{};
     &Apache::lonclonecourse::writefile      &Apache::lonclonecourse::writefile
  ($env{'request.course.id'},$storefn,   ($env{'request.course.id'},$storefn,
  &Apache::lonnet::getfile($url));   &Apache::lonnet::getfile($url));
     $url=$newurl;      $url=$newurl;
  }   }
  $title=~s/\</\&lt\;/g;   $title = &LONCAPA::map::qtunescape($title);
  $title=~s/\>/\&gt\;/g;  
  $title=~s/\:/\&colon;/g;  
  my $ext='false';   my $ext='false';
  if ($url=~/^http\:\/\//) { $ext='true'; }   if ($url=~/^http\:\/\//) { $ext='true'; }
  $url=~s/\:/\&colon;/g;   $url   = &LONCAPA::map::qtunescape($url);
 # Now insert the URL at the bottom  # Now insert the URL at the bottom
                 my $newidx=&LONCAPA::map::getresidx($url);                  my $newidx=&LONCAPA::map::getresidx($url);
  $LONCAPA::map::resources[$newidx]=   $LONCAPA::map::resources[$newidx]=
Line 1348  sub editor { Line 1383  sub editor {
                     my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];                      my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
                     my ($rtitle,@rrest)=split(/\:/,                      my ($rtitle,@rrest)=split(/\:/,
                        $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);                         $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
                     my $comment=                      my $comment=$env{'form.title'};
                      &HTML::Entities::decode($env{'form.title'});                      $comment = &LONCAPA::map::qtunescape($comment);
                     $comment=~s/\</\&lt\;/g;  
                     $comment=~s/\>/\&gt\;/g;  
                     $comment=~s/\:/\&colon;/g;  
     if ($comment=~/\S/) {      if ($comment=~/\S/) {
  $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=   $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
     $comment.':'.join(':',@rrest);      $comment.':'.join(':',@rrest);
     }      }
 # Devalidate title cache  # Devalidate title cache
                     my $renamed_url=$rrest[0];                      my $renamed_url=&LONCAPA::map::qtescape($rrest[0]);
 # Has the &colon;-escaping  
                     $renamed_url=~s/\&colon\;/\:/g;  
     &Apache::lonnet::devalidate_title_cache($renamed_url);      &Apache::lonnet::devalidate_title_cache($renamed_url);
                 }                  }
 # Store the changed version  # Store the changed version
Line 1417  sub editor { Line 1447  sub editor {
 # ---------------------------------------------------------------- Print screen  # ---------------------------------------------------------------- Print screen
         my $idx=0;          my $idx=0;
  my $shown=0;   my $shown=0;
         if (($ishidden) || ($isencrypted) || ($randompick>=0)) {          if (($ishidden) || ($isencrypted) || ($randompick>=0) 
       || ($is_random_order)) {
            $r->print('<p>'.&mt('Parameters').':<ul>'.             $r->print('<p>'.&mt('Parameters').':<ul>'.
                      ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').                       ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').
                        ($is_random_order?'<li>'.&mt('contents randomly ordered').'</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>');                       '</ul></p>');
         }                                                                                                               }
         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>'.&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>');
         }          }
           if ($is_random_order) {
              $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. Do not modify the contents of this folder if it is in active student use.').'</p>');
           }
         $r->print('<table>');          $r->print('<table>');
         foreach (@LONCAPA::map::order) {          foreach my $res (@LONCAPA::map::order) {
            my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$_]);             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,$_,$coursenum));             $r->print(&entryline($idx,$name,$url,$folder,$allowed,$res,
    $coursenum));
            $idx++;             $idx++;
    $shown++;     $shown++;
         }          }
Line 1448  sub editor { Line 1484  sub editor {
 <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />  <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
 <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />  <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
 ENDPASTE  ENDPASTE
             $r->print(              $r->print('<input type="submit" name="pastemarked" value="'.&mt('Paste').'" /> ');
    '<input type="submit" name="pastemarked" value="'.&mt('Paste').  
       '" /> '.&Apache::loncommon::filedescription(      my $type;
  (split(/\./,$env{'form.markedcopy_url'}))[-1]).': '.      if ($env{'form.markedcopy_url'} =~ m{^/adm/wrapper/ext}) {
       $env{'form.markedcopy_title'});   $type = &mt('External Resource');
    $r->print($type.': '. $env{'form.markedcopy_title'});
       }  else {
    my $extension = (split(/\./,$env{'form.markedcopy_url'}))[-1];
    my $type = &Apache::loncommon::filedescription($extension);
    my $icon = '<img src="'.&Apache::loncommon::icon($extension).
       '" class="LC_icon" />';
    $r->print($icon.$type.': '. $env{'form.markedcopy_title'});
       }
             if ($container eq 'page') {              if ($container eq 'page') {
  $r->print(<<PAGEINFO);   $r->print(<<PAGEINFO);
 <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />  <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
Line 1514  sub process_file_upload { Line 1558  sub process_file_upload {
  $codebase);   $codebase);
         my $ext='false';          my $ext='false';
         if ($url=~/^http\:\/\//) { $ext='true'; }          if ($url=~/^http\:\/\//) { $ext='true'; }
         $url=~s/\:/\&colon;/g;   $url     = &LONCAPA::map::qtunescape($url);
         my $comment=$env{'form.comment'};          my $comment=$env{'form.comment'};
         $comment=~s/\</\&lt\;/g;   $comment = &LONCAPA::map::qtunescape($comment);
         $comment=~s/\>/\&gt\;/g;  
         $comment=~s/\:/\&colon;/g;  
         if ($folder=~/^supplemental/) {          if ($folder=~/^supplemental/) {
               $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.                $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                   $env{'user.domain'}.'___&&&___'.$comment;                    $env{'user.domain'}.'___&&&___'.$comment;
Line 1537  sub process_file_upload { Line 1579  sub process_file_upload {
                 my $total_embedded = keys(%{$allfiles});                  my $total_embedded = keys(%{$allfiles});
                 if ($total_embedded > 0) {                  if ($total_embedded > 0) {
                     my $num = 0;                      my $num = 0;
                     $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />      my $state = '
    <form name="upload_embedded" action="/adm/coursedocs"     <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" />
                   method="post" enctype="multipart/form-data">     <input type="hidden" name="cmd" value="upload_embedded" />
    <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" />   <input type="hidden" name="cmd" value="upload_embedded" />  
    <input type="hidden" name="newidx" value="'.$newidx.'" />     <input type="hidden" name="newidx" value="'.$newidx.'" />
    <input type="hidden" name="primaryurl" value="'.&escape($url).'" />     <input type="hidden" name="primaryurl" value="'.&escape($url).'" />
    <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';     <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
                     $$upload_output .= '<b>Upload embedded files</b>:<br />      $phase_status = 'phasetwo';
    <table>';  
                     foreach my $embed_file (keys(%{$allfiles})) {                      $$upload_output .= 
                         $$upload_output .= '<tr><td>'.$embed_file.   'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />'.
           '<input name="embedded_item_'.$num.'" type="file" />   &ask_for_embedded_content('/adm/coursedocs',
            <input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />';    $state,$allfiles,$codebase);
                         my $attrib;  
                         if (@{$$allfiles{$embed_file}} > 1) {  
                             $attrib = join(':',@{$$allfiles{$embed_file}});  
                         } else {  
                             $attrib = $$allfiles{$embed_file}[0];  
                         }  
                         $$upload_output .=  
            '<input name="embedded_attrib_'.$num.'" type="hidden" value="'.$attrib.'" />';  
                         if (exists($$codebase{$embed_file})) {  
                             $$upload_output .=   
           '<input name="codebase_'.$num.'" type="hidden" value="'.&escape($$codebase{$embed_file}).'" />';  
                         }  
                         $$upload_output .= '</td></tr>';  
                         $num ++;  
                     }  
                     $phase_status = 'phasetwo';  
                     $$upload_output .= '</table><br />  
    <input type ="submit" value="Complete upload" />  
    </form>';  
                 } else {                  } else {
                     $$upload_output .= 'No embedded items identified<br />';                      $$upload_output .= 'No embedded items identified<br />';
                 }                  }
Line 1578  sub process_file_upload { Line 1600  sub process_file_upload {
     return $phase_status;      return $phase_status;
 }  }
   
   sub ask_for_embedded_content {
       my ($actionurl,$state,$allfiles,$codebase,$args)=@_;
       my $upload_output = '
      <form name="upload_embedded" action="'.$actionurl.'"
                     method="post" enctype="multipart/form-data">';
       $upload_output .= $state;
       $upload_output .= '<b>Upload embedded files</b>:<br />'.
    &Apache::loncommon::start_data_table();
   
       my $num = 0;
       foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%{$allfiles})) {
    $upload_output .= &Apache::loncommon::start_data_table_row().
       '<td>'.$embed_file.'</td><td>';
    if ($args->{'ignore_remote_references'}
       && $embed_file =~ m{^\w+://}) {
       $upload_output.='<span class="LC_warning">'.&mt("URL points to other server.").'</span>';
    } elsif ($args->{'error_on_invalid_names'}
       && $embed_file ne &Apache::lonnet::clean_filename($embed_file,{'keep_path' => 1,})) {
       
       $upload_output.='<span class="LC_warning">'.&mt("Invalid characters").'</span>';
       
    } else {
   
       $upload_output .='
              <input name="embedded_item_'.$num.'" type="file" value="bob" />
              <input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />';
       my $attrib = join(':',@{$$allfiles{$embed_file}});
       $upload_output .=
    "\n\t\t".
    '<input name="embedded_attrib_'.$num.'" type="hidden" value="'.
    $attrib.'" />';
       if (exists($$codebase{$embed_file})) {
    $upload_output .= 
       "\n\t\t".
       '<input name="codebase_'.$num.'" type="hidden" value="'.
       &escape($$codebase{$embed_file}).'" />';
       }
    }
    $upload_output .= '</td>'.&Apache::loncommon::end_data_table_row();
    $num++;
       }
       $upload_output .= &Apache::loncommon::end_data_table().'<br />
      <input type ="hidden" name="number_embedded_items" value="'.$num.'" />
      <input type ="submit" value="'.&mt('Upload Listed Files').'" />
      '.&mt('(only files for which a location has been provided will be uploaded)').'
      </form>';
       return $upload_output;
   }
   
 sub process_secondary_uploads {  sub process_secondary_uploads {
     my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;      my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
     my $folder=$env{'form.folder'};      my $folder=$env{'form.folder'};
Line 1593  sub process_secondary_uploads { Line 1664  sub process_secondary_uploads {
     $destination .= $newidx;      $destination .= $newidx;
     my ($url,$filename);      my ($url,$filename);
     $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);      $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
     ($filename) = ($url =~ m-^/uploaded/$coursedom/$coursenum/$destination/(.+)$-);      ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$});
     return $filename;      return $filename;
 }  }
   
Line 1601  sub process_secondary_uploads { Line 1672  sub process_secondary_uploads {
   
 sub entryline {  sub entryline {
     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;      my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
     $title=~s/\&colon\;/\:/g;      $title=&HTML::Entities::encode($title,'"<>&\'');
     $title=&HTML::Entities::encode(&HTML::Entities::decode(  
      &unescape($title)),'"<>&\'');  
     my $renametitle=$title;      my $renametitle=$title;
     my $foldertitle=$title;      my $foldertitle=$title;
     my $pagetitle=$title;      my $pagetitle=$title;
     my $orderidx=$LONCAPA::map::order[$index];      my $orderidx=$LONCAPA::map::order[$index];
     if ($title=~ /^(\d+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(.*)$/ ) {       if ($title=~ /^(\d+)___&amp;&amp;&amp;___($match_username)___&amp;&amp;&amp;___($match_domain)___&amp;&amp;&amp;___(.*)$/ ) { 
  $foldertitle=&Apache::lontexconvert::msgtexconverted($4);   $foldertitle=&Apache::lontexconvert::msgtexconverted($4);
  $renametitle=$4;   $renametitle=$4;
  $title='<i>'.&Apache::lonlocal::locallocaltime($1).'</i> '.   $title='<i>'.&Apache::lonlocal::locallocaltime($1).'</i> '.
Line 1670  sub entryline { Line 1739  sub entryline {
  'rn' => 'Rename',   'rn' => 'Rename',
  'cp' => 'Copy');   'cp' => 'Copy');
  my $nocopy=0;   my $nocopy=0;
           my $nocut=0;
         if ($url=~/\.(page|sequence)$/) {          if ($url=~/\.(page|sequence)$/) {
     foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) {      foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) {
  my ($title,$url,$ext,$type)=split(/\:/,$_);   my ($title,$url,$ext,$type)=split(/\:/,$_);
Line 1679  sub entryline { Line 1749  sub entryline {
  }   }
     }      }
  }   }
           if ($url=~/^\/res\/lib\/templates\//) { 
              $nocopy=1; 
              $nocut=1;
           }
         my $copylink='&nbsp;';          my $copylink='&nbsp;';
           my $cutlink='&nbsp;';
         if ($env{'form.pagepath'}) {          if ($env{'form.pagepath'}) {
            unless ($nocopy) {             if (!$nocopy) {
                $copylink=(<<ENDCOPY);                 $copylink=(<<ENDCOPY);
 <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>  <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#000099">$lt{'cp'}</font></a></td>  <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
 ENDCOPY  ENDCOPY
              }
              if (!$nocut) {
                  $cutlink=(<<ENDCUT);
   <a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
   <font size="-2" color="#550044">$lt{'ct'}</font></a>
   ENDCUT
             }              }
             $line.=(<<END);              $line.=(<<END);
 <form name="entry_$index" action="/adm/coursedocs" method="post">  <form name="entry_$index" action="/adm/coursedocs" method="post">
Line 1707  ENDCOPY Line 1788  ENDCOPY
 </td><td bgcolor="#DDDDDD">  </td><td bgcolor="#DDDDDD">
 <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>  <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#990000">$lt{'rm'}</font></a>  <font size="-2" color="#990000">$lt{'rm'}</font></a>
 <a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>  $cutlink
 <font size="-2" color="#550044">$lt{'ct'}</font></a>  
 <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>  <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#009900">$lt{'rn'}</font></a>  <font size="-2" color="#009900">$lt{'rn'}</font></a>
 $copylink  $copylink
 END  END
         } else {          } else {
            unless ($nocopy) {             if (!$nocopy) {
                $copylink=(<<ENDCOPY);                 $copylink=(<<ENDCOPY);
 <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>  <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>
 <font size="-2" color="#000099">$lt{'cp'}</font></a></td>  <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
 ENDCOPY  ENDCOPY
             }              }
               if (!$nocut) {
                  $cutlink=(<<ENDCUT);
   <a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
   <font size="-2" color="#550044">$lt{'ct'}</font></a>
   ENDCUT
               }
             $line.=(<<END);               $line.=(<<END); 
 <form name="entry_$index" action="/adm/coursedocs" method="post">  <form name="entry_$index" action="/adm/coursedocs" method="post">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
Line 1739  ENDCOPY Line 1825  ENDCOPY
 </td><td bgcolor="#DDDDDD">  </td><td bgcolor="#DDDDDD">
 <a href='javascript:removeres("$folderpath","$index","$renametitle","sequence");'>  <a href='javascript:removeres("$folderpath","$index","$renametitle","sequence");'>
 <font size="-2" color="#990000">$lt{'rm'}</font></a>  <font size="-2" color="#990000">$lt{'rm'}</font></a>
 <a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>  $cutlink
 <font size="-2" color="#550044">$lt{'ct'}</font></a>  
 <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'>  <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'>
 <font size="-2" color="#009900">$lt{'rn'}</font></a>  <font size="-2" color="#009900">$lt{'rn'}</font></a>
 $copylink  $copylink
Line 1759  END Line 1844  END
     if ($uploaded) {      if ($uploaded) {
  if ($extension eq 'sequence') {   if ($extension eq 'sequence') {
     $icon=$iconpath.'/folder_closed.gif';      $icon=$iconpath.'/folder_closed.gif';
     $url=~/$coursenum\/([\/\w]+)\.sequence$/;      $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/;
     $url='/adm/coursedocs?';      $url='/adm/coursedocs?';
     $folderarg=$1;      $folderarg=$1;
     $isfolder=1;      $isfolder=1;
         } elsif ($extension eq 'page') {          } elsif ($extension eq 'page') {
             $icon=$iconpath.'/page.gif';              $icon=$iconpath.'/page.gif';
             $url=~/$coursenum\/([\/\w]+)\.page$/;              $url=~/\Q$coursenum\E\/([\/\w]+)\.page$/;
             $pagearg=$1;              $pagearg=$1;
             $url='/adm/coursedocs?';              $url='/adm/coursedocs?';
             $ispage=1;              $ispage=1;
Line 1809  END Line 1894  END
     $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);      $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
  }   }
     }      }
     my $parameterset='&nbsp;';      my ($parameterset,$rand_order_text) = ('&nbsp;', '&nbsp;');
     if ($isfolder || $extension eq 'sequence') {      if ($isfolder || $extension eq 'sequence') {
  my $foldername=&escape($foldertitle);   my $foldername=&escape($foldertitle);
  my $folderpath=$env{'form.folderpath'};   my $folderpath=$env{'form.folderpath'};
Line 1821  END Line 1906  END
                                                .':'.((&LONCAPA::map::getparameter($orderidx,                                                 .':'.((&LONCAPA::map::getparameter($orderidx,
                                               'parameter_hiddenresource'))[0]=~/^yes$/i)                                                'parameter_hiddenresource'))[0]=~/^yes$/i)
                                                .':'.((&LONCAPA::map::getparameter($orderidx,                                                 .':'.((&LONCAPA::map::getparameter($orderidx,
                                               'parameter_encrypturl'))[0]=~/^yes$/i);                                                'parameter_encrypturl'))[0]=~/^yes$/i)
                                                  .':'.((&LONCAPA::map::getparameter($orderidx,
                                                 'parameter_randomorder'))[0]=~/^yes$/i);
  $url.='folderpath='.&escape($folderpath).$cpinfo;   $url.='folderpath='.&escape($folderpath).$cpinfo;
  $parameterset='<label>'.&mt('Randomly Pick: ').   $parameterset='<label>'.&mt('Randomly Pick: ').
     '<input type="text" size="4" onChange="this.form.changeparms.value=1;this.form.submit()" name="randpick_'.$orderidx.'" value="'.      '<input type="text" size="4" onChange="this.form.changeparms.value='."'randompick'".';this.form.submit()" name="randpick_'.$orderidx.'" value="'.
     (&LONCAPA::map::getparameter($orderidx,      (&LONCAPA::map::getparameter($orderidx,
                                               'parameter_randompick'))[0].                                                'parameter_randompick'))[0].
                                               '" />'.                                                '" />'.
 '<font size="-2"><a href="javascript:void(0)">'.&mt('Store').'</a></font></label>';  '<font size="-2"><a href="javascript:void(0)">'.&mt('Save').'</a></font></label>';
                 
    my $ro_set=
       ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');
    $rand_order_text ='
   <nobr><label><input type="checkbox" name="randorder_$orderidx" onClick="this.form.changeparms.value=\'randomorder\';this.form.submit()" '.$ro_set.' /> '.&mt('Random Order').' </label></nobr>';
     }      }
     if ($ispage) {      if ($ispage) {
         my $pagename=&escape($pagetitle);          my $pagename=&escape($pagetitle);
Line 1858  END Line 1949  END
        'hd' => 'Hidden',         'hd' => 'Hidden',
        'ec' => 'URL hidden');         'ec' => 'URL hidden');
  my $enctext=   my $enctext=
     ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');      ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="checked"':'');
  my $hidtext=   my $hidtext=
     ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');      ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="checked"':'');
   
  $line.=(<<ENDPARMS);   $line.=(<<ENDPARMS);
 <td bgcolor="#BBBBFF"><font size='-2'>  <td bgcolor="#BBBBFF"><font size='-2'>
 <nobr><label><input type="checkbox" name="hidprs_$orderidx" onClick="this.form.changeparms.value=1;this.form.submit()" $hidtext /> $lt{'hd'}</label></nobr></td>  <nobr><label><input type="checkbox" name="hidprs_$orderidx" onClick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label></nobr></td>
 <td bgcolor="#BBBBFF"><font size='-2'>  <td bgcolor="#BBBBFF"><font size='-2'>
 <nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.changeparms.value=1;this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>  <nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
   <td bgcolor="#BBBBFF"><font size="-2">$rand_order_text</font></td>
 <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>  <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
 ENDPARMS  ENDPARMS
     }      }
Line 1979  sub list_symbs { Line 2072  sub list_symbs {
     my ($r) = @_;      my ($r) = @_;
   
     $r->print(&Apache::loncommon::start_page('Symb List'));      $r->print(&Apache::loncommon::start_page('Symb List'));
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List'));
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     $r->print("<pre>\n");      $r->print("<pre>\n");
     foreach my $res ($navmap->retrieveResources()) {      foreach my $res ($navmap->retrieveResources()) {
Line 1998  sub verifycontent { Line 2092  sub verifycontent {
    my $loaderror=&Apache::lonnet::overloaderror($r);     my $loaderror=&Apache::lonnet::overloaderror($r);
    if ($loaderror) { return $loaderror; }     if ($loaderror) { return $loaderror; }
    $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));     $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$type.' Documents'));
    $hashtied=0;     $hashtied=0;
    undef %alreadyseen;     undef %alreadyseen;
    %alreadyseen=();     %alreadyseen=();
Line 2033  sub checkversions { Line 2128  sub checkversions {
     my ($r) = @_;      my ($r) = @_;
     my $type = &Apache::loncommon::course_type();      my $type = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));      $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
       $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $type Document Versions"));
     my $header='';      my $header='';
     my $startsel='';      my $startsel='';
     my $monthsel='';      my $monthsel='';
Line 2084  sub checkversions { Line 2180  sub checkversions {
         if (&Apache::lonnet::put('resourceversions',\%newsetversions,          if (&Apache::lonnet::put('resourceversions',\%newsetversions,
   $env{'course.'.$env{'request.course.id'}.'.domain'},    $env{'course.'.$env{'request.course.id'}.'.domain'},
   $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {    $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
     $r->print('<h1>'.&mt('Your Version Settings have been Stored').'</h1>');      $r->print('<h1>'.&mt('Your Version Settings have been Saved').'</h1>');
  } else {   } else {
     $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Store your Version Settings').'</font></h1>');      $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Save your Version Settings').'</font></h1>');
  }   }
  &mark_hash_old();   &mark_hash_old();
     }      }
Line 2324  sub changewarning { Line 2420  sub changewarning {
 $help{'Caching'}.'</font></h3></form>'."\n\n");  $help{'Caching'}.'</font></h3></form>'."\n\n");
 }  }
   
   # =========================================== Breadcrumbs for special functions
   
   sub init_breadcrumbs {
       my ($form,$text)=@_;
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs",
       text=>&Apache::loncommon::course_type()." Documents",
       faq=>273,
       bug=>'Instructor Interface',
                                               help => 'Docs_Adding_Course_Doc'});
       &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',
       text=>$text,
       faq=>273,
       bug=>'Instructor Interface'});
   }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
Line 2352  sub handler { Line 2464  sub handler {
     'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');      'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
     $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(      $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
   'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');    'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
       $help{'Group Files'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');      $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
   
 # does this user have privileges to modify docs  # does this user have privileges to modify docs
     my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});      my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
   
   if ($allowed && $env{'form.verify'}) {    if ($allowed && $env{'form.verify'}) {
         &init_breadcrumbs('verify','Verify Content');
       &verifycontent($r);        &verifycontent($r);
   } elsif ($allowed && $env{'form.listsymbs'}) {    } elsif ($allowed && $env{'form.listsymbs'}) {
         &init_breadcrumbs('listsymbs','List Symbs');
       &list_symbs($r);        &list_symbs($r);
   } elsif ($allowed && $env{'form.docslog'}) {    } elsif ($allowed && $env{'form.docslog'}) {
         &init_breadcrumbs('docslog','Show Log');
       &docs_change_log($r);        &docs_change_log($r);
   } elsif ($allowed && $env{'form.versions'}) {    } elsif ($allowed && $env{'form.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');
       &dumpcourse($r);        &dumpcourse($r);
   } elsif ($allowed && $env{'form.exportcourse'}) {    } elsif ($allowed && $env{'form.exportcourse'}) {
         &init_breadcrumbs('exportcourse','Export '.&Apache::loncommon::course_type().' to IMS');
       &exportcourse($r);        &exportcourse($r);
   } else {    } else {
 # is this a standard course?  # is this a standard course?
Line 2441  sub handler { Line 2559  sub handler {
   my %codebase = ();    my %codebase = ();
   my ($upload_result,$upload_output);    my ($upload_result,$upload_output);
   if ($allowed) {    if ($allowed) {
       if (($env{'form.uploaddoc.filename'}) &&                                               ($env{'form.cmd'}=~/^upload_(\w+)/)) {        if (($env{'form.uploaddoc.filename'}) &&
     ($env{'form.cmd'}=~/^upload_(\w+)/)) {
 # Process file upload - phase one - upload and parse primary file.    # Process file upload - phase one - upload and parse primary file.  
           $upload_result = &process_file_upload(\$upload_output,$coursenum,            $upload_result = &process_file_upload(\$upload_output,$coursenum,
  $coursedom,\%allfiles,   $coursedom,\%allfiles,
Line 2546  sub handler { Line 2665  sub handler {
                 'scuf' => 'Score Upload Form',                  'scuf' => 'Score Upload Form',
                 'bull' => 'Bulletin Board',                  'bull' => 'Bulletin Board',
                 'mypi' => 'My Personal Info',                  'mypi' => 'My Personal Info',
                   'grpo' => 'Group Files',
  'abou' => 'About User',   'abou' => 'About User',
                 'imsf' => 'Import IMS package',                  'imsf' => 'Import IMS package',
                 'file' =>  'File',                  'file' =>  'File',
Line 2585  sub handler { Line 2705  sub handler {
 $containertag  $containertag
 </form>  </form>
 <form name="simpleedit" method="post" action="/adm/coursedocs">  <form name="simpleedit" method="post" action="/adm/coursedocs">
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 $uploadtag  $uploadtag
 </form>  </form>
 <form action="/adm/coursedocs" method="post" name="courseverify">  <form action="/adm/coursedocs" method="post" name="courseverify">
Line 2599  $exportbut Line 2719  $exportbut
 </td><td bgcolor="#DDDDCC">  </td><td bgcolor="#DDDDCC">
     <input type="submit" name="listsymbs" value="$lt{'ls'}" />      <input type="submit" name="listsymbs" value="$lt{'ls'}" />
 </td><td bgcolor="#DDDDCC">  </td><td bgcolor="#DDDDCC">
       <input type="hidden" name="folder" value="$env{'form.folder'}" />
     <input type="submit" name="docslog" value="$lt{'sl'}" />      <input type="submit" name="docslog" value="$lt{'sl'}" />
 </td></tr></table>  </td></tr></table>
 </form>  </form>
Line 2699  ENDFORM Line 2820  ENDFORM
 <hr />  <hr />
 <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="" />
 <nobr>  <nobr>
 <input name="newext" type="button" onClick="javascript:makenewext('newext');"  <input name="newext" type="button" onClick="javascript:makenewext('newext');"
 value="$lt{'extr'}" /> $help{'Adding_External_Resource'}  value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
Line 2717  ENDFORM Line 2838  ENDFORM
            $r->print(<<ENDFORM);             $r->print(<<ENDFORM);
 <br /><form action="/adm/coursedocs" method="post" name="newfolder">  <br /><form action="/adm/coursedocs" method="post" name="newfolder">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>  <nobr>
 <input name="newfolder" type="button"  <input name="newfolder" type="button"
 onClick="javascript:makenewfolder(this.form,'$folderseq');"  onClick="javascript:makenewfolder(this.form,'$folderseq');"
Line 2726  value="$lt{'newf'}" />$help{'Adding_Fold Line 2847  value="$lt{'newf'}" />$help{'Adding_Fold
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="newpage">  <br /><form action="/adm/coursedocs" method="post" name="newpage">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>  <nobr>
 <input name="newpage" type="button"  <input name="newpage" type="button"
 onClick="javascript:makenewpage(this.form,'$pageseq');"  onClick="javascript:makenewpage(this.form,'$pageseq');"
Line 2735  value="$lt{'newp'}" />$help{'Adding_Page Line 2856  value="$lt{'newp'}" />$help{'Adding_Page
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="newsyl">  <br /><form action="/adm/coursedocs" method="post" name="newsyl">
 $uploadtag  $uploadtag
 <input type=hidden name="importdetail"   <input type="hidden" name="importdetail" 
 value="Syllabus=/public/$coursedom/$coursenum/syllabus">  value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
 <nobr>  <nobr>
 <input name="newsyl" type="submit" value="$lt{'syll'}" />   <input name="newsyl" type="submit" value="$lt{'syll'}" /> 
  $help{'Syllabus'}   $help{'Syllabus'}
Line 2744  value="Syllabus=/public/$coursedom/$cour Line 2865  value="Syllabus=/public/$coursedom/$cour
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="newnav">  <br /><form action="/adm/coursedocs" method="post" name="newnav">
 $uploadtag  $uploadtag
 <input type=hidden name="importdetail"   <input type="hidden" name="importdetail" 
 value="Navigate Content=/adm/navmaps">  value="Navigate Content=/adm/navmaps" />
 <nobr>  <nobr>
 <input name="newnav" type="submit" value="$lt{'navc'}" />  <input name="newnav" type="submit" value="$lt{'navc'}" />
 $help{'Navigate_Content'}  $help{'Navigate_Content'}
Line 2753  $help{'Navigate_Content'} Line 2874  $help{'Navigate_Content'}
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="newsmppg">  <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
 $uploadtag  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>  <nobr>
 <input name="newsmppg" type="button" value="$lt{'sipa'}"  <input name="newsmppg" type="button" value="$lt{'sipa'}"
 onClick="javascript:makesmppage();" /> $help{'Simple Page'}  onClick="javascript:makesmppage();" /> $help{'Simple Page'}
Line 2761  onClick="javascript:makesmppage();" /> $ Line 2882  onClick="javascript:makesmppage();" /> $
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">  <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
 $uploadtag  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>  <nobr>
 <input name="newsmpproblem" type="button" value="$lt{'sipr'}"  <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
 onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}  onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
Line 2769  onClick="javascript:makesmpproblem();" / Line 2890  onClick="javascript:makesmpproblem();" /
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="newdropbox">  <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
 $uploadtag        $uploadtag      
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>            <nobr>          
 <input name="newdropbox" type="button" value="$lt{'drbx'}"  <input name="newdropbox" type="button" value="$lt{'drbx'}"
 onClick="javascript:makedropbox();" />  onClick="javascript:makedropbox();" />
Line 2777  onClick="javascript:makedropbox();" /> Line 2898  onClick="javascript:makedropbox();" />
 </form>   </form> 
 <br /><form action="/adm/coursedocs" method="post" name="newexamupload">  <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
 $uploadtag  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>  <nobr>
 <input name="newexamupload" type="button" value="$lt{'scuf'}"  <input name="newexamupload" type="button" value="$lt{'scuf'}"
 onClick="javascript:makeexamupload();" />  onClick="javascript:makeexamupload();" />
Line 2786  $help{'Score_Upload_Form'} Line 2907  $help{'Score_Upload_Form'}
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="newbul">  <br /><form action="/adm/coursedocs" method="post" name="newbul">
 $uploadtag  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>  <nobr>
 <input name="newbulletin" type="button" value="$lt{'bull'}"  <input name="newbulletin" type="button" value="$lt{'bull'}"
 onClick="javascript:makebulboard();" />  onClick="javascript:makebulboard();" />
Line 2795  $help{'Bulletin Board'} Line 2916  $help{'Bulletin Board'}
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="newaboutme">  <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
 $uploadtag  $uploadtag
 <input type=hidden name="importdetail"   <input type="hidden" name="importdetail" 
 value="$plainname=/adm/$udom/$uname/aboutme">  value="$plainname=/adm/$udom/$uname/aboutme" />
 <nobr>  <nobr>
 <input name="newaboutme" type="submit" value="$lt{'mypi'}" />  <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
 $help{'My Personal Info'}  $help{'My Personal Info'}
Line 2804  $help{'My Personal Info'} Line 2925  $help{'My Personal Info'}
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">  <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
 $uploadtag  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>  <nobr>
 <input name="newaboutsomeone" type="button" value="$lt{'abou'}"   <input name="newaboutsomeone" type="button" value="$lt{'abou'}" 
 onClick="javascript:makeabout();" />  onClick="javascript:makeabout();" />
 </nobr>  </nobr>
 </form>  </form>
   <br /><form action="/adm/coursedocs" method="post" name="newgroupfiles">
   $uploadtag
   <input type="hidden" name="importdetail"
   value="Group Files=/adm/$coursedom/$coursenum/aboutme" />
   <nobr>
   <input name="newgroupfiles" type="submit" value="$lt{'grpo'}" />
   $help{'Group Files'}
   </nobr>
   </form>
 ENDFORM  ENDFORM
        }         }
        if ($env{'form.pagepath'}) {         if ($env{'form.pagepath'}) {
            $r->print(<<ENDBLOCK);             $r->print(<<ENDBLOCK);
 <form action="/adm/coursedocs" method="post" name="newsmpproblem">  <form action="/adm/coursedocs" method="post" name="newsmpproblem">
 $uploadtag  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>  <nobr>
 <input name="newsmpproblem" type="button" value="$lt{'sipr'}"  <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
 onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}  onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
Line 2824  onClick="javascript:makesmpproblem();" / Line 2954  onClick="javascript:makesmpproblem();" /
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="newexamupload">  <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
 $uploadtag  $uploadtag
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>  <nobr>
 <input name="newexamupload" type="button" value="$lt{'scuf'}"  <input name="newexamupload" type="button" value="$lt{'scuf'}"
 onClick="javascript:makeexamupload();" />  onClick="javascript:makeexamupload();" />
Line 2888  $lt{'comment'}:<br /> Line 3018  $lt{'comment'}:<br />
 <td bgcolor="#DDDDDD">  <td bgcolor="#DDDDDD">
 <form action="/adm/coursedocs" method="post" name="supnewfolder">  <form action="/adm/coursedocs" method="post" name="supnewfolder">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>  <nobr>
 <input name="newfolder" type="button"  <input name="newfolder" type="button"
 onClick="javascript:makenewfolder(this.form,'$folderseq');"  onClick="javascript:makenewfolder(this.form,'$folderseq');"
Line 2897  value="$lt{'newf'}" /> $help{'Adding_Fol Line 3027  value="$lt{'newf'}" /> $help{'Adding_Fol
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="supnewext">  <br /><form action="/adm/coursedocs" method="post" name="supnewext">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail" value="">  <input type="hidden" name="importdetail" value="" />
 <nobr>  <nobr>
 <input name="newext" type="button"   <input name="newext" type="button" 
 onClick="javascript:makenewext('supnewext');"  onClick="javascript:makenewext('supnewext');"
Line 2906  value="$lt{'extr'}" /> $help{'Adding_Ext Line 3036  value="$lt{'extr'}" /> $help{'Adding_Ext
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">  <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail"   <input type="hidden" name="importdetail" 
 value="Syllabus=/public/$coursedom/$coursenum/syllabus">  value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
 <nobr>  <nobr>
 <input name="newsyl" type="submit" value="$lt{'syll'}" />  <input name="newsyl" type="submit" value="$lt{'syll'}" />
 $help{'Syllabus'}  $help{'Syllabus'}
Line 2915  $help{'Syllabus'} Line 3045  $help{'Syllabus'}
 </form>  </form>
 <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">  <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />  <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
 <input type=hidden name="importdetail"   <input type="hidden" name="importdetail" 
 value="$plainname=/adm/$udom/$uname/aboutme">  value="$plainname=/adm/$udom/$uname/aboutme" />
 <nobr>  <nobr>
 <input name="newaboutme" type="submit" value="$lt{'mypi'}" />  <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
 $help{'My Personal Info'}  $help{'My Personal Info'}

Removed from v.1.252  
changed lines
  Added in v.1.278.2.2


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