Diff for /loncom/interface/portfolio.pm between versions 1.116 and 1.212.2.2

version 1.116, 2006/06/22 19:01:30 version 1.212.2.2, 2010/01/25 21:24:26
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 31  use Apache::lonfeedback; Line 36  use Apache::lonfeedback;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::longroup;  use Apache::longroup;
   use Apache::lonhtmlcommon;
 use HTML::Entities;  use HTML::Entities;
 use LONCAPA;  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 ($url, $filename, $current_path, $current_mode, $field_name,      my ($url, $anchor_fields, $inner_text) = @_;
         $continue_select,$group) = @_;      if ($$anchor_fields{'continue'} ne 'true') {$$anchor_fields{'continue'} = 'false'};
     if ($continue_select ne 'true') {$continue_select = 'false'};      my $anchor = '<a href="'.$url.'?';
     my $anchor = '<a href="'.$url.'?selectfile='.$filename.'&amp;currentpath='.$current_path.'&amp;mode='.$current_mode.'&amp;continue='.$continue_select.'&amp;fieldname='.$field_name;      foreach my $field_name (keys(%$anchor_fields)) {
     if (defined($group)) {          $anchor .= $field_name.'='.$$anchor_fields{$field_name}.'&amp;';
         $anchor .= '&amp;group='.$group;      }
     }      $anchor =~ s/&amp;$//;
     $anchor .= '">'.$filename.'</a>';      $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,$url,$current_path,$is_empty,$dir_list,$group)=@_;      my ($r,$url,$current_path,$is_empty,$dir_list,$can_upload,$group)=@_;
     my $groupitem;      my $namespace = &get_namespace();
     my $namespace = &get_namespace($group);      my $port_path = &get_port_path();
     my $port_path = &get_port_path($group);      if ($can_upload) {
     if (defined($group)) {          my $groupitem = &group_form_data();
         $groupitem = '<input type="hidden" name="group" value="'.$group.'" />';  
     }           my $iconpath= $r->dir_config('lonIconsURL') . "/";
     my $iconpath= $r->dir_config('lonIconsURL') . "/";          my %lt=&Apache::lonlocal::texthash(
     my %text=&Apache::lonlocal::texthash('upload' => 'Upload',   'upload' => 'Upload',
  'upload_label' =>     'upload_label' => 'Upload file to current directory',
  'Upload file to current directory:',  
  'createdir' => 'Create Subdirectory',   'createdir' => 'Create Subdirectory',
  'createdir_label' =>    'createdir_label' => 
  'Create subdirectory in current directory:');   'Create subdirectory in current directory',
     my $escuri = &HTML::Entities::encode($r->uri,'&<>"');                                           'parse' => 'If HTML file, upload embedded images/multimedia/css/linked files'
     $r->print(<<"TABLE");                                               );
 <table id="LC_portfolio_actions">          my $escuri = &HTML::Entities::encode($r->uri,'&<>"');
   <tr id="LC_portfolio_upload">   my $help_fileupload = &Apache::loncommon::help_open_topic('Portfolio AddFiles');
     <td class="LC_label">   my $help_createdir = &Apache::loncommon::help_open_topic('Portfolio CreateDirectory');
       $text{'upload_label'}          my $help_portfolio = &Apache::loncommon::help_open_topic('Portfolio About', &mt('Help on the portfolio'));
     </td>          $r->print(&display_usage($group));
     <td class="LC_value">$groupitem          my $parse_check;
       <form method="post" enctype="multipart/form-data" action="$escuri">          if (!&suppress_embed_prompt()) {
         <input name="uploaddoc" type="file" />              $parse_check = <<"END";
  <input type="hidden" name="currentpath" value="$current_path" />          <br />
  <input type="hidden" name="action" value="$env{"form.action"}" />          <span class="LC_nobreak">
  <input type="hidden" name="fieldname" value="$env{"form.fieldname"}" />           <label>$lt{'parse'}
  <input type="hidden" name="mode" value="$env{"form.mode"}" />           <input type="checkbox" name="parserflag" checked="checked" />
  <input type="submit" name="storeupl" value="$text{'upload'}" />           </label>
       </form>          </span>
     </td>  END
   </tr>          }
   <tr id="LC_portfolio_createdir">  
     <td class="LC_label">          $r->print('<div>'.$help_portfolio);
       $text{'createdir_label'}          # Upload File
     </td>          $r->print('<div class="LC_left_float">'
     <td class="LC_value">                   .'<form method="post" enctype="multipart/form-data" action="'.$escuri.'">'
       <form method="post" action="$escuri">                   .'<fieldset>'
         <input name="newdir" type="input" />$groupitem                   .'<legend>'.$lt{'upload_label'}.'</legend>'
         <input type="hidden" name="currentpath" value="$current_path" />                   .$groupitem 
         <input type="hidden" name="action" value="$env{"form.action"}" />                   .'<input name="uploaddoc" type="file" />'
         <input type="hidden" name="fieldname" value="$env{"form.fieldname"}" />                   .'<input type="hidden" name="currentpath" value="'.$current_path.'" />'
         <input type="hidden" name="mode" value="$env{"form.mode"}" />                   .'<input type="hidden" name="action" value="'.$env{"form.action"}.'" />'
         <input type="submit" name="createdir" value="$text{'createdir'}" />                   .'<input type="hidden" name="fieldname" value="'.$env{"form.fieldname"}.'" />'
       </form>                   .'<input type="hidden" name="mode" value="'.$env{"form.mode"}.'" />'
     </td>                   .'<input type="submit" name="storeupl" value="'.$lt{'upload'}.'" />'
   </tr>                   .$help_fileupload
 </table>                   .$parse_check
 TABLE                   .'</fieldset>'
                    .'</form>'
                    .'</div>'
           );
           # Create Subdirectory
           $r->print('<div class="LC_left_float">'
                    .'<form method="post" action="'.$escuri.'">'
                    .'<fieldset>'
                    .'<legend>'.$lt{'createdir_label'}.'</legend>'
                    .'<input name="newdir" type="text" />'.$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="'.$lt{'createdir'}.'" />'
                    .$help_createdir
                    .'</fieldset>'
                    .'</form>'
                    .'</div>'
           );
           $r->print('</div>');
       } # end "if can_upload"
   
     my @tree = split (/\//,$current_path);      my @tree = split (/\//,$current_path);
     $r->print('<font size="+2">'.&make_anchor($url,$port_path,'/',$env{"form.mode"},$env{"form.fieldname"},$env{"form.continue"},$group).'/');      my %anchor_fields = (
           'selectfile'    => $port_path,
           'currentpath'   => '/',
           'mode'          => $env{"form.mode"},
           'fieldname'     => $env{"form.fieldname"},
           'continue'      => $env{"form.continue"}
       );
       $r->print('<br clear="all" />');
       $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($url,$tree[$i],'/'.$newCurrentPath, $env{"form.mode"},$env{"form.fieldname"}, $env{"form.continue"},$group).'/');              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>');
       $r->print(&Apache::loncommon::help_open_topic('Portfolio ChangeDirectory'));
     &Apache::lonhtmlcommon::store_recent($namespace,$current_path,$current_path);      &Apache::lonhtmlcommon::store_recent($namespace,$current_path,$current_path);
     $r->print('<br /><form method="post" action="'.$url.'?mode='.$env{"form.mode"}.'&amp;fieldname='.$env{"form.fieldname"});      $r->print('<br /><form method="post" action="'.$url.'?mode='.$env{"form.mode"}.'&amp;fieldname='.$env{"form.fieldname"}.&group_args());
     if (defined($group)) {  
         $r->print('&amp;group='.$group);  
     }  
     $r->print('">'.      $r->print('">'.
       &Apache::lonhtmlcommon::select_recent($namespace,'currentpath',        &Apache::lonhtmlcommon::select_recent($namespace,'currentpath',
     'this.form.submit();'));      'this.form.submit();'));
     $r->print("</form>");      $r->print("</form>");
 }  }
   
   sub display_usage {
       my ($group) = @_;
       my $disk_quota = &get_quota($group);
       my $getpropath = 1;
       my $portfolio_root = &get_portfolio_root();
       my ($uname,$udom) = &get_name_dom($group);
       my $current_disk_usage =
            &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath);
       my $usage = $current_disk_usage/1000;
       my $quota = $disk_quota/1000;
       my $percent;
       if ($disk_quota == 0) {
           $percent = 100.0;
       } else {
           $percent = 100*($current_disk_usage/$disk_quota);
       }
       $usage = sprintf("%.2f",$usage);
       $quota = sprintf("%.2f",$quota);
       $percent = sprintf("%.0f",$percent);
       my ($color,$cssclass);
       if ($percent <= 60) {
           $color = '#00A000';
       } elsif ($percent > 60 && $percent < 90) {
           $color = '#FFD300';
           $cssclass = 'class="LC_warning"';
       } elsif( $percent >= 90) {
           $color = '#FF0000';
           $cssclass = 'class="LC_error"';
       }
       my $prog_width = $percent;
       if ($prog_width > 100) {
           $prog_width = 100;
       }
       my $disk_meter = '
     <div id="meter1" align="left" '.$cssclass.'>'.&mt('Currently using [_1] of the [_2] available.',$usage.' MB <span style="font-weight:bold;">('.$percent.'%)</span>',$quota.' MB')."\n".
   '   <div id="meter2" style="display:block; margin-top:5px; margin-bottom:5px; margin-left:0px; margin-right:0px; width:400px; border:1px solid #000000; height:10px;">'."\n".
   '    <div id="meter3" style="display:block; background-color:'.$color.'; width:'.$prog_width.'%; height:10px; color:#000000; margin:0px;"></div>'."\n".
   '   </div>'."\n".
   '  </div>';
       return $disk_meter;
   }
   
   sub display_directory_line {
       my ($r,$select_mode, $filename, $mtime, $size, $css_class,
    $line, $access_controls, $curr_access, $now, $version_flag,
    $href_location, $url, $current_path, $access_admin_text, $versions)=@_;
   
       my $fullpath =  &prepend_group($current_path.$filename);
       $r->print(&Apache::loncommon::start_data_table_row());
       $r->print($line); # contains first two cells of table
       my $lock_info;
       if ($version_flag) { # versioned can't be versioned, so TRUE when root file
           $r->print('<td><img alt="" src="'.&Apache::loncommon::icon($filename).'" /></td>');
           $r->print('<td>'.$version_flag.'</td>');
       } else { # this is a graded or handed back file
           my ($user,$domain) = &get_name_dom($env{'form.group'});
           my $permissions_hash = &Apache::lonnet::get_portfile_permissions($domain,$user);
           if (defined($$permissions_hash{$fullpath})) {
               foreach my $array_item (@{$$permissions_hash{$fullpath}}) {
                   if (ref($array_item) eq 'ARRAY') {
                       if ($$array_item[-1] eq 'handback') {
                           $lock_info = 'Handback';
                       } elsif ($$array_item[-1] eq 'graded') {
                           $lock_info = 'Graded';
                       }
                    }
               }
           }
    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>');
       }
       # $r->print('<td>'.$$version_flag{$filename}.'</td><td>');
       $r->print('<td>'.&make_anchor($href_location.$filename,undef,$filename).'</td>'); 
       $r->print('<td>'.$size.'</td>');
       $r->print('<td>'.&Apache::lonlocal::locallocaltime($mtime).'</td>');
       if ($select_mode ne 'true') {
           $r->print('<td class="'.$css_class.'">&nbsp;&nbsp;</td>'); # Display status
           $r->print('<td><span class="LC_nobreak">'
                    .&mt($curr_access).'&nbsp;&nbsp;&nbsp;'
          );
           my %anchor_fields = (
               'access' => $filename,
               'currentpath' => $current_path
           );
    $r->print(&make_anchor($url, \%anchor_fields, $access_admin_text).'</span></td>');
       } else {
           $r->print('<td class="'.$css_class.'">&nbsp;&nbsp;</td>'); # Display status
       }
       $r->print(&Apache::loncommon::end_data_table_row().$/);
   }
   
 sub display_directory {  sub display_directory {
     my ($r,$url,$current_path,$is_empty,$dir_list,$group)=@_;      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 ($groupitem,$groupecho);  
     my $display_out;      my $display_out;
     my $select_mode;      my $select_mode;
     my $checked_files;      my $checked_files;
     my $port_path = &get_port_path($group);      my $port_path = &get_port_path();
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom($group);
     if (defined($group)) {      my $access_admin_text = &mt('View Status');
        $groupitem = '<input type="hidden" name="group" value="'.$group.'" />';       if ($can_setacl) {
        $groupecho = '&amp;group='.$group;          $access_admin_text = &mt('View/Change Status');
     }      }
   
     my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,      my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
                                                                         $uname);                                                                          $uname);
     my %locked_files = &Apache::lonnet::get_marked_as_readonly_hash(      my %locked_files = &Apache::lonnet::get_marked_as_readonly_hash(
                                                   $current_permissions,$group);                                                    $current_permissions,$group);
     my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group);      my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group);
     my $now = time;      my $now = time;
     if ($env{"form.mode"} eq 'selectfile'){      if ($env{"form.mode"} eq 'selectfile') {
  &select_files($r);   &select_files($r);
  $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'});   $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'});
  $select_mode = 'true';   $select_mode = 'true';
     }       } 
     if ($is_empty && ($current_path ne '/')) {      if ($is_empty && ($current_path ne '/') && $can_delete) {
         $display_out = '<form method="post" action="'.$url.'">'.$groupitem.          $display_out = '<form method="post" action="'.$url.'">'.
       &group_form_data().
         '<input type="hidden" name="action" value="deletedir" />'.          '<input type="hidden" name="action" value="deletedir" />'.
           '<p>'.
         '<input type="submit" name="deletedir" value="'.&mt("Delete Directory").'" />'.          '<input type="submit" name="deletedir" value="'.&mt("Delete Directory").'" />'.
           '</p>'.
         '<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>';
Line 155  sub display_directory { Line 324  sub display_directory {
     }      }
     if ($select_mode eq 'true') {      if ($select_mode eq 'true') {
         $r->print('<form method="post" name="checkselect" action="'.$url.'">');          $r->print('<form method="post" name="checkselect" action="'.$url.'">');
         $r->print('<table class="LC_browser">'.          $r->print(&Apache::loncommon::start_data_table()
             '<tr><th>Select</th><th>&nbsp;</th><th>Name</th><th>Size</th><th>Last Modified</th></tr>');                   .&Apache::loncommon::start_data_table_header_row()
                    .'<th>'.&mt('Select').'</th>'
                    .'<th>&nbsp;</th><th>&nbsp;</th>'
                    .'<th>'.&mt('Name').'</th>'
                    .'<th>'.&mt('Size').'</th>'
                    .'<th>'.&mt('Last Modified').'</th>'
                    .'<th>&nbsp;</th>'
                    .&Apache::loncommon::end_data_table_header_row()
           );
     } else {      } else {
         $r->print('<form method="post" action="'.$url.'">');          $r->print('<form method="post" action="'.$url.'">');
         $r->print('<table class="LC_browser">'.   $r->print(&Apache::loncommon::help_open_topic('Portfolio FileList',
             '<tr><th colspan="2">Actions</th><th>&nbsp;</th><th>Name</th><th>Size</th><th>Last Modified</th><th>Current Access Status</th></tr>');        &mt('Using the portfolio file list')));
     }          $r->print(&Apache::loncommon::start_data_table()
     if (defined($group)) {                   .&Apache::loncommon::start_data_table_header_row()
         $r->print("\n".$groupitem."\n");                   .'<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>&nbsp;</th>'
                    .'<th>'.&mt('Current Access Status').&Apache::loncommon::help_open_topic('Portfolio ShareFile').'</th>'
                    .&Apache::loncommon::end_data_table_header_row());
     }      }
       $r->print("\n".&group_form_data()."\n");
   
     my $href_location="/uploaded/$udom/$uname/$port_path".$current_path;      my $href_location="/uploaded/$udom/$uname/$port_path".$current_path;
     my $href_edit_location="/editupload/$udom/$uname/$port_path".$current_path;      my $href_edit_location="/editupload/$udom/$uname/$port_path".$current_path;
     my @dir_lines;      my @dir_lines;
     my %versioned;      my %versioned;
     foreach my $line (sort       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+$//;
     my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);      my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);
     if ($version) {      if ($version) {
        $versioned{$fname} .= $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]);
     }      }
         push(@dir_lines, [$filename,$dom,$testdir,$size,$mtime,$obs]);  
     }      }
     foreach my $line (@dir_lines) {      foreach my $dir_line (@dir_lines) {
         my ($filename,$dom,$testdir,$size,$mtime,$obs) = @$line;          my ($filename,$dom,$testdir,$size,$mtime,$obs) = @$dir_line;
         my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);          my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);
     if (($filename ne '.') && ($filename ne '..') && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/)) {      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) {
  my $colspan='colspan="2"';   my $colspan_folder='';
    my $colspan_fill='';
                 if ($select_mode eq 'true'){                  if ($select_mode eq 'true'){
     undef($colspan);                      $colspan_fill=' colspan="3"';
                   } else {
                       $colspan_folder=' colspan="2"';
                       $colspan_fill=' colspan="4"';
                 }                  }
  $r->print('<tr class="LC_browser_folder"><td '.$colspan.'><img alt="'.&mt('closed folder').'" src="'.$iconpath.'folder_closed.gif" /></td>');   $r->print('<tr class="LC_browser_folder">');
                 $r->print('<td>Go to ...</td>');                  $r->print('<td'.$colspan_folder.'><img alt="'.&mt('closed folder').'" src="'.$iconpath.'folder_closed.gif" /></td>'
                 $r->print('<td>'.&make_anchor($url,$filename.'/',$current_path.$filename.'/',$env{'form.mode'},$env{"form.fieldname"},$env{'form.continue'},$group).'</td>');                            .'<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('<td'.$colspan_fill.'>&nbsp;</td>');
                 $r->print('</tr>');                   $r->print('</tr>'); 
             } else {              } else {
  my $css_class = 'LC_browser_file';   my $css_class = 'LC_browser_file';
  my $line;   my $line;
                 my $version_flag;                  if ($select_mode eq 'true') {
                 if (exists($versioned{$fname})) {  
                    $version_flag = "*";  
                 } else {  
                     $version_flag = "";  
                 }  
                my $fullpath = $current_path.$filename;  
                 $fullpath = &prepend_group($fullpath,$group);  
                 if ($select_mode eq 'true'){  
                     $line='<td><input type="checkbox" name="checkfile" value="'.$filename.'"';                      $line='<td><input type="checkbox" name="checkfile" value="'.$filename.'"';
     if ($$checked_files{$filename} eq 'selected') {      if ($$checked_files{$filename} eq 'selected') {
                         $line.=" checked ";                          $line.=' checked="checked" ';
                     }                      }
     $line.=' /></td>';      $line.=' /></td>';
                 } else {                  } else {
                     if (exists $locked_files{$fullpath}) {                      if (exists $locked_files{$fullpath}) {
                         $line.='<td colspan="2"><a href="'.$url.'?lockinfo='.$current_path.$filename.$groupecho.'">Locked</a></td>';                          my %anchor_fields = (
                               'lockinfo' => $fullpath
                           );
                           $line.='<td colspan="2">'.&make_anchor($url,\%anchor_fields,&mt('Locked')).'</td>';
  $css_class= 'LC_browser_file_locked';   $css_class= 'LC_browser_file_locked';
                     } else {                      } else {
  my $cat='<img alt="'.&mt('Catalog Information').                          if (!$can_modify) {
     '" src="'.&Apache::loncommon::lonhttpdurl('/res/adm/pages/catalog.gif').'" />';                              $line .= '<td colspan="2">';
                         $line.='<td><input type="checkbox" name="selectfile" value="'.$filename.'" />  
                             <a href="'.$url.'?rename='.$filename.'&amp;currentpath='.$current_path.$groupecho.'">Rename</a></td>  
                             <td><a href="'.$href_edit_location.$filename.'.meta">'.$cat.'</a>  
                             </td>';  
                     }  
     $r->print('<tr class="'.$css_class.'">');  
     $r->print($line);  
                 }  
                 my $curr_access;  
                 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 {                          } else {
                             $cond_access = 1;                              $line .= '<td>';
                         }                          }
                           if ($can_delete) {
                               $line .= '<input type="checkbox" name="selectfile" value="'.$filename.'" />';
                           }
                           if ($can_modify) {
                               my $cat='<img class="LC_icon" alt="'.&mt('Metadata').'"/>';
   # 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>';
                     }                      }
                 }                  }
                 if (!$pub_access && !$guest_access && !$cond_access) {   my $curr_access;
                     $curr_access = &mt('Private');   if ($select_mode ne 'true') {
                 } else {      my $pub_access = 0;
                     my @allaccesses;       my $guest_access = 0;
                     if ($pub_access) {      my $cond_access = 0;
                         push(@allaccesses,&mt('Public'));      foreach my $key (sort(keys(%{$access_controls{$fullpath}}))) {
                     }   my ($num,$scope,$end,$start) = &unpack_acc_key($key);
                     if ($guest_access) {   if (($now > $start) && (!$end || $end > $now)) {
                         push(@allaccesses,&mt('Password-protected'));      if ($scope eq 'public')  {
                     }   $pub_access = 1;
                     if ($cond_access) {      } elsif ($scope eq 'guest') {
                         push(@allaccesses,&mt('Conditional'));   $guest_access = 1;
                     }      } else {
                     $curr_access = join('+ ',@allaccesses);   $cond_access = 1;
                 }      }
                 $r->print('<td><img alt="" src="'.&Apache::loncommon::icon($filename).'" /></td>');   }
                 $r->print('<td><a href="'.$href_location.$filename.'">'.      }
     $filename.'</a></td>');       if (!$pub_access && !$guest_access && !$cond_access) {
                 $r->print('<td>'.$size.'</td>');   $curr_access = &mt('Private');
                 $r->print('<td>'.&Apache::lonlocal::locallocaltime($mtime).'</td>');      } else {
                 $r->print('<td><span style="white-space: nowrap">'.&mt($curr_access).'&nbsp;&nbsp;&nbsp;'.   my @allaccesses; 
                           '<a href="'.$url.'?access='.$filename.   if ($pub_access) {
                           '&amp;currentpath='.$current_path.$groupecho.      push(@allaccesses,&mt('Public'));
                           '">'.&mt('View/Change').'</a></span></td>');   }
                 $r->print('</tr>');    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);
       }
    }
             }              }
         }          }
     }      }
     if ($select_mode eq 'true') {      if ($select_mode eq 'true') {
         $r->print('</table>          $r->print(&Apache::loncommon::end_data_table().'
             <input type="hidden" name="continue" value="true">              <input type="hidden" name="continue" value="true" />
             <input type="hidden" name="fieldname" value="'.$env{'form.fieldname'}.'">              <input type="hidden" name="fieldname" value="'.$env{'form.fieldname'}.'" />
             <input type="hidden" name="mode" value="selectfile">              <input type="hidden" name="mode" value="selectfile" />
             <input type="submit" name="submit" value="Select checked files, and continue selecting." /><br />              <p>
             <input type="button" name="doit" onClick= "finishSelect();" value="Select checked files, and close window" />              <input type="submit" name="submit" value="'.&mt('Select checked files, and continue selecting').'" /><br />
               <input type="button" name="doit" onClick="finishSelect();" value="'.&mt('Select checked files, and close window').'" />
               </p>
             <input type="hidden" name="currentpath" value="'.$current_path.'" />              <input type="hidden" name="currentpath" value="'.$current_path.'" />
         </form>');                  </form>');        
     } else {      } else {
         $r->print('</table>          $r->print(&Apache::loncommon::end_data_table());
         <input type="submit" name="doit" value="Delete Checked Files" />          if ($can_delete) {
               $r->print('
           <p>
           <input type="submit" name="doit" value="'.&mt('Delete Selected').'" />'.
    &Apache::loncommon::help_open_topic('Portfolio DeleteFile').'
           </p>
         <input type="hidden" name="action" value="delete" />          <input type="hidden" name="action" value="delete" />
         <input type="hidden" name="currentpath" value="'.$current_path.'" />          <input type="hidden" name="currentpath" value="'.$current_path.'" />
         </form>');          </form>'
               );
           }
     }      }
 }  }
   
