Diff for /loncom/interface/portfolio.pm between versions 1.71 and 1.194

version 1.71, 2005/01/18 02:18:29 version 1.194, 2008/06/09 22:34:55
Line 1 Line 1
   # The LearningOnline Network
   # portfolio browser
   #
   # $Id$
   #
 # Copyright Michigan State University Board of Trustees  # Copyright Michigan State University Board of Trustees
 #  #
 # This file is part of the LearningOnline Network with CAPA (LON-CAPA).  # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
Line 29  use Apache::lonnet; Line 34  use Apache::lonnet;
 use Apache::lontexconvert;  use Apache::lontexconvert;
 use Apache::lonfeedback;  use Apache::lonfeedback;
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::lonnet;
   use Apache::longroup;
   use Apache::lonhtmlcommon;
   use HTML::Entities;
   use LONCAPA;
   
   sub group_args {
       my $output;
       if (defined($env{'form.group'})) {
           $output .= '&group='.$env{'form.group'};
    if (defined($env{'form.ref'})) {
       $output .= '&ref='.$env{'form.ref'};
    }
       }
       return $output;
   }
   
   sub group_form_data {
       my $output;
       if (defined($env{'form.group'})) {
    $output = '<input type="hidden" name="group" value="'.$env{'form.group'}.'" />';
    if (exists($env{'form.ref'})) {
       $output .= '<input type="hidden" name="ref" value="'.
    $env{'form.ref'}.'" />';
    }
       }
       return $output;
   } 
   
 # receives a file name and path stub from username/userfiles/portfolio/  # receives a file name and path stub from username/userfiles/portfolio/
 # returns an anchor tag consisting encoding filename and currentpath  # returns an anchor tag consisting encoding filename and currentpath
 sub make_anchor {  sub make_anchor {
     my ($filename, $current_path, $current_mode, $field_name) = @_;      my ($url, $anchor_fields, $inner_text) = @_;
     my $anchor = '<a href="/adm/portfolio?selectfile='.$filename.'&currentpath='.$current_path.'&mode='.$current_mode.'&fieldname='.$field_name.'">'.$filename.'</a>';      if ($$anchor_fields{'continue'} ne 'true') {$$anchor_fields{'continue'} = 'false'};
       my $anchor = '<a href="'.$url.'?';
       foreach my $field_name (keys(%$anchor_fields)) {
           $anchor .= $field_name.'='.$$anchor_fields{$field_name}.'&amp;';
       }
       $anchor =~ s/&amp;$//;
       $anchor .= &group_args();
       $anchor .= '">'.$inner_text.'</a>';
     return $anchor;      return $anchor;
 }  }
   
 my $dirptr=16384;  my $dirptr=16384;
 sub display_common {  sub display_common {
     my ($r,$current_path,$is_empty,$dir_list)=@_;      my ($r,$url,$current_path,$is_empty,$dir_list,$can_upload)=@_;
     my $iconpath= $r->dir_config('lonIconsURL') . "/";      my $namespace = &get_namespace();
     $r->print('<table border="0" cellspacing="2" cellpadding="2"><tr valign="middle">');      my $port_path = &get_port_path();
     $r->print('<td bgcolor="#ccddaa" align="center">');      if ($can_upload) {
     my $displayOut = '<form method="post" enctype="multipart/form-data">';          my $groupitem = &group_form_data();
     $displayOut .= '<input name="uploaddoc" type="file" />'.  
         '<input type="hidden" name="currentpath" value="'.$current_path.'" />'.          my $iconpath= $r->dir_config('lonIconsURL') . "/";
         '<input type="hidden" name="action" value="'.$ENV{"form.action"}.'" />'.          my %text=&Apache::lonlocal::texthash(
         '<input type="hidden" name="fieldname" value="'.$ENV{"form.fieldname"}.'" />'.   'upload' => 'Upload',
         '<input type="hidden" name="mode" value="'.$ENV{"form.mode"}.'" />'.    'upload_label' =>  
         '<input type="submit" name="storeupl" value="Upload" />'.   'Upload file to current directory:',
         '</form>';   'createdir' => 'Create Subdirectory',
     $r->print($displayOut);   'createdir_label' => 
     $r->print('</td></tr><tr><td bgcolor="#ccddaa" align="center">');   'Create subdirectory in current directory:',
     $displayOut = '<form method="post">';                                           'parse' => 'If HTML file, upload embedded images/multimedia/css/linked files'
     $displayOut .= '<input name="newdir" type="input" />'.                                              );
         '<input type="hidden" name="currentpath" value="'.$current_path.'" />'.          my $escuri = &HTML::Entities::encode($r->uri,'&<>"');
         '<input type="hidden" name="action" value="'.$ENV{"form.action"}.'" />'.   my $help_fileupload = &Apache::loncommon::help_open_topic('Portfolio AddFiles');
         '<input type="hidden" name="fieldname" value="'.$ENV{"form.fieldname"}.'" />'.   my $help_createdir = &Apache::loncommon::help_open_topic('Portfolio CreateDirectory');
         '<input type="hidden" name="mode" value="'.$ENV{"form.mode"}.'" />'.   
         '<input type="submit" name="createdir" value="'.&mt("Create Directory").'" />'.   # FIXME: This line should be deleted once Portfolio uses breadcrumbs
         '</form>';   $r->print(&Apache::loncommon::help_open_topic('Portfolio About', &mt('Help on the portfolio')));
     $r->print($displayOut);  
     $r->print('</td></tr></table>');          $r->print(<<"TABLE"); 
   <table id="LC_portfolio_actions">
     <tr id="LC_portfolio_upload">
       <td class="LC_label">
         $text{'upload_label'}
       </td>
       <td class="LC_value">
         <form method="post" enctype="multipart/form-data" action="$escuri">
           $groupitem 
           <input name="uploaddoc" type="file" />
    <input type="hidden" name="currentpath" value="$current_path" />
    <input type="hidden" name="action" value="$env{"form.action"}" />
    <input type="hidden" name="fieldname" value="$env{"form.fieldname"}" />
    <input type="hidden" name="mode" value="$env{"form.mode"}" />
    <input type="submit" name="storeupl" value="$text{'upload'}" />$help_fileupload
           <br />
           <span class="LC_nobreak">
            <label>$text{'parse'}
            <input type="checkbox" name="parserflag" checked="checked" />
            </label>
           </span>
         </form>
       </td>
     </tr>
     <tr id="LC_portfolio_createdir">
       <td class="LC_label">
         $text{'createdir_label'}
       </td>
       <td class="LC_value">
         <form method="post" action="$escuri">
           <input name="newdir" type="input" />$groupitem
           <input type="hidden" name="currentpath" value="$current_path" />
           <input type="hidden" name="action" value="$env{"form.action"}" />
           <input type="hidden" name="fieldname" value="$env{"form.fieldname"}" />
           <input type="hidden" name="mode" value="$env{"form.mode"}" />
           <input type="submit" name="createdir" value="$text{'createdir'}" />$help_createdir
         </form>
       </td>
     </tr>
   </table>
   TABLE
       }
     my @tree = split (/\//,$current_path);      my @tree = split (/\//,$current_path);
     $r->print('<font size="+2">'.&make_anchor('portfolio','/',$ENV{"form.mode"},$ENV{"form.fieldname"}).'/');      my %anchor_fields = (
           'selectfile'    => $port_path,
           'currentpath'   => '/',
           'mode'          => $env{"form.mode"},
           'fieldname'     => $env{"form.fieldname"},
           'continue'      => $env{"form.continue"}
       );
       $r->print('<span class="LC_current_location">'.&make_anchor($url,\%anchor_fields,$port_path).'/');
     if (@tree > 1){      if (@tree > 1){
         my $newCurrentPath = '';          my $newCurrentPath = '/';
         for (my $i = 1; $i< @tree; $i++){          for (my $i = 1; $i< @tree; $i++){
             $newCurrentPath .= $tree[$i].'/';              $newCurrentPath .= $tree[$i].'/';
             $r->print(&make_anchor($tree[$i],'/'.$newCurrentPath, $ENV{"form.mode"},$ENV{"form.fieldname"}).'/');              my %anchor_fields = (
                   'selectfile' => $tree[$i],
                   'currentpath' => $newCurrentPath,
                   'mode' => $env{"form.mode"},
                   'fieldname' => $env{"form.fieldname"},
                   'continue' => $env{"form.continue"}
               );
               $r->print(&make_anchor($url,\%anchor_fields,$tree[$i]).'/');
         }          }
     }      }
     $r->print('</font>');      $r->print('</span>');
     &Apache::lonhtmlcommon::store_recent('portfolio',$current_path,$current_path);      $r->print(&Apache::loncommon::help_open_topic('Portfolio ChangeDirectory'));
     $r->print('<br /><form method=post action="/adm/portfolio?mode='.$ENV{"form.mode"}.'&fieldname='.$ENV{"form.fieldname"}.'">'.      &Apache::lonhtmlcommon::store_recent($namespace,$current_path,$current_path);
       &Apache::lonhtmlcommon::select_recent('portfolio','currentpath',      $r->print('<br /><form method="post" action="'.$url.'?mode='.$env{"form.mode"}.'&amp;fieldname='.$env{"form.fieldname"}.&group_args());
       $r->print('">'.
         &Apache::lonhtmlcommon::select_recent($namespace,'currentpath',
     'this.form.submit();'));      'this.form.submit();'));
     $r->print("</form>");      $r->print("</form>");
 }  }
 sub display_directory {  
     my ($r,$current_path,$is_empty,$dir_list)=@_;  sub display_directory_line {
     my $iconpath= $r->dir_config('lonIconsURL') . "/";      my ($r,$select_mode, $filename, $mtime, $size, $css_class,
     my $display_out;   $line, $access_controls, $curr_access, $now, $version_flag,
     my %locked_files = &Apache::lonnet::get_marked_as_readonly_hash ($ENV{'user.domain'},$ENV{'user.name'});   $href_location, $url, $current_path, $access_admin_text, $versions)=@_;
     if ($is_empty && ($current_path ne '/')) {  
         $display_out = '<form method="post" action="/adm/portfolio">'.      my $fullpath =  &prepend_group($current_path.$filename);
         '<input type="hidden" name="action" value="deletedir" />'.      $r->print('<tr class="'.$css_class.'">');
         '<input type="submit" name="deletedir" value="'.&mt("Delete Directory").'" />'.      $r->print($line); # contains first two cells of table
         '<input type="hidden" name="selectfile" value="" />'.      my $lock_info;
         '<input type="hidden" name="currentpath" value="'.$current_path.'" />'.      if ($version_flag) { # versioned can't be versioned, so TRUE when root file
         '</form>';          $r->print('<td><img alt="" src="'.&Apache::loncommon::icon($filename).'" /></td>');
                   $r->print('<td>'.$version_flag.'</td>');
         $r->print($display_out);      } else { # this is a graded or handed back file
  return;          my ($user,$domain) = &get_name_dom($env{'form.group'});
     }          my $permissions_hash = &Apache::lonnet::get_portfile_permissions($domain,$user);
     $r->print('<table border="0" cellspacing="2" cellpadding="2">'.          if (defined($$permissions_hash{$fullpath})) {
             '<tr><th colspan="2">Actions</th><th>&nbsp;</th><th>Name</th><th>Size</th><th>Last Modified</th></tr>');              foreach my $array_item (@{$$permissions_hash{$fullpath}}) {
     my $href_location="/uploaded/$ENV{'user.domain'}/$ENV{'user.name'}/portfolio$current_path";                  if (ref($array_item) eq 'ARRAY') {
     $r->print('<form method="post" action="/adm/portfolio">');                      if ($$array_item[-1] eq 'handback') {
     foreach my $line (sort                           $lock_info = 'Handback';
       {                       } elsif ($$array_item[-1] eq 'graded') {
   my ($afile)=split('&',$a,2);                          $lock_info = 'Graded';
   my ($bfile)=split('&',$b,2);                      }
   return (lc($afile) cmp lc($bfile));                   }
       } (@$dir_list)) {  
     #$strip holds directory/file name  
     #$dom   
     my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);   
     if (($filename ne '.') && ($filename ne '..')) {  
             if ($dirptr&$testdir) {  
                 $r->print('<tr bgcolor="#FFAA99"><td colspan="2"><img src="'.$iconpath.'folder_closed.gif"></td>');  
                 $r->print('<td>Go to ...</td>');  
                 $r->print('<td>'.&make_anchor($filename.'/',$current_path.$filename.'/',$ENV{'form.mode'},$ENV{"form.fieldname"}).'</td>');   
                 $r->print('</tr>');   
             } else {  
                 $r->print('<tr bgcolor="#CCCCFF">');  
                 if (exists $locked_files{$current_path.$filename}){  
                     $r->print('<td colspan="2">Locked</td>');  
                 } else {  
                     $r->print('<td><input type="checkbox" name="selectfile" value="'.$filename.'" />  
                         <a href="/adm/portfolio?rename='.$filename.'&amp;currentpath='.$current_path.'">Rename</a></td>  
                         <td><a href="/adm/portfolio?meta='.$filename.'&amp;currentpath='.$current_path.'">Meta</a>  
                         </td>');  
                 }  
                 $r->print('<td><img src="'.$iconpath.'unknown.gif"></td>');  
                 $r->print('<td><a href="'.$href_location.$filename.'">'.  
     $filename.'</a></td>');   
                 $r->print('<td>'.$size.'</td>');  
                 $r->print('<td>'.&Apache::lonlocal::locallocaltime($mtime).'</td>');  
                 $r->print('</tr>');   
             }              }
         }          }
    if ($lock_info) {
       my %anchor_fields = ('lockinfo' => $fullpath);
       if ($versions) { # hold the folder open
           my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($fullpath);
           $fname =~ s|^/||;
           $anchor_fields{'showversions'} = $fname.'.'.$extension;
       }
       $lock_info = &make_anchor(undef,\%anchor_fields,$lock_info);
    }
    $r->print('<td colspan="2">'.$lock_info.'</td>');
     }      }
 #   <tr bgcolor="#FFAA99"> pink bg       # $r->print('<td>'.$$version_flag{$filename}.'</td><td>');
 #   <tr bgcolor="#CCCCFF"> blue bg                  $r->print('<td>'.&make_anchor($href_location.$filename,undef,$filename).'</td>'); 
 #   $r->print(&display_directory($current_path, $currentFile, @dir_list));      $r->print('<td>'.$size.'</td>');
 #    $r->print('</td>><td>');      $r->print('<td>'.&Apache::lonlocal::locallocaltime($mtime).'</td>');
 #   $r->print(&display_actions($current_path, $currentFile, $isEmpty));      if ($select_mode ne 'true') {
     $r->print('</table>   $r->print('<td><span style="white-space: nowrap">'.
     <input type="submit" name="doit" value="Delete Checked Files" />    &mt($curr_access).'&nbsp;&nbsp;&nbsp;');
     <input type="hidden" name="action" value="delete" />          my %anchor_fields = (
     <input type="hidden" name="currentpath" value="'.$current_path.'" />              'access' => $filename,
     </form>');              'currentpath' => $current_path
           );
    $r->print(&make_anchor($url, \%anchor_fields, $access_admin_text).'</span></td>');
       }
       $r->print('</tr>'.$/);
 }  }
 sub display_file_select {  
     my ($r,$current_path,$is_empty,$dir_list)=@_;  sub display_directory {
       my ($r,$url,$current_path,$is_empty,$dir_list,$group,$can_upload,
           $can_modify,$can_delete,$can_setacl)=@_;
     my $iconpath= $r->dir_config('lonIconsURL') . "/";      my $iconpath= $r->dir_config('lonIconsURL') . "/";
     my $display_out;      my $display_out;
     my $checked_files = &Apache::lonnet::files_in_path($ENV{'user.name'}, $ENV{'form.currentpath'});      my $select_mode;
     if ($is_empty && ($current_path ne '/')) {      my $checked_files;
         $display_out = '<form method="post" action="/adm/portfolio">'.      my $port_path = &get_port_path();
       my ($uname,$udom) = &get_name_dom($group);
       my $access_admin_text = &mt('View Status');
       if ($can_setacl) {
           $access_admin_text = &mt('View/Change Status');
       }
   
       my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
                                                                           $uname);
       my %locked_files = &Apache::lonnet::get_marked_as_readonly_hash(
                                                     $current_permissions,$group);
       my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group);
       my $now = time;
       if ($env{"form.mode"} eq 'selectfile') {
    &select_files($r);
    $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'});
    $select_mode = 'true';
       } 
       if ($is_empty && ($current_path ne '/') && $can_delete) {
           $display_out = '<form method="post" action="'.$url.'">'.
       &group_form_data().
         '<input type="hidden" name="action" value="deletedir" />'.          '<input type="hidden" name="action" value="deletedir" />'.
         '<input type="submit" name="deletedir" value="'.&mt("Delete Directory").'" />'.          '<input type="submit" name="deletedir" value="'.&mt("Delete Directory").'" />'.
         '<input type="hidden" name="selectfile" value="" />'.          '<input type="hidden" name="selectfile" value="" />'.
         '<input type="hidden" name="currentpath" value="'.$current_path.'" />'.          '<input type="hidden" name="currentpath" value="'.$current_path.'" />'.
   
         '</form>';          '</form>';
                   
         $r->print($display_out);          $r->print($display_out);
  return;   return;
     }      }
     $r->print('<table border="0" cellspacing="2" cellpadding="2">'.      if ($select_mode eq 'true') {
             '<tr><th>Select</th><th>&nbsp;</th><th>Name</th><th>Size</th><th>Last Modified</th></tr>');          $r->print('<form method="post" name="checkselect" action="'.$url.'">');
     my $href_location="/uploaded/$ENV{'user.domain'}/$ENV{'user.name'}/portfolio$current_path";          $r->print('<table id="LC_browser">'.
     $r->print('<form method="post" name="checkselect" action="/adm/portfolio">');              '<tr><th>Select</th><th>&nbsp;</th><th>&nbsp;</th><th>Name</th><th>Size</th><th>Last Modified</th></tr>');
     foreach my $line (sort       } else {
           $r->print('<form method="post" action="'.$url.'">');
    $r->print(&Apache::loncommon::help_open_topic('Portfolio FileList',
         &mt('Using the portfolio file list')));
           $r->print('<table id="LC_browser">'.
                     '<tr>'
                    .'<th colspan="2">'.&mt('Actions'). &Apache::loncommon::help_open_topic('Portfolio FileAction').'</th>'
                    .'<th>&nbsp;</th><th>&nbsp;</th>'
                    .'<th>'.&mt('Name').&Apache::loncommon::help_open_topic('Portfolio OpenFile').'</th>'
                    .'<th>'.&mt('Size').'</th>'
                    .'<th>'.&mt('Last Modified').'</th>'
                    .'<th>'.&mt('Current Access Status').&Apache::loncommon::help_open_topic('Portfolio ShareFile').'</th>'
                    .'</tr>');
       }
       $r->print("\n".&group_form_data()."\n");
   
       my $href_location="/uploaded/$udom/$uname/$port_path".$current_path;
       my $href_edit_location="/editupload/$udom/$uname/$port_path".$current_path;
       my @dir_lines;
       my %versioned;
       foreach my $dir_line (sort 
       {         { 
   my ($afile)=split('&',$a,2);    my ($afile)=split('&',$a,2);
   my ($bfile)=split('&',$b,2);    my ($bfile)=split('&',$b,2);
   return (lc($afile) cmp lc($bfile));    return (lc($afile) cmp lc($bfile));
       } (@$dir_list)) {        } (@$dir_list)) {
     #$strip holds directory/file name      my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$dir_line,16); 
     #$dom   
     my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);   
     $filename =~ s/\s+$//;      $filename =~ s/\s+$//;
     if (($filename ne '.') && ($filename ne '..')) {      my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);
       if ($version) {
       my $fullpath = &prepend_group($current_path.$fname.'.'.$extension);
          push(@{ $versioned{$fullpath} },
    [$filename,$dom,$testdir,$size,$mtime,$obs,]);
       } else {
          push(@dir_lines, [$filename,$dom,$testdir,$size,$mtime,$obs]);
       }
       }
       foreach my $dir_line (@dir_lines) {
           my ($filename,$dom,$testdir,$size,$mtime,$obs) = @$dir_line;
           my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);
       if (($filename ne '.') && ($filename ne '..') && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/)) {
          my $version_flag;
          my $show_versions;
       my $fullpath =  &prepend_group($current_path.$filename);
          if ($env{'form.showversions'} =~ /$filename/) {
              $show_versions = 'true';
          }
          if (exists($versioned{$fullpath})) {
              my %anchor_fields = (
                  'selectfile' => $fullpath,
                  'continue' => 'false',
                  'currentpath' => $current_path,
              );
              if ($show_versions) {
                  # Must preserve other possible showversion files
                  my $version_remainder = $env{'form.showversions'};
                  $version_remainder =~ s/$filename//g;                
                  $anchor_fields{'showversions'} = $version_remainder;
                       $version_flag = &make_anchor('portfolio',\%anchor_fields,
                           '<img class="LC_icon" alt="'.&mt('opened folder').'" src="'.$iconpath.'folder_pointer_opened.gif" />');
              } else {
                  # allow multiple files to show versioned
                  $anchor_fields{'showversions'} = $env{'form.showversions'}.','.$filename;
                       $version_flag = &make_anchor('portfolio',\%anchor_fields,
                           '<img class="LC_icon" alt="'.&mt('closed folder').'" src="'.$iconpath.'folder_pointer_closed.gif" />');
                   }
          } else {
              $version_flag = '&nbsp;';
          }
             if ($dirptr&$testdir) {              if ($dirptr&$testdir) {
                 $r->print('<tr bgcolor="#FFAA99"><td><img src="'.$iconpath.'folder_closed.gif"></td>');   my $colspan='colspan="2"';
                 $r->print('<td>Go to ...</td>');                  if ($select_mode eq 'true'){
                 $r->print('<td>'.&make_anchor($filename.'/',$current_path.$filename.'/',$ENV{'form.mode'},$ENV{"form.fieldname"}).'</td>');       undef($colspan);
                   }
    $r->print('<tr class="LC_browser_folder"><td '.$colspan.'><img alt="'.&mt('closed folder').'" src="'.$iconpath.'folder_closed.gif" /></td>');
                   $r->print('<td>'.&mt('Go to ...').'</td>');
                   my %anchor_fields = (
                       'selectfile'    => $filename.'/',
                       'currentpath'   => $current_path.$filename.'/',
                       'mode'          => $env{"form.mode"},
                       'fieldname'     => $env{"form.fieldname"},
                       'continue'      => $env{"form.continue"}
                   );  
                   $r->print('<td>'.$version_flag.'</td><td>'.&make_anchor($url,\%anchor_fields,$filename.'/').'</td>'); 
                 $r->print('</tr>');                   $r->print('</tr>'); 
             } else {              } else {
                 $r->print('<tr bgcolor="#CCCCFF">');   my $css_class = 'LC_browser_file';
                 $r->print('<td><input type="checkbox" name="selectfile" value="'.$filename.'"');    my $line;
                 if ($$checked_files{$filename} eq 'selected') {                  if ($select_mode eq 'true') {
                     $r->print("CHECKED");                      $line='<td><input type="checkbox" name="checkfile" value="'.$filename.'"';
                 }      if ($$checked_files{$filename} eq 'selected') {
                 $r->print('></td>');                          $line.=" checked ";
                 $r->print('<td><img src="'.$iconpath.'unknown.gif"></td>');                      }
                 $r->print('<td><a href="'.$href_location.$filename.'">'.      $line.=' /></td>';
     $filename.'</a></td>');                   } else {
                 $r->print('<td>'.$size.'</td>');                      if (exists $locked_files{$fullpath}) {
                 $r->print('<td>'.&Apache::lonlocal::locallocaltime($mtime).'</td>');                          my %anchor_fields = (
                 $r->print('</tr>');                               'lockinfo' => $fullpath
                           );
                           $line.='<td colspan="2">'.&make_anchor($url,\%anchor_fields,&mt('Locked')).'</td>';
    $css_class= 'LC_browser_file_locked';
                       } else {
                           if (!$can_modify) {
                               $line .= '<td colspan="2">';
                           } else {
                               $line .= '<td>';
                           }
                           if ($can_delete) {
                               $line .= '<input type="checkbox" name="selectfile" value="'.$filename.'" />';
                           }
                           if ($can_modify) {
                               my $cat='<img class="LC_icon" alt="'.&mt('Catalog Information').
                               '" src="'.&Apache::loncommon::lonhttpdurl('/res/adm/pages/catalog.gif').'" />';
                               my %anchor_fields = (
                                   'rename' => $filename,
                                   currentpath => $current_path
                               );
                               $line .= &make_anchor($url,\%anchor_fields,&mt('Rename'));
                               $line .= '</td><td>'.&make_anchor($href_edit_location.$filename.'.meta',\%anchor_fields,$cat);
                               # '<a href="'.$href_edit_location.$filename.'.meta">'.$cat.'</a>';
                           }
                           $line .= '</td>';
                       }
                   }
    my $curr_access;
    if ($select_mode ne 'true') {
       my $pub_access = 0;
       my $guest_access = 0;
       my $cond_access = 0;
       foreach my $key (sort(keys(%{$access_controls{$fullpath}}))) {
    my ($num,$scope,$end,$start) = &unpack_acc_key($key);
    if (($now > $start) && (!$end || $end > $now)) {
       if ($scope eq 'public')  {
    $pub_access = 1;
       } elsif ($scope eq 'guest') {
    $guest_access = 1;
       } else {
    $cond_access = 1;
       }
    }
       }
       if (!$pub_access && !$guest_access && !$cond_access) {
    $curr_access = &mt('Private');
       } else {
    my @allaccesses; 
    if ($pub_access) {
       push(@allaccesses,&mt('Public'));
    }
    if ($guest_access) {
       push(@allaccesses,&mt('Passphrase-protected'));
    }
    if ($cond_access) {
       push(@allaccesses,&mt('Conditional'));
    }
    $curr_access = join('+ ',@allaccesses);
       }
    }
                   &display_directory_line($r,$select_mode, $filename, $mtime, $size, $css_class, $line, 
                                           \%access_controls, $curr_access,$now, $version_flag, $href_location, 
                                           $url, $current_path, $access_admin_text);
    if ($show_versions) {
       foreach my $dir_line (@{ $versioned{$fullpath} }) {
           my ($v_filename,$dom,$testdir,$size,$mtime,$obs) =
       @$dir_line;
                           $line = '<td colspan="2">&nbsp;</td>';
    &display_directory_line($r,$select_mode, $v_filename, $mtime, $size, 
    $css_class, $line, \%access_controls, $curr_access, $now,
    undef, $href_location, $url, $current_path, $access_admin_text, 1);
       }
    }
             }              }
         }          }
     }      }
     $r->print('</table>      if ($select_mode eq 'true') {
             <input type="hidden" name="continue" value="true">          $r->print('</table>
             <input type="hidden" name="fieldname" value="'.$ENV{'form.fieldname'}.'">              <input type="hidden" name="continue" value="true" />
             <input type="hidden" name="mode" value="selectfile">              <input type="hidden" name="fieldname" value="'.$env{'form.fieldname'}.'" />
               <input type="hidden" name="mode" value="selectfile" />
             <input type="submit" name="submit" value="Select checked files, and continue selecting." /><br />              <input type="submit" name="submit" value="Select checked files, and continue selecting." /><br />
             <input type="button" name="doit" onClick= "finishSelect();" value="Select checked files, and close window" />              <input type="button" name="doit" onClick= "finishSelect();" value="Select checked files, and close window" />
             <input type="hidden" name="currentpath" value="'.$current_path.'" />              <input type="hidden" name="currentpath" value="'.$current_path.'" />
     </form>');          </form>');        
 }      } else {
 sub prettyinput {          $r->print('</table>');
     my ($type,$value,$fieldname,$formname,          if ($can_delete) {
  $relatedsearchflag,$relatedsep,$relatedvalue,$size)=@_;              $r->print('
     if (! defined($size)) {          <input type="submit" name="doit" value="'.&mt('Delete Checked Files').'" />'.
         $size = 80;   &Apache::loncommon::help_open_topic('Portfolio DeleteFile').'
     }          <input type="hidden" name="action" value="delete" />
     # Language          <input type="hidden" name="currentpath" value="'.$current_path.'" />
     if ($type eq 'language') {          </form>'
  return &Apache::lonmeta::selectbox($fieldname,              );
   $value,          }
   \&Apache::loncommon::languagedescription,  
   (&Apache::loncommon::languageids)).  
                               &relatedfield(0,$relatedsearchflag,$relatedsep);  
     }  
     # Copyright  
     if ($type eq 'copyright') {  
  return &Apache::lonmeta::selectbox($fieldname,  
   $value,  
   \&Apache::loncommon::copyrightdescription,  
   (&Apache::loncommon::copyrightids)).  
                               &relatedfield(0,$relatedsearchflag,$relatedsep);  
     }  
     # Source Copyright  
     if ($type eq 'sourceavail') {  
  return &Apache::lonmeta::selectbox($fieldname,  
   $value,  
   \&Apache::loncommon::source_copyrightdescription,  
   (&Apache::loncommon::source_copyrightids)).  
                               &relatedfield(0,$relatedsearchflag,$relatedsep);  
     }  
     # Gradelevels  
     if (($type eq 'lowestgradelevel') ||  
  ($type eq 'highestgradelevel')) {  
  return &Apache::loncommon::select_level_form($value,$fieldname).  
             &relatedfield(0,$relatedsearchflag,$relatedsep);  
     }  
     # Obsolete  
     if ($type eq 'obsolete') {  
  return '<input type="checkbox" name="'.$fieldname.'"'.  
     ($value?' checked="1"':'').' />'.  
             &relatedfield(0,$relatedsearchflag,$relatedsep);   
     }  
     # Obsolete replacement file  
     if ($type eq 'obsoletereplacement') {  
  return '<input type="text" name="'.$fieldname.  
     '" size="60" value="'.$value.'" /><a href="javascript:openbrowser'.  
     "('".$formname."','".$fieldname."'".  
     ",'')\">".&mt('Select').'</a>'.  
             &relatedfield(0,$relatedsearchflag,$relatedsep);   
     }  
     # Customdistribution file  
     if ($type eq 'customdistributionfile') {  
  return '<input type="text" name="'.$fieldname.  
     '" size="60" value="'.$value.'" /><a href="javascript:openbrowser'.  
     "('".$formname."','".$fieldname."'".  
     ",'rights')\">".&mt('Select').'</a>'.  
             &relatedfield(0,$relatedsearchflag,$relatedsep);   
     }  
     # Source Customdistribution file  
     if ($type eq 'sourcerights') {  
  return '<input type="text" name="'.$fieldname.  
     '" size="60" value="'.$value.'" /><a href="javascript:openbrowser'.  
     "('".$formname."','".$fieldname."'".  
     ",'rights')\">".&mt('Select').'</a>'.  
             &relatedfield(0,$relatedsearchflag,$relatedsep);   
     }  
     # Dates  
     if (($type eq 'creationdate') ||  
  ($type eq 'lastrevisiondate')) {  
  return   
             &Apache::lonhtmlcommon::date_setter($formname,$fieldname,$value).  
             &relatedfield(0,$relatedsearchflag,$relatedsep);  
     }  
     # No pretty input found  
     $value=~s/^\s+//gs;  
     $value=~s/\s+$//gs;  
     $value=~s/\s+/ /gs;  
     $value=~s/\"/\&quot\;/gs;  
     return   
         '<input type="text" name="'.$fieldname.'" size="'.$size.'" '.  
         'value="'.$value.'" />'.  
         &relatedfield(1,$relatedsearchflag,$relatedsep,$fieldname,  
                       $relatedvalue);   
 }  
   
 sub relatedfield {  
     my ($show,$relatedsearchflag,$relatedsep,$fieldname,$relatedvalue)=@_;  
     if (! $relatedsearchflag) {   
         return '';  
     }  
     if (! defined($relatedsep)) {  
         $relatedsep=' ';  
     }  
     if (! $show) {  
         return $relatedsep.'&nbsp;';  
     }  
     return $relatedsep.'<input type="checkbox" name="'.$fieldname.'_related"'.  
  ($relatedvalue?' checked="1"':'').' />';  
 }  
   
   
 # The field names  
 sub fieldnames {  
     return &Apache::lonlocal::texthash  
         (  
          'title' => 'Title',  
          'author' =>'Author(s)',  
          'authorspace' => 'Author Space',  
          'modifyinguser' => 'Last Modifying User',  
          'subject' => 'Subject',  
          'keywords' => 'Keyword(s)',  
          'notes' => 'Notes',  
          'abstract' => 'Abstract',  
          'lowestgradelevel' => 'Lowest Grade Level',  
          'highestgradelevel' => 'Highest Grade Level',  
          'standards' => 'Standards',  
          'mime' => 'MIME Type',  
          'language' => 'Language',  
          'creationdate' => 'Creation Date',  
          'lastrevisiondate' => 'Last Revision Date',  
          'owner' => 'Publisher/Owner',  
          'copyright' => 'Copyright/Distribution',  
          'customdistributionfile' => 'Custom Distribution File',  
          'sourceavail' => 'Source Available',  
          'sourcerights' => 'Source Custom Distribution File',  
          'obsolete' => 'Obsolete',  
          'obsoletereplacement' => 'Suggested Replacement for Obsolete File',  
          'count'      => 'Network-wide number of accesses (hits)',  
          'course'     => 'Network-wide number of courses using resource',  
          'course_list' => 'Network-wide courses using resource',  
          'sequsage'      => 'Number of resources using or importing resource',  
          'sequsage_list' => 'Resources using or importing resource',  
          'goto'       => 'Number of resources that follow this resource in maps',  
          'goto_list'  => 'Resources that follow this resource in maps',  
          'comefrom'   => 'Number of resources that lead up to this resource in maps',  
          'comefrom_list' => 'Resources that lead up to this resource in maps',  
          'clear'      => 'Material presented in clear way',  
          'depth'      => 'Material covered with sufficient depth',  
          'helpful'    => 'Material is helpful',  
          'correct'    => 'Material appears to be correct',  
          'technical'  => 'Resource is technically correct',   
          'avetries'   => 'Average number of tries till solved',  
          'stdno'      => 'Total number of students who have worked on this problem',  
          'difficulty' => 'Degree of difficulty',  
          'disc'       => 'Degree of discrimination',  
  'dependencies' => 'Resources used by this resource',  
          );  
 }  
   
 sub edit_meta_data {  
     my ($r,$uri) = @_;  
     # Construction Space Call  
     # Header  
     my $disuri=$uri;  
     my $fn=&Apache::lonnet::filelocation('',$uri);  
     $disuri=~s/^\/\~/\/priv\//;  
     $disuri=~s/\.meta$//;  
     my $target=$uri;  
     $target=~s/^\/\~/\/res\/$ENV{'request.role.domain'}\//;  
     $target=~s/\.meta$//;  
         $r->print('<script language="JavaScript">'.  
                   &Apache::loncommon::browser_and_searcher_javascript().  
                   '</script>');  
         my %lt=&fieldnames();  
  my $output;  
     foreach ('author','title','subject','keywords','abstract','notes',  
              'copyright','customdistributionfile','language',  
              'standards',  
              'lowestgradelevel','highestgradelevel','sourceavail','sourcerights',  
              'obsolete','obsoletereplacement') {  
         if (defined($ENV{'form.new_'.$_})) {  
             $Apache::lonpublisher::metadatafields{$_}=  
                 $ENV{'form.new_'.$_};  
         }  
         if (! $Apache::lonpublisher::metadatafields{'copyright'}) {  
             $Apache::lonpublisher::metadatafields{'copyright'}=  
                 'default';  
         }  
         $output.=('<p>'.$lt{$_}.': '.  
                   &prettyinput($_,  
    $Apache::lonpublisher::metadatafields{$_},  
    'new_'.$_,'defaultmeta').'</p>');  
     }      }
     return $output;  
 }  }
   
 sub open_form {  sub open_form {
     my ($r)=@_;      my ($r,$url)=@_;
     my @files=&Apache::loncommon::get_env_multiple('form.selectfile');      my @files=&Apache::loncommon::get_env_multiple('form.selectfile');
     $r->print('<form method="post" action="/adm/portfolio">');      $r->print('<form name="portform" method="post" action="'.$url.'">');
     $r->print('<input type="hidden" name="action" value="'.      $r->print('<input type="hidden" name="action" value="'.
       $ENV{'form.action'}.'" />');        $env{'form.action'}.'" />');
     $r->print('<input type="hidden" name="confirmed" value="1" />');      $r->print('<input type="hidden" name="confirmed" value="1" />');
     foreach (@files) {      foreach (@files) {
         $r->print('<input type="hidden" name="selectfile" value="'.          $r->print('<input type="hidden" name="selectfile" value="'.
       $_.'" />');        $_.'" />');
     }      }
     $r->print('<input type="hidden" name="currentpath" value="'.      $r->print('<input type="hidden" name="currentpath" value="'.
       $ENV{'form.currentpath'}.'" />');        $env{'form.currentpath'}.'" />');
 }  }
   
 sub close_form {  sub close_form {
     my ($r)=@_;      my ($r,$url,$button_text)=@_;
     $r->print('<p><input type="submit" value="'.&mt('Continue').      if (!defined($button_text)) {
       '" /></p></form>');          $button_text = {
     $r->print('<form action="/adm/portfolio" method="POST">                           'continue' => &mt('Continue'),
                            'cancel'   => &mt('Cancel'),
                          };
       }
       $r->print('<p><input type="submit" value="'.$button_text->{'continue'}.'" />');
       $r->print(&group_form_data().'</p></form>');
       $r->print('<form action="'.$url.'" method="post">
                <p>                 <p>
               <input type="hidden" name="currentpath" value="'.                <input type="hidden" name="currentpath" value="'.
       $ENV{'form.currentpath'}.'" />        $env{'form.currentpath'}.'" />'.
                  <input type="submit" value="'.&mt('Cancel').'" />        &group_form_data());
                </p></form>');      $r->print("\n".'   <input type="submit" value="'.$button_text->{'cancel'}.'" />
                  </p></form>'); 
 }  }
   
 sub display_file {  sub display_file {
     my ($path,$filename)=@_;      my ($path,$filename)=@_;
     my $display_file_text;      my $display_file_text;
     if (!defined($path)) { $path=$ENV{'form.currentpath'}; }      my $file_start='<span class="LC_filename">';
       my $file_end='</span>';
       if (!defined($path)) { $path=$env{'form.currentpath'}; }
     if (!defined($filename)) {       if (!defined($filename)) { 
         $filename=$ENV{'form.selectfile'};          $filename=$env{'form.selectfile'};
         $display_file_text = '<tt>'.$path.$filename.'</tt>';          $display_file_text = $file_start.$path.$filename.$file_end;
     } elsif (ref($filename) eq "ARRAY") {      } elsif (ref($filename) eq "ARRAY") {
         foreach (@$filename) {          foreach my $file (@$filename) {
             $display_file_text .= '<tt>'.$path.$_.'</tt><br />';              $display_file_text .= $file_start.$path.$file.$file_end.'<br />';
         }          }
     } elsif (ref($filename) eq "SCALAR") {      } elsif (ref($filename) eq "SCALAR") {
         $display_file_text = '<tt>'.$path.$filename.'</tt>';                  $display_file_text = $file_start.$path.$$filename.$file_end;
       } else {
    $display_file_text = $file_start.$path.$filename.$file_end;
     }      }
     return $display_file_text;      return $display_file_text;
 }  }
   
 sub done {  sub done {
     return ('<h3><a href="/adm/portfolio?currentpath='.      my ($message,$url)=@_;
     $ENV{'form.currentpath'}.      unless (defined $message) {
     '&fieldname='.$ENV{'form.fieldname'}.          $message='Done';
     '&mode='.$ENV{'form.mode'}.      }
     '">'.&mt('Done').'</a></h3>');      my %anchor_fields = (
           'showversions' => $env{'form.showversions'},
           'currentpath' => $env{'form.currentpath'},
           'fieldname' => $env{'form.fieldname'},
           'mode'      => $env{'form.mode'}
       );
       my $result = '<h3>'.&make_anchor($url,\%anchor_fields,&mt($message)).'</h3>';
       return $result;
 }  }
   
 sub delete {  sub delete {
     my ($r)=@_;      my ($r,$url,$group)=@_;
     my @check;      my @check;
     my $file_name = $ENV{'form.currentpath'}.$ENV{'form.selectfile'};      my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'};
       $file_name = &prepend_group($file_name);
     my @files=&Apache::loncommon::get_env_multiple('form.selectfile');      my @files=&Apache::loncommon::get_env_multiple('form.selectfile');
       my ($uname,$udom) = &get_name_dom($group);
     if (&Apache::lonnet::is_locked($file_name,$ENV{'user.domain'},$ENV{'user.name'} ) eq 'true') {      if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
         $r->print ("The file is locked and cannot be deleted.<br />");          $r->print(&mt('The file is locked and cannot be deleted.').'<br />');
         $r->print(&done());          $r->print(&done('Back',$url));
     } else {      } else {
         if (scalar(@files)) {          if (scalar(@files)) {
             &open_form($r);              &open_form($r,$url);
             $r->print('<p>'.&mt('Delete').' '.&display_file(undef,\@files).'?</p>');              $r->print('<p>'.&mt('Delete [_1]?',&display_file(undef,\@files)).'</p>');
             &close_form($r);              &close_form($r,$url);
         } else {          } else {
             $r->print("No file was checked to delete.<br />");              $r->print("No file was checked to delete.<br />");
             $r->print(&done());              $r->print(&done(undef,$url));
         }          }
     }      }
 }   } 
   
 sub delete_confirmed {  sub delete_confirmed {
     my ($r)=@_;      my ($r,$url,$group)=@_;
     my @files=&Apache::loncommon::get_env_multiple('form.selectfile');      my @files=&Apache::loncommon::get_env_multiple('form.selectfile');
     my $result;      my $result;
       my ($uname,$udom) = &get_name_dom($group);
       my $port_path = &get_port_path();
       my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
                                                                           $uname);
     foreach my $delete_file (@files) {      foreach my $delete_file (@files) {
         $result=&Apache::lonnet::removeuserfile($ENV{'user.name'},          $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path.
        $ENV{'user.domain'},'portfolio'.         $env{'form.currentpath'}.
        $ENV{'form.currentpath'}.  
        $delete_file);         $delete_file);
         if ($result ne 'ok') {          if ($result ne 'ok') {
  $r->print('<font color="red"> An error occured ('.$result.      $r->print('<span class="LC_error">'
   ') while trying to delete '.&display_file(undef, $delete_file).'</font><br />');                        .&mt('An error occurred ([_1]) while trying to delete [_2].'
                            ,$result,&display_file(undef, $delete_file))
                         .'</span><br /><br />');
           } else {
               $r->print(&mt('File: [_1] deleted.',
                             &display_file(undef,$delete_file)));
               my $file_name = $env{'form.currentpath'}.$delete_file;
               $file_name = &prepend_group($file_name);
               my %access_controls = 
                       &Apache::lonnet::get_access_controls($current_permissions,
                                                            $group,$file_name);
               if (keys(%access_controls) > 0) {
                   my %changes; 
                   foreach my $key (keys(%{$access_controls{$file_name}})) {
                       $changes{'delete'}{$key} = 1;
                   }
                   if (keys(%changes) > 0) {
                       my ($outcome,$deloutcome,$new_values,$translation) =
                       &Apache::lonnet::modify_access_controls($file_name,\%changes,
                                                               $udom,$uname);
                       if ($outcome ne 'ok') {
                              $r->print('<br />'.&mt("An error occurred ([_1]) while ".
                                  "trying to delete access controls for the file.",$outcome).
                                  '</span><br /><br />');
                       } else {
                           if ($deloutcome eq 'ok') {
                               $r->print('<br />'.&mt('Access controls also deleted for the file.').'<br /><br />');
                           } else {
                               $r->print('<span class="LC_error">'.'<br />'.
                                  &mt("An error occurred ([_1]) while ".
                                      "trying to delete access controls for the file.",$deloutcome).
                                      '</span><br /><br />');
                           }
                       }
                   }
               }
         }          }
     }      }
     $r->print(&done());      $r->print(&done(undef,$url));
 }  }
   
 sub delete_dir {  sub delete_dir {
     my ($r)=@_;      my ($r,$url)=@_;
     &open_form($r);      &open_form($r,$url);
     $r->print('<p>'.&mt('Delete').' '.&display_file().'?</p>');       $r->print('<p>'.&mt('Delete [_1]?',&display_file()).'</p>');
     &close_form($r);      &close_form($r,$url);
 }   } 
   
 sub delete_dir_confirmed {  sub delete_dir_confirmed {
     my ($r)=@_;      my ($r,$url,$group)=@_;
     my $directory_name = $ENV{'form.currentpath'};      my $directory_name = $env{'form.currentpath'};
     $directory_name =~ m/\/$/;      $directory_name =~ s|/$||; # remove any trailing slash
     $directory_name = $`;      my ($uname,$udom) = &get_name_dom($group);
     my $result=&Apache::lonnet::removeuserfile($ENV{'user.name'},      my $namespace = &get_namespace();
        $ENV{'user.domain'},'portfolio'.      my $port_path = &get_port_path();
       my $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path.
        $directory_name);         $directory_name);
                 
     if ($result ne 'ok') {      if ($result ne 'ok') {
  $r->print('<font color="red"> An error occured (dir) ('.$result.   $r->print('<span class="LC_error">'
   ') while trying to delete '.$directory_name.'</font><br />');                    .&mt('An error occurred (dir) ([_1]) while trying to delete [_2].'
                          ,$result,$directory_name)
                     .'</span><br />');
     } else {      } else {
         # now remove from recent          # now remove from recent
 #        $r->print('<br /> removing '.$directory_name.'<br /');          &Apache::lonhtmlcommon::remove_recent($namespace,[$directory_name.'/']);
         &Apache::lonhtmlcommon::remove_recent('portfolio',[$directory_name.'/']);  
         my @dirs = split m!/!, $directory_name;          my @dirs = split m!/!, $directory_name;
           
 #        $directory_name =~ m/^(\/*\/)(\/*.)$/;  
         $directory_name='/';          $directory_name='/';
         for (my $i=1; $i < (@dirs - 1); $i ++){          for (my $i=1; $i < (@dirs - 1); $i ++){
             $directory_name .= $dirs[$i].'/';              $directory_name .= $dirs[$i].'/';
         }          }
         $ENV{'form.currentpath'} = $directory_name;          $env{'form.currentpath'} = $directory_name;
     }      }
     $r->print(&done());      $r->print(&done(undef,$url));
 }  }
   
 sub rename {  sub rename {
     my ($r)=@_;      my ($r,$url,$group)=@_;
     my $file_name = $ENV{'form.currentpath'}.$ENV{'form.rename'};      my $file_name = $env{'form.currentpath'}.$env{'form.rename'};
     if (&Apache::lonnet::is_locked($file_name,$ENV{'user.domain'},$ENV{'user.name'}) eq 'true') {      my ($uname,$udom) = &get_name_dom($group);
         $r->print ("The file is locked and cannot be renamed.<br />");      $file_name = &prepend_group($file_name);
         $r->print(&done());      if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
     } else {          $r->print("The file is locked and cannot be renamed.<br />");
         &open_form($r);          $r->print(&done(undef,$url));
         $r->print('<p>'.&mt('Rename').' '.&display_file().' to       } else {
                    <input name="filenewname" type="input" size="50" />?</p>');          &open_form($r,$url);
         &close_form($r);          $r->print('<p>'.&mt('Rename [_1] to [_2]?', &display_file()
                     , '<input name="filenewname" type="input" size="50" />').'</p>');
           &close_form($r,$url);
     }      }
 }  }
   
 sub rename_confirmed {  sub rename_confirmed {
     my ($r)=@_;      my ($r,$url,$group)=@_;
     my $filenewname=&Apache::lonnet::clean_filename($ENV{'form.filenewname'});      my $filenewname=&Apache::lonnet::clean_filename($env{'form.filenewname'});
       my ($uname,$udom) = &get_name_dom($group);
       my $port_path = &get_port_path();
     if ($filenewname eq '') {      if ($filenewname eq '') {
  $r->print('<font color="red">'.   $r->print('<span class="LC_error">'.
   &mt("Error: no valid filename was provided to rename to.").    &mt("Error: no valid filename was provided to rename to.").
   '</font><br />');    '</span><br />');
  $r->print(&done());   $r->print(&done(undef,$url));
  return;   return;
     }       } 
       my $chg_access;
     my $result=      my $result=
  &Apache::lonnet::renameuserfile($ENV{'user.name'},$ENV{'user.domain'},   &Apache::lonnet::renameuserfile($uname,$udom,
             'portfolio'.$ENV{'form.currentpath'}.$ENV{'form.selectfile'},              $port_path.$env{'form.currentpath'}.$env{'form.selectfile'},
             'portfolio'.$ENV{'form.currentpath'}.$filenewname);              $port_path.$env{'form.currentpath'}.$filenewname);
     if ($result ne 'ok') {      if ($result eq 'ok') {
  $r->print('<font color="red"> An errror occured ('.$result.          $chg_access = &access_for_renamed($filenewname,$group,$udom,$uname);
   ') while trying to rename '.&display_file().' to '.      } else {      
   &display_file(undef,$filenewname).'</font><br />');   $r->print('<span class="LC_error">'.
     &mt('An error occurred ([_1]) while trying to rename [_2] to [_3].'
                         ,$result,&display_file(),&display_file('',$filenewname))
                     .'</span><br />');
           return;
       }
       if ($filenewname ne $env{'form.filenewname'}) {
           $r->print(&mt("The new file name was changed from:<br />[_1] to [_2]",
         '<strong>'.&display_file('',$env{'form.filenewname'}).'</strong>',
         '<strong>'.&display_file('',$filenewname).'</strong>'));
       }
       $r->print($chg_access);
       $r->print(&done(undef,$url));
   }
   
   sub access_for_renamed {
       my ($filenewname,$group,$udom,$uname) = @_;
       my $oldfile = $env{'form.currentpath'}.$env{'form.selectfile'};
       $oldfile = &prepend_group($oldfile);
       my $newfile = $env{'form.currentpath'}.$filenewname;
       $newfile = &prepend_group($newfile);
       my $current_permissions =
    &Apache::lonnet::get_portfile_permissions($udom,$uname);
       my %access_controls =
    &Apache::lonnet::get_access_controls($current_permissions,
        $group,$oldfile);
       my $chg_text;
       if (keys(%access_controls) > 0) {
           my %change_old;
           my %change_new;
           foreach my $key (keys(%{$access_controls{$oldfile}})) {
               $change_old{'delete'}{$key} = 1;
               $change_new{'activate'}{$key} = $access_controls{$oldfile}{$key};
           }
           my ($outcome,$deloutcome,$new_values,$translation) =
               &Apache::lonnet::modify_access_controls($oldfile,\%change_old,
       $udom,$uname);
           if ($outcome ne 'ok') {
               $chg_text ='<br /><br />'.&mt("An error occurred ([_1]) while ".
                   "trying to delete access control records for the old name.",$outcome).
                   '</span><br />';
           } else {
               if ($deloutcome ne 'ok') {
                   $chg_text = '<br /><br /><span class="LC_error"><br />'.
       &mt("An error occurred ([_1]) while ".
    "trying to delete access control records for the old name.",$deloutcome).
    '</span><br />';
               }
           }
           ($outcome,$deloutcome,$new_values,$translation) =
               &Apache::lonnet::modify_access_controls($newfile,\%change_new,
                                                       $udom,$uname);
           if ($outcome ne 'ok') {
               $chg_text .= '<br /><br />'.
    &mt("An error occurred ([_1]) while ".
                   "trying to update access control records for the new name.",$outcome).
                   '</span><br />';
           }
           if ($chg_text eq '') {
               $chg_text = '<br /><br />'.&mt('Access controls updated to reflect the name change.');
           }
       }
       return $chg_text;
   }
   
   sub display_access {
       my ($r,$url,$group,$can_setacl,$port_path,$action) = @_;
       my ($uname,$udom) = &get_name_dom($group);
       my $file_name = $env{'form.currentpath'}.$env{'form.access'};
       $file_name = &prepend_group($file_name);
       my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
                                                                           $uname);
       my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group,$file_name);
       my $aclcount = keys(%access_controls);
       my ($header,$info);
       if ($action eq 'chgaccess') {
           $header = '<h3>'.&mt('Allowing others to retrieve file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'</h3>';
           $info .= &mt('Access to this file by others can be set to be one or more of the following types: public, passphrase-protected or conditional.');
           $info .= '<br /><ul><li>'.&mt('Public files are available to anyone without the need for login.');
           $info .= '</li><li>'.&mt('Passphrase-protected files do not require log-in, but will require the viewer to enter the passphrase you set.');
           $info .= '</li><li>'.&explain_conditionals();
           $info .= '</li></ul>'.
                     &mt('A listing of files viewable without log-in is available at: ')."<a href=\"/adm/$udom/$uname/aboutme/portfolio\">http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme/portfolio</a>.<br />";
           if ($group eq '') {
               $info .= &mt("For logged in users a 'Display file listing' link will also appear (when there are viewable files) on your personal information page:");
           } else {
               $info .= &mt("For logged in users a 'Display file listing' link will also appear (when there are viewable files) on the course information page:");
           }
           $info .= "<br /><a href=\"/adm/$udom/$uname/aboutme\">http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme</a><br />";
           if ($group ne '') {
               $info .= &mt("Users with privileges to edit course contents may add a course information page to a course using the 'Course Info' button in DOCS").'<br />';
           }
       } else {
           $header = '<h3>'.&mt('Conditional access controls for file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'</h3>'.
                     &explain_conditionals().'<br />';
       }
       if ($can_setacl) {
           &open_form($r,$url);
           $r->print($header.$info);
    $r->print('<br />'.&Apache::loncommon::help_open_topic('Portfolio ShareFile SetAccess', &mt('Help on setting up share access')));
    $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile ChangeSetting', &mt('Help on changing settings')));
    $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile StopAccess', &mt('Help on removing share access')));
           &access_setting_table($r,$url,$file_name,$access_controls{$file_name},
                                 $action);
           my $button_text = {
                           'continue' => &mt('Proceed'),
                           'cancel' => &mt('Return to directory'),
                         };
           &close_form($r,$url,$button_text);
       } else {
           $r->print($header);
           if ($aclcount) {  
               $r->print($info);
           }
           &view_access_settings($r,$url,$access_controls{$file_name},$aclcount);
       }
   }
   
   sub explain_conditionals {
       return
           &mt('Conditional files are accessible to logged-in users with accounts in the LON-CAPA network, who satisfy the conditions you set.').'<br />'."\n".
           &mt('The conditions can include affiliation with a particular course, or a user account in a specific domain.').'<br />'."\n".
           &mt('Alternatively access can be granted to people with specific LON-CAPA usernames and domains.');
   }
   
   sub view_access_settings {
       my ($r,$url,$access_controls,$aclcount) = @_;
       my ($showstart,$showend);
       my %todisplay;
       foreach my $key (sort(keys(%{$access_controls}))) {
           my ($num,$scope,$end,$start) = &unpack_acc_key($key);
           $todisplay{$scope}{$key} = $$access_controls{$key};
       }
       if ($aclcount) {
           $r->print('<h4>'.&mt('Current access controls defined for this file:').'</h4>');
           $r->print(&Apache::loncommon::start_data_table());
           $r->print(&Apache::loncommon::start_data_table_header_row());
           $r->print('<th>'.&mt('Access control').'</th><th>'.&mt('Dates available').
                     '</th><th>'.&mt('Additional information').'</th>');
           $r->print(&Apache::loncommon::end_data_table_header_row());
           my $count = 1;
           my $chg = 'none';
           &build_access_summary($r,$count,$chg,%todisplay);
           $r->print(&Apache::loncommon::end_data_table());
       } else {
           $r->print(&mt('No access control settings currently exist for this file.').'<br />');
       }
       my %anchor_fields = (
           'currentpath' => $env{'form.currentpath'}
       );
       $r->print('<br />'.&make_anchor($url, \%anchor_fields, &mt('Return to directory')));
       return;
   }
   
   sub build_access_summary {
       my ($r,$count,$chg,%todisplay) = @_; 
       my ($showstart,$showend);
       my %scope_desc = (
                         public => 'Public',
                         guest => 'Passphrase-protected',
                         domains => 'Conditional: domain-based',
                         users => 'Conditional: user-based',
                         course => 'Conditional: course-based',
                        );
       my @allscopes = ('public','guest','domains','users','course');
       foreach my $scope (@allscopes) {
           if ((!(exists($todisplay{$scope}))) || (ref($todisplay{$scope}) ne 'HASH')) {
               next;
           }
           foreach my $key (sort(keys(%{$todisplay{$scope}}))) {
               if ($count) {
                   $r->print(&Apache::loncommon::start_data_table_row());
               }
               my ($num,$scope,$end,$start) = &unpack_acc_key($key);
               my $content = $todisplay{$scope}{$key};
               if ($chg eq 'delete') {
                   $showstart = &mt('Deleted');
                   $showend = $showstart;
               } else {
                   $showstart = localtime($start);
                   if ($end == 0) {
                       $showend = &mt('No end date');
                   } else {
                       $showend = localtime($end);
                   }
               }
               $r->print('<td>'.&mt($scope_desc{$scope}));
               if ($scope eq 'course') {
                   if ($chg ne 'delete') {
                       my $cid = $content->{'domain'}.'_'.$content->{'number'};
                       my %course_description = &Apache::lonnet::coursedescription($cid);
                       $r->print('<br />('.$course_description{'description'}.')');
                   }
               }
               $r->print('</td><td>'.&mt('Start: ').$showstart.
                     '<br />'.&mt('End: ').$showend.'</td><td>');
               if ($chg ne 'delete') {
                   if ($scope eq 'guest') {
                       $r->print(&mt('Passphrase').': '.$content->{'password'});
                   } elsif ($scope eq 'course') {
                       $r->print('<table width="100%"><tr>');
                       $r->print('<th>'.&mt('Roles').'</th><th>'.
                             &mt('Access').'</th><th>'.
                                             &mt('Sections').'</th>');
                       $r->print('<th>'.&mt('Groups').'</th>');
                       $r->print('</tr>');
                       foreach my $id (sort(keys(%{$content->{'roles'}}))) {
                           $r->print('<tr>');
                           foreach my $item ('role','access','section','group') {
                               $r->print('<td>');
                               if ($item eq 'role') {
                                   my $ucscope = $scope;
                                   $ucscope =~ s/^(\w)/uc($1)/e;
                                   my $role_output;
                                   foreach my $role (@{$content->{'roles'}{$id}{$item}}) {
                                       if ($role eq 'all') {
                                           $role_output .= $role.',';
                                       } elsif ($role =~ /^cr/) {
                                           $role_output .= (split('/',$role))[3].',';
                                       } else {
                                           $role_output .= &Apache::lonnet::plaintext($role,$ucscope).',';
                                       }
                                   }
                                   $role_output =~ s/,$//;
                                   $r->print($role_output);
                               } else {
                                   $r->print(join(',',@{$content->{'roles'}{$id}{$item}}));
                               }
                               $r->print('</td>');
                           }
    $r->print('</tr>');
                       }
       $r->print('</table>');
                   } elsif ($scope eq 'domains') {
                       $r->print(&mt('Domains: ').join(',',@{$content->{'dom'}}));
                   } elsif ($scope eq 'users') {
                       my $curr_user_list = &sort_users($content->{'users'});
                       $r->print(&mt('Users: ').$curr_user_list);
                   } else {
                       $r->print('&nbsp;');
                   }
               } else {
                   $r->print('&nbsp;');
               }
               $r->print('</td>');
               $r->print(&Apache::loncommon::end_data_table_row());
               $count ++;
           }
       }
   }
   
   
   sub update_access {
       my ($r,$url,$group,$port_path) = @_;
       my $totalprocessed = 0;
       my %processing;
       my %title  = (
                            'activate' => 'New control(s) added',
                            'delete'   => 'Existing control(s) deleted',
                            'update'   => 'Existing control(s) modified',
                        );
       my $changes;
       foreach my $chg (sort(keys(%title))) {     
           @{$processing{$chg}} = &Apache::loncommon::get_env_multiple('form.'.$chg);
           $totalprocessed += @{$processing{$chg}};
           foreach my $num (@{$processing{$chg}}) {
               my $scope = $env{'form.scope_'.$num};
               my ($start,$end) = &get_dates_from_form($num);
               my $newkey = $num.':'.$scope.'_'.$end.'_'.$start;
               if ($chg eq 'delete') {
                   $$changes{$chg}{$newkey} = 1;
               } else {
                   $$changes{$chg}{$newkey} = 
                               &build_access_record($num,$scope,$start,$end,$chg);
               }
           }
     }      }
     if ($filenewname ne $ENV{'form.filenewname'}) {      my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'};
         $r->print("The new file name was changed from:<br /><strong>".$ENV{'form.filenewname'}."</strong> to <strong>$filenewname </strong>");      $r->print('<h3>'.&mt('Allowing others to retrieve file: [_1]',
                 $port_path.$file_name).'</h3>'."\n");
       $file_name = &prepend_group($file_name);
       my ($uname,$udom) = &get_name_dom($group);
       my ($errors,$outcome,$deloutcome,$new_values,$translation);
       if ($totalprocessed) {
           ($outcome,$deloutcome,$new_values,$translation) =
           &Apache::lonnet::modify_access_controls($file_name,$changes,$udom,
                                                   $uname);
       }
       my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
                                                                          $uname);
       my %access_controls = 
    &Apache::lonnet::get_access_controls($current_permissions,
        $group,$file_name);
       if ($totalprocessed) {
           if ($outcome eq 'ok') {
               my $updated_controls = $access_controls{$file_name};
               my ($showstart,$showend);
               $r->print(&Apache::loncommon::start_data_table());
               $r->print(&Apache::loncommon::start_data_table_header_row());
               $r->print('<th>'.&mt('Type of change').'</th><th>'.
                         &mt('Access control').'</th><th>'.&mt('Dates available').
                         '</th><th>'.&mt('Additional information').'</th>');
               $r->print(&Apache::loncommon::end_data_table_header_row());
               foreach my $chg (sort(keys(%processing))) {
                   if (@{$processing{$chg}} > 0) {
                       if ($chg eq 'delete') {
                           if (!($deloutcome eq 'ok')) {
                               $errors .='<span class="LC_error">'.
    &mt('A problem occurred deleting access controls: [_1]',$deloutcome).
    '</span>';
                               next;
                           }
                       }
                       my $numchgs = @{$processing{$chg}};
                       $r->print(&Apache::loncommon::start_data_table_row());
                       $r->print('<td rowspan="'.$numchgs.'">'.&mt($title{$chg}).
                                 '.</td>');
                       my $count = 0;
                       my %todisplay;
                       foreach my $key (sort(keys(%{$$changes{$chg}}))) {
                           my ($num,$scope,$end,$start) = &unpack_acc_key($key);
                           my $newkey = $key;
                           if ($chg eq 'activate') {
                               $newkey =~ s/^(\d+)/$$translation{$1}/;
                           }
                           $todisplay{$scope}{$newkey} = $$updated_controls{$newkey};
                       }
                       &build_access_summary($r,$count,$chg,%todisplay);  
                   }
               }
               $r->print(&Apache::loncommon::end_data_table());
           } else {
               if ((@{$processing{'activate'}} > 0) || (@{$processing{'update'}} > 0)) {
                   $errors .= '<span class="LC_error">'.
       &mt('A problem occurred saving access control settings: [_1]',$outcome).
       '</span>';
               }
           }
           if ($errors) { 
               $r->print($errors);
           }
       }
       my $allnew = 0;
       my $totalnew = 0;
       my $status = 'new';
       my ($firstitem,$lastitem);
       foreach my $newitem ('course','domains','users') {
           $allnew += $env{'form.new'.$newitem};
       }
       if ($allnew > 0) {
           my $now = time;
           my $then = $now + (60*60*24*180); # six months approx.
           &open_form($r,$url);
           foreach my $newitem ('course','domains','users') {
               if ($env{'form.new'.$newitem} > 0) {
                   $r->print('<br />'.&mt('Add new <b>[_1]-based</b> access control for portfolio file: <b>[_2]</b>',&mt($newitem),$env{'form.currentpath'}.$env{'form.selectfile'}).'<br /><br />');
                   $firstitem = $totalnew;
                   $lastitem = $totalnew + $env{'form.new'.$newitem};
                   $totalnew = $lastitem;
                   my @numbers;   
                   for (my $i=$firstitem; $i<$lastitem; $i++) {
                       push (@numbers,$i);
                   }
                   &display_access_row($r,$status,$newitem,\@numbers,
                                       $access_controls{$file_name},$now,$then);
               }
           }
           &close_form($r,$url);
       } else {
           my %anchor_fields = (
               'currentpath' => $env{'form.currentpath'},
               'access' => $env{'form.selectfile'}
           );
           $r->print('<br />'.&make_anchor($url, \%anchor_fields, &mt('Display all access settings for this file')));
           delete $anchor_fields{'access'};
           $r->print('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&make_anchor($url,\%anchor_fields,&mt('Return to directory')));
       }
       return;
   }
   
   sub build_access_record {
       my ($num,$scope,$start,$end,$chg) = @_;
       my $record = {
    type => $scope,
    time => {
       start => $start,
       end   => $end
       },
       };
   
       if ($scope eq 'guest') {
           $record->{'password'} = $env{'form.password'};
       } elsif ($scope eq 'course') {
           $record->{'domain'} = $env{'form.crsdom_'.$num};
    $record->{'number'} = $env{'form.crsnum_'.$num};
           my @role_ids;
           my @delete_role_ids =
               &Apache::loncommon::get_env_multiple('form.delete_role_'.$num);
    my @preserves =
       &Apache::loncommon::get_env_multiple('form.preserve_role_'.$num);
    if (@delete_role_ids) {
       foreach my $id (@preserves) {
    if (grep {$_ = $id} (@delete_role_ids)) {
       next;
    }
    push(@role_ids,$id); 
       }
    } else {
       push(@role_ids,@preserves);
    }
   
    my $next_id = $env{'form.add_role_'.$num};
    if ($next_id) {
       push(@role_ids,$next_id);
    }
   
           foreach my $id (@role_ids) {
               my (@roles,@accesses,@sections,@groups);
               if (($id == $next_id) && ($chg eq 'update')) {
                   @roles    = split(/,/,$env{'form.role_'.$num.'_'.$next_id});
                   @accesses = split(/,/,$env{'form.access_'.$num.'_'.$next_id});
                   @sections = split(/,/,$env{'form.section_'.$num.'_'.$next_id});
                   @groups   = split(/,/,$env{'form.group_'.$num.'_'.$next_id});
               } else {
                   @roles = &Apache::loncommon::get_env_multiple('form.role_'.$num.'_'.$id);
                   @accesses = &Apache::loncommon::get_env_multiple('form.access_'.$num.'_'.$id);
                   @sections = &Apache::loncommon::get_env_multiple('form.section_'.$num.'_'.$id);
                   @groups = &Apache::loncommon::get_env_multiple('form.group_'.$num.'_'.$id);
               }
       $record->{'roles'}{$id}{'role'}    = \@roles;
       $record->{'roles'}{$id}{'access'}  = \@accesses;
       $record->{'roles'}{$id}{'section'} = \@sections;
       $record->{'roles'}{$id}{'group'}   = \@groups;
           }
       } elsif ($scope eq 'domains') {
           my @doms = &Apache::loncommon::get_env_multiple('form.dom_'.$num);
    $record->{'dom'} = \@doms;
       } elsif ($scope eq 'users') {
           my $userlist = $env{'form.users_'.$num};
           $userlist =~ s/\s+//sg;
    my %userhash = map { ($_,1) } (split(/,/,$userlist));
           foreach my $user (keys(%userhash)) {
               my ($uname,$udom) = split(/:/,$user);
       push(@{$record->{'users'}}, {
    'uname' => $uname,
    'udom'  => $udom
    });
    }
       }
       return $record;
   }
   
   sub get_dates_from_form {
       my ($id) = @_;
       my $startdate;
       my $enddate;
       $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate_'.$id);
       $enddate   = &Apache::lonhtmlcommon::get_date_from_form('enddate_'.$id);
       if ( exists ($env{'form.noend_'.$id}) ) {
           $enddate = 0;
       }
       return ($startdate,$enddate);
   }
   
   sub sort_users {
       my ($users) = @_; 
       my @curr_users = map {
    $_->{'uname'}.':'.$_->{'udom'}
       } (@{$users});
       my $curr_user_list = join(",\n",sort(@curr_users));
       return $curr_user_list;
   }
   
   sub access_setting_table {
       my ($r,$url,$filename,$access_controls,$action) = @_;
       my ($public,$publictext);
       $publictext ='Off';
       my ($guest,$guesttext);
       $guesttext = 'Off';
       my @courses = ();
       my @domains = ();
       my @users = ();
       my $now = time;
       my $then = $now + (60*60*24*180); # six months approx.
       my ($num,$scope,$publicnum,$guestnum);
       my (%acl_count,%end,%start,%conditionals);
       foreach my $key (sort(keys(%{$access_controls}))) {
           ($num,$scope,$end{$key},$start{$key}) = &unpack_acc_key($key);
           if ($scope eq 'public') {
               $public = $key;
               $publicnum = $num;
               $publictext = &acl_status($start{$key},$end{$key},$now);
           } elsif ($scope eq 'guest') {
               $guest=$key;
               $guestnum = $num;  
               $guesttext = &acl_status($start{$key},$end{$key},$now);
           } else {
               $conditionals{$scope}{$key} = $$access_controls{$key};
               if ($scope eq 'course') {
                   push(@courses,$key);
               } elsif ($scope eq 'domains') {
                   push(@domains,$key);
               } elsif ($scope eq 'users') {
                   push(@users,$key);
               }
           }
           $acl_count{$scope} ++;
       }
       $r->print('<table border="0"><tr><td valign="top">');
       if ($action eq 'chgaccess') {
           &standard_settings($r,$now,$then,$url,$filename,\%acl_count,\%start,
                              \%end,$public,$publicnum,$publictext,$guest,$guestnum,
                              $guesttext,$access_controls,%conditionals);
       } else {
           &condition_setting($r,$access_controls,$now,$then,\%acl_count,
                              \@domains,\@users,\@courses);
       }
       $r->print('</td></tr></table>');
   }
   
   sub standard_settings {
       my ($r,$now,$then,$url,$filename,$acl_count,$start,$end,$public,$publicnum,
         $publictext,$guest,$guestnum,$guesttext,$access_controls,%conditionals)=@_;
       $r->print('<h3>'.&mt('Public access: [_1]',&mt($publictext)).'</h3>');
       $r->print(&Apache::loncommon::start_data_table());
       $r->print(&Apache::loncommon::start_data_table_header_row());
       $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available').'</th>');
       $r->print(&Apache::loncommon::end_data_table_header_row());
       $r->print(&Apache::loncommon::start_data_table_row());
       if ($public) {
           $r->print('<td>'.&actionbox('old',$publicnum,'public').'</td><td>'.
                &dateboxes($publicnum,$start->{$public},$end->{$public}).'</td>');
       } else {
           $r->print('<td>'.&actionbox('new','0','public').'</td><td>'.
                     &dateboxes('0',$now,$then).'</td>');
       }
       $r->print(&Apache::loncommon::end_data_table_row());
       $r->print(&Apache::loncommon::end_data_table());
       $r->print('</td><td width="40">&nbsp;</td><td valign="top">');
       $r->print('<h3>'.&mt('Passphrase-protected access: [_1]',&mt($guesttext)).'</h3>');
       $r->print(&Apache::loncommon::start_data_table());
       $r->print(&Apache::loncommon::start_data_table_header_row());
       $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available').
                 '</th><th>'. &mt('Passphrase').'</th>');
       $r->print(&Apache::loncommon::end_data_table_header_row());
       $r->print(&Apache::loncommon::start_data_table_row());
       my $passwd;
       if ($guest) {
           $passwd = $$access_controls{$guest}{'password'};
           $r->print('<td>'.&actionbox('old',$guestnum,'guest').'</td><td>'.
                 &dateboxes($guestnum,$start->{$guest},$end->{$guest}).'</td>');
       } else {
           $r->print('<td>'.&actionbox('new','1','guest').'</td><td>'.
                     &dateboxes('1',$now,$then).'</td>');
       }
       $r->print('<td><input type="text" size="15" name="password" value="'.
                 $passwd.'" /></td>');
       $r->print(&Apache::loncommon::end_data_table_row());
       $r->print(&Apache::loncommon::end_data_table());
       $r->print('</td></tr><tr><td colspan="3">&nbsp;</td></tr>'.
                 '<tr><td colspan="3">');
       my $numconditionals = 0;
       my $conditionstext;
       my %cond_status;
       foreach my $scope ('domains','users','course') {
           $numconditionals += $acl_count->{$scope}; 
           if ($acl_count->{$scope} > 0) {
               if ($conditionstext ne 'Active') { 
                   foreach my $key (keys(%{$conditionals{$scope}})) {
                       $conditionstext = &acl_status($start->{$key},$end->{$key},$now);
                       if ($conditionstext eq 'Active') {
                          last;
                       }
                   }
               }
           }
       }
       if ($conditionstext eq '') {
           $conditionstext = 'Off';
       }
       my %anchor_fields = (
               'access' => $env{'form.selectfile'},
               'action' => 'chgconditions',
               'currentpath' => $env{'form.currentpath'},
           );
       $r->print('<h3>'.&mt('Conditional access: [_1]',&mt($conditionstext)).'</h3>');
       if ($numconditionals > 0) {
           my $count = 1;
           my $chg = 'none';
           $r->print(&mt('You have previously set [_1] conditional access controls.',$numconditionals).' '.&make_anchor($url,\%anchor_fields,&mt('Change Conditions')).'<br /><br />');
           $r->print(&Apache::loncommon::start_data_table());
           $r->print(&Apache::loncommon::start_data_table_header_row());
           $r->print('<th>'.&mt('Access control').'</th><th>'.&mt('Dates available').
                     '</th><th>'.&mt('Additional information').'</th>');
           $r->print(&Apache::loncommon::end_data_table_header_row());
           &build_access_summary($r,$count,$chg,%conditionals);
           $r->print(&Apache::loncommon::end_data_table());
       } else {
           $r->print(&make_anchor($url,\%anchor_fields,&mt('Add conditional access')).' '.&mt('based on domain, username, or course affiliation.'));
       }
   }
   
   sub condition_setting {
       my ($r,$access_controls,$now,$then,$acl_count,$domains,$users,$courses) = @_;
       $r->print('<tr><td valign="top">');
       &access_element($r,'domains',$acl_count,$domains,$access_controls,$now,$then);
       $r->print('</td><td>&nbsp;</td><td valign="top">');
       &access_element($r,'users',$acl_count,$users,$access_controls,$now,$then);
       $r->print('</td></tr><tr><td colspan="3"></td></tr><tr>');
       if ($acl_count->{course} > 0) {
           $r->print('<td colspan="3" valign="top">');
       } else {
           $r->print('<td valign="top">');
       }
       &access_element($r,'course',$acl_count,$courses,$access_controls,$now,$then);
       $r->print('</td>');
       $r->print('</td></tr></table>');
   }
   
   sub acl_status {
       my ($start,$end,$now) = @_;
       if ($start > $now) {
           return 'Inactive';
       }
       if ($end && $end<$now) {
           return 'Inactive';
       }
       return 'Active';
   }
   
   sub access_element {
       my ($r,$type,$acl_count,$items,$access_controls,$now,$then) = @_;
       my $title = $type;
       $title =~ s/s$//;
       $title =~ s/^(\w)/uc($1)/e;
       $r->print('<h3>'.&mt('[_1]-based conditional access: ',&mt($title)));
       if ($$acl_count{$type}) {
           $r->print($$acl_count{$type}.' ');
           if ($$acl_count{$type} > 1) {
               $r->print(&mt('conditions'));
           } else {
               $r->print(&mt('condition'));
           }
       } else {
           $r->print(&mt('Off'));
       }
       $r->print('</h3>');
       &display_access_row($r,'old',$type,$items,$access_controls,$now,$then);
       return;
   }
   
   sub display_access_row {
       my ($r,$status,$type,$items,$access_controls,$now,$then) = @_;
       if (@{$items} > 0) {
           my @all_doms;
           my $colspan = 3;
           my $uctype = $type;
           $uctype =~ s/^(\w)/uc($1)/e;
           $r->print(&Apache::loncommon::start_data_table());
           $r->print(&Apache::loncommon::start_data_table_header_row());
           $r->print('<th>'.&mt('Action?').'</th><th>'.&mt($uctype).'</th><th>'.
                 &mt('Dates available').'</th>');
           if ($type eq 'course' && $status eq 'old') {
               $r->print('<th>'.&mt('Allowed [_1] member affiliations',$type).
                         '</th>');
               $colspan ++;
           } elsif ($type eq 'domains') {
               @all_doms = sort(&Apache::lonnet::all_domains());
           }
           $r->print(&Apache::loncommon::end_data_table_header_row());
           foreach my $key (@{$items}) {
       $r->print(&Apache::loncommon::start_data_table_row());
               if ($type eq 'course') {
                   &course_row($r,$status,$type,$key,$access_controls,$now,$then);
               } elsif ($type eq 'domains') {
                   &domains_row($r,$status,$key,\@all_doms,$access_controls,$now,
                               $then);
               } elsif ($type eq 'users') {
                   &users_row($r,$status,$key,$access_controls,$now,$then);
               }
       $r->print(&Apache::loncommon::end_data_table_row());
           }
           if ($status eq 'old') {
       $r->print(&Apache::loncommon::start_data_table_row());
               $r->print('<td colspan="',$colspan.'">'.&additional_item($type).
                         '</td>');
       $r->print(&Apache::loncommon::end_data_table_row());
           }
           $r->print(&Apache::loncommon::end_data_table());
       } else {
           $r->print(&mt('No [_1]-based conditions defined.',&mt($type)).'<br />'
                     .&additional_item($type));
       }
       return;
   }
   
   sub course_js {
       return qq|
   <script type="text/javascript">
   function setRoleOptions(num,roleid,cdom,cnum,type) {
       updateIndexNum = getIndexByValue('update',num);
       var addItem = 'add_role_'+num;
       var addIndexNum = getIndexByName(addItem);
       if (document.portform.elements[addItem].checked) {
           document.portform.elements[updateIndexNum].checked = true;
           var url = '/adm/portfolio?action=rolepicker&setroles='+num+'_'+roleid+'&cnum='+cnum+'&cdom='+cdom+'&type='+type;
           var title = 'Roles_Chooser';
           var options = 'scrollbars=1,resizable=1,menubar=0';
           options += ',width=700,height=600';
           rolebrowser = open(url,title,options,'1');
           rolebrowser.focus();
       } else {
           addArray = new Array ('role','access','section','group');
           for (var j=0;j<addArray.length;j++) {
               var itemIndex = getIndexByName(addArray[j]+'_'+num+'_'+roleid);
               document.portform.elements[itemIndex].value = '';
           }
       }
   }
   
   function getIndexByName(item) {
       for (var i=0;i<document.portform.elements.length;i++) {
           if (document.portform.elements[i].name == item) {
               return i;
           }
     }      }
     $r->print(&done());      return -1;
 }  }
   
   function getIndexByValue(name,value) {
       for (var i=0;i<document.portform.elements.length;i++) {
           if (document.portform.elements[i].name == name && document.portform.elements[i].value == value) {
               return i;
           }
       }
       return -1;
   }
   
   </script>
   |;
   }
   
   sub course_row {
       my ($r,$status,$type,$item,$access_controls,$now,$then) = @_;
       my $content;
       my $defdom = $env{'user.domain'};
       if ($status eq 'old') {
           $content = $$access_controls{$item}; 
           $defdom =  $content->{'domain'};
       }
       my $js = &Apache::loncommon::coursebrowser_javascript($defdom)
    .&course_js();
       my $uctype = $type;
       $uctype =~ s/^(\w)/uc($1)/e;
       my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,
                                                       $type);
       $r->print('<td>'.$js.&actionbox($status,$num,$scope).'</td>');
       if ($status eq 'old') {
           my $cid = $content->{'domain'}.'_'.$content->{'number'};
           my %course_description = &Apache::lonnet::coursedescription($cid);
           $r->print('<td><input type="hidden" name="crsdom_'.$num.'" value="'.$content->{'domain'}.'" /><input type="hidden" name="crsnum_'.$num.'" value="'.$content->{'number'}.'" />'.$course_description{'description'}.'</td>');
       } elsif ($status eq 'new') {
           $r->print('<td>'.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,$num.'_1',undef,$uctype).'&nbsp;&nbsp;<input type="text" name="description_'.$num.'" size="30" /><input type="hidden" name="crsdom_'.$num.'" /><input type="hidden" name="crsnum_'.$num.'" /></td>');
       }
       $r->print('<td>'.&dateboxes($num,$start,$end));
       my $newrole_id = 1;
       if ($status eq 'old') {
           $r->print('</td><td>');
           my $max_id = 0;
           if (keys(%{$content->{'roles'}}) > 0) {
               $r->print('<table><tr><th>'.&mt('Action').'</th>'.
                         '<th>'.&mt('Roles').'</th>'.
                         '<th>'.&mt('Access').'</th>'.
                         '<th>'.&mt('Sections').'</th>'.
                         '<th>'.&mt('Groups').'</th></tr>');
               foreach my $role_id (sort(keys(%{$content->{'roles'}}))) {
                   if ($role_id > $max_id) {
                       $max_id = $role_id;
                   }
                   $max_id ++;
                   my $role_selects = &role_selectors($num,$role_id,$type,$content,'display');
                   $r->print('<tr><td><span style="white-space: nowrap"><label><input type="checkbox" name="delete_role_'.$num.'" value="'.$role_id.'" />'.&mt('Delete').'</label></span><br /><input type="hidden" name="preserve_role_'.$num.'" value="'.$role_id.'" /></td>'.$role_selects.'</tr>');
               }
               $r->print('</table>');
           }
           $r->print('<br />'.&mt('Add a roles-based condition').
                     '&nbsp;<input type="checkbox" name ="add_role_'.
                     $num.'" onClick="javascript:setRoleOptions('."'$num',
                     '$max_id','$content->{'domain'}','$content->{'number'}',
                     '$uctype'".')" value="" />');
           $newrole_id = $max_id;
       } else {
           $r->print('<input type="hidden" name ="add_role_'.$num.'" value="" />');
       }
       $r->print(&add_course_role($num,$newrole_id));
       $r->print('</td>');
       return;
   }
   
   sub add_course_role {
       my ($num,$max_id) = @_;
       my $output;
       $output .='<input type="hidden" name="role_'.$num.'_'.$max_id.'" />'.
                 '<input type="hidden" name="access_'.$num.'_'.$max_id.'" />'.
                 '<input type="hidden" name="section_'.$num.'_'.$max_id.'" />'.
                 '<input type="hidden" name="group_'.$num.'_'.$max_id.'" />';
       return $output;
   }
   
   sub domains_row {
       my ($r,$status,$item,$all_doms,$access_controls,$now,$then) = @_;
       my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,
                                                       'domains');
       my $dom_select = '<select name="dom_'.$num.'" size="4" multiple="true">'.
                        ' <option value="">'.&mt('Please select').'</option>';
       if ($status eq 'old') {
           my $content =  $$access_controls{$item};
    foreach my $dom (@{$all_doms}) {
               if ((@{$content->{'dom'}} > 0) 
    && (grep(/^\Q$dom\E$/,@{$content->{'dom'}}))) {
                   $dom_select .= '<option value="'.$dom.'" selected>'.
                                  $dom.'</option>';
               } else {
                   $dom_select .= '<option value="'.$dom.'">'.$dom.'</option>';
               }
           }
       } else {
           foreach my $dom (@{$all_doms}) {
               $dom_select .= '<option value="'.$dom.'">'.$dom.'</option>';
           }
       }
       $dom_select .= '</select>';
       $r->print('<td>'.&actionbox($status,$num,$scope).'</td><td>'.$dom_select.
                 '</td><td>'.&dateboxes($num,$start,$end).'</td>');
   }
   
   sub users_row {
       my ($r,$status,$item,$access_controls,$now,$then) = @_;
       my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,
                                                       'users');
       my $curr_user_list;
       if ($status eq 'old') {
           my $content = $$access_controls{$item};
           $curr_user_list = &sort_users($content->{'users'});
       }
       $r->print('<td>'.&actionbox($status,$num,$scope).'</td><td>'.&mt("Format for users' username:domain information:").'<br /><tt>sparty:msu,illini:uiuc  ... etc.</tt><br /><textarea name="users_'.$num.'" cols="30"  rows="5">'.$curr_user_list.'</textarea></td><td>'.&dateboxes($num,$start,$end).'</td>');
   }
   
   sub additional_item {
       my ($type) = @_;
       my $output = &mt('Add new [_1] condition(s)?',&mt($type)).'&nbsp;'.&mt('Number to add: ').'<input type="text" name="new'.$type.'" size="3" value="0" />';
       return $output;
   }
   
   sub actionbox {
       my ($status,$num,$scope) = @_;
       my $output = '<span style="white-space: nowrap"><label>';
       if ($status eq 'new') {
           my $checkstate;
           if ($scope eq 'domains' || $scope eq 'users' || $scope eq 'course') {
               $checkstate = 'checked="checked"';
           }
           $output .= '<input type="checkbox" name="activate" value="'.$num.'" '.
                      $checkstate.'  />'.
           &mt('Activate');
       } else {
           $output .= '<input type="checkbox" name="delete" value="'.$num.
                      '" />'.&mt('Delete').'</label></span><br /><span style="white-space: nowrap">'.
                      '<label><input type="checkbox" name="update" value="'.
                      $num.'" />'.&mt('Update');
       }
       $output .= '</label></span><input type="hidden" name="scope_'.$num.                '" value="'.$scope.'" />';
       return $output;
   }
                                                                                      
   sub dateboxes {
       my ($num,$start,$end) = @_;
       my $noend;
       if ($end == 0) {
           $noend = 'checked="checked"';
       }
       my $startdate = &Apache::lonhtmlcommon::date_setter('portform',
                              'startdate_'.$num,$start,undef,undef,undef,1,undef,
                               undef,undef,1);
       my $enddate = &Apache::lonhtmlcommon::date_setter('portform',
                                  'enddate_'.$num,$end,undef,undef,undef,1,undef,
                                   undef,undef,1). '&nbsp;&nbsp;<span style="white-space: nowrap"><label>'.
                                   '<input type="checkbox" name="noend_'.
                                   $num.'" '.$noend.' />'.&mt('No end date').
                                   '</label></span>';
                                                                                      
       my $output = &mt('Start: ').$startdate.'<br />'.&mt('End: ').$enddate;
       return $output;
   }
   
   sub unpack_acc_key {
       my ($acc_key) = @_;
       my ($num,$scope,$end,$start) = ($acc_key =~ /^([^:]+):([a-z]+)_(\d*)_?(\d*)$/);
       return ($num,$scope,$end,$start);
   }
   
   sub set_identifiers {
       my ($status,$item,$now,$then,$scope) = @_;
       if ($status eq 'old') {
           return(&unpack_acc_key($item));
       } else {
           return($item,$scope,$then,$now);
       }
   } 
   
   sub role_selectors {
       my ($num,$role_id,$type,$content,$caller) = @_;
       my ($output,$cdom,$cnum,$longid);
       if ($caller eq 'display') {
           $longid = '_'.$num.'_'.$role_id;
           $cdom = $$content{'domain'};
           $cnum = $$content{'number'};
       } elsif ($caller eq 'rolepicker') {
            $cdom = $env{'form.cdom'};
            $cnum = $env{'form.cnum'};
       }
       my $uctype = $type;
       $uctype =~ s/^(\w)/uc($1)/e;
       my ($sections,$groups,$allroles,$rolehash,$accesshash) =
               &Apache::loncommon::get_secgrprole_info($cdom,$cnum,1,$uctype);
       if (!@{$sections}) {
           @{$sections} = ('none');
       } else {
           unshift(@{$sections},('all','none'));
       }
       if (!@{$groups}) {
           @{$groups} = ('none');
       } else {
           unshift(@{$groups},('all','none'));
       }
       my @allacesses = sort(keys(%{$accesshash}));
       my (%sectionhash,%grouphash);
       foreach my $sec (@{$sections}) {
           $sectionhash{$sec} = $sec;
       }
       foreach my $grp (@{$groups}) {
           $grouphash{$grp} = $grp;
       }
       my %lookup = (
                      'role' => $rolehash,
                      'access' => $accesshash,
                      'section' => \%sectionhash,
                      'group' => \%grouphash,
                    );
       my @allaccesses = sort(keys(%{$accesshash}));
       my %allitems = (
                       'role' => $allroles,
                       'access' => \@allaccesses,
                       'section' => $sections,
                       'group' => $groups,
                      );
       foreach my $item ('role','access','section','group') {
           $output .= '<td><select name="'.$item.$longid.'" multiple="true" size="4">'."\n";
           foreach my $entry (@{$allitems{$item}}) {
               if ($caller eq 'display') {
                   if ((@{$$content{'roles'}{$role_id}{$item}} > 0) && 
                       (grep(/^\Q$entry\E$/,@{$$content{'roles'}{$role_id}{$item}}))) {
                       $output .= '  <option value="'.$entry.'" selected>'.
                                     $lookup{$item}{$entry}.'</option>';
                       next;
                   }
               }
               $output .= '  <option value="'.$entry.'">'.
                          $lookup{$item}{$entry}.'</option>';
           }
           $output .= '</select>';
       }
       $output .= '</td>';
       return $output;
   }
   
   sub role_options_window {
       my ($r) = @_;
       my $type = $env{'form.type'};
       my $rolenum = $env{'form.setroles'};
       my ($num,$role_id) = ($rolenum =~ /^([\d_]+)_(\d+)$/);
       my $role_elements;
       foreach my $item ('role','access','section','group') {
           $role_elements .= "'".$item.'_'.$rolenum."',";
       }
       $role_elements =~ s/,$//; 
       my $role_selects = &role_selectors($num,$role_id,$type,undef,
                                          'rolepicker');
       $r->print(<<"END_SCRIPT");
   <script type="text/javascript">
   function setRoles() {
       var role_elements = new Array($role_elements);
       for (var i=0; i<role_elements.length; i++) {
           var copylist = '';
           for (var j=0; j<document.rolepicker.elements[i].length; j++) {
               if (document.rolepicker.elements[i].options[j].selected) {
                   copylist = copylist + document.rolepicker.elements[i].options[j].value + ',';
               }
           }
           copylist = copylist.substr(0,copylist.length-1);
           var openerItem = getIndexByName(role_elements[i]);
           opener.document.portform.elements[openerItem].value = copylist; 
       }
       var roleAdder = getIndexByName('add_role_$num');
       opener.document.portform.elements[roleAdder].value = '$role_id';
       self.close();
   }
   
   function getIndexByName(item) {
       for (var i=0;i<opener.document.portform.elements.length;i++) {
           if (opener.document.portform.elements[i].name == item) {
               return i;
           }
       }
       return -1;
   }
   
   </script>
   END_SCRIPT
       $r->print(&mt('Select roles, course status, section(s) and group(s) for users who will be able to access the portfolio file.'));
       $r->print('<form name="rolepicker" action="/adm/portfolio" method="post"><table><tr><th>'.&mt('Roles').'</th><th>'.&mt('[_1] status',$type).'</th><th>'.&mt('Sections').'</th><th>'.&mt('Groups').'</th></tr><tr>'.$role_selects.'</tr></table><br /><input type="button" name="rolepickbutton" value="Save selections" onclick="setRoles()" />');
       return;
   }
   
 sub select_files {  sub select_files {
     my ($r)=@_;      my ($r) = @_;
     if ($ENV{'form.continue'} eq 'true') {      if ($env{'form.continue'} eq 'true') {
         # here we update the selections for the currentpath          # here we update the selections for the currentpath
         # eventually, have to handle removing those not checked, but . . .           # eventually, have to handle removing those not checked, but . . . 
         my @items=&Apache::loncommon::get_env_multiple('form.selectfile');          my @items=&Apache::loncommon::get_env_multiple('form.checkfile');
         &Apache::lonnet::save_selected_files($ENV{'user.name'}, $ENV{'form.currentpath'}, @items);          if (scalar(@items)){
                &Apache::lonnet::save_selected_files($env{'user.name'}, $env{'form.currentpath'}, @items);
           }
     } else {      } else {
         if ($ENV{'form.currentpath'} eq '/') {  
             #empty the file for a fresh start              #empty the file for a fresh start
             # &Apache::lonnet::clear_selected_files($ENV{'user.name'});              &Apache::lonnet::clear_selected_files($env{'user.name'});
         }  
     }      }
     my @files = &Apache::lonnet::files_not_in_path($ENV{'user.name'}, $ENV{'form.currentpath'});      my @files = &Apache::lonnet::files_not_in_path($env{'user.name'}, $env{'form.currentpath'});
     my $java_files = join ",", @files;      my $java_files = join ",", @files;
     if ($java_files) {      if ($java_files) {
         $java_files.=',';          $java_files.=',';
     }      }
     my $javascript =(<<ENDSMP);      my $javascript =(<<ENDSMP);
         <script language='javascript'>          <script type="text/javascript">
         function finishSelect() {          function finishSelect() {
 ENDSMP  ENDSMP
     $javascript .= 'fileList = "'.$java_files.'";';      $javascript .= 'fileList = "'.$java_files.'";';
Line 584  ENDSMP Line 1739  ENDSMP
                     fileList = fileList + document.forms.checkselect.currentpath.value + document.forms.checkselect[i].value + "," ;                      fileList = fileList + document.forms.checkselect.currentpath.value + document.forms.checkselect[i].value + "," ;
                 }                  }
             }              }
             opener.document.forms.lonhomework.              var hwfield = opener.document.getElementsByName('$env{'form.fieldname'}');
 ENDSMP              hwfield[0].value = fileList;
     $javascript .= $ENV{'form.fieldname'};  
     $javascript .= (<<ENDSMP);  
         .value=fileList;  
             self.close();              self.close();
         }          }
         </script>          </script>
 ENDSMP  ENDSMP
     $r->print($javascript);      $r->print($javascript);
     $r->print("<h1>Select portfolio files</h1>      $r->print("<h1>".&mt('Select portfolio files')."</h1>".
                 Check as many as you wish in response to the essay problem.<br />");                  &mt('Check as many as you wish in response to the problem.')."<br />");
     $r->print("<strong>Files selected from other directories:</strong><br />");      my @otherfiles=&Apache::lonnet::files_not_in_path($env{'user.name'}, $env{'form.currentpath'});
     foreach (&Apache::lonnet::files_not_in_path($ENV{'user.name'}, $ENV{'form.currentpath'})) {      if (@otherfiles) {
         $r->print($_."<br />");   $r->print("<strong>".&mt('Files selected from other directories:')."</strong><br />");
    foreach my $file (@otherfiles) {
       $r->print($file."<br />");
    }
     }      }
 }  }
 sub upload {  
     my ($r)=@_;  
     my $fname=$ENV{'form.uploaddoc.filename'};  sub check_for_upload {
     my $filesize = (length($ENV{'form.uploaddoc'})) / 1000; #express in k (1024?)      my ($path,$fname,$group,$element) = @_;
     my $disk_quota = 20000; # expressed in k      my $disk_quota = &get_quota($group);
     $fname=&Apache::lonnet::clean_filename($fname);      my $filesize = (length($env{'form.'.$element})) / 1000; #express in k (1024?)
     my $portfolio_root = &Apache::loncommon::propath($ENV{'user.domain'},      my $portfolio_root = &get_portfolio_root();
  $ENV{'user.name'}).      my $port_path = &get_port_path();
  '/userfiles/portfolio';      my ($uname,$udom) = &get_name_dom($group);
     # Fixme --- Move the checking for existing file to LOND error return      # Fixme --- Move the checking for existing file to LOND error return
     my @dir_list=&Apache::lonnet::dirlist($ENV{'form.currentpath'},      my @dir_list=&get_dir_list($portfolio_root,$path,$group);
   $ENV{'user.domain'},  
   $ENV{'user.name'},$portfolio_root);  
     my $found_file = 0;      my $found_file = 0;
       my $locked_file = 0;
     foreach my $line (@dir_list) {      foreach my $line (@dir_list) {
         my ($filename)=split(/\&/,$line,2);          my ($file_name)=split(/\&/,$line,2);
         if ($filename eq $fname){          if ($file_name eq $fname){
               $file_name = $path.$file_name;
               $file_name = &prepend_group($file_name);
             $found_file = 1;              $found_file = 1;
               if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
                   $locked_file = 1;
               } 
         }          }
     }      }
     my $current_disk_usage = &Apache::lonnet::diskusage($ENV{'user.domain'}, $ENV{'user.name'},$portfolio_root);      my $getpropath = 1;
     if ((($current_disk_usage/1000) + $filesize) > $disk_quota){      my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath);
         $r->print('<font color="red">Unable to upload <strong>'.$fname.' (size = '.$filesize.' kilobytes</strong>. Disk quota will be exceeded.'.  
                   '<br />Disk quota is '.$disk_quota.' kilobytes. Your current disk usage is '.$current_disk_usage.' kilobytes.');      if (($current_disk_usage + $filesize) > $disk_quota){
     }           my $msg = '<span class="LC_error">'.
     elsif ($found_file){                     &mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded.','<span class="LC_filename">'.$fname.'</span>',$filesize).'</span>'.
         $r->print('<font color="red">Unable to upload <strong>'.$fname.'</strong>, a file by that name was found in <strong>'.$ENV{'form.currentpath'}.'</strong></font>'.                    '<br />'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.',$disk_quota,$current_disk_usage);
                   '<br />To upload, rename or delete existing '.$fname.' in '.$ENV{'form.currentpath'});   return ('will_exceed_quota',$msg);
     } else {      } elsif ($found_file) {
         my $result=&Apache::lonnet::userfileupload('uploaddoc','',          if ($locked_file) {
          'portfolio'.$ENV{'form.currentpath'});              my $msg = '<span class="LC_error">';
         if ($result !~ m|^/uploaded/|) {              $msg .= &mt('Unable to upload [_1]. A locked file by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>','<span class="LC_filename">'.$port_path.$env{'form.currentpath'}.'</span>');
             $r->print('<font color="red"> An errror occured ('.$result.              $msg .= '</span><br />';
               ') while trying to upload '.&display_file().'</font><br />');              $msg .= &mt('You will be able to rename or delete existing [_1] after a grade has been assigned.','<span class="LC_filename">'.$fname.'</span>');
       return ('file_locked',$msg);
    } else {
               my $msg = '<span class="LC_error">';
               $msg .= &mt('Unable to upload [_1]. A file by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>',$port_path.$env{'form.currentpath'});
               $msg .= '</span>';
               $msg .= '<br />';
               $msg .= &mt('To upload, rename or delete existing [_1] in [_2].','<span class="LC_filename">'.$fname.'</span>', $port_path.$env{'form.currentpath'});
       return ('file_exists',$msg);
    }
       }
   }
   
   sub upload {
       my ($r,$url,$group)=@_;
       my $fname=&Apache::lonnet::clean_filename($env{'form.uploaddoc.filename'});
   
       my ($state,$msg) = &check_for_upload($env{'form.currentpath'},
    $fname,$group,'uploaddoc');
   
       if ($state eq 'will_exceed_quota'
    || $state eq 'file_locked'
    || $state eq 'file_exists' ) {
    $r->print($msg.&done('Back',$url));
    return;
       }
   
       my $port_path = &get_port_path();
       my (%allfiles,%codebase,$mode);
       if ($env{'form.uploaddoc.filename'} =~ m/(\.htm|\.html|\.shtml)$/i) {
           if ($env{'form.parserflag'}) {
       $mode = 'parse';
         }          }
     }      }
     $r->print(&done());      my $result=
    &Apache::lonnet::userfileupload('uploaddoc','',
    $port_path.$env{'form.currentpath'},
    $mode,\%allfiles,\%codebase);
       if ($result !~ m|^/uploaded/|) {
    $r->print('<span class="LC_error">'.&mt('An error occurred ([_1]) while trying to upload [_2].'
                     ,$result,&display_file()).'</span><br />');
    $r->print(&done('Back',$url));
       } else {
    if (%allfiles) {
       my $state = <<STATE;
       <input type="hidden" name="action"      value="upload_embedded" />
       <input type="hidden" name="currentpath" value="$env{'form.currentpath'}" />
       <input type="hidden" name="fieldname"   value="$env{'form.fieldname'}" />
       <input type="hidden" name="mode"        value="$env{'form.mode'}" />
   STATE
               $r->print("<h2>".&mt("Reference Warning")."</h2>");
               $r->print("<p>".&mt("Completed upload of the file. This file contained references to other files. You must upload the referenced files or else the uploaded file may not work properly.")."</p>");
               $r->print("<p>".&mt("Please select the locations from which the referenced files are to be uploaded.")."</p>");
       $r->print(&Apache::loncommon::ask_for_embedded_content('/adm/portfolio',$state,\%allfiles,\%codebase,
         {'error_on_invalid_names'   => 1,
          'ignore_remote_references' => 1,}));
       $r->print('<p>Or '.&done('Return to directory',$url).'</p>');
    } else {
       $r->print(&done(undef,$url));
    }
       }
   }
   
   sub upload_embedded {
       my ($r,$url,$group)=@_;
       for (my $i=0; $i<$env{'form.number_embedded_items'}; $i++) {
    next if (!exists($env{'form.embedded_item_'.$i.'.filename'}));
    my $orig_uploaded_filename = 
       $env{'form.embedded_item_'.$i.'.filename'};
   
    $env{'form.embedded_orig_'.$i} = 
       &unescape($env{'form.embedded_orig_'.$i});
    my ($path,$fname) = 
       ($env{'form.embedded_orig_'.$i} =~ m{(.*/)([^/]*)});
    # no path, whole string is fname
    if (!$fname) { $fname = $env{'form.embedded_orig_'.$i} };
   
    $path = $env{'form.currentpath'}.$path;
    $fname = &Apache::lonnet::clean_filename($fname);
   
    my ($state,$msg) = &check_for_upload($path,$fname,$group,
        'embedded_item_'.$i);
   
    if ($state eq 'will_exceed_quota'
       || $state eq 'file_locked'
       || $state eq 'file_exists' ) {
       $r->print($msg);
       next;
    }
   
    my $port_path = &get_port_path();
    my $src_path = $env{'form.embedded_orig_'.$i};
    $env{'form.embedded_item_'.$i.'.filename'}=$fname;
   
    my $result=
       &Apache::lonnet::userfileupload('embedded_item_'.$i,'',
       $port_path.$path);
    if ($result !~ m|^/uploaded/|) {
       $r->print('<span class="LC_error">'
                         .&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].'
                              ,$result,$orig_uploaded_filename,$env{'form.embedded_orig_'.$i})
                         .'</span><br />');
       next;
    } else {
       $r->print("<p> Uploaded ".
         &display_file($port_path.$path,$fname).'</p>');
    }
       }
       $r->print(&done(undef,$url));
   }
   
   sub lock_info {
       my ($r,$url,$group) = @_;
       my ($uname,$udom) = &get_name_dom($group);
       my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
                                                                          $uname);
       my $file_name = $env{'form.lockinfo'};
       $file_name = &prepend_group($file_name);
       if (defined($file_name) && defined($$current_permissions{$file_name})) {
           foreach my $array_item (@{$$current_permissions{$file_name}}) {
               next if (ref($array_item) ne 'ARRAY');
   
       my $filetext;
       if (defined($group)) {
    $filetext = '<strong>'.$env{'form.lockinfo'}.
       '</strong> (group: '.$group.')'; 
       } else {
    $filetext = '<strong>'.$file_name.'</strong>';
       } 
       
       my $title ='<strong>'.&Apache::lonnet::gettitle($$array_item[0]).
    '</strong><br />';
       if ($$array_item[-1] eq 'graded') {
    $r->print(&mt('[_1] was submitted in response to problem: [_2]',
                                 $filetext,$title));
       } elsif ($$array_item[-1] eq 'handback') {
    $r->print(&mt('[_1] was handed back in response to problem: [_2]',
                                 $filetext,$title));
       } else {
    # submission style lock
    $r->print(&mt('[_1] was submitted in response to problem: [_2]',
                                 $filetext,$title));
       }
       my %course_description = 
    &Apache::lonnet::coursedescription($$array_item[1]);
       if ( $course_description{'description'} ne '') {
    $r->print(&mt('In the course:').' <strong>'.$course_description{'description'}.'</strong><br />');
       }
           }
       }
       $r->print(&done(&mt('Back'),$url));
       return 'ok';
 }  }
   
 sub createdir {  sub createdir {
     my ($r)=@_;      my ($r,$url,$group)=@_;
     my $newdir=&Apache::lonnet::clean_filename($ENV{'form.newdir'});      my $newdir=&Apache::lonnet::clean_filename($env{'form.newdir'});
     if ($newdir eq '') {      if ($newdir eq '') {
     $r->print('<font color="red">'.      $r->print('<span class="LC_error">'.
       &mt("Error: no directory name was provided.").        &mt("Error: no directory name was provided.").
       '</font><br />');        '</span><br />');
     $r->print(&done());      $r->print(&done(undef,$url));
     return;      return;
     }       }
     my $portfolio_root = &Apache::loncommon::propath($ENV{'user.domain'},      my $portfolio_root = &get_portfolio_root(); 
  $ENV{'user.name'}).      my @dir_list=&get_dir_list($portfolio_root,undef,$group);
  '/userfiles/portfolio';  
     my @dir_list=&Apache::lonnet::dirlist($ENV{'form.currentpath'},  
   $ENV{'user.domain'},  
   $ENV{'user.name'},$portfolio_root);  
     my $found_file = 0;      my $found_file = 0;
     foreach my $line (@dir_list) {      foreach my $line (@dir_list) {
         my ($filename)=split(/\&/,$line,2);          my ($filename)=split(/\&/,$line,2);
Line 664  sub createdir { Line 1967  sub createdir {
         }          }
     }      }
     if ($found_file){      if ($found_file){
        $r->print('<font color="red"> Unable to create a directory named <strong>'.$newdir.         $r->print('<span class="LC_error">'
                ' </strong>a file or directory by that name already exists.</font><br />');                        .&mt('Unable to create a directory named [_1].','<strong>'.$newdir.'</strong>')
                         .' '.&mt('A file or directory by that name already exists.').'</span><br />');
     } else {      } else {
         my $result=&Apache::lonnet::mkdiruserfile($ENV{'user.name'},          my ($uname,$udom) = &get_name_dom($group);
          $ENV{'user.domain'},'portfolio'.$ENV{'form.currentpath'}.$newdir);          my $port_path = &get_port_path();
           my $result=&Apache::lonnet::mkdiruserfile($uname,$udom,
            $port_path.$env{'form.currentpath'}.$newdir);
         if ($result ne 'ok') {          if ($result ne 'ok') {
        $r->print('<font color="red"> An errror occured ('.$result.         $r->print('<span class="LC_error">'
           ') while trying to create a new directory '.&display_file().'</font><br />');                        .&mt('An error occurred ([_1]) while trying to create a new directory [_2].'
                              ,$result,&display_file())
                         .'</span><br />');
         }          }
     }      }
     if ($newdir ne $ENV{'form.newdir'}) {      if ($newdir ne $env{'form.newdir'}) {
         $r->print("The new directory name was changed from:<br /><strong>".$ENV{'form.newdir'}."</strong> to <strong>$newdir </strong>");            $r->print(&mt('The new directory name was changed from [_1] to [_2].'
                         ,'<strong>'.$env{'form.newdir'}.'</strong>','<strong>'.$newdir.'</strong>'));  
       }
       $r->print(&done(undef,$url));
   }
   
   sub get_portfolio_root {
       my ($udom,$uname,$group) = @_;
       if (!(defined($udom)) || !(defined($uname))) {
           ($uname,$udom) = &get_name_dom($group);
       }
       my $path = '/userfiles/portfolio';
       if (!defined($group)) { 
           if (defined($env{'form.group'})) {
               $group = $env{'form.group'};      
           }
       }
       if (defined($group)) {
           $path = '/userfiles/groups/'.$group.'/portfolio';
       } 
       return $path;
   }
   
   sub get_group_quota {
       my ($group) = @_;
       my $group_quota; 
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$group);
       if (%curr_groups) {
           my %group_info =  &Apache::longroup::get_group_settings(
                                                       $curr_groups{$group});
           $group_quota = $group_info{'quota'}; #expressed in Mb
           if ($group_quota) {
               $group_quota = 1000 * $group_quota; #expressed in k
           }
       }
       return $group_quota;
   }
   
   sub get_dir_list {
       my ($portfolio_root,$path,$group) = @_;
       $path ||= $env{'form.currentpath'};
       my ($uname,$udom) = &get_name_dom($group);
       my $getpropath = 1;
       return &Apache::lonnet::dirlist($portfolio_root.$path,$udom,$uname,$getpropath);
   }
   
   sub get_name_dom {
       my ($group) = @_;
       my ($uname,$udom);
       if (defined($group)) {
           $udom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           $uname = $env{'course.'.$env{'request.course.id'}.'.num'};
       } else {
           $udom = $env{'user.domain'};
           $uname = $env{'user.name'};
       }
       return ($uname,$udom);
   }
   
   sub prepend_group {
       my ($filename) = @_;
       if (defined($env{'form.group'})) {
           $filename = $env{'form.group'}.$filename;
     }      }
     $r->print(&done());      return $filename;
   }
   
   sub get_namespace {
       my $namespace = 'portfolio';
       if (defined($env{'form.group'})) {
           my ($uname,$udom) = &get_name_dom($env{'form.group'});
           $namespace .= '_'.$udom.'_'.$uname.'_'.$env{'form.group'};
       }
       return $namespace;
   }
   
   sub get_port_path {
       my $port_path;
       if (defined($env{'form.group'})) {
          $port_path = "groups/$env{'form.group'}/portfolio";
       } else {
          $port_path = 'portfolio';
       }
       return $port_path;
   }
   
   sub missing_priv {
       my ($r,$url,$priv) = @_;
       my $longtext = {
                         upload => 'upload files',
                         delete => 'delete files',
                         rename => 'rename files',
                         setacl => 'set access controls for files',
                      };
       my $escpath = &HTML::Entities::encode($env{'form.currentpath'},'&<>"');
       my $rtnlink = '<a href="'.$url;
       if ($url =~ /\?/) {
           $rtnlink .= '&';
       } else {
           $rtnlink .= '?';
       }
       $rtnlink .= 'currentpath='.$escpath;
       $r->print('<h3>'.&mt('Action disallowed').'</h3>');
       $r->print(&mt('You do not have sufficient privileges to [_1] ',
                     $longtext->{$priv}));
       if (defined($env{'form.group'})) {
           $r->print(&mt("in the group's file repository."));
           $rtnlink .= &group_args()
       } else {
           $r->print(&mt('in this portfolio.'));
       }
       $rtnlink .= '">'.&mt('Return to directory').'</a>';
       $r->print('<br />'.$rtnlink);
       $r->print(&Apache::loncommon::end_page());
       return;
   }
   
   sub coursegrp_portfolio_header {
       my ($cdom,$cnum,$grp_desc)=@_;
       my $gpterm  = &Apache::loncommon::group_term();
       my $ucgpterm = $gpterm;
       $ucgpterm =~ s/^(\w)/uc($1)/e;
       if ($env{'form.ref'}) {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>"/adm/coursegroups",
                 text=>"Groups",
                 title=>"Course Groups"});
       }
       &Apache::lonhtmlcommon::add_breadcrumb
           ({href=>"/adm/$cdom/$cnum/$env{'form.group'}/smppg?ref=$env{'form.ref'}",
             text=>"$ucgpterm: $grp_desc",
             title=>"Go to group's home page"},
            {href=>"/adm/coursegrp_portfolio?".&group_args(),
             text=>"Group Portfolio",
             title=>"Display group portfolio"});
       my $output = &Apache::lonhtmlcommon::breadcrumbs(
                            &mt('[_1] portfolio files - [_2]',$gpterm,$grp_desc));
       return $output;
   }
   
   sub get_quota {
       my ($group) = @_;
       my $disk_quota;
       if (defined($group)) {
           my $grp_quota = &get_group_quota($group); # quota expressed in k
           if ($grp_quota ne '') {
               $disk_quota = $grp_quota;
           } else {
               $disk_quota = 0;
           }
       } else {
           $disk_quota = &Apache::loncommon::get_user_quota($env{'user.name'},
                                       $env{'user.domain'}); #expressed in Mb
           $disk_quota = 1000 * $disk_quota; # convert from Mb to kb
       }
       return $disk_quota;
 }  }
   
 sub handler {  sub handler {
     # this handles file management      # this handles file management
     my $r = shift;      my $r = shift;
     my $portfolio_root = &Apache::loncommon::propath($ENV{'user.domain'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
  $ENV{'user.name'}).           ['selectfile','currentpath','meta','lockinfo','currentfile','action',
  '/userfiles/portfolio';    'fieldname','mode','rename','continue','group','access','setnum',
             'cnum','cdom','type','setroles','showversions','ref']);
       my ($uname,$udom,$portfolio_root,$url,$caller,$title,$group,$grp_desc);
       if ($r->uri =~ m|^(/adm/)([^/]+)|) {
           $url = $1.$2;
           $caller = $2;
       }
       my ($can_modify,$can_delete,$can_upload,$can_setacl);
       if ($caller eq 'coursegrp_portfolio') {
       #  Needs to be in a course
           if (! ($env{'request.course.fn'})) {
           # Not in a course
               $env{'user.error.msg'}=
        "/adm/coursegrp_portfolio:rgf:0:0:Cannot view group portfolio";
               return HTTP_NOT_ACCEPTABLE;
           }
           my $earlyout = 0;
           my $view_permission = 
              &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
           $env{'form.group'} =~ s/\W//g;
    $group = $env{'form.group'};
           if ($group ne '') {
               ($uname,$udom) = &get_name_dom($group);
               my %curr_groups = &Apache::longroup::coursegroups($udom,$uname,
          $group); 
               if (%curr_groups) {
                   my %grp_content = &Apache::longroup::get_group_settings(
                                                            $curr_groups{$group});
                   $grp_desc = &unescape($grp_content{'description'});
                   if (($view_permission) || (&Apache::lonnet::allowed('rgf',
                                         $env{'request.course.id'}.'/'.$group))) {
                       $portfolio_root = &get_portfolio_root();
                   } else {
                       $r->print(&mt('You do not have the privileges required to access the shared files space for this group.'));
                       $earlyout = 1;
                   }
               } else {
                   $r->print(&mt('Not a valid group for this course'));
                   $earlyout = 1;
               }
               $title = &mt('Group files for [_1]', $group); 
           } else {
               $r->print(&mt('Invalid group'));
               $earlyout = 1;
           }
           if ($earlyout) { return OK; }
           if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
               $can_modify = 1;
               $can_delete = 1;
               $can_upload = 1;
               $can_setacl = 1;
           } else {
               if (&Apache::lonnet::allowed('agf',$env{'request.course.id'}.'/'.$group)) {
                   $can_setacl = 1;
               }
               if (&Apache::lonnet::allowed('ugf',$env{'request.course.id'}.'/'.$group)) {
                   $can_upload = 1;
               }
               if (&Apache::lonnet::allowed('mgf',$env{'request.course.id'}.'/'.$group)) {
                   $can_modify = 1;
               }
               if (&Apache::lonnet::allowed('dgf',$env{'request.course.id'}.'/'.$group)) {
                   $can_delete = 1;
               }
           }
       } else {
           ($uname,$udom) = &get_name_dom();
           $portfolio_root = &get_portfolio_root();
           $title = &mt('Portfolio Manager');
           $can_modify = 1;
           $can_delete = 1;
           $can_upload = 1;
           $can_setacl = 1;
       }
   
       my $port_path = &get_port_path();
     &Apache::loncommon::no_cache($r);      &Apache::loncommon::no_cache($r);
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
     # Give the LON-CAPA page header      # Give the LON-CAPA page header
     $r->print('<html><head><title>'.      if ($env{"form.mode"} eq 'selectfile'){
               &mt('Portfolio Manager').          $r->print(&Apache::loncommon::start_page($title,undef,
               "</title></head>\n".   {'only_body' => 1}));
               &Apache::loncommon::bodytag('Portfolio Manager'));      } elsif ($env{'form.action'} eq 'rolepicker') {
           $r->print(&Apache::loncommon::start_page('New role-based condition',undef,
                                                    {'no_nav_bar'  => 1, }));
       } else {
           $r->print(&Apache::loncommon::start_page($title));
       }
     $r->rflush();      $r->rflush();
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      my ($blocked,$blocktext) = 
                                             ['selectfile','currentpath','meta',          &Apache::loncommon::blocking_status('port',$uname,$udom);
      'currentfile','action','fieldname','mode','rename']);      if ($blocked) {
  if (($ENV{'form.storeupl'} eq 'Upload') & (!$ENV{'form.uploaddoc.filename'})){           $r->print($blocktext);
        $r->print('<font color="red"> No file was selected to upload.'.           $r->print(&Apache::loncommon::end_page());
                'To upload a file, click <strong>Browse...</strong>'.           return OK;
                ', select a file, then click <strong>Upload</strong>,</font>');      }
  }   if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){
     if ($ENV{'form.meta'}) {         $r->print('<span class="LC_error">');
         &open_form($r);         $r->print(&mt('No file was selected to upload.').' ');
         $r->print(&edit_meta_data($r, $ENV{'form.currentpath'}.$ENV{'form.selectfile'}));      $r->print(&mt('To upload a file, click <strong>Browse...</strong> and select a file, then click <strong>Upload</strong>.'));
         $r->print('Edit the meta data<br />');      $r->print('</span>');
         &close_form($r);   }
     }      if ($env{'form.meta'}) {
     if ($ENV{'form.store'}) {          &open_form($r,$url);
     }          $r->print(&mt('Edit the meta data').'<br />');
           &close_form($r,$url);
     if ($ENV{'form.uploaddoc.filename'}) {      }
  &upload($r);      if ($env{'form.store'}) {
     } elsif ($ENV{'form.action'} eq 'delete' && $ENV{'form.confirmed'}) {      }
  &delete_confirmed($r);  
     } elsif ($ENV{'form.action'} eq 'delete') {      if ($env{'form.uploaddoc.filename'}) {
  &delete($r);          if ($can_upload) {
     } elsif ($ENV{'form.action'} eq 'deletedir' && $ENV{'form.confirmed'}) {      &upload($r,$url,$group);
  &delete_dir_confirmed($r);          } else {
     } elsif ($ENV{'form.action'} eq 'deletedir'){              &missing_priv($r,$url,'upload');
  &delete_dir($r);          }
     } elsif ($ENV{'form.action'} eq 'rename' && $ENV{'form.confirmed'}) {      } elsif ($env{'form.action'} eq 'upload_embedded') {
  &rename_confirmed($r);   if ($can_upload) {
     } elsif ($ENV{'form.rename'}) {      &upload_embedded($r,$url,$group);
         $ENV{'form.selectfile'} = $ENV{'form.rename'};          } else {
         $ENV{'form.action'} = 'rename';              &missing_priv($r,$url,'upload');
  &rename($r);          }
     } elsif ($ENV{'form.createdir'}) {      } elsif ($env{'form.action'} eq 'delete' && $env{'form.confirmed'}) {
  &createdir($r);          if ($can_delete) {
       &delete_confirmed($r,$url,$group);
           } else {
               &missing_priv($r,$url,'delete');
           }
       } elsif ($env{'form.action'} eq 'delete') {
           if ($can_delete) {
       &delete($r,$url,$group);
           } else {
               &missing_priv($r,$url,'delete');
           }
       } elsif ($env{'form.action'} eq 'deletedir' && $env{'form.confirmed'}) {
           if ($can_delete) {
       &delete_dir_confirmed($r,$url,$group);
           } else {
               &missing_priv($r,$url,'delete');
           }
       } elsif ($env{'form.action'} eq 'deletedir') {
           if ($can_delete) {
       &delete_dir($r,$url);
           } else {
               &missing_priv($r,$url,'delete');
           }
       } elsif ($env{'form.action'} eq 'rename' && $env{'form.confirmed'}) {
           if ($can_modify) {
       &rename_confirmed($r,$url,$group);
           } else {
               &missing_priv($r,$url,'rename');
           }
       } elsif ($env{'form.rename'}) {
           $env{'form.selectfile'} = $env{'form.rename'};
           $env{'form.action'} = 'rename';
           if ($can_modify) {
       &rename($r,$url,$group);
           } else {
               &missing_priv($r,$url,'rename');
           }
       } elsif ($env{'form.access'}) {
           $env{'form.selectfile'} = $env{'form.access'};
           if (!defined($env{'form.action'})) { 
               $env{'form.action'} = 'chgaccess';
           }
           &display_access($r,$url,$group,$can_setacl,$port_path,$env{'form.action'});
       } elsif (($env{'form.action'} eq 'chgaccess') || 
                ($env{'form.action'} eq 'chgconditions')) {
           if ($can_setacl) {
               &update_access($r,$url,$group,$port_path);
           } else {
               &missing_priv($r,$url,'setacl');
           }
       } elsif ($env{'form.action'} eq 'rolepicker') {
           if ($can_setacl) { 
               &role_options_window($r);
           } else {
               &missing_priv($r,$url,'setacl');
           }
       } elsif ($env{'form.createdir'}) {
           if ($can_upload) {
       &createdir($r,$url,$group);
           } else {
               &missing_priv($r,$url,'upload');
           }
       } elsif ($env{'form.lockinfo'}) {
           &lock_info($r,$url,$group);
     } else {      } else {
  my $current_path='/';   my $current_path='/';
  if ($ENV{'form.currentpath'}) {   if ($env{'form.currentpath'}) {
     $current_path = $ENV{'form.currentpath'};      $current_path = $env{'form.currentpath'};
  }   }
  my @dir_list=&Apache::lonnet::dirlist($current_path,          if ($caller eq 'coursegrp_portfolio') {
     $ENV{'user.domain'},              &Apache::lonhtmlcommon::clear_breadcrumbs();
     $ENV{'user.name'},$portfolio_root);              $r->print(&coursegrp_portfolio_header($udom,$uname,$grp_desc));
           }
           my @dir_list=&get_dir_list($portfolio_root,$current_path,$group);
  if ($dir_list[0] eq 'no_such_dir'){   if ($dir_list[0] eq 'no_such_dir'){
     # two main reasons for this:      # two main reasons for this:
             #    1) never been here, so directory structure not created              #    1) never been here, so directory structure not created
     #    2) back-button navigation after deleting a directory      #    2) back-button navigation after deleting a directory
     if ($current_path eq '/'){      if ($current_path eq '/'){
         &Apache::lonnet::mkdiruserfile($ENV{'user.name'},          &Apache::lonnet::mkdiruserfile($uname,$udom,
        $ENV{'user.domain'},'portfolio');         &get_port_path());
     } else {      } else {
                 # some directory that snuck in get rid of the directory                  # some directory that snuck in get rid of the directory
                 # from the recent pulldown, just in case                  # from the recent pulldown, just in case
Line 753  sub handler { Line 2361  sub handler {
  $current_path = '/'; # force it back to the root           $current_path = '/'; # force it back to the root        
     }      }
     # now grab the directory list again, for the first time      # now grab the directory list again, for the first time
     @dir_list=&Apache::lonnet::dirlist($current_path,              @dir_list=&get_dir_list($portfolio_root,$current_path,$group);
     $ENV{'user.domain'},  
     $ENV{'user.name'},$portfolio_root);  
         }          }
  # need to know if directory is empty so it can be removed if desired   # need to know if directory is empty so it can be removed if desired
  my $is_empty=(@dir_list == 2);   my $is_empty=(@dir_list == 2);
  &display_common($r,$current_path,$is_empty,\@dir_list);   &display_common($r,$url,$current_path,$is_empty,\@dir_list,
  if ($ENV{"form.mode"} eq 'selectfile'){   $can_upload);
     &select_files($r);          &display_directory($r,$url,$current_path,$is_empty,\@dir_list,$group,
             &display_file_select($r,$current_path,$is_empty,\@dir_list);                             $can_upload,$can_modify,$can_delete,$can_setacl);
  } else {   $r->print(&Apache::loncommon::end_page());
     &display_directory($r,$current_path,$is_empty,\@dir_list);  
  }  
  $r->print("</body>\n</html>\n");  
  return OK;  
     }      }
       return OK;
 }  }
   
 1;  1;
 __END__  __END__

Removed from v.1.71  
changed lines
  Added in v.1.194


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

Internal Server Error

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

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

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