--- loncom/publisher/lonpubdir.pm	2008/12/05 09:41:59	1.116
+++ loncom/publisher/lonpubdir.pm	2011/10/26 17:31:40	1.133
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Construction Space Directory Lister
 #
-# $Id: lonpubdir.pm,v 1.116 2008/12/05 09:41:59 bisitz Exp $
+# $Id: lonpubdir.pm,v 1.133 2011/10/26 17:31:40 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -47,58 +47,34 @@ sub handler {
 
   my $r=shift;
 
-  my $fn;
-
-
-
-  $fn = getEffectiveUrl($r);
-
   # Validate access to the construction space and get username@domain.
 
   my $uname;
   my $udom;
 
-  ($uname,$udom)=
-    &Apache::loncacc::constructaccess(
-             $fn,$r->dir_config('lonDefDomain')); 
+  ($uname,$udom)=&Apache::loncacc::constructaccess($r->uri); 
   unless (($uname) && ($udom)) {
-     $r->log_reason($uname.' at '.$udom.
-         ' trying to list directory '.$env{'form.filename'}.
-         ' ('.$fn.') - not authorized', 
-         $r->filename); 
      return HTTP_NOT_ACCEPTABLE;
   }
 
-  # Remove trailing / from directory name.
+# ----------------------------------------------------------- Start page output
 
+  my $fn=$r->filename;
   $fn=~s/\/$//;
 
-  unless ($fn) { 
-     $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
-         ' trying to list empty directory', $r->filename); 
-     return HTTP_NOT_FOUND;
-  } 
-
-# ----------------------------------------------------------- Start page output
-
   my $thisdisfn=$fn;
-  $thisdisfn=~s/^\/home\/$uname\/public_html//;	# subdirectory part of
-                                                # construction space. 
   my $docroot=$r->dir_config('lonDocRoot');     # Apache  londocument root.
+  $thisdisfn=~s/^\Q$docroot\E\/priv//;
 
-  my $resdir=$docroot.'/res/'.$udom.'/'.$uname.$thisdisfn; # Resource directory
-  my $targetdir=$udom.'/'.$uname.$thisdisfn; # Publiction target directory.
-  my $linkdir='/priv/'.$uname.$thisdisfn;      # Full URL name of constr space.
+  my $resdir=$docroot.'/res'.$thisdisfn; # Resource directory
+  my $targetdir='/res'.$thisdisfn; # Publication target directory.
+  my $linkdir='/priv'.$thisdisfn;      # Full URL name of constr space.
 
   my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom);
 
   &startpage($r, $uname, $udom, $thisdisfn);   # Put out the start of page.
-  if ($env{'environment.remote'} eq 'off') {
-      &dircontrols($r,$uname,$udom,$thisdisfn);    # Put out actions for directory, 
+  &dircontrols($r,$uname,$udom,$thisdisfn);    # Put out actions for directory, 
                                                # browse/upload + new file page.
-  } else {
-      &pubbuttons($r,$uname,$thisdisfn);
-  }
   &resourceactions($r,$uname,$udom,$thisdisfn); #Put out form used for printing/deletion etc.
 
   my $numdir = 0;