Line 308  sub open_form { Line 558  sub open_form {
 }  }
   
 sub close_form {  sub close_form {
     my ($r,$url,$group,$button_text)=@_;      my ($r,$url,$button_text)=@_;
     if (!defined($button_text)) {      if (!defined($button_text)) {
         $button_text = {          $button_text = {
                          'continue' => &mt('Continue'),                           'continue' => &mt('Continue'),
Line 316  sub close_form { Line 566  sub close_form {
                        };                         };
     }      }
     $r->print('<p><input type="submit" value="'.$button_text->{'continue'}.'" />');      $r->print('<p><input type="submit" value="'.$button_text->{'continue'}.'" />');
     if (defined($group)) {      $r->print(&group_form_data().'</p></form>');
        $r->print("\n".'<input type="hidden" name="group" value="'.  
               $group.'" />');  
     }  
     $r->print('</p></form>');  
     $r->print('<form action="'.$url.'" method="post">      $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'}.'" />'.
     if (defined($group)) {        &group_form_data());
        $r->print("\n".'<input type="hidden" name="group" value="'.  
               $group.'" />');  
     }  
     $r->print("\n".'   <input type="submit" value="'.$button_text->{'cancel'}.'" />      $r->print("\n".'   <input type="submit" value="'.$button_text->{'cancel'}.'" />
                </p></form>');                  </p></form>'); 
 }  }
Line 355  sub display_file { Line 598  sub display_file {
 }  }
   
 sub done {  sub done {
     my ($message,$url,$group)=@_;      my ($message,$url)=@_;
     unless (defined $message) {      unless (defined $message) {
         $message='Done';          $message='Done';
     }      }
     my $result = '<h3><a href="'.$url.'?currentpath='.      my %anchor_fields = (
          $env{'form.currentpath'}.          'showversions' => $env{'form.showversions'},
          '&fieldname='.$env{'form.fieldname'}.          'currentpath' => $env{'form.currentpath'},
          '&mode='.$env{'form.mode'};          'fieldname' => $env{'form.fieldname'},
     if (defined($group)) {          'mode'      => $env{'form.mode'}
         $result .= '&group='.$group;      );
     }      my $result = '<h3>'.&make_anchor($url,\%anchor_fields,&mt($message)).'</h3>';
     $result .= '">'.&mt($message).'</a></h3>';  
     return $result;      return $result;
 }  }
   
Line 374  sub delete { Line 616  sub delete {
     my ($r,$url,$group)=@_;      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,$group);      $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);      my ($uname,$udom) = &get_name_dom($group);
     if (&Apache::lonnet::is_locked($file_name,$udom,$uname) 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('Back',$url,$group));          $r->print(&done('Back',$url));
     } else {      } else {
         if (scalar(@files)) {          if (scalar(@files)) {
             &open_form($r,$url);              &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,$url,$group);              &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(undef,$url,$group));              $r->print(&done(undef,$url));
         }          }
     }      }
 }   } 
Line 397  sub delete_confirmed { Line 639  sub delete_confirmed {
     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 ($uname,$udom) = &get_name_dom($group);
     my $port_path = &get_port_path($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($uname,$udom,$port_path.          $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path.
        $env{'form.currentpath'}.         $env{'form.currentpath'}.
        $delete_file);         $delete_file);
         if ($result ne 'ok') {          if ($result ne 'ok') {
  $r->print('<span class="LC_error"> An error occured ('.$result.      $r->print('<span class="LC_error">'
   ') while trying to delete '.&display_file(undef, $delete_file).'</span><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(undef,$url,$group));      $r->print(&done(undef,$url));
 }  }
   
 sub delete_dir {  sub delete_dir {
     my ($r,$url,$group)=@_;      my ($r,$url)=@_;
     &open_form($r,$url);      &open_form($r,$url);
     $r->print('<p>'.&mt('Delete').' '.&display_file().'?</p>');       $r->print('<p>'.&mt('Delete [_1]?',&display_file()).'</p>');
     &close_form($r,$url,$group);      &close_form($r,$url);
 }   } 
   
 sub delete_dir_confirmed {  sub delete_dir_confirmed {
Line 422  sub delete_dir_confirmed { Line 701  sub delete_dir_confirmed {
     my $directory_name = $env{'form.currentpath'};      my $directory_name = $env{'form.currentpath'};
     $directory_name =~ s|/$||; # remove any trailing slash      $directory_name =~ s|/$||; # remove any trailing slash
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom($group);
     my $namespace = &get_namespace($group);      my $namespace = &get_namespace();
     my $port_path = &get_port_path($group);      my $port_path = &get_port_path();
     my $result=&Apache::lonnet::removeuserfile($uname,$udom,$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('<span class="LC_error"> An error occured (dir) ('.$result.   $r->print('<span class="LC_error">'
   ') while trying to delete '.$directory_name.'</span><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($namespace,[$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(undef,$url,$group));      $r->print(&done(undef,$url));
 }  }
   
 sub rename {  sub rename {
     my ($r,$url,$group)=@_;      my ($r,$url,$group)=@_;
     my $file_name = $env{'form.currentpath'}.$env{'form.rename'};      my $file_name = $env{'form.currentpath'}.$env{'form.rename'};
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom($group);
     $file_name = &prepend_group($file_name,$group);      $file_name = &prepend_group($file_name);
     if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {      if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
         $r->print ("The file is locked and cannot be renamed.<br />");          $r->print("The file is locked and cannot be renamed.<br />");
         $r->print(&done(undef,$url,$group));          $r->print(&done(undef,$url));
     } else {      } else {
         &open_form($r,$url);          &open_form($r,$url);
         $r->print('<p>'.&mt('Rename').' '.&display_file().' to           $r->print('<p>'.&mt('Rename [_1] to [_2]?', &display_file()
                    <input name="filenewname" type="input" size="50" />?</p>');                    , '<input name="filenewname" type="text" size="50" />').'</p>');
         &close_form($r,$url,$group);          &close_form($r,$url);
     }      }
 }  }
   
Line 466  sub rename_confirmed { Line 744  sub rename_confirmed {
     my ($r,$url,$group)=@_;      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 ($uname,$udom) = &get_name_dom($group);
     my $port_path = &get_port_path($group);      my $port_path = &get_port_path();
     if ($filenewname eq '') {      if ($filenewname eq '') {
  $r->print('<span class="LC_error">'.   $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.").
   '</span><br />');    '</span><br />');
  $r->print(&done(undef,$url,$group));   $r->print(&done(undef,$url));
  return;   return;
     }       } 
       my $chg_access;
     my $result=      my $result=
  &Apache::lonnet::renameuserfile($uname,$udom,   &Apache::lonnet::renameuserfile($uname,$udom,
             $port_path.$env{'form.currentpath'}.$env{'form.selectfile'},              $port_path.$env{'form.currentpath'}.$env{'form.selectfile'},
             $port_path.$env{'form.currentpath'}.$filenewname);              $port_path.$env{'form.currentpath'}.$filenewname);
     if ($result ne 'ok') {      if ($result eq 'ok') {
           $chg_access = &access_for_renamed($filenewname,$group,$udom,$uname);
       } else {      
  $r->print('<span class="LC_error">'.   $r->print('<span class="LC_error">'.
   &mt('An errror occured ([_1]) while trying to rename [_2]'    &mt('An error occurred ([_1]) while trying to rename [_2] to [_3].'
       .' to [_3]',$result,&display_file(),                        ,$result,&display_file(),&display_file('',$filenewname))
       &display_file('',$filenewname)).'</span><br />');                    .'</span><br />');
           return;
     }      }
     if ($filenewname ne $env{'form.filenewname'}) {      if ($filenewname ne $env{'form.filenewname'}) {
         $r->print(&mt("The new file name was changed from:<br />[_1] to [_2]",          $r->print(&mt("The new file name was changed from:<br />[_1] to [_2]",
       '<strong>'.&display_file('',$env{'form.filenewname'}).'</strong>',        '<strong>'.&display_file('',$env{'form.filenewname'}).'</strong>',
       '<strong>'.&display_file('',$filenewname).'</strong>'));        '<strong>'.&display_file('',$filenewname).'</strong>'));
     }      }
     $r->print(&done(undef,$url,$group));      $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 {  sub display_access {
     my ($r,$url,$group) = @_;      my ($r,$url,$group,$can_setacl,$port_path,$action) = @_;
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom($group);
     my $file_name = $env{'form.currentpath'}.$env{'form.access'};      my $file_name = $env{'form.currentpath'}.$env{'form.access'};
     $file_name = &prepend_group($file_name,$group);      $file_name = &prepend_group($file_name);
     my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,      my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
                                                                         $uname);                                                                          $uname);
     my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group,$file_name);      my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group,$file_name);
     &open_form($r,$url);      my $aclcount = keys(%access_controls);
     $r->print('<h3>'.&mt('Allowing others to retrieve portfolio file: [_1]',$env{'form.currentpath'}.$env{'form.access'}).'</h3>'."\n");      my ($header,$info);
     $r->print(&mt('Access to this file by others can be set to be one or more of the following types: public, password-protected or conditional.').'<br /><ul><li>'.&mt('Public files are available to anyone without the need for login.').'</li><li>'.&mt('Password-protected files do not require log-in, but will require the viewer to enter the password you set.').'</li><li>'.&mt('Conditional files are accessible to logged-in users with accounts in the LON-CAPA network, who satify the conditions you set.').'<br />'.&mt('The conditions can include affiliation with a particular course or group, or a user account in a specific domain.').'<br />'.&mt('Alternatively you can grant access to people with specific LON-CAPA usernames and domains.').'</li></ul>');      if ($action eq 'chgaccess') {
     &access_setting_table($r,$access_controls{$file_name});          $header = '<h3>'.&mt('Allowing others to retrieve file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'</h3>';
     my $button_text = {          $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\">".&Apache::lonnet::absolute_url($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\">".&Apache::lonnet::absolute_url($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'),                          'continue' => &mt('Proceed'),
                         'cancel' => &mt('Back to directory listing'),                          'cancel' => &mt('Return to directory'),
                       };                        };
     &close_form($r,$url,$group,$button_text);          &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 {  sub update_access {
     my ($r,$url,$group) = @_;      my ($r,$url,$group,$port_path) = @_;
     my $function = &Apache::loncommon::get_users_function();  
     my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg');  
     my $totalprocessed = 0;      my $totalprocessed = 0;
     my %processing;      my %processing;
     my %title  = (      my %title  = (
Line 539  sub update_access { Line 1038  sub update_access {
         }          }
     }      }
     my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'};      my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'};
     $r->print('<h3>'.&mt('Allowing others to retrieve portfolio file: [_1]',      $r->print('<h3>'.&mt('Allowing others to retrieve file: [_1]',
               $file_name).'</h3>'."\n");                $port_path.$file_name).'</h3>'."\n");
     $file_name = &prepend_group($file_name,$group);      $file_name = &prepend_group($file_name);
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom($group);
     my ($errors,$outcome,$deloutcome,$new_values,$translation);      my ($errors,$outcome,$deloutcome,$new_values,$translation);
     if ($totalprocessed) {      if ($totalprocessed) {
Line 579  sub update_access { Line 1078  sub update_access {
                     $r->print('<td rowspan="'.$numchgs.'">'.&mt($title{$chg}).                      $r->print('<td rowspan="'.$numchgs.'">'.&mt($title{$chg}).
                               '.</td>');                                '.</td>');
                     my $count = 0;                      my $count = 0;
                       my %todisplay;
                     foreach my $key (sort(keys(%{$$changes{$chg}}))) {                      foreach my $key (sort(keys(%{$$changes{$chg}}))) {
                         if ($count) {                          my ($num,$scope,$end,$start) = &unpack_acc_key($key);
                             $r->print(&Apache::loncommon::start_data_table_row());  
                         }  
                         my ($num,$scope,$end,$start) = &unpack_acc_key($key);   
                         my $newkey = $key;                          my $newkey = $key;
                         if ($chg eq 'activate') {                          if ($chg eq 'activate') {
                             $newkey =~ s/^(\d+)/$$translation{$1}/;                              $newkey =~ s/^(\d+)/$$translation{$1}/;
                         }                          }
                         my $content = $$updated_controls{$newkey};                          $todisplay{$scope}{$newkey} = $$updated_controls{$newkey};
                         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));  
                         if (($scope eq 'course') || ($scope eq 'group')) {  
                             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('Password').': '.$content->{'password'});  
                             } elsif ($scope eq 'course' || $scope eq 'group') {  
                                 $r->print('<table border="0"><tr bgcol = "'.  
                                           $tablecolor.'">');  
                                 $r->print('<th>'.&mt('Roles').'</th><th>'.  
                                           &mt('Access').'</th><th>'.  
                                           &mt('Sections').'</th>');  
                                 if ($scope eq 'course') {  
                                     $r->print('<th>'.&mt('Groups').'</th>');  
                                 } else {  
                                     $r->print('<th>'.&mt('Teams').'</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)/;  
                                             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(&Apache::loncommon::end_data_table_row());  
                                 $r->print(&Apache::loncommon::end_data_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 ++;  
                     }                      }
                       &build_access_summary($r,$count,$chg,%todisplay);  
                 }                  }
             }              }
             $r->print(&Apache::loncommon::end_data_table());              $r->print(&Apache::loncommon::end_data_table());
         } else {          } else {
             if ((@{$processing{'activate'}} > 0) || (@{$processing{'update'}} > 0)) {              if ((@{$processing{'activate'}} > 0) || (@{$processing{'update'}} > 0)) {
                 $errors .= '<span class="LC_error">'.                  $errors .= '<span class="LC_error">'.
     &mt('A problem occurred storing access control settings: [_1]',$outcome).      &mt('A problem occurred saving access control settings: [_1]',$outcome).
     '</span>';      '</span>';
             }              }
         }          }
Line 685  sub update_access { Line 1106  sub update_access {
     my $totalnew = 0;      my $totalnew = 0;
     my $status = 'new';      my $status = 'new';
     my ($firstitem,$lastitem);      my ($firstitem,$lastitem);
     foreach my $newitem ('course','group','domains','users') {      foreach my $newitem ('course','domains','users') {
         $allnew += $env{'form.new'.$newitem};          $allnew += $env{'form.new'.$newitem};
     }      }
     if ($allnew > 0) {      if ($allnew > 0) {
         my $now = time;          my $now = time;
         my $then = $now + (60*60*24*180); # six months approx.          my $then = $now + (60*60*24*180); # six months approx.
         &open_form($r,$url,$group);          &open_form($r,$url);
         foreach my $newitem ('course','group','domains','users') {          foreach my $newitem ('course','domains','users') {
             if ($env{'form.new'.$newitem} > 0) {              if ($env{'form.new'.$newitem} > 0) {
                 $r->print('<br />'.&mt('Add new <b>[_1]-based</b> access control for portfolio file: <b>[_2]</b>',$newitem,$env{'form.currentpath'}.$env{'form.selectfile'}).'<br /><br />');                  $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;                  $firstitem = $totalnew;
                 $lastitem = $totalnew + $env{'form.new'.$newitem};                  $lastitem = $totalnew + $env{'form.new'.$newitem};
                 $totalnew = $lastitem;                  $totalnew = $lastitem;
Line 706  sub update_access { Line 1127  sub update_access {
                                     $access_controls{$file_name},$now,$then);                                      $access_controls{$file_name},$now,$then);
             }              }
         }          }
         &close_form($r,$url,$group);          &close_form($r,$url);
     } else {      } else {
         $r->print('<br /><a href="'.$url.'?access='.$env{'form.selectfile'}.          my %anchor_fields = (
                   '&amp;currentpath='.$env{'form.currentpath'}.'">'.              'currentpath' => $env{'form.currentpath'},
                    &mt('Display all access settings for this file').'</a>');              '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;      return;
 }  }
Line 727  sub build_access_record { Line 1152  sub build_access_record {
   
     if ($scope eq 'guest') {      if ($scope eq 'guest') {
         $record->{'password'} = $env{'form.password'};          $record->{'password'} = $env{'form.password'};
     } elsif (($scope eq 'course') || ($scope eq 'group')) {      } elsif ($scope eq 'course') {
         $record->{'domain'} = $env{'form.crsdom_'.$num};          $record->{'domain'} = $env{'form.crsdom_'.$num};
  $record->{'number'} = $env{'form.crsnum_'.$num};   $record->{'number'} = $env{'form.crsnum_'.$num};
         my @role_ids;          my @role_ids;
Line 809  sub sort_users { Line 1234  sub sort_users {
 }  }
   
 sub access_setting_table {  sub access_setting_table {
     my ($r,$access_controls) = @_;      my ($r,$url,$filename,$access_controls,$action) = @_;
     my ($public,$publictext);      my ($public,$publictext);
     $publictext = &mt('Off');      $publictext ='Off';
     my ($guest,$guesttext);      my ($guest,$guesttext);
     $guesttext = &mt('Off');      $guesttext = 'Off';
     my @courses = ();      my @courses = ();
     my @groups = ();  
     my @domains = ();      my @domains = ();
     my @users = ();      my @users = ();
     my $now = time;      my $now = time;
     my $then = $now + (60*60*24*180); # six months approx.      my $then = $now + (60*60*24*180); # six months approx.
     my ($num,$scope,$publicnum,$guestnum);      my ($num,$scope,$publicnum,$guestnum);
     my (%acl_count,%end,%start);      my (%acl_count,%end,%start,%conditionals);
     foreach my $key (sort(keys(%{$access_controls}))) {      foreach my $key (sort(keys(%{$access_controls}))) {
         ($num,$scope,$end{$key},$start{$key}) = &unpack_acc_key($key);          ($num,$scope,$end{$key},$start{$key}) = &unpack_acc_key($key);
         if ($scope eq 'public') {          if ($scope eq 'public') {
Line 832  sub access_setting_table { Line 1256  sub access_setting_table {
             $guest=$key;              $guest=$key;
             $guestnum = $num;                $guestnum = $num;  
             $guesttext = &acl_status($start{$key},$end{$key},$now);              $guesttext = &acl_status($start{$key},$end{$key},$now);
         } elsif ($scope eq 'course') {          } else {
             push(@courses,$key);              $conditionals{$scope}{$key} = $$access_controls{$key};
         } elsif ($scope eq 'group') {              if ($scope eq 'course') {
             push(@groups,$key);                  push(@courses,$key);
         } elsif ($scope eq 'domains') {              } elsif ($scope eq 'domains') {
             push(@domains,$key);                  push(@domains,$key);
         } elsif ($scope eq 'users') {              } elsif ($scope eq 'users') {
             push(@users,$key);                  push(@users,$key);
               }
         }          }
         $acl_count{$scope} ++;          $acl_count{$scope} ++;
     }      }
     $r->print('<table border="0"><tr><td valign="top">');      $r->print('<table border="0"><tr><td valign="top">');
     $r->print('<h3>'.&mt('Public access:').' '.$publictext.'</h3>');      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());
     $r->print(&Apache::loncommon::start_data_table_header_row());      $r->print(&Apache::loncommon::start_data_table_header_row());
     $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available').'</th>');      $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available').'</th>');
Line 852  sub access_setting_table { Line 1291  sub access_setting_table {
     $r->print(&Apache::loncommon::start_data_table_row());      $r->print(&Apache::loncommon::start_data_table_row());
     if ($public) {      if ($public) {
         $r->print('<td>'.&actionbox('old',$publicnum,'public').'</td><td>'.          $r->print('<td>'.&actionbox('old',$publicnum,'public').'</td><td>'.
                   &dateboxes($publicnum,$start{$public},$end{$public}).'</td>');               &dateboxes($publicnum,$start->{$public},$end->{$public}).'</td>');
     } else {      } else {
         $r->print('<td>'.&actionbox('new','0','public').'</td><td>'.          $r->print('<td>'.&actionbox('new','0','public').'</td><td>'.
                   &dateboxes('0',$now,$then).'</td>');                    &dateboxes('0',$now,$then).'</td>');
Line 860  sub access_setting_table { Line 1299  sub access_setting_table {
     $r->print(&Apache::loncommon::end_data_table_row());      $r->print(&Apache::loncommon::end_data_table_row());
     $r->print(&Apache::loncommon::end_data_table());      $r->print(&Apache::loncommon::end_data_table());
     $r->print('</td><td width="40">&nbsp;</td><td valign="top">');      $r->print('</td><td width="40">&nbsp;</td><td valign="top">');
     $r->print('<h3>'.&mt('Password-protected access:').' '.$guesttext.'</h3>');      $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());
     $r->print(&Apache::loncommon::start_data_table_header_row());      $r->print(&Apache::loncommon::start_data_table_header_row());
     $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available').      $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available').
               '</th><th>'. &mt('Password').'</th>');                '</th><th>'. &mt('Passphrase').'</th>');
     $r->print(&Apache::loncommon::end_data_table_header_row());      $r->print(&Apache::loncommon::end_data_table_header_row());
     $r->print(&Apache::loncommon::start_data_table_row());      $r->print(&Apache::loncommon::start_data_table_row());
     my $passwd;      my $passwd;
     if ($guest) {      if ($guest) {
         $passwd = $$access_controls{$guest}{'password'};          $passwd = $$access_controls{$guest}{'password'};
         $r->print('<td>'.&actionbox('old',$guestnum,'guest').'</td><td>'.          $r->print('<td>'.&actionbox('old',$guestnum,'guest').'</td><td>'.
                   &dateboxes($guestnum,$start{$guest},$end{$guest}).'</td>');                &dateboxes($guestnum,$start->{$guest},$end->{$guest}).'</td>');
     } else {      } else {
         $r->print('<td>'.&actionbox('new','1','guest').'</td><td>'.          $r->print('<td>'.&actionbox('new','1','guest').'</td><td>'.
                   &dateboxes('1',$now,$then).'</td>');                    &dateboxes('1',$now,$then).'</td>');
Line 880  sub access_setting_table { Line 1319  sub access_setting_table {
               $passwd.'" /></td>');                $passwd.'" /></td>');
     $r->print(&Apache::loncommon::end_data_table_row());      $r->print(&Apache::loncommon::end_data_table_row());
     $r->print(&Apache::loncommon::end_data_table());      $r->print(&Apache::loncommon::end_data_table());
     $r->print('</td></tr><tr><td colspan="3">&nbsp;</td></tr><tr><td valign="top">');      $r->print('</td></tr><tr><td colspan="3">&nbsp;</td></tr>'.
     &access_element($r,'domains',\%acl_count,\@domains,$access_controls,$now,$then);                '<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/community 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">');      $r->print('</td><td>&nbsp;</td><td valign="top">');
     &access_element($r,'users',\%acl_count,\@users,$access_controls,$now,$then);      &access_element($r,'users',$acl_count,$users,$access_controls,$now,$then);
     $r->print('</td></tr><tr><td colspan="3"></td></tr><tr>');      $r->print('</td></tr><tr><td colspan="3"></td></tr><tr>');
     if (@courses > 0 || @groups > 0) {      if ($acl_count->{course} > 0) {
         $r->print('<td colspan="3" valign="top">');          $r->print('<td colspan="3" valign="top">');
     } else {      } else {
         $r->print('<td valign="top">');          $r->print('<td valign="top">');
     }      }
     &access_element($r,'course',\%acl_count,\@courses,$access_controls,$now,$then);      &access_element($r,'course',$acl_count,$courses,$access_controls,$now,$then);
     $r->print('</td>');      $r->print('</td>');
     if (@courses > 0 || @groups > 0) {  
         $r->print('</tr><tr><td colspan="3">&nbsp;</td></tr><tr><td colspan="3" valign="top">');  
     } else {  
         $r->print('<td>&nbsp;</td><td valign="top">');  
     }  
     &access_element($r,'group',\%acl_count,\@groups,$access_controls,$now,$then);  
     $r->print('</td></tr></table>');      $r->print('</td></tr></table>');
 }  }
   
 sub acl_status {  sub acl_status {
     my ($start,$end,$now) = @_;      my ($start,$end,$now) = @_;
     if ($start > $now) {      if ($start > $now) {
         return &mt('Inactive');          return 'Inactive';
     }      }
     if ($end && $end<$now) {      if ($end && $end<$now) {
         return &mt('Inactive');          return 'Inactive';
     }      }
     return &mt('Active');      return 'Active';
 }  }
   
 sub access_element {  sub access_element {
Line 917  sub access_element { Line 1395  sub access_element {
     my $title = $type;      my $title = $type;
     $title =~ s/s$//;      $title =~ s/s$//;
     $title =~ s/^(\w)/uc($1)/e;      $title =~ s/^(\w)/uc($1)/e;
     $r->print('<h3>'.&mt('[_1]-based conditional access: ',$title));      $r->print('<h3>'.&mt('[_1]-based conditional access: ',&mt($title)));
     if ($$acl_count{$type}) {      if ($$acl_count{$type}) {
         $r->print($$acl_count{$type}.' ');          $r->print($$acl_count{$type}.' ');
         if ($$acl_count{$type} > 1) {          if ($$acl_count{$type} > 1) {
Line 937  sub display_access_row { Line 1415  sub display_access_row {
     my ($r,$status,$type,$items,$access_controls,$now,$then) = @_;      my ($r,$status,$type,$items,$access_controls,$now,$then) = @_;
     if (@{$items} > 0) {      if (@{$items} > 0) {
         my @all_doms;          my @all_doms;
         my $tablecolor;  
         my $colspan = 3;          my $colspan = 3;
         my $uctype = $type;          my $uctype = $type;
         $uctype =~ s/^(\w)/uc($1)/e;          $uctype =~ s/^(\w)/uc($1)/e;
Line 945  sub display_access_row { Line 1422  sub display_access_row {
         $r->print(&Apache::loncommon::start_data_table_header_row());          $r->print(&Apache::loncommon::start_data_table_header_row());
         $r->print('<th>'.&mt('Action?').'</th><th>'.&mt($uctype).'</th><th>'.          $r->print('<th>'.&mt('Action?').'</th><th>'.&mt($uctype).'</th><th>'.
               &mt('Dates available').'</th>');                &mt('Dates available').'</th>');
         if (($type eq 'course') || ($type eq 'group')) {          if ($type eq 'course' && $status eq 'old') {
             $r->print('<th>'.&mt('Allowed [_1] member affiliations',$type).              $r->print('<th>'.&mt('Allowed [_1] member affiliations',$type).
                       '</th>');                        '</th>');
             $colspan ++;              $colspan ++;
             my $function = &Apache::loncommon::get_users_function();  
             $tablecolor=&Apache::loncommon::designparm($function.'.tabbg');  
         } elsif ($type eq 'domains') {          } elsif ($type eq 'domains') {
             @all_doms = &Apache::loncommon::get_domains();              @all_doms = sort(&Apache::lonnet::all_domains());
         }          }
         $r->print(&Apache::loncommon::end_data_table_header_row());          $r->print(&Apache::loncommon::end_data_table_header_row());
  $r->print(&Apache::loncommon::start_data_table_row());  
         foreach my $key (@{$items}) {          foreach my $key (@{$items}) {
             if (($type eq 'course') || ($type eq 'group')) {      $r->print(&Apache::loncommon::start_data_table_row());
                 &course_row($r,$status,$type,$key,$access_controls,              if ($type eq 'course') {
                             $tablecolor,$now,$then);                  &course_row($r,$status,$type,$key,$access_controls,$now,$then);
             } elsif ($type eq 'domains') {              } elsif ($type eq 'domains') {
                 &domains_row($r,$status,$key,\@all_doms,$access_controls,$now,                  &domains_row($r,$status,$key,\@all_doms,$access_controls,$now,
                             $then);                              $then);
             } elsif ($type eq 'users') {              } elsif ($type eq 'users') {
                 &users_row($r,$status,$key,$access_controls,$now,$then);                  &users_row($r,$status,$key,$access_controls,$now,$then);
             }              }
       $r->print(&Apache::loncommon::end_data_table_row());
         }          }
         $r->print(&Apache::loncommon::end_data_table_row());  
         if ($status eq 'old') {          if ($status eq 'old') {
     $r->print(&Apache::loncommon::start_data_table_row());      $r->print(&Apache::loncommon::start_data_table_row());
             $r->print('<td colspan="',$colspan.'">'.&additional_item($type).              $r->print('<td colspan="',$colspan.'">'.&additional_item($type).
Line 976  sub display_access_row { Line 1450  sub display_access_row {
         }          }
         $r->print(&Apache::loncommon::end_data_table());          $r->print(&Apache::loncommon::end_data_table());
     } else {      } else {
         $r->print(&mt('No [_1]-based conditions defined.<br />',$type).          $r->print(&mt('No [_1]-based conditions defined.',&mt($type)).'<br />'
                   &additional_item($type));                    .&additional_item($type));
     }      }
     return;      return;
 }  }
Line 985  sub display_access_row { Line 1459  sub display_access_row {
 sub course_js {  sub course_js {
     return qq|      return qq|
 <script type="text/javascript">  <script type="text/javascript">
 function setRoleOptions(caller,num,cdom,cnum,type) {  function setRoleOptions(num,roleid,cdom,cnum,type) {
     addIndexnum = getCallerIndex(caller);      updateIndexNum = getIndexByValue('update',num);
     updateIndexnum = getIndex('update',num);      var addItem = 'add_role_'+num;
     if (caller.checked) {      var addIndexNum = getIndexByName(addItem);
         document.portform.elements[updateIndexnum].checked = true;      if (document.portform.elements[addItem].checked) {
         var url = '/adm/portfolio?action=rolepicker&setroles='+addIndexnum+'&cnum='+cnum+'&cdom='+cdom+'&type='+type;          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 title = 'Roles_Chooser';
         var options = 'scrollbars=1,resizable=1,menubar=0';          var options = 'scrollbars=1,resizable=1,menubar=0';
         options += ',width=700,height=600';          options += ',width=700,height=600';
         rolebrowser = open(url,title,options,'1');          rolebrowser = open(url,title,options,'1');
         rolebrowser.focus();          rolebrowser.focus();
     } else {      } else {
         for (var j=0;j<5;j++) {          addArray = new Array ('role','access','section','group');
             document.portform.elements[addIndexnum+j].value = '';          for (var j=0;j<addArray.length;j++) {
               var itemIndex = getIndexByName(addArray[j]+'_'+num+'_'+roleid);
               document.portform.elements[itemIndex].value = '';
         }          }
     }      }
 }  }
   
 function getCallerIndex(caller) {  function getIndexByName(item) {
     for (var i=0;i<document.portform.elements.length;i++) {      for (var i=0;i<document.portform.elements.length;i++) {
         if (document.portform.elements[i] == caller) {          if (document.portform.elements[i].name == item) {
             return i;              return i;
         }          }
     }      }
     return -1;      return -1;
 }  }
   
 function getIndex(name,value) {  function getIndexByValue(name,value) {
     for (var i=0;i<document.portform.elements.length;i++) {      for (var i=0;i<document.portform.elements.length;i++) {
         if (document.portform.elements[i].name == name && document.portform.elements[i].value == value) {          if (document.portform.elements[i].name == name && document.portform.elements[i].value == value) {
             return i;              return i;
Line 1026  function getIndex(name,value) { Line 1503  function getIndex(name,value) {
 }  }
   
 sub course_row {  sub course_row {
     my ($r,$status,$type,$item,$access_controls,$tablecolor,$now,$then) = @_;      my ($r,$status,$type,$item,$access_controls,$now,$then) = @_;
     my $content;      my $content;
     my $defdom = $env{'user.domain'};      my $defdom = $env{'user.domain'};
     if ($status eq 'old') {      if ($status eq 'old') {
Line 1035  sub course_row { Line 1512  sub course_row {
     }      }
     my $js = &Apache::loncommon::coursebrowser_javascript($defdom)      my $js = &Apache::loncommon::coursebrowser_javascript($defdom)
  .&course_js();   .&course_js();
     my $crsgrptext = 'Groups';      my $uctype = $type;
     if ($type eq 'group') {      $uctype =~ s/^(\w)/uc($1)/e;
         $crsgrptext = 'Teams';  
     }  
     my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,      my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,
                                                     $type);                                                      $type);
     $r->print('<td>'.$js.&actionbox($status,$num,$scope).'</td>');      $r->print('<td>'.$js.&actionbox($status,$num,$scope).'</td>');
Line 1047  sub course_row { Line 1522  sub course_row {
         my %course_description = &Apache::lonnet::coursedescription($cid);          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>');          $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') {      } elsif ($status eq 'new') {
         my $uctype = $type;          $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>');
         $uctype =~ s/^(\w)/uc($1)/e;  
         $r->print('<td>'.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,undef,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).'</td>');      $r->print('<td>'.&dateboxes($num,$start,$end));
     $r->print('<td><table border="0"><tr bgcolor="'.$tablecolor.'">');      my $newrole_id = 1;
     $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Roles').'</th><th>'.  
               &mt('Access').'</th><th>'.&mt('Sections').'</th><th>'.  
               &mt($crsgrptext).'</th></tr>');  
     if ($status eq 'old') {      if ($status eq 'old') {
           $r->print('</td><td>');
         my $max_id = 0;          my $max_id = 0;
         foreach my $role_id (sort(keys(%{$content->{'roles'}}))) {          if (keys(%{$content->{'roles'}}) > 0) {
             if ($role_id > $max_id) {              $r->print('<table><tr><th>'.&mt('Action').'</th>'.
                 $max_id = $role_id;                        '<th>'.&mt('Roles').'</th>'.
             }                        '<th>'.&mt('Access').'</th>'.
             $max_id ++;                        '<th>'.&mt('Sections').'</th>'.
             my $role_selects = &role_selectors($num,$role_id,$status,$type,$content,'display');                        '<th>'.&mt('Groups').'</th></tr>');
             $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>');              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 class="LC_nobreak"><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('</table><br />'.&mt('Add a roles-based condition').'&nbsp;<input type="checkbox" name ="add_role_'.$num.'" onClick="javascript:setRoleOptions(this,'."'$num','$content->{'domain'}','$content->{'number'}','Course'".')" value="'.$max_id.'" /><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.'" /></td>');          $r->print('<br />'.&mt('Add a roles-based condition').
     } elsif ($status eq 'new') {                    '&nbsp;<input type="checkbox" name="add_role_'.
         my $role_id = 1;                    $num.'" onClick="javascript:setRoleOptions('."'$num',
         my $role_selects = &role_selectors($num,$role_id,$status,$type,undef,'display');                    '$max_id','$content->{'domain'}','$content->{'number'}',
         $r->print('<tr><td><input type="checkbox" name="add_role_'.$num.'" value="'.$role_id.'" checked="checked" />'.&mt('Add').'<input type="hidden" name="grplist_'.$num.'_'.$role_id.'" /></td>'.$role_selects);                    '$uctype'".')" value="" />');
         $r->print('</tr></table></td>');          $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;      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 {  sub domains_row {
     my ($r,$status,$item,$all_doms,$access_controls,$now,$then) = @_;      my ($r,$status,$item,$all_doms,$access_controls,$now,$then) = @_;
     my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,      my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,
                                                     'domains');                                                      'domains');
     my $dom_select = '<select name="dom_'.$num.'" size="4" multiple="true">'.      my $dom_select = '<select name="dom_'.$num.'" size="4" multiple="multiple">'.
                      ' <option value="">'.&mt('Please select').'</option>';                       ' <option value="">'.&mt('Please select').'</option>';
     if ($status eq 'old') {      if ($status eq 'old') {
         my $content =  $$access_controls{$item};          my $content =  $$access_controls{$item};
  foreach my $dom (@{$all_doms}) {   foreach my $dom (@{$all_doms}) {
             if ((@{$content->{'dom'}} > 0)               if ((@{$content->{'dom'}} > 0) 
  && (grep(/^\Q$dom\E$/,@{$content->{'dom'}}))) {   && (grep(/^\Q$dom\E$/,@{$content->{'dom'}}))) {
                 $dom_select .= '<option value="'.$dom.'" selected>'.                  $dom_select .= '<option value="'.$dom.'" selected="selected">'.
                                $dom.'</option>';                                 $dom.'</option>';
             } else {              } else {
                 $dom_select .= '<option value="'.$dom.'">'.$dom.'</option>';                  $dom_select .= '<option value="'.$dom.'">'.$dom.'</option>';
Line 1117  sub users_row { Line 1610  sub users_row {
   
 sub additional_item {  sub additional_item {
     my ($type) = @_;      my ($type) = @_;
     my $output = &mt('Add new [_1] condition(s)?',$type).'&nbsp;'.&mt('Number to add: ').'<input type="text" name="new'.$type.'" size="3" value="0" />';      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;      return $output;
 }  }
   
 sub actionbox {  sub actionbox {
     my ($status,$num,$scope) = @_;      my ($status,$num,$scope) = @_;
     my $output = '<span style="white-space: nowrap"><label>';      my $output = '<span class="LC_nobreak"><label>';
     if ($status eq 'new') {      if ($status eq 'new') {
         $output .= '<input type="checkbox" name="activate" value="'.$num.'" />'.          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');          &mt('Activate');
     } else {      } else {
         $output .= '<input type="checkbox" name="delete" value="'.$num.          $output .= '<input type="checkbox" name="delete" value="'.$num.
                    '" />'.&mt('Delete').'</label></span><br /><span style="white-space: nowrap">'.                     '" />'.&mt('Delete').'</label></span><br /><span class="LC_nobreak">'.
                    '<label><input type="checkbox" name="update" value="'.                     '<label><input type="checkbox" name="update" value="'.
                    $num.'" />'.&mt('Update');                     $num.'" />'.&mt('Update');
     }      }
Line 1148  sub dateboxes { Line 1646  sub dateboxes {
                             undef,undef,1);                              undef,undef,1);
     my $enddate = &Apache::lonhtmlcommon::date_setter('portform',      my $enddate = &Apache::lonhtmlcommon::date_setter('portform',
                                'enddate_'.$num,$end,undef,undef,undef,1,undef,                                 'enddate_'.$num,$end,undef,undef,undef,1,undef,
                                 undef,undef,1). '&nbsp;&nbsp;<span style="white-space: nowrap"><label>'.                                  undef,undef,1). '&nbsp;&nbsp;<span class="LC_nobreak"><label>'.
                                 '<input type="checkbox" name="noend_'.                                  '<input type="checkbox" name="noend_'.
                                 $num.'" '.$noend.' />'.&mt('No end date').                                  $num.'" '.$noend.' />'.&mt('No end date').
                                 '</label></span>';                                  '</label></span>';
Line 1173  sub set_identifiers { Line 1671  sub set_identifiers {
 }   } 
   
 sub role_selectors {  sub role_selectors {
     my ($num,$role_id,$status,$type,$content,$caller) = @_;      my ($num,$role_id,$type,$content,$caller) = @_;
     my ($output,$cdom,$cnum,$longid);      my ($output,$cdom,$cnum,$longid);
     if ($caller eq 'display') {      if ($caller eq 'display') {
         $longid = '_'.$num.'_'.$role_id;          $longid = '_'.$num.'_'.$role_id;
         if ($status eq 'new') {          $cdom = $$content{'domain'};
             foreach my $item ('role','access','section','group') {          $cnum = $$content{'number'};
                 $output .= '<td><select name="'.$item.$longid.'">'.  
                            '<option value="">'.&mt('Pick [_1] first',$type).  
                            '</option></select></td>';  
             }  
             return $output;  
         } else {  
             $cdom = $$content{'domain'};  
             $cnum = $$content{'number'};  
         }  
     } elsif ($caller eq 'rolepicker') {      } elsif ($caller eq 'rolepicker') {
          $cdom = $env{'form.cdom'};           $cdom = $env{'form.cdom'};
          $cnum = $env{'form.cnum'};           $cnum = $env{'form.cnum'};
     }      }
       my $uctype = $type;
       $uctype =~ s/^(\w)/uc($1)/e;
     my ($sections,$groups,$allroles,$rolehash,$accesshash) =      my ($sections,$groups,$allroles,$rolehash,$accesshash) =
             &Apache::loncommon::get_secgrprole_info($cdom,$cnum,1,$type);              &Apache::loncommon::get_secgrprole_info($cdom,$cnum,1,$uctype);
     if (!@{$sections}) {      if (!@{$sections}) {
         @{$sections} = ('none');          @{$sections} = ('none');
     } else {      } else {
Line 1223  sub role_selectors { Line 1714  sub role_selectors {
                     'role' => $allroles,                      'role' => $allroles,
                     'access' => \@allaccesses,                      'access' => \@allaccesses,
                     'section' => $sections,                      'section' => $sections,
                     'group' => $groups,                       'group' => $groups,
                    );                     );
     foreach my $item ('role','access','section','group') {      foreach my $item ('role','access','section','group') {
         $output .= '<td><select name="'.$item.$longid.'" multiple="true" size="4">'."\n";          $output .= '<td><select name="'.$item.$longid.'" multiple="multiple" size="4">'."\n";
         foreach my $entry (@{$allitems{$item}}) {          foreach my $entry (@{$allitems{$item}}) {
             if ($caller eq 'display') {              if ($caller eq 'display') {
                 if ((@{$$content{'roles'}{$role_id}{$item}} > 0) &&                   if ((@{$$content{'roles'}{$role_id}{$item}} > 0) && 
                     (grep(/^\Q$entry\E$/,@{$$content{'roles'}{$role_id}{$item}}))) {                      (grep(/^\Q$entry\E$/,@{$$content{'roles'}{$role_id}{$item}}))) {
                     $output .= '  <option value="'.$entry.'" selected>'.                      $output .= '  <option value="'.$entry.'" selected="selected">'.
                                   $lookup{$item}{$entry}.'</option>';                                    $lookup{$item}{$entry}.'</option>';
                     next;                      next;
                 }                  }
Line 1247  sub role_selectors { Line 1738  sub role_selectors {
   
 sub role_options_window {  sub role_options_window {
     my ($r) = @_;      my ($r) = @_;
     my $cdom = $env{'form.cdom'};  
     my $cnum = $env{'form.cnum'};  
     my $type = $env{'form.type'};      my $type = $env{'form.type'};
     my $addindex = $env{'form.setroles'};      my $rolenum = $env{'form.setroles'};
     my $role_selects = &role_selectors(1,1,'new',$type,undef,'rolepicker');      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");      $r->print(<<"END_SCRIPT");
 <script type="text/javascript">  <script type="text/javascript">
 function setRoles() {  function setRoles() {
     var addidx = $addindex+1;      var role_elements = new Array($role_elements);
     for (var i=0; i<4; i++) {      for (var i=0; i<role_elements.length; i++) {
         var copylist = '';          var copylist = '';
         for (var j=0; j<document.rolepicker.elements[i].length; j++) {          for (var j=0; j<document.rolepicker.elements[i].length; j++) {
             if (document.rolepicker.elements[i].options[j].selected) {              if (document.rolepicker.elements[i].options[j].selected) {
Line 1264  function setRoles() { Line 1760  function setRoles() {
             }              }
         }          }
         copylist = copylist.substr(0,copylist.length-1);          copylist = copylist.substr(0,copylist.length-1);
         opener.document.portform.elements[addidx+i].value = copylist;          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();      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>  </script>
 END_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(&mt('Select roles, course status, section(s) and group(s) for users who will be able to access the portfolio file.'));
Line 1276  END_SCRIPT Line 1785  END_SCRIPT
 }  }
   
 sub select_files {  sub select_files {
     my ($r,$group) = @_;      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 . . . 
Line 1304  ENDSMP Line 1813  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 problem.<br />");  
     my @otherfiles=&Apache::lonnet::files_not_in_path($env{'user.name'}, $env{'form.currentpath'});      my @otherfiles=&Apache::lonnet::files_not_in_path($env{'user.name'}, $env{'form.currentpath'});
     if (@otherfiles) {      if (@otherfiles) {
  $r->print("<strong>Files selected from other directories:</strong><br />");   $r->print(&Apache::loncommon::start_data_table()
                    .&Apache::loncommon::start_data_table_header_row()
                    .'<th>'.&mt('Files selected from other directories:')."</th>"
                    .&Apache::loncommon::end_data_table_header_row()
           );
  foreach my $file (@otherfiles) {   foreach my $file (@otherfiles) {
     $r->print($file."<br />");      $r->print(&Apache::loncommon::start_data_table_row()
                        .'<td>'.$file."</td>"
                        .&Apache::loncommon::end_data_table_row()
               );
  }   }
     }          $r->print(&Apache::loncommon::end_data_table()
                    .'<br />'
           );
       }
       $r->print('<div>'
                .&mt('Check as many files as you wish in response to the problem:')
                .'</div>'
       );
 }  }
 sub upload {  
     my ($r,$url,$group)=@_;  
     my $fname=$env{'form.uploaddoc.filename'};  
     my $filesize = (length($env{'form.uploaddoc'})) / 1000; #express in k (1024?)  
     my $disk_quota = 20000; # expressed in k  
     $fname=&Apache::lonnet::clean_filename($fname);  
   
     my $portfolio_root=&get_portfolio_root($group);  
   sub check_for_upload {
       my ($path,$fname,$group,$element) = @_;
       my $disk_quota = &get_quota($group);
       my $filesize = (length($env{'form.'.$element})) / 1000; #express in k (1024?)
       my $portfolio_root = &get_portfolio_root();
       my $port_path = &get_port_path();
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom($group);
     my $port_path = &get_port_path($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=&get_dir_list($portfolio_root,$group);      my @dir_list=&get_dir_list($portfolio_root,$path,$group);
     my $found_file = 0;      my $found_file = 0;
     my $locked_file = 0;      my $locked_file = 0;
     foreach my $line (@dir_list) {      foreach my $line (@dir_list) {
         my ($file_name)=split(/\&/,$line,2);          my ($file_name)=split(/\&/,$line,2);
         if ($file_name eq $fname){          if ($file_name eq $fname){
             $file_name = $env{'form.currentpath'}.$file_name;              $file_name = $path.$file_name;
             $file_name = &prepend_group($file_name,$group);              $file_name = &prepend_group($file_name);
             $found_file = 1;              $found_file = 1;
             if (defined($group)) {  
                 $file_name = $group.'/'.$file_name;  
             }  
             if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {              if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
                 $locked_file = 1;                  $locked_file = 1;
             }               } 
         }          }
     }      }
     my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root);      my $getpropath = 1;
       my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath);
   
     if (($current_disk_usage + $filesize) > $disk_quota){      if (($current_disk_usage + $filesize) > $disk_quota){
         $r->print('<span class="LC_error">Unable to upload <strong>'.$fname.' (size = '.$filesize.' kilobytes)</strong>. Disk quota will be exceeded.</span>'.          my $msg = '<span class="LC_error">'.
                   '<br />Disk quota is '.$disk_quota.' kilobytes. Your current disk usage is '.$current_disk_usage.' kilobytes.');                  &mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded.','<span class="LC_filename">'.$fname.'</span>',$filesize).'</span>'.
         $r->print(&done('Back',$url,$group));                    '<br />'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.',$disk_quota,$current_disk_usage);
     }    return ('will_exceed_quota',$msg);
     elsif ($found_file){      } elsif ($found_file) {
         if ($locked_file){          if ($locked_file) {
             $r->print('<span class="LC_error">'.'Unable to upload <strong>'.$fname.'</strong>, a <strong>locked</strong> file by that name was found in <strong>'.$port_path.$env{'form.currentpath'}.'</strong></span>'.              my $msg = '<span class="LC_error">';
                   '<br />You will be able to rename or delete existing '.$fname.' after a grade has been assigned.');              $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(&done('Back',$url,$group));                    $msg .= '</span><br />';
         } else {                 $msg .= &mt('You will be able to rename or delete existing [_1] after a grade has been assigned.','<span class="LC_filename">'.$fname.'</span>');
             $r->print('<span class="LC_error">'.'Unable to upload <strong>'.$fname.'</strong>, a file by that name was found in <strong>'.$port_path.$env{'form.currentpath'}.'</strong></span>'.      return ('file_locked',$msg);
                   '<br />To upload, rename or delete existing '.$fname.' in '.$port_path.$env{'form.currentpath'});   } else {
             $r->print(&done('Back',$url,$group));              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'});
     } else {              $msg .= '</span>';
         my $result=&Apache::lonnet::userfileupload('uploaddoc','',              $msg .= '<br />';
          $port_path.$env{'form.currentpath'});              $msg .= &mt('To upload, rename or delete existing [_1] in [_2].','<span class="LC_filename">'.$fname.'</span>', $port_path.$env{'form.currentpath'});
         if ($result !~ m|^/uploaded/|) {      return ('file_exists',$msg);
             $r->print('<span class="LC_error">'.'An errror occured ('.$result.   }
               ') while trying to upload '.&display_file().'</span><br />');      }
     $r->print(&done('Back',$url,$group));  }
         } else {  
             $r->print(&done(undef,$url,$group));  sub upload {
       my ($r,$url,$group)=@_;
       my $fname=&Apache::lonnet::clean_filename($env{'form.uploaddoc.filename'});
       my $disk_quota = &get_quota($group);
       my $portfolio_root = &get_portfolio_root();
       my $port_path = &get_port_path();
       my ($uname,$udom) = &get_name_dom($group);
       my $getpropath = 1;
       my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath);
       my ($state,$msg) = 
           &Apache::loncommon::check_for_upload($env{'form.currentpath'},$fname,
                                $group,'uploaddoc',$portfolio_root,
                                                $port_path,$disk_quota,
                                                $current_disk_usage,$uname,$udom);
       if ($state eq 'will_exceed_quota'
    || $state eq 'file_locked'
    || $state eq 'file_exists' ) {
    $r->print($msg.&done('Back',$url));
    return;
       }
   
       my (%allfiles,%codebase,$mode);
       if ($env{'form.uploaddoc.filename'} =~ m/(\.htm|\.html|\.shtml)$/i) {
           if ($env{'form.parserflag'}) {
       $mode = 'parse';
         }          }
     }      }
       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) {
               if (!&suppress_embed_prompt()) {
           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 lock_info {  sub lock_info {
     my ($r,$url,$group) = @_;      my ($r,$url,$group) = @_;
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom($group);
     my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,      my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
                                                                        $uname);                                                                         $uname);
     my $file_name = $env{'form.lockinfo'};      my $file_name = $env{'form.lockinfo'};
     $file_name = &prepend_group($file_name,$group);      $file_name = &prepend_group($file_name);
     if (defined($file_name) && defined($$current_permissions{$file_name})) {      if (defined($file_name) && defined($$current_permissions{$file_name})) {
         foreach my $array_item (@{$$current_permissions{$file_name}}) {          foreach my $array_item (@{$$current_permissions{$file_name}}) {
             if (ref($array_item) eq 'ARRAY') {              next if (ref($array_item) ne 'ARRAY');
                 my $filetext;  
                 if (defined($group)) {      my $filetext;
                     $filetext = '<strong>'.$env{'form.lockinfo'}.      if (defined($group)) {
                                     '</strong> (group: '.$group.')';    $filetext = '<strong>'.$env{'form.lockinfo'}.
                 } else {      '</strong> (group: '.$group.')'; 
                     $filetext = '<strong>'.$file_name.'</strong>';      } else {
                 }    $filetext = '<strong>'.$file_name.'</strong>';
                 $r->print(&mt('[_1] was submitted in response to problem: ',      } 
                               $filetext).      
                           '<strong>'.&Apache::lonnet::gettitle($$array_item[0]).      my $title ='<strong>'.&Apache::lonnet::gettitle($$array_item[0]).
                           '</strong><br />');   '</strong><br />';
                 my %course_description = &Apache::lonnet::coursedescription($$array_item[1]);      if ($$array_item[-1] eq 'graded') {
                 $r->print(&mt('In the course: <strong>[_1]</strong><br />',   $r->print(&mt('[_1] was submitted in response to problem: [_2]',
                               $course_description{'description'}));                                $filetext,$title));
                 # $r->print('the third is '.$$array_item[2].'<br>');      } elsif ($$array_item[-1] eq 'handback') {
                 # $r->print("item is $$array_item[0]<br> and $$array_item[0]");   $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('Back',$url,$group));      $r->print(&done(&mt('Back'),$url));
     return 'ok';      return 'ok';
 }  }
   
 sub createdir {  sub createdir {
     my ($r,$url,$group)=@_;      my ($r,$url,$group)=@_;
     my $newdir=&Apache::lonnet::clean_filename($env{'form.newdir'});      my $newdir=&Apache::lonnet::clean_filename($env{'form.newdir'});
Line 1419  sub createdir { Line 2001  sub createdir {
     $r->print('<span class="LC_error">'.      $r->print('<span class="LC_error">'.
       &mt("Error: no directory name was provided.").        &mt("Error: no directory name was provided.").
       '</span><br />');        '</span><br />');
     $r->print(&done(undef,$url,$group));      $r->print(&done(undef,$url));
     return;      return;
     }      }
     my $portfolio_root = &get_portfolio_root($group);       my $portfolio_root = &get_portfolio_root(); 
     my @dir_list=&get_dir_list($portfolio_root,$group);      my @dir_list=&get_dir_list($portfolio_root,undef,$group);
     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 1432  sub createdir { Line 2014  sub createdir {
         }          }
     }      }
     if ($found_file){      if ($found_file){
        $r->print('<span class="LC_error">'.'Unable to create a directory named <strong>'.$newdir.         $r->print('<span class="LC_error">'
                ' </strong>a file or directory by that name already exists.</span><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 ($uname,$udom) = &get_name_dom($group);          my ($uname,$udom) = &get_name_dom($group);
         my $port_path = &get_port_path($group);          my $port_path = &get_port_path();
         my $result=&Apache::lonnet::mkdiruserfile($uname,$udom,          my $result=&Apache::lonnet::mkdiruserfile($uname,$udom,
          $port_path.$env{'form.currentpath'}.$newdir);           $port_path.$env{'form.currentpath'}.$newdir);
         if ($result ne 'ok') {          if ($result ne 'ok') {
        $r->print('<span class="LC_error">'.'An errror occured ('.$result.         $r->print('<span class="LC_error">'
           ') while trying to create a new directory '.&display_file().'</span><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,$group));      $r->print(&done(undef,$url));
 }  }
   
 sub get_portfolio_root {  sub get_portfolio_root {
     my ($group) = @_;      my ($udom,$uname,$group) = @_;
     my ($portfolio_root,$udom,$uname,$path);      if (!(defined($udom)) || !(defined($uname))) {
     ($uname,$udom) = &get_name_dom($group);          ($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)) {      if (defined($group)) {
         $path = '/userfiles/groups/'.$group.'/portfolio';          $path = '/userfiles/groups/'.$group.'/portfolio';
     } else {      } 
         $path = '/userfiles/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 (&Apache::loncommon::propath($udom,$uname).$path);      return $group_quota;
 }  }
   
 sub get_dir_list {  sub get_dir_list {
     my ($portfolio_root,$group) = @_;      my ($portfolio_root,$path,$group) = @_;
       $path ||= $env{'form.currentpath'};
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom($group);
     return &Apache::lonnet::dirlist($env{'form.currentpath'},      my $getpropath = 1;
                                           $udom,$uname,$portfolio_root);      return &Apache::lonnet::dirlist($portfolio_root.$path,$udom,$uname,$getpropath);
 }  }
   
 sub get_name_dom {  sub get_name_dom {
Line 1483  sub get_name_dom { Line 2092  sub get_name_dom {
 }  }
   
 sub prepend_group {  sub prepend_group {
     my ($filename,$group) = @_;      my ($filename) = @_;
     if (defined($group)) {      if (defined($env{'form.group'})) {
         $filename = $group.'/'.$filename;          $filename = $env{'form.group'}.$filename;
     }      }
     return $filename;      return $filename;
 }  }
   
 sub get_namespace {  sub get_namespace {
     my ($group) = @_;  
     my $namespace = 'portfolio';      my $namespace = 'portfolio';
     if (defined($group)) {      if (defined($env{'form.group'})) {
         my ($uname,$udom) = &get_name_dom($group);          my ($uname,$udom) = &get_name_dom($env{'form.group'});
         $namespace .= '_'.$udom.'_'.$uname.'_'.$group;          $namespace .= '_'.$udom.'_'.$uname.'_'.$env{'form.group'};
     }      }
     return $namespace;      return $namespace;
 }  }
   
 sub get_port_path {  sub get_port_path {
     my ($group) = @_;  
     my $port_path;      my $port_path;
     if (defined($group)) {      if (defined($env{'form.group'})) {
        $port_path = "groups/$group/portfolio";         $port_path = "groups/$env{'form.group'}/portfolio";
     } else {      } else {
        $port_path = 'portfolio';         $port_path = 'portfolio';
     }      }
     return $port_path;      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 group portfolio."));
           $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 suppress_embed_prompt {
       my $suppress_prompt = 0;
       if (($env{'request.role'} =~ /^st/) && ($env{'request.course.id'} ne '')) {
           if ($env{'course.'.$env{'request.course.id'}.'.suppress_embed_prompt'} eq 'yes') {
               $suppress_prompt = 1;
           }
       }
       return $suppress_prompt;
   }
   
   
 sub handler {  sub handler {
     # this handles file management      # this handles file management
     my $r = shift;      my $r = shift;
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
          ['selectfile','currentpath','meta','lockinfo','currentfile','action',           ['selectfile','currentpath','meta','lockinfo','currentfile','action',
   'fieldname','mode','rename','continue','group','access','setnum',    'fieldname','mode','rename','continue','group','access','setnum',
           'cnum','cdom','type','setroles']);            'cnum','cdom','type','setroles','showversions','ref']);
     my ($uname,$udom,$portfolio_root,$url,$group,$caller,$title);      my ($uname,$udom,$portfolio_root,$url,$caller,$title,$group,$grp_desc);
     if ($r->uri =~ m|^(/adm/)([^/]+)|) {      if ($r->uri =~ m|^(/adm/)([^/]+)|) {
         $url = $1.$2;          $url = $1.$2;
         $caller = $2;          $caller = $2;
     }      }
       my ($can_modify,$can_delete,$can_upload,$can_setacl);
     if ($caller eq 'coursegrp_portfolio') {      if ($caller eq 'coursegrp_portfolio') {
     #  Needs to be in a course      #  Needs to be in a course
         if (! ($env{'request.course.fn'})) {          if (! ($env{'request.course.fn'})) {
Line 1532  sub handler { Line 2223  sub handler {
             return HTTP_NOT_ACCEPTABLE;              return HTTP_NOT_ACCEPTABLE;
         }          }
         my $earlyout = 0;          my $earlyout = 0;
         my $view_permission = &Apache::lonnet::allowed('vcg',          my $view_permission = 
                                                 $env{'request.course.id'});             &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
         $group = $env{'form.group'};          $env{'form.group'} =~ s/\W//g;
         $group =~ s/\W//g;   $group = $env{'form.group'};
         if ($group) {          if ($group ne '') {
             ($uname,$udom) = &get_name_dom($group);              ($uname,$udom) = &get_name_dom($group);
             my %curr_groups = &Apache::longroup::coursegroups($udom,$uname,              my %curr_groups = &Apache::longroup::coursegroups($udom,$uname,
        $group);          $group); 
             if (%curr_groups) {              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',                  if (($view_permission) || (&Apache::lonnet::allowed('rgf',
                                       $env{'request.course.id'}.'/'.$group))) {                                        $env{'request.course.id'}.'/'.$group))) {
                     $portfolio_root = &get_portfolio_root($group);                      $portfolio_root = &get_portfolio_root();
                 } else {                  } else {
                     $r->print('You do not have the privileges required to access the shared files space for this group.');                      $r->print(&mt('You do not have the privileges required to access the shared files space for this group.'));
                     $earlyout = 1;                      $earlyout = 1;
                 }                  }
             } else {              } else {
                 $r->print('Not a valid group for this course');                  $r->print(&mt('Not a valid group for this course'));
                 $earlyout = 1;                  $earlyout = 1;
             }              }
             $title = &mt('Group files').' for '.$group;               $title = &mt('Group portfolio for [_1]', $group); 
         } else {          } else {
             $r->print('Invalid group');              $r->print(&mt('Invalid group'));
             $earlyout = 1;              $earlyout = 1;
         }          }
         if ($earlyout) { return OK; }          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 {      } else {
         ($uname,$udom) = &get_name_dom();          ($uname,$udom) = &get_name_dom();
         $portfolio_root = &get_portfolio_root();          $portfolio_root = &get_portfolio_root();
         $title = &mt('Portfolio Manager');          $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
       my $brcrum = [{href=>"/adm/portfolio",text=>"Portfolio Manager"}];
   
     if ($env{"form.mode"} eq 'selectfile'){      if ($env{"form.mode"} eq 'selectfile'){
         $r->print(&Apache::loncommon::start_page($title,undef,          $r->print(&Apache::loncommon::start_page($title,undef,
  {'only_body' => 1}));   {'only_body' => 1}));
     } elsif ($env{'form.action'} eq 'rolepicker') {      } elsif ($env{'form.action'} eq 'rolepicker') {
         $r->print(&Apache::loncommon::start_page('New role-based condition',undef,          $r->print(&Apache::loncommon::start_page('New role-based condition',undef,
                                                  {'no_nav_bar'  => 1, }));                                                   {'no_nav_bar'  => 1, }));
     } else {      } elsif ($caller eq 'coursegrp_portfolio') {
         $r->print(&Apache::loncommon::start_page($title));          $r->print(&Apache::loncommon::start_page($title));
       } else {
           $r->print(&Apache::loncommon::start_page($title,undef,
                                                    {'bread_crumbs' => $brcrum}));
           if (!&Apache::lonnet::usertools_access($uname,$udom,'portfolio')) {
               $r->print('<h2>'.&mt('No user portfolio available') .'</h2>'.
                         &mt('This is a result of one of the following:').'<ul>'.
                         '<li>'.&mt('The administrator of this domain has disabled portfolio functionality for this specific user.').'</li>'.
                         '<li>'.&mt('The domain has been configured to disable, by default, portfolio functionality for all users in the domain.').'</li>'.
                         '</ul>');
               $r->print(&Apache::loncommon::end_page());
               return OK;
           }
     }      }
     $r->rflush();      $r->rflush();
       my ($blocked,$blocktext) = 
           &Apache::loncommon::blocking_status('port',$uname,$udom);
       if ($blocked) {
            $r->print($blocktext);
            $r->print(&Apache::loncommon::end_page());
            return OK;
       }
  if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){   if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){
        $r->print('<span class="LC_error">'.         $r->print('<span class="LC_error">');
       'No file was selected to upload.'.         $r->print(&mt('No file was selected to upload.').' ');
       'To upload a file, click <strong>Browse...</strong>'.      $r->print(&mt('To upload a file, click <strong>Browse...</strong> and select a file, then click <strong>Upload</strong>.'));
       ', select a file, then click <strong>Upload</strong>.'.      $r->print('</span>');
       '</span>');  
  }   }
     if ($env{'form.meta'}) {      if ($env{'form.meta'}) {
         &open_form($r,$url);          &open_form($r,$url);
 #        $r->print(&edit_meta_data($r, $env{'form.currentpath'}.$env{'form.selectfile'}));          $r->print(&mt('Edit the meta data').'<br />');
         $r->print('Edit the meta data<br />');          &close_form($r,$url);
         &close_form($r,$url,$group);  
     }      }
     if ($env{'form.store'}) {      if ($env{'form.store'}) {
     }      }
   
     if ($env{'form.uploaddoc.filename'}) {      if ($env{'form.uploaddoc.filename'}) {
  &upload($r,$url,$group);          if ($can_upload) {
       &upload($r,$url,$group);
           } else {
               &missing_priv($r,$url,'upload');
           }
       } elsif ($env{'form.action'} eq 'upload_embedded') {
    if ($can_upload) {
               my $disk_quota = &get_quota($group);
               my $getpropath = 1;
               my $current_disk_usage = 
                   &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath);
       $r->print(
                   &Apache::loncommon::upload_embedded('portfolio',$port_path,$uname,$udom,
                       $group,$portfolio_root,$group,$disk_quota,$current_disk_usage));
               $r->print(&done(undef,$url));
           } else {
               &missing_priv($r,$url,'upload');
           }
     } elsif ($env{'form.action'} eq 'delete' && $env{'form.confirmed'}) {      } elsif ($env{'form.action'} eq 'delete' && $env{'form.confirmed'}) {
  &delete_confirmed($r,$url,$group);          if ($can_delete) {
       &delete_confirmed($r,$url,$group);
           } else {
               &missing_priv($r,$url,'delete');
           }
     } elsif ($env{'form.action'} eq 'delete') {      } elsif ($env{'form.action'} eq 'delete') {
  &delete($r,$url,$group);          if ($can_delete) {
       &delete($r,$url,$group);
           } else {
               &missing_priv($r,$url,'delete');
           }
     } elsif ($env{'form.action'} eq 'deletedir' && $env{'form.confirmed'}) {      } elsif ($env{'form.action'} eq 'deletedir' && $env{'form.confirmed'}) {
  &delete_dir_confirmed($r,$url,$group);          if ($can_delete) {
     } elsif ($env{'form.action'} eq 'deletedir'){      &delete_dir_confirmed($r,$url,$group);
  &delete_dir($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'}) {      } elsif ($env{'form.action'} eq 'rename' && $env{'form.confirmed'}) {
  &rename_confirmed($r,$url,$group);          if ($can_modify) {
       &rename_confirmed($r,$url,$group);
           } else {
               &missing_priv($r,$url,'rename');
           }
     } elsif ($env{'form.rename'}) {      } elsif ($env{'form.rename'}) {
         $env{'form.selectfile'} = $env{'form.rename'};          $env{'form.selectfile'} = $env{'form.rename'};
         $env{'form.action'} = 'rename';          $env{'form.action'} = 'rename';
  &rename($r,$url,$group);          if ($can_modify) {
       &rename($r,$url,$group);
           } else {
               &missing_priv($r,$url,'rename');
           }
     } elsif ($env{'form.access'}) {      } elsif ($env{'form.access'}) {
         $env{'form.selectfile'} = $env{'form.access'};          $env{'form.selectfile'} = $env{'form.access'};
         $env{'form.action'} = 'chgaccess';          if (!defined($env{'form.action'})) { 
         &display_access($r,$url,$group);              $env{'form.action'} = 'chgaccess';
     } elsif ($env{'form.action'} eq 'chgaccess') {          }
         &update_access($r,$url,$group);          &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') {      } elsif ($env{'form.action'} eq 'rolepicker') {
         &role_options_window($r);          if ($can_setacl) { 
               &role_options_window($r);
           } else {
               &missing_priv($r,$url,'setacl');
           }
     } elsif ($env{'form.createdir'}) {      } elsif ($env{'form.createdir'}) {
  &createdir($r,$url,$group);          if ($can_upload) {
       &createdir($r,$url,$group);
           } else {
               &missing_priv($r,$url,'upload');
           }
     } elsif ($env{'form.lockinfo'}) {      } elsif ($env{'form.lockinfo'}) {
         &lock_info($r,$url,$group);          &lock_info($r,$url,$group);
     } else {      } else {
Line 1627  sub handler { Line 2420  sub handler {
  if ($env{'form.currentpath'}) {   if ($env{'form.currentpath'}) {
     $current_path = $env{'form.currentpath'};      $current_path = $env{'form.currentpath'};
  }   }
         my @dir_list=&get_dir_list($portfolio_root,$group);          if ($caller eq 'coursegrp_portfolio') {
               &Apache::lonhtmlcommon::clear_breadcrumbs();
               $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($uname,$udom,          &Apache::lonnet::mkdiruserfile($uname,$udom,
        &get_port_path($group));         &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 1643  sub handler { Line 2440  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);
     $udom,$uname,$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,$url,$current_path,$is_empty,\@dir_list,$group);   &display_common($r,$url,$current_path,$is_empty,\@dir_list,
         &display_directory($r,$url,$current_path,$is_empty,\@dir_list,$group);   $can_upload,$group);
           &display_directory($r,$url,$current_path,$is_empty,\@dir_list,$group,
                              $can_upload,$can_modify,$can_delete,$can_setacl);
  $r->print(&Apache::loncommon::end_page());   $r->print(&Apache::loncommon::end_page());
     }      }
     return OK;      return OK;
 }  }
   
 1;  1;
 __END__  __END__

Removed from v.1.116  
changed lines
  Added in v.1.212.2.2


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.