@@ -130,9 +106,9 @@ sub handler {
      my $extension='';
      if ($filename=~/\.(\w+)$/) { $extension=$1; }
      if ($cmode&$dirptr) {
-	 putdirectory($r, $thisdisfn, $linkdir, $filename, $cmtime,$targetdir,\%bombs,\$numdir);
+	 &putdirectory($r, $thisdisfn, $linkdir, $filename, $cmtime,$targetdir,\%bombs,\$numdir);
      } elsif (&Apache::loncommon::fileembstyle($extension) ne 'hdn') {
-	 putresource($r, $udom, $uname, $filename, $thisdisfn, $resdir, 
+	 &putresource($r, $udom, $uname, $filename, $thisdisfn, $resdir, 
 		     $targetdir, $linkdir, $cmtime,\%bombs,\$numres);
      } else {
 	# "hidden" extension and not a directory, so hide it away.
@@ -145,41 +121,7 @@ sub handler {
   );
   return OK;  
 }
-#
-#  Gets the effective URL of the request and returns it:
-#    $effn = getEffectiveUrl($r);
-#       $r  - The Apache Request object.
-sub getEffectiveUrl {
-    my $r = shift;
-    my $fn;
-    
-    if ($env{'form.filename'}) {	# If a form filename is defined.
-	$fn=$env{'form.filename'};
-	#
-	#   Replace the ~username of the URL with /home/username/public_html
-	#   so that we don't have to worry about ~ expansion internally.
-	#
-	$fn=~s/^http\:\/\/[^\/]+\///;
-        $fn=~s/^\///;
-        $fn=~s{~($LONCAPA::username_re)}{/home/$1/public_html};
-	
-	#  Remove trailing / strings (?) 
-	
-	$fn=~s/\/[^\/]+$//;
-    } else {
-	#   If no form is defined, use request filename.
-	$fn = $r->filename();
-	my $lonDocRoot=$r->dir_config('lonDocRoot');
-	if ( $fn =~ /$lonDocRoot/ ) {
-	    #internal authentication, needs fixup.
-	    $fn = $r->uri(); # non users do not get the full path request
-                             # through SCRIPT_FILENAME
-	    $fn=~s{^/~($LONCAPA::username_re)}{/home/$1/public_html};
-	}
-    }
-    $fn=~s/\/+/\//g;
-    return $fn;
-}
+
 #
 #   Output the header of the page.  This includes:
 #   - The HTML header 
@@ -193,31 +135,26 @@ sub getEffectiveUrl {
 
 sub startpage {
     my ($r, $uname, $udom, $thisdisfn) = @_;
-    my $currdir = '/priv/'.$uname.$thisdisfn;
     &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;
 
-    my $formaction='/priv/'.$uname.$thisdisfn.'/';
+    my $formaction='/priv'.$thisdisfn.'/';
     $formaction=~s|/+|/|g;
-    my $pagetitle .= &Apache::loncommon::help_open_menu('','',3,'Authoring').
-        '<font face="Arial, Helvetica, sans-serif" size="+1"><b>'.&mt('Construction Space').'</b>:</font>&nbsp;'.
-        '<form name="dirs" method="post" action="'.$formaction.
-        '" target="_parent"><tt><b>'.
-        &Apache::lonhtmlcommon::crumbs($uname.$thisdisfn.'/','_top','/priv','','+1',1)."</b></tt><br />".
-        &Apache::lonhtmlcommon::select_recent('construct','recent',
-                 'this.form.action=this.form.recent.value;this.form.submit()').
-              '</form>';
     &Apache::lonhtmlcommon::store_recent('construct',$formaction,$formaction);
-    if ($env{'environment.remote'} eq 'off') {
-	$env{'request.noversionuri'}=$currdir.'/';
-	$r->print(&Apache::loncommon::start_page('Construction Space',undef,
-						 {'body_title' =>
-						      $pagetitle,}));
-    } else {
-	$r->print(&Apache::loncommon::start_page('Construction Space',undef,
-						 { 'only_body' => 1,}));
-	$r->print($pagetitle);
-    }
+
+    &Apache::lonhtmlcommon::clear_breadcrumbs();
+    &Apache::lonhtmlcommon::add_breadcrumb({
+        'text'  => 'Construction Space',
+        'href'  => &Apache::loncommon::authorspace(),
+    });
+    # breadcrumbs (and tools) will be created 
+    # in start_page->bodytag->innerregister
+
+    $env{'request.noversionuri'}=$formaction;
+    $r->print(&Apache::loncommon::start_page('Construction Space',undef));
+
+    $r->print(&Apache::loncommon::head_subbox(
+                &Apache::loncommon::CSTR_pageheader(1)));
 
     my $esc_thisdisfn = &Apache::loncommon::escape_single($thisdisfn);
     my $doctitle = 'LON-CAPA '.&mt('Construction Space');
@@ -227,7 +164,7 @@ sub startpage {
 top.document.title = '$esc_thisdisfn/ - $doctitle';
 // Store directory location for menu bar to find
 
-parent.lastknownpriv='/~$uname$esc_thisdisfn/';
+parent.lastknownpriv='/priv$esc_thisdisfn/';
 
 // Confirmation dialogues
 
@@ -330,12 +267,6 @@ parent.lastknownpriv='/~$uname$esc_thisd
 </script>
 ENDPUBDIRSCRIPT
     $r->print($pubdirscript);
-
-    if ((($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) &&
-	$env{'environment.remote'} ne 'off') {
-	$r->print('<h3>'.&mt('Co-Author').': '.$uname.' at '.$udom.
-		  '</h3>');
-    }
 }
 
 sub dircontrols {
@@ -376,7 +307,7 @@ sub dircontrols {
                                       );
     my $mytype = $lt{'type'}; # avoid conflict with " and ' in javascript
     $r->print(<<END);
-<div class="columnSection">
+<div class="LC_columnSection">
   <div>
     <form name="curractions" method="post" action="">
       <fieldset>
@@ -388,7 +319,7 @@ sub dircontrols {
             <option value="printdir">$lt{'prnt'}</option>
             <option value="delete">$lt{'dedr'}</option>
         </select>
-        <input type="hidden" name="filename" value="/~$uname$thisdisfn/" />
+        <input type="hidden" name="filename" value="/priv$thisdisfn/" />
       </fieldset>
     </form>
     <form name="publishdir" method="post" action="/adm/publish" target="_parent">
@@ -404,7 +335,7 @@ sub dircontrols {
     <form name="upublisher" enctype="multipart/form-data" method="post" action="/adm/upload" target="_parent">
       <fieldset>
         <legend>$lt{'updc'}</legend>
-        <input type="hidden" name="filename" value="/~$uname$thisdisfn/" />
+        <input type="hidden" name="filename" value="/priv$thisdisfn/" />
         <input type="file" name="upfile" size="20" />
         <input type="button" value="$lt{'uplo'}"  onclick="checkUpload(this.form)" />
       </fieldset>
@@ -416,7 +347,7 @@ sub dircontrols {
       <fieldset>
               <legend>$lt{'crea'}</legend>
 	      <span class="LC_nobreak">
-		<input type="hidden" name="filename" value="/~$uname$thisdisfn/" />
+		<input type="hidden" name="filename" value="/priv$thisdisfn/" />
                   <script type="text/javascript">
                     function validate_go() {
                         var selected = document.fileaction.action.selectedIndex;
@@ -448,17 +379,6 @@ sub dircontrols {
 END
 }
 
-sub pubbuttons {
-    my ($r,$uname,$thisdisfn) = @_;
-    $r->print('<form method="post" action="/adm/publish" target="_parent">'.
-              '<table><tr><td><input type="hidden" name="filename" value="/~'.
-               $uname.$thisdisfn.'/" />'.
-              '<input type="submit" value="'.&mt('Publish Directory').'" /></td><td>'.
-'<input type="button" onclick="window.location='."'/~".
-               $uname.$thisdisfn."/default.meta'".'" value="'.
-&mt('Edit Directory Catalog Information').'" /></td></tr></table></form>');
-}
-
 sub resourceactions {
     my ($r,$uname,$udom,$thisdisfn) = @_;
     $r->print(<<END);
@@ -526,29 +446,29 @@ sub getSourceRightString {
 # 
 sub putdirectory {
     my ($r, $reqfile, $here, $dirname, $modtime, $resdir, $bombs, $numdir) = @_;
-    # construct the display filename: the directory name unless ..:
-    
+
+# construct the display filename: the directory name unless ..:
+   
+    my $actionitem;
+ 
     my $disfilename = $dirname;
-    if ($dirname eq '..') {
-	$disfilename = '<i>'.&mt('Parent Directory').'</i>';
-    }
-    unless ( (($dirname eq '..') && ($reqfile eq '')) || ($dirname eq '.')) {
+# Don't display directory itself, and there is no way up from root directory
+    unless ((($dirname eq '..') && ($reqfile=~/^\/[^\/]+\/[^\/]+$/)) || ($dirname eq '.')) {
 	my $kaputt=0;
 	foreach (keys %{$bombs}) {
 	    if ($_=~m:^\Q$resdir\E/\Q$disfilename\E/:) { $kaputt=1; last; }
 	}
+#
+# Get the metadata from that directory's default.meta to display titles
+#
 	%Apache::lonpublisher::metadatafields=();
 	%Apache::lonpublisher::metadatakeys=();
-	my $construct=$here;
-	$construct=~s{^/priv/($LONCAPA::username_re)$}{/home/$1/public_html};
-        my $dirpath = $here;
-        $dirpath=~s{^/priv/}{/~};
-	&Apache::lonpublisher::metaeval(&Apache::lonnet::getfile(
-       				 $construct.'/'.$dirname.'/default.meta'
-								 ));
-        my $actionitem = '';
+	&Apache::lonpublisher::metaeval(
+                 &Apache::lonnet::getfile($r->dir_config('lonDocRoot').$here.'/'.$dirname.'/default.meta')
+                                       );
         if ($dirname eq '..') {
             $actionitem = &mt('Go to ...');
+            $disfilename = '<i>'.&mt('Parent Directory').'</i>';
         } else {
             $actionitem = 
                     '<form name="dirselect_'.$$numdir.
@@ -561,7 +481,7 @@ sub putdirectory {
                       '<option value="printdir">'.&mt('Print directory').'</option>'.
                       '<option value="delete">'.&mt('Delete directory').'</option>'.
                     '</select>'.
-                     '<input type="hidden" name="filename" value="'.&HTML::Entities::encode($dirpath.'/'.$dirname,'<>&"').'/" />'.
+                     '<input type="hidden" name="filename" value="'.&HTML::Entities::encode($here.'/'.$dirname,'<>&"').'/" />'.
                      '<input type="hidden" name="openname" value="'.$here.'/'.$dirname.'/" />'.
                      '<input type="hidden" name="postdata" value="" />'.
                    '</form>';
@@ -569,7 +489,7 @@ sub putdirectory {
         }
 	$r->print('<tr class="LC_browser_folder">'.
 		  '<td><img src="'.
-		  $Apache::lonnet::perlvar{'lonIconsURL'}.'/folder_closed.gif" alt="folder" /></td>'.
+		  $Apache::lonnet::perlvar{'lonIconsURL'}.'/navmap.folder.closed.gif" alt="folder" /></td>'.
 		  '<td>'.$actionitem.'</td>'.
 		  '<td><span class="LC_filename"><a href="'.&HTML::Entities::encode($here.'/'.$dirname,'<>&"').'/" target="_parent">'.
 		  $disfilename.'</a></span></td>'.
@@ -598,11 +518,9 @@ sub putresource {
     my $css_class='LC_browser_file';
     my $title='&nbsp;';
     my $publish_button=&mt('Publish');
-    my $cstr_dir = '/home/'.$uname.'/public_html/'.$thisdisfn.'/';
-#    my $action_buttons=
-#        '<br /><a target="_parent" href="/adm/cfile?action=delete&filename=/~'.
-#	$uname.'/'.$thisdisfn.'/'.$filename.'">'.
-#	&mt('Delete').'</a>';
+    my $cstr_dir = $r->dir_config('lonDocRoot').'/priv/'.$udom.'/'.$uname.'/'.$thisdisfn.'/';
+    my $linkfilename=&HTML::Entities::encode('/priv'.$thisdisfn.'/'.$filename,'<>&"');
+
     if (-e $resdir.'/'.$filename) {
         my $same=0;
 	my ($rdev,$rino,$rmode,$rnlink,
@@ -628,9 +546,17 @@ sub putresource {
 	    $meta_same = 0;
 	}
 	$publish_button=&mt('Re-publish');
-	my $rights_status =
-	    &mt(&getCopyRightString($targetdir.'/'.$filename)).' '.
-	    &mt(&getSourceRightString($targetdir.'/'.$filename));
+
+        my $rights_status =
+            &mt(&getCopyRightString($targetdir.'/'.$filename)).', ';
+
+        my %lt_SourceRight = &Apache::lonlocal::texthash(
+               'open'   => 'Source: open',
+               'closed' => 'Source: closed',
+        );
+        $rights_status .=
+            $lt_SourceRight{&getSourceRightString($targetdir.'/'.$filename)};
+
 	$title = '<a href="/res/'.$targetdir.'/'.$filename.
 	    '.meta" target="cat">'.
 	    &getTitleString($targetdir.'/'.$filename).'</a>';
@@ -647,34 +573,26 @@ sub putresource {
 		$status=&mt('Published').
 		    '<br />'. $rights_status;
 	    }
-#	    } else {
-#		$action_buttons='';
-#	    }
 	} else {
             $pubstatus = 'modified';
 	    $status=&mt('Modified').
 		'<br />'. $rights_status;
-#	    $action_buttons='';
 	    if (&Apache::loncommon::fileembstyle(($filename=~/\.(\w+)$/)) eq 'ssi') {
-		$status.='<br /><a href="/adm/diff?filename=/~'.$uname.
-		    $thisdisfn.'/'.$filename.
+		$status.='<br /><a href="/adm/diff?filename='.$linkfilename.
 		    '&amp;versiontwo=priv" target="cat">'.&mt('Diffs').'</a>';
 	    }
 	} 
 
-	$title.="\n".'<br /><a href="/~'.$uname.$thisdisfn.'/'.$filename.'.meta">'. 
+	$title.="\n".'<br /><a href="'.$linkfilename.'.meta">'. 
 	    ($$bombs{$targetdir.'/'.$filename}?'<img src="/adm/lonMisc/bomb.gif" border="0" alt="'.&mt('bomb').'" />':&mt('Edit Metadata')).'</a>';
 
 	if (!$meta_same) {
 	    $title = &mt('Metadata Modified').'<br />'.$title.
-		'<br /><a href="/adm/diff?filename=/~'.$uname.
-		$thisdisfn.'/'.$filename.'.meta'.
+		'<br /><a href="/adm/diff?filename=/priv/'.$linkfilename.'.meta'.
 		'&amp;versiontwo=priv" target="cat">'.&mt('Metadata Diffs').'</a>';
-	    $title.="\n".'<br /><a href="/adm/retrieve?filename=/~'.$uname.
-		$thisdisfn.'/'.$filename.'.meta" target="_parent">'.&mt('Retrieve Metadata').'</a>';
+	    $title.="\n".'<br /><a href="/adm/retrieve?filename='.$linkfilename.'.meta" target="_parent">'.&mt('Retrieve Metadata').'</a>';
 	}
-	$status.="\n".'<br /><a href="/adm/retrieve?filename=/~'.$uname.
-	    $thisdisfn.'/'.$filename.'" target="_parent">'.&mt('Retrieve').'</a>';
+	$status.="\n".'<br /><a href="/adm/retrieve?filename='.$linkfilename.'" target="_parent">'.&mt('Retrieve').'</a>';
     }
     my $editlink='';
     my $editlink2='';
@@ -686,12 +604,10 @@ sub putresource {
 	$editlink2=' <br />(<a href="'.$linkdir.'/'.$filename.'?forceColoredit=1" target="_parent">'.&mt('Edit').'</a>)';
     }
     if ($filename=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm|sty)$/) {
-	$editlink.=' (<a href="/adm/cleanup?filename=/~'.$uname.
-	    $thisdisfn.'/'.$filename.'" target="_parent">'.&mt('Clean Up').')</a>';
+	$editlink.=' (<a href="/adm/cleanup?filename='.$linkfilename.'" target="_parent">'.&mt('Clean Up').')</a>';
     }
     if ($filename=~/\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) {
-	$editlink=' (<a target="_parent" href="/adm/cfile?decompress=/~'.
-	      $uname.$thisdisfn.'/'.$filename.'">'.&mt('Decompress').'</a>)';
+	$editlink=' (<a target="_parent" href="/adm/cfile?decompress='.$linkfilename.'">'.&mt('Decompress').'</a>)';
     }
     my $pub_select = '';
     &create_pubselect($r,\$pub_select,$udom,$uname,$thisdisfn,$filename,$resdir,$pubstatus,$publish_button,$numres);
@@ -739,8 +655,8 @@ sub create_pubselect {
 '<option value="cleanup">'.&mt('Clean up').'</option>'.
 '<option value="print">'.&mt('Print').'</option>'.
 '</select>
-<input type="hidden" name="filename" value="/~'.
- &HTML::Entities::encode($uname.$thisdisfn.'/'.$filename,'<>&"').'" />
+<input type="hidden" name="filename" value="/priv'.
+ &HTML::Entities::encode($thisdisfn.'/'.$filename,'<>&"').'" />
  <input type="hidden" name="dispfilename" value="'.
  &HTML::Entities::encode($filename).'" /></form>';
     $$numres ++;
@@ -765,32 +681,6 @@ sub check_for_versions {
     return $versions;
 }
 
-#
-#   Categorize files in the directory.
-#   For each file in a list of files in a file directory, 
-#   the  file categorized as one of:
-#    - directory  
-#    - sequence
-#    - problem 
-#    - Other resource.
-#
-#   For each file the modification date is determined as well.
-#   Returned is a list of sublists:
-#    (directories, sequences, problems, other)
-#   each of the sublists contains entries of the following form (sorted by
-#   filename):
-#     (filename, typecode, lastmodtime)
-#
-#   $list = CategorizeFiles($location, $files)
-#       $location   - Directory in which the files live (relative to our
-#                     execution.
-#       $files      - list of files.
-#
-sub CategorizeFiles {
-    my $location = shift;
-    my $files    = shift;
-}
-
 1;
 __END__
 
@@ -887,26 +777,6 @@ Output the header of the page.  This inc
         $dirname - Name of directory special file.
         $modtime - Encoded modification time.
 
-=item CategorizeFiles($location, $files)
-    
-    Categorize files in the directory.
-    For each file in a list of files in a file directory, 
-    the  file categorized as one of:
-        - directory  
-        - sequence
-        - problem 
-        - Other resource.
-
-    For each file the modification date is determined as well.
-    Returned is a list of sublists:
-        (directories, sequences, problems, other)
-    each of the sublists contains entries of the following form (sorted by filename):
-    (filename, typecode, lastmodtime)
-    
-        $list = CategorizeFiles($location, $files)
-        $location   - Directory in which the files live (relative to our execution)
-        $files      - list of files.
-
 =back
 
 =cut