Diff for /loncom/interface/lonindexer.pm between versions 1.16 and 1.192

version 1.16, 2001/08/08 03:00:11 version 1.192, 2009/03/17 23:11:20
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 #  
 # Directory Indexer  # Directory Indexer
 # (Login Screen  
 #  #
 # 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14 Gerd Kortemeyer)  # $Id$
 # 11/23 Gerd Kortemeyer  #
 # 07/20-08/04 H.K. Ng  # Copyright Michigan State University Board of Trustees
 #  #
 # 05/9-05/19/2001 H. K. Ng  # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
 # 05/21/2001 H. K. Ng  #
 # 05/23/2001 H. K. Ng  # LON-CAPA is free software; you can redistribute it and/or modify
 # 05/31/2001 Scott Harrison  # it under the terms of the GNU General Public License as published by
 # 06/01/2001 Scott Harrison  # the Free Software Foundation; either version 2 of the License, or
 # 06/02/2001 Scott Harrison  # (at your option) any later version.
 # 06/15/2001 Scott Harrison  #
 # 06/26/2001 H. K. Ng  # LON-CAPA is distributed in the hope that it will be useful,
 # 07/08/2001 H. K. Ng  # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # 8/6,8/7 Scott Harrison  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   # GNU General Public License for more details.
   #
   # You should have received a copy of the GNU General Public License
   # along with LON-CAPA; if not, write to the Free Software
   # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   #
   # /home/httpd/html/adm/gpl.txt
   #
   # http://www.lon-capa.org/
   #
   ###
   
   ###############################################################################
   ##                                                                           ##
   ## ORGANIZATION OF THIS PERL MODULE                                          ##
   ##                                                                           ##
   ## 1. Description of functions                                               ##
   ## 2. Modules used by this module                                            ##
   ## 3. Choices for different output views (detailed, summary, xml, etc)       ##
   ## 4. BEGIN block (to be run once after compilation)                         ##
   ## 5. Handling routine called via Apache and mod_perl                        ##
   ## 6. Other subroutines                                                      ##
   ##                                                                           ##
   ###############################################################################
   
 package Apache::lonindexer;  package Apache::lonindexer;
   
   # ------------------------------------------------- modules used by this module
 use strict;  use strict;
 use Apache::lonnet();  use Apache::lonnet;
   use Apache::loncommon();
   use Apache::lonhtmlcommon();
   use Apache::lonsequence();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
   use Apache::lonmeta;
 use Apache::File;  use Apache::File;
   use Apache::lonlocal;
   use Apache::lonsource();
   use Apache::groupsort();
 use GDBM_File;  use GDBM_File;
   use LONCAPA qw(:match);
   
   # ---------------------------------------- variables used throughout the module
   my %hash; # global user-specific gdbm file
   my %dirs; # keys are directories, values are the open/close status
   my %language; # has the reference information present in language.tab
   my %dynhash; # hash of hashes for dynamic metadata
   my %dynread; # hash of directories already read for dynamic metadata
   my %fieldnames; # Metadata fieldnames
   # ----- Values which are set by the handler subroutine and are accessible to
   # -----     other methods.
   my $extrafield; # default extra table cell
   my $fnum; # file counter
   my $dnum; # directory counter
   
   # ----- Used to include or exclude files with certain extensions.
   my @Only = ();
   my @Omit = ();
   
   
 my %hash;  
 my %dirs;  
 my %language;  
 my $hidden;  
 my $extrafield;  
 my $fnum;  
 my $dnum;  
 sub BEGIN {  
     my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.  
      '/language.tab');  
     map {  
  $_=~/(\w+)\s+([\w\s\-]+)/;  
  $language{$1}=$2;  
     } <$fh>;  
 }  
   
   
   # ----------------------------- Handling routine called via Apache and mod_perl
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
     $r->content_type('text/html');      my $c = $r->connection();
       &Apache::loncommon::content_type($r,'text/html');
       &Apache::loncommon::no_cache($r);
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
     $fnum=0;      $fnum=0;
     $dnum=0;      $dnum=0;
   
       # Deal with stupid global variables (is there a way around making
       # these global to this package?  It is just so wrong....)
       undef (@Only);
       undef (@Omit);
       %fieldnames=&Apache::lonmeta::fieldnames();
   
   # ------------------------------------- read in machine configuration variables
     my $iconpath= $r->dir_config('lonIconsURL') . "/";      my $iconpath= $r->dir_config('lonIconsURL') . "/";
     my $domain  = $r->dir_config('lonDefDomain');      my $domain  = $r->dir_config('lonDefDomain');
     my $role    = $r->dir_config('lonRole');      my $role    = $r->dir_config('lonRole');
Line 58  sub handler { Line 104  sub handler {
     my $lonhost = $r->dir_config('lonHostID');      my $lonhost = $r->dir_config('lonHostID');
     my $tabdir  = $r->dir_config('lonTabDir');      my $tabdir  = $r->dir_config('lonTabDir');
   
     my $fileclr='#ffffe6';  #SB my $fileclr='#ffffe6';
     my $line;      my $line;
     my (@attrchk,@openpath);      my (@attrchk,@openpath,$typeselect);
     my $uri=$r->uri;      my $uri=$r->uri;
   
 # -------------------------------------- see if called from an interactive mode  # -------------------------------------- see if called from an interactive mode
 #    foreach my $key (sort(keys(%ENV))) {      # Get the parameters from the query string
 # $r->print("$key is $ENV{$key}<br />");      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
 #    }       ['catalogmode','launch','acts','mode','form','element',
 #    $r->print("END ENV");                'only','omit','titleelement']);
     map {      #-------------------------------------------------------------------
        my ($name, $value) = split(/=/,$_);      my $closebutton='';
        $value =~ tr/+/ /;  
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;  
        if ($name eq 'catalogmode') {  
            $ENV{'form.'.$name}=$value;  
        }  
        if ($name eq 'launch') {  
            $ENV{'form.'.$name}=$value;  
        }  
        if ($name eq 'acts') {  
            $ENV{'form.'.$name}=$value;  
        }  
     } (split(/&/,$ENV{'QUERY_STRING'}));  
   
     $hidden=''; my $closebutton='';  
     my $groupimportbutton='';      my $groupimportbutton='';
     my $colspan='';       my $colspan=''; 
       
     $extrafield='';      $extrafield='';
     my $diropendb = "/home/httpd/perl/tmp/$domain\_$ENV{'user.name'}_indexer.db";      my $diropendb = 
    "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_sel_res.db";
     if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {      %hash = ();
  if ($ENV{'form.launch'} eq '1') {      {
     delete $hash{'mode_catalog'};   my %dbfile;
     map {   if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_WRITER(),0640)) {
  if ($_ =~ /^pre_/) {      if ($env{'form.launch'} eq '1') {
     delete $hash{$_};   &start_fresh_session(\%dbfile);
  }      }
  if ($_ =~ /^store/) {      while(my($key,$value)=each(%dbfile)) {
     delete $hash{$_};   $hash{$key}=$value;
  }      }
     } keys %hash;          untie(%dbfile);
  }  
  if ($hash{'mode_catalog'} eq 'interactive') {  
     $ENV{'form.catalogmode'}='interactive';  
  }  
  if ($hash{'mode_catalog'} eq 'groupimport') {  
     $ENV{'form.catalogmode'}='groupimport';  
  }   }
       }
  if ($ENV{'form.catalogmode'} eq 'interactive') {  # - Evaluate actions from previous page (both cumulatively and chronologically)
     $hash{'mode_catalog'}='interactive';          if ($env{'form.catalogmode'} eq 'import' || $hash{'form.catalogmode'} eq 'import') {
     $extrafield='<td bgcolor="'.$fileclr.'" valign="bottom">'.      &Apache::groupsort::update_actions_hash(\%hash);
  '<a name="$anchor"><img src="'.$iconpath.'whitespace1.gif"'.   }
  ' border="0"></td>';      
       {
     #Hijack lonindexer to verify a title and be close down.
      if ($env{'form.launch'} eq '2') {
          &Apache::loncommon::content_type($r,'text/html');
          my $extra='';
          if (defined($env{'form.titleelement'}) && 
      $env{'form.titleelement'} ne '') {
      my $verify_title = &Apache::lonnet::gettitle($env{'form.acts'});
   #   &Apache::lonnet::logthis("Hrrm $env{'form.acts'} -- $verify_title");
      $verify_title=~s/'/\\'/g;
      $extra='window.opener.document.forms["'.$env{'form.form'}.'"].elements["'.$env{'form.titleelement'}.'"].value=\''.$verify_title.'\';';
          }
          my $js = <<ENDSUBM;
          <script type="text/javascript">
    function load() {
    window.opener.document.forms["$env{'form.form'}"]
       .elements["$env{'form.element'}"]
       .value='$env{'form.acts'}';
    $extra
    window.close();
    }
             </script>
   ENDSUBM
          $r->print(&Apache::loncommon::start_page(undef,$js,
    {'only_body'   =>1,
    'add_entries' =>
        {'onload' => "load();"},}
    ).
    &Apache::loncommon::end_page());
          return OK;
      }
       
   # -------------------- refresh environment with user database values (in %hash)
    &setvalues(\%hash,'form.catalogmode',\%env,'form.catalogmode'   );
   
   # --------------------- define extra fields and buttons in case of special mode
    if ($env{'form.catalogmode'} eq 'interactive') {
   #SB    $extrafield='<td bgcolor="'.$fileclr.'" valign="bottom">'.
               $extrafield='<td class="LC_bottom">'.
    '<img alt="" src="'.$iconpath.'whitespace1.gif"'.
    ' class="LC_icon" /></td>';
     $colspan=" colspan='2' ";      $colspan=" colspan='2' ";
     $hidden=<<END;              my $cl=&mt('Close');
 <input type='hidden' name='catalogmode' value='interactive'>  
 END  
             $closebutton=<<END;              $closebutton=<<END;
 <input type="button" name="close" value='CLOSE' onClick="self.close()">  <input type="button" name="close" value='$cl' onClick="self.close()" />
 END  END
         }          }
  elsif ($ENV{'form.catalogmode'} eq 'groupimport') {   elsif ($env{'form.catalogmode'} eq 'import') {
     $hash{'mode_catalog'}='groupimport';  #SB    $extrafield='<td bgcolor="'.$fileclr.'" valign="bottom">'.
     $extrafield='<td bgcolor="'.$fileclr.'" valign="bottom">'.              $extrafield='<td class="LC_bottom">'.
  '<a name="$anchor"><img src="'.$iconpath.'whitespace1.gif"'.   '<img alt="" src="'.$iconpath.'whitespace1.gif"'.
  ' border="0"></td>';   ' class="LC_icon" /></td>';
     $colspan=" colspan='2' ";      $colspan=" colspan='2' ";
     $hidden=<<END;      my $cl=&mt('Close');
 <input type='hidden' name='catalogmode' value='groupimport'>              my $gi=&mt('Import');
 END  
             $closebutton=<<END;              $closebutton=<<END;
 <input type="button" name="close" value='CLOSE' onClick="self.close()">  <input type="button" name="close" value='$cl' onClick="self.close()" />
 END  END
             $groupimportbutton=<<END;              $groupimportbutton=<<END;
 <input type="button" name="groupimport" value='GROUP IMPORT' onClick="javascript:select_group()">  <input type="button" name="groupimport" value='$gi'
   onClick="javascript:select_group()" />
 END  END
         }          }
    # Additions made by Matthew to make the browser a little easier to deal
    # with in the future.
    #
    # $mode (at this time) indicates if we are in edit mode.
    # $form is the name of the form that the URL is placed when the
    #       selection is made.
    # $element is the name of the element in $formname which receives
    #       the URL.
    #&Apache::lonxml::debug('Checking mode, form, element');
    &setvalues(\%hash,'form.mode'        ,\%env,'form.mode'   );
    &setvalues(\%hash,'form.form'        ,\%env,'form.form'   );
    &setvalues(\%hash,'form.element'     ,\%env,'form.element');
    &setvalues(\%hash,'form.titleelement',\%env,'form.titleelement');
    &setvalues(\%hash,'form.only'        ,\%env,'form.only'   );
    &setvalues(\%hash,'form.omit'        ,\%env,'form.omit'   );
   
           # Deal with 'omit' and 'only' 
           if (exists $env{'form.omit'}) {
               @Omit = split(',',$env{'form.omit'});
           }
           if (exists $env{'form.only'}) {
               @Only = split(',',$env{'form.only'});
           }
           
    my $mode = $env{'form.mode'};
    my ($form,$element,$titleelement);
    if ($mode eq 'edit' || $mode eq 'parmset') {
       $form         = $env{'form.form'};
       $element      = $env{'form.element'};
       $titleelement = $env{'form.titleelement'};
    }
    #&Apache::lonxml::debug("mode=$mode form=$form element=$element titleelement=$titleelement");
   # ------ set catalogmodefunctions to have extra needed javascript functionality
  my $catalogmodefunctions='';   my $catalogmodefunctions='';
  if ($ENV{'form.catalogmode'} eq 'interactive' or   if ($env{'form.catalogmode'} eq 'interactive' or
     $ENV{'form.catalogmode'} eq 'groupimport') {      $env{'form.catalogmode'} eq 'import') {
     $catalogmodefunctions=<<END;      # The if statement below sets us up to use the old version
 function select_data(title,url) {      # by default (ie. if $mode is undefined).  This is the easy
     changeTitle(title);      # way out.  Hopefully in the future I'll find a way to get 
       # the calls dealt with in a more comprehensive manner.
   
   #
   # There is now also mode "simple", which is for the simple version of the rat
   #
   #
       if (!defined($mode) || ($mode ne 'edit' && $mode ne 'parmset')) {
                   my $location = "/adm/groupsort?&inhibitmenu=yes&catalogmode=import&";
                   $location .= "mode=".$mode."&";
                   $location .= "acts=";
    $catalogmodefunctions=<<"END";
   function select_data(url) {
     changeURL(url);      changeURL(url);
     self.close();      self.close();
 }  }
 function save_group() {  function select_group() {
     for (var num=0; num<document.forms.fnum.fnum.value; num++) {      window.location="$location"+document.forms.fileattr.acts.value;
  if (eval("document.forms.form"+num+".filelink.checked")) {  }
     alert(eval("document.forms.form"+num+".title.value")+  function changeURL(val) {
        eval("document.forms.form"+num+".filelink.value"));      if (opener.inf) {
  }          if (opener.inf.document.forms.resinfo.elements.u) {
       opener.inf.document.forms.resinfo.elements.u.value=val;
           }
     }      }
 }  }
 function select_group() {  END
 //    window.location="http://"+window.location.hostname+"/adm/groupsort?acts="+document.forms.fileattr.acts.value;              } elsif ($mode eq 'edit') { # we are in 'edit' mode
     window.location="/adm/groupsort?acts="+document.forms.fileattr.acts.value;                  my $location = "/adm/groupsort?catalogmode=interactive&";
                   $location .= "form=$form&element=$element&mode=edit&acts=";
    $catalogmodefunctions=<<END;
   // mode = $mode
   function select_data(url) {
      var location = "/res/?launch=2&form=$form&element=$element&titleelement=$titleelement&acts=" + url;
      window.location=location;
      if (window.opener.document.forms["$form"].elements["$element"].value != url) {
          window.opener.unClean();
      }
 }  }
 function select_group2() {  function select_group() {
     var linkflag=false;      window.location="$location"+document.forms.fileattr.acts.value;
     for (var num=0; num<document.forms.fnum.fnum.value; num++) {  
  if (eval("document.forms.form"+num+".filelink.checked")) {  
 //    alert(eval("document.forms.form"+num+".title.value")+  
 //       eval("document.forms.form"+num+".filelink.value"));  
     insertRowInLastRow();  
     placeResourceInLastRow(  
    eval("document.forms.form"+num+".title.value"),  
    eval("document.forms.form"+num+".filelink.value"),  
    linkflag  
    );  
     linkflag=true;  
  }  
     }  
     opener.editmode=0;  
     opener.notclear=0;  
     opener.linkmode=0;  
     opener.infoclear();  
     opener.draw();  
     self.close();  
 }  }
 function insertRowInLastRow() {  
     opener.insertrow(opener.maxrow);  function changeURL(val) {
     opener.addobj(opener.maxrow,'e&2');      if (window.opener.document) {
 }   window.opener.document.forms["$form"].elements["$element"].value=val;
 function placeResourceInLastRow (title,url,linkflag) {      } else {
     opener.newresource(opener.maxrow,2,opener.escape(title),opener.escape(url),'false','normal');      alert("The file you selected is: "+val);
     opener.save();  
     opener.mostrecent=opener.obj.length-1;  
     if (linkflag) {  
  opener.joinres(opener.linkmode,opener.mostrecent,0);  
     }      }
     opener.linkmode=opener.mostrecent;  
 }  }
   END
                   if (!$titleelement) {
       $catalogmodefunctions.='function changeTitle(val) {}';
    } else {
       $catalogmodefunctions.=<<END;
 function changeTitle(val) {  function changeTitle(val) {
     if (opener.inf.document.forms.resinfo.elements.t) {      if (window.opener.document) {
         opener.inf.document.forms.resinfo.elements.t.value=val;      window.opener.document.forms["$form"].elements["$titleelement"].value=val;
       } else {
       alert("The title of the file you selected is: "+val);
     }      }
 }  }
   END
                   }
               } elsif ($mode eq 'parmset') {
                   my $location = "/adm/groupsort?catalogmode=interactive&";
                   $location .= "form=$form&element=$element&mode=parmset&acts=";
    $catalogmodefunctions=<<END;
   // mode = $mode
   function select_data(url) {
       changeURL(url);
       self.close();
   }
   
   function select_group() {
       window.location="$location"+document.forms.fileattr.acts.value;
   }
   
 function changeURL(val) {  function changeURL(val) {
     if (opener.inf.document.forms.resinfo.elements.u) {      if (window.opener.document) {
  opener.inf.document.forms.resinfo.elements.u.value=val;          var elementname  = "$element"+"_value";
           var checkboxname = "$element"+"_setparmval";
    window.opener.document.forms["$form"].elements[elementname].value=val;
           window.opener.document.forms["$form"].elements[checkboxname].checked=true;
       } else {
       alert("The file you selected is: "+val);
     }      }
 }  }
   
 END  END
               }
         }          }
  if ($ENV{'form.catalogmode'} eq 'groupimport') {          $catalogmodefunctions.=<<END;
     $catalogmodefunctions.=<<END;  
 var acts='';  var acts='';
   function rep_dirpath(suffix,val) {
       eval("document.forms.dirpath"+suffix+".acts.value=val");
   }
   END
    if ($env{'form.catalogmode'} eq 'import') {
               $catalogmodefunctions.=<<END;
 function queue(val) {  function queue(val) {
     if (eval("document.forms."+val+".filelink.checked")) {      if (eval("document.forms."+val+".filelink.checked")) {
  var l=val.length;   var l=val.length;
  var v=val.substring(4,l);   var v=val.substring(4,l);
  document.forms.fileattr.acts.value+='1a'+v+'b';   document.forms.fileattr.acts.value+='1a'+v+'b';
 // alert(document.forms.fileattr.acts.value);  
     }      }
     else {      else {
  var l=val.length;   var l=val.length;
  var v=val.substring(4,l);   var v=val.substring(4,l);
  document.forms.fileattr.acts.value+='0a'+v+'b';   document.forms.fileattr.acts.value+='0a'+v+'b';
 // alert(document.forms.fileattr.acts.value);  
     }  
     if (typeof(document.forms.dirpathUP)!="undefined") {  
 // document.forms.dirpathUP.acts.value=document.forms.fileattr.acts.value;  
 // alert(document.forms.dirpathUP.acts.value);  
     }      }
 }  }
 function rep_dirpath(suffix,val) {  
     eval("document.forms.dirpath"+suffix+".acts.value=val");  
 //    eval("alert(document.forms.dirpath"+suffix+".acts.value)");  
 //    return false;  
 }  
 END  END
  }   }
   
           my $inhibit_menu = "+'&".&Apache::loncommon::inhibit_menu_check()."'";
 # ---------------------------------------------------------------- Print Header  # ---------------------------------------------------------------- Print Header
  $r->print(<<ENDHEADER);          
 <html>   my $js = <<"ENDHEADER";
 <head>  <script type="text/javascript">
 <title>The LearningOnline Network With CAPA Directory Browser</title>  $catalogmodefunctions;
   function update_only(field) {
 <script language="javascript">      alert(field.name);
 $catalogmodefunctions  }
 function openWindow(url, wdwName, w, h, toolbar,scrollbar) {  function checkAll() {
     var options = "width=" + w + ",height=" + h + ",";      var numForms = document.forms.length;
       for (i=0;i<numForms;i++) {
           var numElements = document.forms[i].elements.length;
           for (j=0;j<numElements;j++){
               var fieldName = document.forms[i].elements[j].name;
               if (fieldName == 'filelink') {
                   document.forms[i].elements[j].checked = true;
                   queue(document.forms[i].name);
               }
           }
       }
   }
   function uncheckAll() {
       var numForms = document.forms.length;
       for (i=0;i<numForms;i++) {
           var numElements = document.forms[i].elements.length;
           for (j=0;j<numElements;j++){
               var fieldName = document.forms[i].elements[j].name;
               if (fieldName == 'filelink') {
                   document.forms[i].elements[j].checked = false;
                   queue(document.forms[i].name);
               }
           }
       }
   }
   function openWindow(url, wdwName, w, h, toolbar,scrollbar,locationbar) {
       var xpos = (screen.width-w)/2;
       xpos = (xpos < 0) ? '0' : xpos;
       var ypos = (screen.height-h)/2-30;
       ypos = (ypos < 0) ? '0' : ypos;
       var options = "width=" + w + ",height=" + h + ",screenx="+xpos+",screeny="+ypos+",";
     options += "resizable=yes,scrollbars="+scrollbar+",status=no,";      options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
     options += "menubar=no,toolbar="+toolbar+",location=no,directories=no";      options += "menubar=no,toolbar="+toolbar+",location="+locationbar+",directories=no";
     var newWin = window.open(url, wdwName, options);      var newWin = window.open(url, wdwName, options);
     newWin.focus();      newWin.focus();
 }  }
 function gothere(val) {  function gothere(val) {
     window.location=val+'?acts='+document.forms.fileattr.acts.value;      window.location=val+'?acts='+document.forms.fileattr.acts.value$inhibit_menu;
 }  }
 </script>  </script>
   
 </head>  
 <body bgcolor="#FFFFFF">  
 ENDHEADER  ENDHEADER
         if ($ENV{'form.catalogmode'} eq 'groupimport') {  
 #    $r->print($ENV{'form.acts'}."<br />");          my ($headerdom)=($uri=~m{^/res/($match_domain)/});
     my $acts=$ENV{'form.acts'};   $r->print(&Apache::loncommon::start_page('Content Library',$js,
     my @Acts=split(/b/,$acts);   {'domain' => $headerdom,}));
     my %ahash;  # ---------------------------------- get state of file types to be showing
     my %achash;   if ($env{'form.only'}) {
     my $ac=0;      $typeselect = $env{'form.only'};
     map {   } else {
  my ($state,$ref)=split(/a/);      $typeselect = '';
  $ahash{$ref}=$state;  
  $achash{$ref}=$ac;  
  $ac++;  
     } (@Acts);  
     map {  
  my $key=$_;  
  if ($ahash{$key} eq '1') {  
 #    $r->print("<b>NEW: ");  
 #    $r->print($hash{'pre_'.$key.'_title'});  
 #    $r->print(" : ");  
 #    $r->print($hash{'pre_'.$key.'_link'});  
 #    $r->print("</b><br />");  
     $hash{'store_'.$hash{'pre_'.$key.'_link'}}=  
  $hash{'pre_'.$key.'_title'};  
     $hash{'storectr_'.$hash{'pre_'.$key.'_link'}}=  
  $hash{'storectr'}+0;  
     $hash{'storectr'}++;  
  }  
  if ($ahash{$key} eq '0') {  
     if ($hash{'store_'.$hash{'pre_'.$key.'_link'}}) {  
  delete $hash{'store_'.$hash{'pre_'.$key.'_link'}};  
     }  
  }  
     } sort {$achash{$a}<=>$achash{$b}} (keys %ahash);  
     map {  
  if ($_ =~ /^store_/) {  
     my $key=$_;  
     $key=~s/^store_//;  
 #    $r->print("<b>STORE: ");  
 #    $r->print($hash{'storectr_'.$key});  
 #    $r->print(':');  
 #    $r->print($hash{'store_'.$key});  
 #    $r->print(':');  
 #    $r->print($key);  
 #    $r->print("</b><br />");  
  }  
     } keys %hash;  
     map {  
  if ($_ =~ /^pre_/ && $_ =~/link$/) {  
     my $key = $_;  
     $key =~ s/^pre_//;  
     $key =~ s/_[^_]*$//;  
 #    $r->print($key);  
 #    $r->print(':');  
 #    $r->print($hash{'pre_'.$key.'_title'});  
 #    $r->print(':');  
 #    $r->print($hash{'pre_'.$key.'_link'});  
 #    $r->print('<br />');  
     delete $hash{'pre_'.$key.'_title'};  
     delete $hash{'pre_'.$key.'_link'};  
  }  
     } keys %hash;  
  }   }
   
  $r->print('<h2><font color="#888888">The LearningOnline With CAPA Network Directory Browser</font></h2>'."\n");  
     } else {  
  $r->print('<html><head></head><body>Unable to tie hash to db file</body></html>');  
  return OK;  
     }  
     untie %hash;  
     if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {  
   
  if ($ENV{'form.attrs'} ne "") {  # ---------------------------------- get state of file attributes to be showing
     for (my $i=0; $i<=5; $i++) {   if ($env{'form.attrs'}) {
       for (my $i=0; $i<=14; $i++) {
  delete $hash{'display_attrs_'.$i};   delete $hash{'display_attrs_'.$i};
  if ($ENV{'form.attr'.$i} == 1) {   if ($env{'form.attr'.$i} == 1) {
     $attrchk[$i] = "checked";      $attrchk[$i] = 'checked';
     $hash{'display_attrs_'.$i} = 1;      $hash{'display_attrs_'.$i} = 1;
  }   }
     }      }
  } else {   } else {
     for (my $i=0; $i<=5; $i++) {      for (my $i=0; $i<=14; $i++) {
  $attrchk[$i] = "checked" if $hash{'display_attrs_'.$i} == 1;   $attrchk[$i] = 'checked' if $hash{'display_attrs_'.$i} == 1;
     }      }
  }   }
   
   # ------------------------------- output state of file attributes to be showing
   #                                 All versions has to the last item
   #                                 since it does not take an extra col
    my %lt=&Apache::lonlocal::texthash(
      'ti' => 'Title',
      'si' => 'Size',
      'la' => 'Last access',
      'lm' => 'Last modified',
      'st' => 'Statistics',
      'au' => 'Author',
      'kw' => 'Keywords',
      'sb' => 'Subject',
      'nt' => 'Notes',
      'ab' => 'Abstract',
      'ln' => 'Language',
      'sa' => 'Source Available',
      'sr' => 'Show resource',
      'li' => 'Linked/Related Resources',
      'av' => 'All versions',
      'ud' => 'Update Display',
      'pr' => 'Problems',
      'gr' => 'Graphics',
      'at' => 'All types',
      'hd' => 'Display Options'
      );
  $r->print(<<END);   $r->print(<<END);
 <b><font color="#666666">Display file attributes</font></b><br>  <fieldset>
 <form method="post" name="fileattr" action="$uri" enctype="application/x-www-form-urlencoded">  <legend>$lt{'hd'}</legend>
 <table border=0><tr>  <form method="post" name="fileattr" action="$uri"
 <td><input type="checkbox" name="attr0" value="1" $attrchk[0] /> Size</td>   enctype="application/x-www-form-urlencoded">
 <td><input type="checkbox" name="attr1" value="1" $attrchk[1] /> Last access</td>  <label><input type="checkbox" name="attr9" value="1" $attrchk[9] onClick="this.form.submit();" /> $lt{'av'}</label>
 <td><input type="checkbox" name="attr2" value="1" $attrchk[2] /> Last modified</td>  <table border="0">
 </tr><tr>  <tr>
 <td><input type="checkbox" name="attr3" value="1" $attrchk[3] /> Author</td>  <td><label><input type="checkbox" name="attr0" value="1" $attrchk[0] onClick="this.form.submit();" /> $lt{'ti'}</label></td>
 <td><input type="checkbox" name="attr4" value="1" $attrchk[4] /> Keywords</td>  <td><label><input type="checkbox" name="attr4" value="1" $attrchk[4] onClick="this.form.submit();" /> $lt{'au'}</label></td>
 <td><input type="checkbox" name="attr5" value="1" $attrchk[5] /> Language</td>  <td><label><input type="checkbox" name="attr5" value="1" $attrchk[5] onClick="this.form.submit();" /> $lt{'kw'}</label></td>
 </tr></table>  <td><label><input type="checkbox" name="attr6" value="1" $attrchk[6] onClick="this.form.submit();" /> $lt{'ln'}</label></td>
 <input type="hidden" name="dirPointer" value="on" />  <td><label><input type="checkbox" name="attr13" value="1" $attrchk[13] onClick="this.form.submit();" /> $lt{'nt'}</label></td>
   </tr>
   <tr>
   <td><label><input type="checkbox" name="attr1" value="1" $attrchk[1] onClick="this.form.submit();" /> $lt{'si'}</label></td>
   <td><label><input type="checkbox" name="attr2" value="1" $attrchk[2] onClick="this.form.submit();" /> $lt{'la'}</label></td>
   <td><label><input type="checkbox" name="attr3" value="1" $attrchk[3] onClick="this.form.submit();" /> $lt{'lm'}</label></td>
   <td><label><input type="checkbox" name="attr10" value="1" $attrchk[10] onClick="this.form.submit();" /> $lt{'sa'}</label></td>
   <td><label><input type="checkbox" name="attr14" value="1" $attrchk[14] onClick="this.form.submit();" /> $lt{'ab'}</label></td>
   </tr>
   <tr>
   <td><label><input type="checkbox" name="attr8" value="1" $attrchk[8] onClick="this.form.submit();" /> $lt{'st'}</label></td>
   <td><label><input type="checkbox" name="attr11" value="1" $attrchk[11] onClick="this.form.submit();" /> $lt{'li'}</label></td>
   <td><label><input type="checkbox" name="attr7" value="1" $attrchk[7] onClick="this.form.submit();" /> $lt{'sr'}</label></td>
   <td><label><input type="checkbox" name="attr12" value="1" $attrchk[12] onClick="this.form.submit();" /> $lt{'sb'}</label></td>
   <td>&nbsp;</td>
   </tr>
   </table>
   <input type="hidden" name="attrs" value="1" />
   END
           my @file_categories = &Apache::loncommon::filecategories();
           my %select_file_categories;
           my @select_form_order = ('');
           $select_file_categories{''} = &mt('All file types');
           foreach my $cat (@file_categories) {
       my $types = join(",",&Apache::loncommon::filecategorytypes($cat));
       $select_file_categories{$types} = $cat;
       push(@select_form_order,$types);
    }
           $select_file_categories{'select_form_order'} = \@select_form_order;
           my $type_element=
       &Apache::loncommon::select_form($typeselect,'only',
       %select_file_categories);
           $type_element = '<label>'.&mt('File Type Displayed: [_1]',
         $type_element).'</label>';
           $r->print($type_element
                    .'</fieldset>');
           $r->print(<<END);
   <br />
   <input type="submit" name="updatedisplay" value="$lt{'ud'}" />
 <input type="hidden" name="acts" value="" />  <input type="hidden" name="acts" value="" />
 <input type="submit" name="attrs" value="Review" />&nbsp;  $closebutton $groupimportbutton
 <input type="submit" name="attrs" value="Refresh" />  END
 $hidden          $r->print(&Apache::loncommon::inhibit_menu_check('input'));
 $closebutton     
 $groupimportbutton  # -------------- Filter out sequence containment in crumbs and "recent folders"
 </form>   my $storeuri=$uri;
 END   $storeuri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1];
    $storeuri=~s/\/+/\//g;
         my $titleclr="#ddffff";  # ---------------------------------------------------------------- Bread crumbs
         $r->print("<table border=0><tr><td bgcolor=#eeeeee>\n");          $r->print(&Apache::lonhtmlcommon::crumbs($storeuri,'','',
  $r->print("<table border=0><tr>\n");   (($env{'form.catalogmode'} eq 'import')?
  $r->print("<td $colspan bgcolor=$titleclr><b>Name</b></td>\n");   'document.forms.fileattr':'')).
  $r->print("<td bgcolor=$titleclr align=right><b>Size (bytes) </b></td>\n") if ($hash{'display_attrs_0'} == 1);    &Apache::lonhtmlcommon::select_recent('residx','resrecent',
  $r->print("<td bgcolor=$titleclr><b>Last accessed</b></td>\n") if ($hash{'display_attrs_1'} == 1);  'window.status=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.action=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.submit();'));
  $r->print("<td bgcolor=$titleclr><b>Last modified</b></td>\n") if ($hash{'display_attrs_2'} == 1);  # -------------------------------------------------------- Resource Home Button
  $r->print("<td bgcolor=$titleclr><b>Author(s)</b></td>\n") if ($hash{'display_attrs_3'} == 1);   my $reshome=$env{'course.'.$env{'request.course.id'}.'.reshome'};
  $r->print("<td bgcolor=$titleclr><b>Keywords</b></td>\n") if ($hash{'display_attrs_4'} == 1);   if ($reshome) {
  $r->print("<td bgcolor=$titleclr><b>Language</b></td>\n") if ($hash{'display_attrs_5'} == 1);      $r->print("<span class=\"LC_fontsize_large\"><a href='");
  $r->print("</tr>");      if ($env{'form.catalogmode'} eq 'import') {
    $r->print('javascript:document.forms.fileattr.action="'.&Apache::loncommon::inhibit_menu_check($reshome).'";document.forms.fileattr.submit();');
       } else {
    $r->print($reshome);
       }
       $r->print("'>".&mt('Home').'</a></span>');
    }
    $r->print('</form>');
   # ------------------------------------------------------ Remember where we were
    &Apache::loncommon::storeresurl($storeuri);
    &Apache::lonhtmlcommon::store_recent('residx',$storeuri,$storeuri);
   # -------------------------------------------------- Check All and Uncheck all
    if ($env{'form.catalogmode'} eq 'import') {
       $r->print('<br /><input type="button" value="'.&mt("Check All").'" id="checkallbutton" onClick="javascript:checkAll()" />');
       $r->print('<input type="button" value="'.&mt("Uncheck All").'" id="uncheckallbutton" onClick="javascript:uncheckAll()" />');
    }
   # ----------------- output starting row to the indexed file/directory hierarchy
           #$r->print(&initdebug());
           #$r->print(&writedebug("Omit:@Omit")) if (@Omit);
           #$r->print(&writedebug("Only:@Only")) if (@Only);
           $r->print('<br /><br />');
           $r->print(&Apache::loncommon::start_data_table("LC_tableBrowseRes")
                    .&Apache::loncommon::start_data_table_header_row());
    $r->print("<th $colspan>".&mt('Name')."</th>\n");
    $r->print("<th>".&mt('Title')."</th>\n") 
       if ($hash{'display_attrs_0'} == 1);
    $r->print('<th class="LC_right">'.&mt("Size")." (".&mt("bytes").") ".
     "</th>\n") if ($hash{'display_attrs_1'} == 1);
    $r->print("<th>".&mt("Last accessed")."</th>\n") 
       if ($hash{'display_attrs_2'} == 1);
    $r->print("<th>".&mt("Last modified")."</th>\n")
       if ($hash{'display_attrs_3'} == 1);
    $r->print("<th>".&mt("Author(s)")."</th>\n")
       if ($hash{'display_attrs_4'} == 1);
    $r->print("<th>".&mt("Keywords")."</th>\n")
       if ($hash{'display_attrs_5'} == 1);
    $r->print("<th>".&mt("Language")."</th>\n")
       if ($hash{'display_attrs_6'} == 1);
    $r->print("<th>".&mt("Usage Statistics")." <br />(".
     &mt("Courses/Network Hits").") ".&mt('updated periodically')."</th>\n")
       if ($hash{'display_attrs_8'} == 1);
    $r->print("<th>".&mt("Source Available")."</th>\n")
       if ($hash{'display_attrs_10'} == 1);
    $r->print("<th>".&mt("Linked/Related Resources")."</th>\n")
       if ($hash{'display_attrs_11'} == 1);
    $r->print("<th>".&mt("Resource")."</th>\n")
       if ($hash{'display_attrs_7'} == 1);
    $r->print("<th>".&mt("Subject")."</th>\n")
       if ($hash{'display_attrs_12'} == 1);
    $r->print("<th>".&mt("Notes")."</th>\n")
       if ($hash{'display_attrs_13'} == 1);
    $r->print("<th>".&mt("Abstract")."</th>\n")
       if ($hash{'display_attrs_14'} == 1);
       
       $r->print(&Apache::loncommon::end_data_table_header_row());
       
      
   
  map {  # ----------------- read in what directories have previously been set to "open"
    foreach (keys %hash) {
     if ($_ =~ /^diropen_status_/) {      if ($_ =~ /^diropen_status_/) {
  my $key = $_;   my $key = $_;
  $key =~ s/^diropen_status_//;   $key =~ s/^diropen_status_//;
  $dirs{$key} = $hash{$_};   $dirs{$key} = $hash{$_};
     }      }
  } keys %hash;   }
   
  if ($ENV{'form.openuri'}) {  # take care of review and refresh options   if ($env{'form.openuri'}) {  # take care of review and refresh options
     my $uri=$ENV{'form.openuri'};      my $uri=$env{'form.openuri'};
     if (exists($hash{'diropen_status_'.$uri})) {      if (exists($hash{'diropen_status_'.$uri})) {
  my $cursta = $hash{'diropen_status_'.$uri};   my $cursta = $hash{'diropen_status_'.$uri};
  $dirs{$uri} = 'open';   $dirs{$uri} = 'open';
Line 400  END Line 611  END
     }      }
  }   }
   
  my $bredir = $ENV{'form.dirPointer'};  
  my $toplevel;   my $toplevel;
  my $indent = 0;   my $indent = 0;
  $uri = $uri.'/' if $uri !~ /.*\/$/;   $uri = $uri.'/' if $uri !~ /.*\/$/;
  if ($bredir ne "on") {  
     $hash{'top.level'} = $uri;  
     $toplevel = $uri;  
   
  } else {    if ($env{'form.dirPointer'} ne 'on') {
     $toplevel = $hash{'top.level'};       $hash{'top.level'} = $uri;
  }       $toplevel = $uri;
  if ($toplevel ne "/res/"){    } else {
        $toplevel = $hash{'top.level'};
     }
   
   # -------------------------------- if not at top level, provide an uplink arrow
    if ($toplevel ne '/res/'){
     my (@uri_com) = split(/\//,$uri);      my (@uri_com) = split(/\//,$uri);
     pop @uri_com;      pop @uri_com;
     my $upone = join('/',@uri_com);      my $upone = join('/',@uri_com);
Line 419  END Line 631  END
     &display_line ($r,'opened',$upone.'&viewOneUp',0,$upone,@list);      &display_line ($r,'opened',$upone.'&viewOneUp',0,$upone,@list);
     $indent = 1;      $indent = 1;
  }   }
   
   # -------- recursively go through all the directories and output as appropriate
  &scanDir ($r,$toplevel,$indent,\%hash);   &scanDir ($r,$toplevel,$indent,\%hash);
   
  $r->print("<form name='fnum'>");  # -------------------------------------------------------------- end the tables
  $r->print("<input type='hidden' name='fnum' value='$fnum'></form>");          $r->print(&Apache::loncommon::end_data_table());
  $r->print("</table>");  
  $r->print("</td></tr></table>");  # ---------------------------- embed hidden information useful for group import
  $r->print("</body></html>\n");   $r->print("<form name='fnum' action=''>");
  untie(%hash);   $r->print("<input type='hidden' name='fnum' value='$fnum' /></form>");
     } else {  
  $r->print("Unable to tie hash to db file");  # --------------------------------------------------- end the output and return
    $r->print(&Apache::loncommon::end_page()."\n");
       }
       if(! $c->aborted()) {
   # write back into the temporary file
    my %dbfile;
           if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_NEWDB(),0640)) {
               while (my($key,$value) = each(%hash)) {
                   $dbfile{$key}=$value;
               }
               untie(%dbfile);
           }
     }      }
   
     return OK;      return OK;
 }  }
   
   # ----------------------------------------------- recursive scan of a directory
 # --------------------recursive scan of a directory  
 sub scanDir {  sub scanDir {
     my ($r,$startdir,$indent,$hashref)=@_;      my ($r,$startdir,$indent,$hashref)=@_;
       my $c = $r->connection();
     my ($compuri,$curdir);      my ($compuri,$curdir);
     my $dirptr=16384;      my $dirptr=16384;
       my $obs;
     $indent++;      $indent++;
   
     my %dupdirs = %dirs;      my %dupdirs = %dirs;
     my @list=&get_list($r,$startdir);      my @list=&get_list($r,$startdir);
     foreach my $line (@list) {      foreach my $line (@list) {
  my ($strip,$dom,$foo,$testdir,$foo)=split(/\&/,$line,5);           return if ($c->aborted());
  next if $strip =~ /.*\.meta$/;   #This is a kludge, sorry aboot this
  if ($dom eq "domain") {   my ($strip,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); 
     $compuri = join('',$strip,"/");  # domain list has /res/<domain name>   next if($strip =~ /.*\.meta$/ | $obs eq '1');
     $curdir = $compuri;   my (@fileparts) = split(/\./,$strip);
    if ($hash{'display_attrs_9'} != 1) {
               # if not all versions to be shown
       if (scalar(@fileparts) >= 3) {
    my $fext = pop @fileparts;
    my $ov = pop @fileparts;
    my $fname = join ('.',@fileparts,$fext);
    next if (grep /\Q$fname\E/,@list and $ov =~ /^\d+$/);
       }
    }
   
    if ($dom eq 'domain') {
       # dom list has full path /res/<domain name>/ already
       $curdir='';
       $compuri = (split(/\&/,$line))[0];
  } else {   } else {
     $compuri = join('',$startdir,$strip,"/"); # user, dir & file have name only, i.e., w/o path      # user, dir & file have name only, i.e., w/o path
       $compuri = join('',$startdir,$strip,'/');
     $curdir = $startdir;      $curdir = $startdir;
  }   }
  my $diropen = "closed";   my $diropen = 'closed';
  if (($dirptr&$testdir) or ($dom =~ /^(domain|user)$/)) {   if (($dirptr&$testdir) or ($dom =~ /^(domain|user)$/) or ($compuri=~/\.(sequence|page)\/$/)) {
     while (my ($key,$val)= each %dupdirs) {      while (my ($key,$val)= each %dupdirs) {
  if ($key eq $compuri and $val eq "open") {   if ($key eq $compuri and $val eq "open") {
     $diropen = "opened";      $diropen = "opened";
     delete $dupdirs{key},$dirs{$key};      delete($dupdirs{$key});
       delete($dirs{$key});
  }   }
     }      }
  }   }
  &display_line($r,$diropen,$line,$indent,$curdir,$hashref,@list);   &display_line($r,$diropen,$line,$indent,$curdir,$hashref,@list);
  &scanDir ($r,$compuri,$indent) if $diropen eq "opened";   &scanDir ($r,$compuri,$indent) if $diropen eq 'opened';
     }      }
     $indent--;      $indent--;
 }  }
   
 # ----------------- get complete matched list based on the uri ------  # --------------- get complete matched list based on the uri (returns an array)
 sub get_list {  sub get_list {
     my ($r,$uri)=@_;      my ($r,$uri)=@_;
     my @list;      my @list=();
     my $luri = $uri;      (my $luri = $uri) =~ s/\//_/g;
     $luri =~ s/\//_/g;      if ($env{'form.updatedisplay'}) {
    foreach (keys %hash) {
     if ($ENV{'form.attrs'} eq "Refresh") {  
  map {  
     delete $hash{$_} if ($_ =~ /^dirlist_files_/);      delete $hash{$_} if ($_ =~ /^dirlist_files_/);
     } keys %hash;      delete $hash{$_} if ($_ =~ /^dirlist_timestamp_files_/);
    }
     }      }
   
     if ($hash{'dirlist_files'.$luri}) {      if (defined($hash{'dirlist_files_'.$luri}) &&
    $hash{'dirlist_timestamp_files_'.$luri}+600 > (time)) {
  @list = split(/\n/,$hash{'dirlist_files_'.$luri});   @list = split(/\n/,$hash{'dirlist_files_'.$luri});
       } elsif ($uri=~/\.(page|sequence)\/$/) {
   # is a page or a sequence
    $uri=~s/\/$//;
    $uri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1];
    $uri=~s/\/+/\//g;
    foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$uri))) {
       my @ratpart=split(/\:/,$_);
       push(@list,&LONCAPA::map::qtescape($ratpart[1]));
    } 
    $hash{'dirlist_files_'.$luri} = join("\n",@list);
     } else {      } else {
   # is really a directory
  @list = &Apache::lonnet::dirlist($uri);   @list = &Apache::lonnet::dirlist($uri);
  $hash{'dirlist_files_'.$luri} = join('\n',@list);   $hash{'dirlist_files_'.$luri} = join("\n",@list);
    $hash{'dirlist_timestamp_files_'.$luri} = time;
       }
       return @list=&match_ext($r,@list);    
   }
   
   sub dynmetaread {
       my $uri=shift;
       if (($hash{'display_attrs_8'}==1) || ($hash{'display_attrs_11'}==1)) {
   # We don't want the filename
    $uri=~s/\/[^\/]+$//;
   # Did we already see this?
    my $builddir=$uri;
    while ($builddir) {
       if ($dynread{$builddir}) {
    return 0;
       }
       $builddir=~s/\/[^\/]+$//;
    }
   # Actually get the data
    %dynhash=
       (%dynhash,&Apache::lonmeta::get_dynamic_metadata_from_sql($uri.'/'));
   # Remember that we got it
    $dynread{$uri}=1;
       } 
   }
   
   sub initdebug {
       my $start_page=
    &Apache::loncommon::start_page('Debug',undef,
          {'only_body' => 1,});
       $start_page =~ s/\n/ /g;
       return <<ENDJS;
   <script type="text/javascript">
   var debugging = true;
   if (debugging) {
       var debuggingWindow = window.open('','Debug','width=400,height=300',true);
   } 
   
   function output(text) {
       if (debugging) {
           debuggingWindow.document.writeln(text);
     }      }
     return @list=&match_ext($r,@list);  }
   output('$start_page<pre>');   
   </script>
   ENDJS
   }
   
   sub writedebug {
       my ($text) = @_;
       return "<script type=\"text/javascript\">output('$text');</script>";
 }  }
   
 #-------------------------- filters out files based on extensions  # -------------------- filters out files based on extensions (returns an array)
 sub match_ext {  sub match_ext {
     my ($r,@packlist)=@_;      my ($r,@packlist)=@_;
     my @trimlist;      my @trimlist;
Line 498  sub match_ext { Line 800  sub match_ext {
     my @fileext;      my @fileext;
     my $dirptr=16384;      my $dirptr=16384;
   
     my $tabdir  = $r->dir_config('lonTabDir');  
     my $fn = $tabdir.'/filetypes.tab';  
     if (-e $fn) {  
  my $FH=Apache::File->new($fn);  
  my @content=<$FH>;  
  foreach my $line (@content) {  
     (my $ext,my $foo) = split /\s+/,$line;  
     push @fileext,$ext;  
  }  
     }  
     foreach my $line (@packlist) {      foreach my $line (@packlist) {
  chomp $line;   chomp $line;
  $line =~ s/^\/home\/httpd\/html//;   $line =~ s/^\/home\/httpd\/html//;
  my @unpackline = split (/\&/,$line);   my @unpackline = split (/\&/,$line);
  next if ($unpackline[0] eq ".");   next if ($unpackline[0] eq '.');
  next if ($unpackline[0] eq "..");   next if ($unpackline[0] eq '..');
  my @filecom = split (/\./,$unpackline[0]);   my @filecom = split (/\./,$unpackline[0]);
  my $fext = pop(@filecom);   my $fext = pop(@filecom);
  my $fnptr = $unpackline[3]&$dirptr;   my $fnptr = ($unpackline[3]&$dirptr) || ($fext=~/\.(page|sequence)$/);
   if ($fnptr == 0 and $unpackline[3] ne "") {    if ($fnptr == 0 and $unpackline[3] ne "") {
     foreach my $nextline (@fileext) {      my $embstyle = &Apache::loncommon::fileembstyle($fext);
  push @trimlist,$line if $nextline eq $fext;              push @trimlist,$line if (defined($embstyle) && 
     }       ($embstyle ne 'hdn' or $fext eq 'meta'));
  } else {   } else {
     push @trimlist,$line;      push @trimlist,$line;
  }   }
     }      }
     @trimlist = sort (@trimlist);      @trimlist = sort {uc($a) cmp uc($b)} (@trimlist);
     return @trimlist;      return @trimlist;
 }  }
   
 #------------------- displays one line in appropriate table format  # ------------------------------- displays one line in appropriate table format
 sub display_line{  sub display_line {
     my ($r,$diropen,$line,$indent,$startdir,$hashref,@list)=@_;      my ($r,$diropen,$line,$indent,$startdir,$hashref,@list)=@_;
     my (@pathfn, $fndir, $fnptr);      my (@pathfn, $fndir);
   # there could be relative paths (files actually belonging into this directory)
   # or absolute paths (for example, from sequences)
       my $absolute;
       my $pathprefix;
       if ($line=~m|^/res/| && $startdir ne '') {
    $absolute=1;
    $pathprefix='';
       } else {
    $absolute=0;
    $pathprefix=$startdir;
       }
     my $dirptr=16384;      my $dirptr=16384;
     my $fileclr="#ffffe6";  #SB my $fileclr="#ffffe6";
     my $iconpath= $r->dir_config('lonIconsURL') . "/";      my $iconpath= $r->dir_config('lonIconsURL') . '/';
   
     my @filecom = split (/\&/,$line);      my @filecom = split (/\&/,$line);
     my @pathcom = split (/\//,$filecom[0]);      my @pathcom = split (/\//,$filecom[0]);
     my $listname = $pathcom[scalar(@pathcom)-1];      my $listname = $pathcom[scalar(@pathcom)-1];
     my $fnptr = $filecom[3]&$dirptr;      my $fnptr = $filecom[3]&$dirptr;
     my $msg = 'View '.$filecom[0].' resources';      my $msg = &mt('View').' '.$filecom[0].' '.&mt('resources');
     $msg = 'Close '.$filecom[0].' directory' if $diropen eq "opened";      $msg = &mt('Close').' '.$filecom[0].' '.&mt('directory') if $diropen eq 'opened';
       my $nowOpen = ($diropen eq 'opened' ? 1 : 0);
   
     my $tabtag="</td>";      my $tabtag='</td>';
     my $i=0;      my $i=0;
       while ($i<=14) {
     while ($i<=5) {   $tabtag=join('',$tabtag,"<td>&nbsp;</td>")
  $tabtag=join('',$tabtag,"<td bgcolor=",$fileclr,">&nbsp;</td>") if $hash{'display_attrs_'.$i} == 1;      if ($i != 9 &&
    $hash{'display_attrs_'.$i} == 1);
  $i++;   $i++;
     }      }
     if ($filecom[1] eq "viewOneUp") {      my $valign = ($hash{'display_attrs_7'} == 1 ? 'top' : 'bottom');
  $r->print("<tr>$extrafield");  
  $r->print("<td bgcolor=$fileclr valign=bottom>\n");  # display uplink arrow
  $r->print ('<form method="post" name="dirpathUP" action="'.$startdir.      if ($filecom[1] eq 'viewOneUp') {
    my $updir=$startdir;
   # -------------- Filter out sequence containment in crumbs and "recent folders"
    $updir='/'.(split(/\.(page|sequence)\/\//,$startdir))[-1];
    $updir=~s/\/+/\//g;
   
   #SB $r->print("<tr valign='$valign' bgcolor=\"$fileclr\">$extrafield");
           $r->print(&Apache::loncommon::start_data_table_row()); # valign="$valign" ?!?
           $r->print($extrafield);
    $r->print("<td>\n");
    $r->print ('<form method="post" name="dirpathUP" action="'.$updir.
    '/" '.     '/" '.
    'onSubmit="return rep_dirpath(\'UP\',document.forms.fileattr.acts.value)" '.     'onSubmit="return rep_dirpath(\'UP\','.
      'document.forms.fileattr.acts.value)" '.
    'enctype="application/x-www-form-urlencoded"'.     'enctype="application/x-www-form-urlencoded"'.
                    '>'."\n");                     '>'."\n");
  $r->print ($hidden.'<input type=hidden name=openuri value="'.$startdir.'">'."\n");   $r->print(&Apache::loncommon::inhibit_menu_check('input'));
  $r->print ('<input type="hidden" name="acts" value="">'."\n");   $r->print ('<input type=hidden name=openuri value="'.
  $r->print ('<input src="'.$iconpath.'arrow_up.gif"');     $startdir.'" />'."\n");
  $r->print (' name="'.$msg.'" height="22" type="image" border="0">'."\n");          $r->print ('<input type="hidden" name="acts" value="" />'."\n");
  $r->print("Up $tabtag</tr></form>\n");   $r->print ('<a href="#" onClick="document.dirpathUP.submit()"><img src="'.$iconpath.'arrow.up.gif"');
    $r->print (' name="'.$msg.'" type="image" class="LC_fileicon" />'.
      "\n");
    $r->print(&mt("Up")."</a></form>$tabtag");
           $r->print(&Apache::loncommon::end_data_table_row());
  return OK;   return OK;
     }      }
     if ($filecom[1] eq "domain") {  # Do we have permission to look at this?
  $r->print ('<input type=hidden name=dirPointer value="on">'."\n") if ($ENV{'form.dirPointer'} eq "on");  
  $r->print("<tr>$extrafield");      if($filecom[15] ne '1') { return OK if (!&Apache::lonnet::allowed('bre',$pathprefix.$filecom[0])); }
  $r->print("<td bgcolor=$fileclr valign=bottom>");  
  &begin_form ($r,$filecom[0].'/');  # make absolute links appear on different background
  my $anchor = $filecom[0].'/';  #SB    if ($absolute) { $fileclr='#ccdd99'; }
  $anchor =~ s/\///g;  
  $r->print ('<a name="'.$anchor.'">');  # display domain
  $r->print ('<input type="hidden" name="acts" value="">');      if ($filecom[1] eq 'domain') {
  $r->print ('<input src="'.$iconpath.'folder_pointer_'.$diropen.'.gif"');     $r->print ('<input type="hidden" name="dirPointer" value="on" />'."\n")
  $r->print (' name="'.$msg.'" height="22" type="image" border="0">'."\n");       if ($env{'form.dirPointer'} eq "on");
  $r->print ('<a href="javascript:gothere(\''.$filecom[0].'/\')"><img src="'.$iconpath.'server.gif"');  #SB $r->print("<tr valign='$valign' bgcolor=\"$fileclr\">$extrafield");
  $r->print (' border="0"></a>'."\n");   $r->print(&Apache::loncommon::start_data_table_row()); # valign="$valign" ?!?"
  $r->print("Domain - $listname $tabtag</tr></form>\n");          $r->print($extrafield);
    $r->print("<td>");
    &begin_form ($r,$filecom[0]);
    my $anchor = $filecom[0];
    $anchor =~ s/\W//g;
    $r->print ('<a name="'.$anchor.'"></a>');
   $r->print ('<input type="hidden" name="acts" value="" />');
    $r->print ('<a href="#" onClick="document.dirpath'.($dnum-1).'.submit()"><img src="'.$iconpath.'arrow.'.($nowOpen ? "open" : "closed" ).'.gif"'); 
    $r->print (' name="'.$msg.'" type="image" class="LC_fileicon" /></a>'.
      "\n");
    my $quotable_filecom = &Apache::loncommon::escape_single($filecom[0]);
    $r->print ('<a href="javascript:gothere(\''.$quotable_filecom.
      '\')"><img alt="" src="'.$iconpath.'server.gif"');
    $r->print (' class="LC_fileicon" />'."\n");
    $r->print (&mt("Domain")." - $listname </a>");
    if (&Apache::lonnet::domain($listname,'description')) {
       $r->print("<br />(".&Apache::lonnet::domain($listname,'description').
         ")");
    }
    $r->print("</form>$tabtag");
            $r->print(&Apache::loncommon::end_data_table_row());
  return OK;   return OK;
   
   # display user directory
     }      }
     if ($filecom[1] eq "user") {      if ($filecom[1] eq 'user') {
  $r->print("<tr>$extrafield");   # $r->print("<tr valign=$valign bgcolor=\"$fileclr\">$extrafield");
  $r->print("<td bgcolor=$fileclr valign=bottom nowrap>\n");  
  my $curdir = $startdir.$filecom[0].'/';   my $curdir = $startdir.$filecom[0].'/';
  my $anchor = $curdir;   my $anchor = $curdir;
  $anchor =~ s/\///g;   $anchor =~ s/\W//g;
   #SB $r->print("<tr bgcolor=\"$fileclr\">$extrafield<td valign=$valign>");
           $r->print(&Apache::loncommon::start_data_table_row()
                    .$extrafield.'<td class="LC_'.$valign.'">');
  &begin_form ($r,$curdir);   &begin_form ($r,$curdir);
  $r->print ('<a name="'.$anchor.'"><img src="'.$iconpath.'whitespace1.gif" border=0>'."\n");   $r->print ('<a name="'.$anchor.'"></a><img alt="" src="'.$iconpath.
  $r->print ('<input type="hidden" name="acts" value="">');     'whitespace_21.gif" class="LC_icon" />'."\n");
  $r->print ('<input src="'.$iconpath.'folder_pointer_'.$diropen.'.gif"');    $r->print ('<input type="hidden" name="acts" value="" />');
  $r->print (' name="'.$msg.'" height="22" type="image" border="0">'."\n");   $r->print ('<a href="#" onClick="document.dirpath'.($dnum-1).'.submit()">');
  $r->print ('<a href="javascript:gothere(\''.$curdir.'\')"><img src='.$iconpath.'quill.gif border=0 name="'.$msg.'" height="22"></a>');          $r->print ('<img src="'.$iconpath.'arrow.'.($nowOpen ? "open" : "closed" ).
  $r->print ($listname.$tabtag.'</tr></form>'."\n");     '.gif" class="LC_fileicon"'); 
  return OK;   $r->print (' name="'.$msg.'"/></a>'.
      "\n");
    my $quotable_curdir = &Apache::loncommon::escape_single($curdir);
    $r->print ('<a href="javascript:gothere(\''.$quotable_curdir
      .'\')"><img alt="'.$msg.'" src="'.
      $iconpath.'quill.gif" class="LC_fileicon" />');
    my $domain=(split(m|/|,$startdir))[2];
    my $plainname=&Apache::loncommon::plainname($listname,$domain);
           $r->print ($listname.'</a>');
   
           if (defined($plainname) && $plainname) { $r->print(" ($plainname) "); }
           $r->print('</form>'.$tabtag);
           $r->print(&Apache::loncommon::end_data_table_row());
           return OK;
     }      }
   
 # display file  # display file
     if ($fnptr == 0 and $filecom[3] ne "") {          if (($fnptr == 0 and $filecom[3] ne '') or $absolute) {
  my @file_ext = split (/\./,$listname);              my $title;
  my $curfext = $file_ext[scalar(@file_ext)-1];              my $filelink = $pathprefix.$filecom[0];
  my $filelink = $startdir.$filecom[0];              if ($hash{'display_attrs_0'} == 1) {
  $r->print("<tr><td nowrap valign='bottom' bgcolor=$fileclr>");                  $title = &Apache::lonnet::gettitle($filelink);
  my $metafile = grep /^$filecom[0]\.meta\&/, @list;              }
  my $title;              my @file_ext = split (/\./,$listname);
         if ($ENV{'form.catalogmode'} eq 'interactive') {              my $curfext = $file_ext[-1];
     $title=$listname;              if (@Omit) {
     $title = &Apache::lonnet::metadata($filelink,'title')                  foreach (@Omit) { return OK if (lc($curfext) eq $_); }
  if ($metafile == 1);              }
     $title=$listname unless $title;              if (@Only) {
     $r->print("<a href='javascript:select_data(\"",                  my $skip = 1;
               $title,'","',$filelink,"\")'>");                  foreach (@Only) { $skip = 0 if (lc($curfext) eq $_); }
     $r->print("<img src='",$iconpath,"select.gif' border=0></a>\n");                  return OK if ($skip > 0);
     $r->print("</td><td valign='bottom' nowrap bgcolor=$fileclr>");              }
  }              # Set the icon for the file
         elsif ($ENV{'form.catalogmode'} eq 'groupimport') {              my $iconname = &Apache::loncommon::icon($listname);
     $title=$listname;  #SB $r->print("<tr valign='$valign' bgcolor=\"$fileclr\">);
     $title = &Apache::lonnet::metadata($filelink,'title')          $r->print(&Apache::loncommon::start_data_table_row()); #SB valign="$valign" ?!?
  if ($metafile == 1);          $r->print('<td class="LC_middle LC_nobreak">');
     $title=$listname unless $title;  
     $r->print("<form name='form$fnum'>\n");          if ($env{'form.catalogmode'} eq 'interactive') {
       my $quotable_filelink = &Apache::loncommon::escape_single($filelink);
               $r->print("<a href=\"javascript:select_data(\'",
                         $quotable_filelink,"')\">");
       $r->print("<img alt=\"\" src='",$iconpath,"select.gif' class='LC_icon' /></a>".
         "\n");
       $r->print('</td><td class="LC_middle"><span class="LC_nobreak">');
    } elsif ($env{'form.catalogmode'} eq 'import') {
       $r->print("<form name='form$fnum' action=''>\n");
     $r->print("<input type='checkbox' name='filelink"."' ".      $r->print("<input type='checkbox' name='filelink"."' ".
       "value='$filelink' onClick='".        "value='$filelink' onClick='".
       "javascript:queue(\"form$fnum\")' ");        "javascript:queue(\"form$fnum\")' ");
     if ($hash{'store_'.$filelink}) {      if ($hash{'store_'.$filelink}) {
  $r->print("checked");   $r->print("checked");
     }      }
     $r->print(">\n");      $r->print(" />\n");
     $r->print("<input type='hidden' name='title"."' ".      $r->print('</form></td><td class="LC_middle"><span class="LC_nobreak">');
       "value='$title'>\n");  
     $r->print("</form>\n");  
     $r->print("</td><td valign='bottom' nowrap bgcolor=$fileclr>");  
     $hash{"pre_${fnum}_link"}=$filelink;      $hash{"pre_${fnum}_link"}=$filelink;
     $hash{"pre_${fnum}_title"}=$title;      $hash{"pre_${fnum}_title"}=$title;
       if (!$hash{"pre_${fnum}_title"}) {
           $hash{"pre_${fnum}_title"} = 'Not_retrieved';
       }
      $fnum++;       $fnum++;
  }   }
   # Form to open or close sequences
  if ($indent > 0 and $indent < 11) {   if ($filelink=~/\.(page|sequence)$/) {
     $r->print("<img src=",$iconpath,"whitespace",$indent,".gif border=0>\n");      my $curdir = $startdir.$filecom[0].'/';
  } elsif ($indent >0) {      &begin_form($r,$curdir);
     my $ten = int($indent/10.);      $indent--;
     my $rem = $indent%10.0;   }
   # General indentation
     my $count = 0;      my $count = 0;
     while ($count < $ten) {      while ($count < $indent) {
  $r->print("<img src=",$iconpath,"whitespace10.gif border=0>\n");   $r->print("<img alt=\"\" src=".$iconpath.
     $count++;    "whitespace_21.gif class='LC_icon' />\n");
           $count++;
     }      }
     $r->print("<img src=",$iconpath,"whitespace",$rem,".gif border=0>\n") if $rem > 0;  # Sequence open/close icon
    if ($filelink=~/\.(page|sequence)$/) {
       my $curdir = $startdir.$filecom[0].'/';
       my $anchor = $curdir;
       $anchor =~ s/\W//g;
       $r->print ('<input type="hidden" name="acts" value="" />');
       $r->print ('<a name="'.$anchor.'"></a>');
               $r->print ('<a href="#" onClick="document.dirpath'.($dnum-1).'.submit()">');
               $r->print ('<img src="'.$iconpath.'arrow.'.($nowOpen ? "open" : "closed" ).
                          '.gif" class="LC_fileicon"');
       $r->print (' name="'.$msg.'" type="image" class="LC_fileicon" /></a>'.
          "\n");
    }
   # Filetype icons
    $r->print("<img alt=\"\" src='$iconname' class='LC_fileicon' />\n");
    my $quotable_filelink = &Apache::loncommon::escape_single($filelink);
   
    $r->print (" <a href=\"javascript:openWindow('".$quotable_filelink.
      "?inhibitmenu=yes','previewfile','450','500','no','yes','yes');\"".
      " target=\"_self\">$listname</a> ");
    $quotable_filelink = &Apache::loncommon::escape_single($filelink.'.meta');
    &Apache::loncommon::inhibit_menu_check(\$quotable_filelink);
    $r->print (" (<a href=\"javascript:openWindow('".$quotable_filelink.
      "?inhibitmenu=yes','metadatafile','500','550','no','yes','no');\" ".
      " target=\"_self\">".&mt('metadata')."</a>) ");
   # Close form to open/close sequence
    if ($filelink=~/\.(page|sequence)$/) {
       $r->print('</form>');
    }
    $r->print("</span></td>\n");
    if ($hash{'display_attrs_0'} == 1) {
       $r->print('<td> '.($title eq '' ? '&nbsp;' : $title).
         ' </td>'."\n");
  }   }
    $r->print('<td class="LC_right"> ',
  $r->print("<img src=$iconpath$curfext.gif border=0>\n");    $filecom[8]," </td>\n") 
  $r->print (" <a href=\"javascript:openWindow('".$filelink."', 'metadatafile', '450', '500', 'no', 'yes')\"; TARGET=_self>$listname</a> ");  
   
  $r->print (" (<a href=\"javascript:openWindow('".$filelink.".meta', 'metadatafile', '400', '450', 'no', 'yes')\"; TARGET=_self>metadata</a>) ") if ($metafile == 1);  
   
  $r->print("</td>\n");  
  $r->print("<td bgcolor=$fileclr align=right valign=bottom> ",$filecom[8]," </td>\n")   
     if $hash{'display_attrs_0'} == 1;  
  $r->print("<td bgcolor=$fileclr valign=bottom> ".(localtime($filecom[9]))." </td>\n")   
     if $hash{'display_attrs_1'} == 1;      if $hash{'display_attrs_1'} == 1;
  $r->print("<td bgcolor=$fileclr valign=bottom> ".(localtime($filecom[10]))." </td>\n")    $r->print('<td class="LC_nobreak"> '.
                     (&Apache::lonlocal::locallocaltime($filecom[9]))." </td>\n")
     if $hash{'display_attrs_2'} == 1;      if $hash{'display_attrs_2'} == 1;
    $r->print('<td class="LC_nobreak"> '.
                     (&Apache::lonlocal::locallocaltime($filecom[10]))." </td>\n")
       if $hash{'display_attrs_3'} == 1;
   
  if ($hash{'display_attrs_3'} == 1) {  
     my $author = &Apache::lonnet::metadata($filelink,'author') if ($metafile == 1);  
     $author = '&nbsp;' if (!$author);  
     $r->print("<td bgcolor=$fileclr valign=bottom> ".$author." </td>\n");  
  }  
  if ($hash{'display_attrs_4'} == 1) {   if ($hash{'display_attrs_4'} == 1) {
     my $keywords = &Apache::lonnet::metadata($filelink,'keywords') if ($metafile == 1);      my $author = &Apache::lonnet::metadata($filelink,'author');
     $keywords = '&nbsp;' if (!$keywords);      $r->print('<td class="LC_nobreak"> '.($author eq '' ? '&nbsp;' : $author).
     $r->print("<td bgcolor=$fileclr valign=bottom> ".$keywords." </td>\n");        " </td>\n");
  }   }
  if ($hash{'display_attrs_5'} == 1) {   if ($hash{'display_attrs_5'} == 1) {
     my $lang = &Apache::lonnet::metadata($filelink,'language') if ($metafile == 1);      my $keywords = &Apache::lonnet::metadata($filelink,'keywords');
     $lang = $language{$lang};      # $keywords = '&nbsp;' if (!$keywords);
     $lang = '&nbsp;' if (!$lang);      $r->print('<td> '.($keywords eq '' ? '&nbsp;' : $keywords).
     $r->print("<td bgcolor=$fileclr valign=bottom> ".$lang." </td>\n");        " </td>\n");
    }
   
    if ($hash{'display_attrs_6'} == 1) {
       my $lang = &Apache::lonnet::metadata($filelink,'language');
       $lang = &Apache::loncommon::languagedescription($lang);
       $r->print('<td> '.($lang eq '' ? '&nbsp;' : $lang).
         " </td>\n");
    }
    if ($hash{'display_attrs_8'} == 1) {
   # statistics
       &dynmetaread($filelink);
       $r->print("<td>");
       &dynmetaprint($r,$filelink,'count');
       &dynmetaprint($r,$filelink,'course');
       &dynmetaprint($r,$filelink,'stdno');
       &dynmetaprint($r,$filelink,'avetries');
       &dynmetaprint($r,$filelink,'difficulty');
       &dynmetaprint($r,$filelink,'disc');
       &dynmetaprint($r,$filelink,'clear');
       &dynmetaprint($r,$filelink,'technical');
       &dynmetaprint($r,$filelink,'correct');
       &dynmetaprint($r,$filelink,'helpful');
       &dynmetaprint($r,$filelink,'depth');
       $r->print("&nbsp;</td>\n");
   
    }
    if ($hash{'display_attrs_10'} == 1) {
       my $source = &Apache::lonnet::metadata($filelink,'sourceavail');
       if($source eq 'open') {
    my $sourcelink = &Apache::lonsource::make_link($filelink,$listname);
    my $quotable_sourcelink = &Apache::loncommon::escape_single($sourcelink);
    &Apache::loncommon::inhibit_menu_check(\$quotable_sourcelink);
    $r->print('<td>'."<a href=\"javascript:openWindow('"
     .$quotable_sourcelink.
     "', 'previewsource', '700', '700', 'no', 'yes','yes');\"".
     " target=\"_self\">".&mt('Source Code')."</a> "."</td>\n");
       } else { #A cuddled else. :P
    $r->print("<td>&nbsp;</td>\n");
       }
  }   }
  $r->print("</tr>\n");   if ($hash{'display_attrs_11'} == 1) {
     }  # links
      &dynmetaread($filelink);
      $r->print('<td>');
      &coursecontext($r,$filelink);
      &dynmetaprint($r,$filelink,'goto_list');
      &dynmetaprint($r,$filelink,'comefrom_list');
      &dynmetaprint($r,$filelink,'sequsage_list');
      &dynmetaprint($r,$filelink,'dependencies');
              &dynmetaprint($r,$filelink,'course_list');
      $r->print('</td>');
           }
           
      
   
    if ($hash{'display_attrs_7'} == 1) {
   # Show resource
      my $output=&showpreview($filelink);
              $r->print('<td> '.($output eq '' ? '&nbsp;':$output).
         " </td>\n");
       }
       
       if ($hash{'display_attrs_12'} == 1) {
       my $subject = &Apache::lonnet::metadata($filelink,'subject');
       $r->print('<td> '.($subject eq '' ? '&nbsp;' : $subject).
         " </td>\n");
    }
   
    if ($hash{'display_attrs_13'} == 1) {
       my $notes = &Apache::lonnet::metadata($filelink,'notes');
       $r->print('<td> '.($notes eq '' ? '&nbsp;' : $notes).
         " </td>\n");
    }
   
    if ($hash{'display_attrs_14'} == 1) {
       my $abstract = &Apache::lonnet::metadata($filelink,'abstract');
       $r->print('<td> '.($abstract eq '' ? '&nbsp;' : $abstract).
         " </td>\n");
    }
   
    $r->print(&Apache::loncommon::end_data_table_row());
   }
       
       
   
 # -- display directory  # -- display directory
     if ($fnptr == $dirptr) {      if ($fnptr == $dirptr) {
  my @file_ext = split (/\./,$listname);  
  my $curfext = $file_ext[scalar(@file_ext)-1];  
  my $curdir = $startdir.$filecom[0].'/';   my $curdir = $startdir.$filecom[0].'/';
  my $anchor = $curdir;   my $anchor = $curdir;
  $anchor =~ s/\///g;   $anchor =~ s/\W//g;
  $r->print("<tr>$extrafield<td bgcolor=$fileclr valign=bottom>");  #SB $r->print("<tr bgcolor=\"$fileclr\">$extrafield<td valign=$valign>");
           $r->print(&Apache::loncommon::start_data_table_row()); # SB: bgcolor suggestion: darkgrey ("LC_info_row"?!?)
   # $r->print('<tr class="LC_info_row">');
           $r->print($extrafield.'<td class="LC_middle LC_nobreak">');
  &begin_form ($r,$curdir);   &begin_form ($r,$curdir);
  my $indentm1 = $indent-1;   my $indentm1 = $indent-1;
  if ($indentm1 < 11 and $indentm1 > 0) {   my $count = 0;
     $r->print("<img src=",$iconpath,"whitespace",$indentm1,".gif border=0>\n");   while ($count < $indentm1) {
  } else {      $r->print ("<img alt=\"\" src=",$iconpath
     my $ten = int($indentm1/10.);                 ,"whitespace_21.gif class='LC_icon' />\n");
     my $rem = $indentm1%10.0;              $count++;
     my $count = 0;   }
     while ($count < $ten) {   $r->print ('<input type="hidden" name="acts" value="" />');
  $r->print ("<img src=",$iconpath,"whitespace10.gif border=0>\n");   $r->print ('<a name="'.$anchor.'"></a>');
  $count++;          $r->print ('<a href="#" onClick="document.dirpath'.($dnum-1).'.submit()"><img src="'.$iconpath.
     }     'arrow.'.($nowOpen ? "open" : "closed" ).'.gif"');
     $r->print ("<img src=",$iconpath,"whitespace",$rem,".gif border=0>\n") if $rem > 0;   $r->print (' name="'.$msg.'" class="LC_fileicon" /></a>'.
  }     "\n");
  $r->print ('<input type="hidden" name="acts" value="">');   my $quotable_curdir = &Apache::loncommon::escape_single($curdir);
  $r->print ('<a name="'.$anchor.'"><input src="'.$iconpath.'folder_pointer_'.$diropen.'.gif"');          
  $r->print (' name="'.$msg.'" height="22" type="image" border="0">'."\n");          my $location = &Apache::loncommon::lonhttpdurl("/adm/lonIcons");
  $r->print ('<a href="javascript:gothere(\''.$curdir.'\')"><img src="'.$iconpath.'folder_'.$diropen.'.gif" border=0></a>'."\n");   my $icon = "navmap.folder.".($nowOpen ? "open":"closed").'.gif';
  $r->print ("$listname$tabtag</tr></form>\n");          $r->print ('<a href="javascript:gothere(\''
      .$quotable_curdir.'\')"">'
      .'<img class="LC_fileicon" alt="'.&mt('Open Folder').'" src="'.
                      $location."/".$icon.'" />'.
                      "\n");
    $r->print ("$listname</a></form></td>\n");
   # Attributes
    my $filelink = $startdir.$filecom[0].'/default';
   
    if ($hash{'display_attrs_0'} == 1) {
       my $title = &Apache::lonnet::gettitle($filelink);
       $r->print('<td> '.($title eq '' ? '&nbsp;' : $title).
         ' </td>'."\n");
    }
    $r->print('<td class="LC_right"> ',
     $filecom[8]," </td>\n") 
       if $hash{'display_attrs_1'} == 1;
    $r->print('<td class="LC_break"> '.
                     (&Apache::lonlocal::locallocaltime($filecom[9]))." </td>\n")
       if $hash{'display_attrs_2'} == 1;
    $r->print('<td class="LC_break"> '.
                     (&Apache::lonlocal::locallocaltime($filecom[10]))." </td>\n")
       if $hash{'display_attrs_3'} == 1;
   
    if ($hash{'display_attrs_4'} == 1) {
       my $author = &Apache::lonnet::metadata($filelink,'author');
       $r->print('<td> '.($author eq '' ? '&nbsp;' : $author).
         " </td>\n");
    }
    if ($hash{'display_attrs_5'} == 1) {
       my $keywords = &Apache::lonnet::metadata($filelink,'keywords');
       # $keywords = '&nbsp;' if (!$keywords);
       $r->print('<td> '.($keywords eq '' ? '&nbsp;' : $keywords).
         " </td>\n");
    }
    if ($hash{'display_attrs_6'} == 1) {
       my $lang = &Apache::lonnet::metadata($filelink,'language');
       $lang = &Apache::loncommon::languagedescription($lang);
       $r->print('<td> '.($lang eq '' ? '&nbsp;' : $lang).
         " </td>\n");
    }
   
    if ($hash{'display_attrs_8'} == 1) {
      $r->print('<td>&nbsp;</td>');
    }
     if ($hash{'display_attrs_10'} == 1) {
      $r->print('<td>&nbsp;</td>');
    }
    if ($hash{'display_attrs_7'} == 1) {
      $r->print('<td>&nbsp;</td>');
       }     
       if ($hash{'display_attrs_11'} == 1) {
      $r->print('<td>&nbsp;</td>');
    }
    if ($hash{'display_attrs_12'} == 1) {
       my $subject = &Apache::lonnet::metadata($filelink,'subject');
       $r->print('<td> '.($subject eq '' ? '&nbsp;' : $subject).
         " </td>\n");
    }
    if ($hash{'display_attrs_13'} == 1) {
       my $notes = &Apache::lonnet::metadata($filelink,'notes');
       $r->print('<td> '.($notes eq '' ? '&nbsp;' : $notes).
         " </td>\n");
    }
   
    if ($hash{'display_attrs_14'} == 1) {
       my $abstract = &Apache::lonnet::metadata($filelink,'abstract');
       $r->print('<td> '.($abstract eq '' ? '&nbsp;' : $abstract).
         " </td>\n");
    }
   
    $r->print(&Apache::loncommon::end_data_table_row());
       }
   
   }
   
   sub coursecontext {
       my ($r,$filelink)=@_;
       my $filesymb=&Apache::lonnet::symbread($filelink);
       if ($filesymb) {
    my ($map,$index,$resource)=&Apache::lonnet::decode_symb($filesymb);
    $r->print(&mt('Already in this course:<br />[_1] in folder/map [_2].<br />',
         &Apache::lonnet::gettitle($resource),
         &Apache::lonnet::gettitle($map)));
       }
   }
   
   sub showpreview {
       my ($filelink)=@_;
       if ($filelink=~m-^(/ext/|http://)-) {
    return &mt('External Resource, preview not enabled');
       }
       my ($curfext)=($filelink=~/\.(\w+)$/);
       my $output='';
       my $embstyle=&Apache::loncommon::fileembstyle($curfext);
       if ($embstyle eq 'ssi') {
          my $cache=$Apache::lonnet::perlvar{'lonDocRoot'}.$filelink.
                       '.tmp';
          if ((!$env{'form.updatedisplay'}) &&
                       (-e $cache)) {
             open(FH,$cache);
             $output=join("\n",<FH>);
             close(FH);
          } else {
   # In update display mode, remove old cache. This is done to retroactively
   # clean up course context renderings.
     if (-e $cache) {
          unlink($cache);
     }
             $output=&Apache::lonnet::ssi_body($filelink);
   # Is access denied? Don't render, don't store
             if ($output=~/LONCAPAACCESSCONTROLERRORSCREEN/s) {
                $output='';
   # Was this rendered in course content? Don't store
             } elsif (!&Apache::lonnet::symbread($filelink)) {
                open(FH,">$cache");
                print FH $output;
                close(FH);
             }
          }
          $output='<span class="LC_fontsize_medium">'.$output.'</span>';
       } elsif ($embstyle eq 'img') {
          $output='<img alt="'.&mt('Preview').'" src="'.$filelink.'" />';
       } elsif ($filelink=~m{^/res/($match_domain)/($match_username)/}) {
          $output='<img  alt="'.&mt('Preview').'" src="http://'.
                    &Apache::lonnet::hostname(&Apache::lonnet::homeserver($2,$1)).
                    '/cgi-bin/thumbnail.gif?url='.$filelink.'" />';
     }      }
       return $output;
   }
   
   sub dynmetaprint {
       my ($r,$filelink,$item)=@_;
       if ($dynhash{$filelink}->{$item}) {
    $r->print("\n<br />".$fieldnames{$item}.': '.
     &Apache::lonmeta::prettyprint($item,
    $dynhash{$filelink}->{$item},
     (($env{'form.catalogmode'} ne 'import')?'preview':''),
     '',
     (($env{'form.catalogmode'} eq 'import')?'document.forms.fileattr':''),1));
       }
 }  }
   
 # ------------------- prints the beginning of a form for directory or file link  # ------------------- prints the beginning of a form for directory or file link
 sub begin_form {  sub begin_form {
     my ($r,$uri) = @_;      my ($r,$uri) = @_;
     my $anchor = $uri;      my $anchor = $uri;
     $anchor =~ s/\///g;      $anchor =~ s/\W//g;
     $r->print ('<form method="post" name="dirpath'.$dnum.'" action="'.$uri.'#'.$anchor.      $uri=&Apache::loncommon::escape_single($uri);
        '" onSubmit="return rep_dirpath(\''.$dnum.'\',document.forms.fileattr.acts.value)" '.      $r->print ('<form method="post" name="dirpath'.$dnum.'" action="'.$uri.
          '#'.$anchor.
          '" onSubmit="return rep_dirpath(\''.$dnum.'\''.
          ',document.forms.fileattr.acts.value)" '.
        'enctype="application/x-www-form-urlencoded">'."\n");         'enctype="application/x-www-form-urlencoded">'."\n");
     $r->print ($hidden.'<input type=hidden name=openuri value="'.$uri.'">'."\n");      $r->print ('<input type="hidden" name="openuri" value="'.$uri.'" />'.
     $r->print ('<input type=hidden name=dirPointer value="on">'."\n");         "\n");
       $r->print ('<input type="hidden" name="dirPointer" value="on" />'."\n");
       $r->print(&Apache::loncommon::inhibit_menu_check('input'));
     $dnum++;      $dnum++;
 }  }
   
   # --------- settings whenever the user causes the indexer window to be launched
   sub start_fresh_session {
       my ($hash) = @_;
       delete $hash->{'form.catalogmode'};
       delete $hash->{'form.mode'};
       delete $hash->{'form.form'};
       delete $hash->{'form.element'};
       delete $hash->{'form.omit'};
       delete $hash->{'form.only'};
       foreach (keys %{$hash}) {
           delete $hash->{$_} if (/^(pre_|store)/);
       }
   }
   
   # ------------------------------------------------------------------- setvalues
   sub setvalues {
       # setvalues is used in registerurl to synchronize the database
       # hash and environment hashes
       my ($H1,$h1key,$H2,$h2key) =@_;
       #
       if (exists $H2->{$h2key}) {
    $H1->{$h1key} = $H2->{$h2key};
       } elsif (exists $H1->{$h1key}) {
    $H2->{$h2key} = $H1->{$h1key};
       } 
   }
   
 1;  1;
 __END__  
   sub cleanup {
       if (tied(%hash)){
    &Apache::lonnet::logthis('Cleanup indexer: hash');
       }
       return OK;
   }
   
   
   
   
   
   =head1 NAME
   
   Apache::lonindexer - mod_perl module for cross server filesystem browsing
   
   =head1 SYNOPSIS
   
   Invoked by /etc/httpd/conf/srm.conf:
   
    <LocationMatch "^/res.*/$">
    SetHandler perl-script
    PerlHandler Apache::lonindexer
    </LocationMatch>
   
   =head1 INTRODUCTION
   
   This module enables a scheme of browsing across a cross server.
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   =head1 BEGIN SUBROUTINE
   
   This routine is only run once after compilation.
   
   =over 4
   
   =item *
   
   Initializes %language hash table.
   
   =back
   
   =head1 HANDLER SUBROUTINE
   
   This routine is called by Apache and mod_perl.
   
   =over 4
   
   =item *
   
   read in machine configuration variables
   
   =item *
   
   see if called from an interactive mode
   
   =item *
   
   refresh environment with user database values (in %hash)
   
   =item *
   
   define extra fields and buttons in case of special mode
   
   =item *
   
   set catalogmodefunctions to have extra needed javascript functionality
   
   =item *
   
   print header
   
   =item *
   
   evaluate actions from previous page (both cumulatively and chronologically)
   
   =item *
   
   output title
   
   =item *
   
   get state of file attributes to be showing
   
   =item *
   
   output state of file attributes to be showing
   
   =item *
   
   output starting row to the indexed file/directory hierarchy
   
   =item *
   
   read in what directories have previously been set to "open"
   
   =item *
   
   if not at top level, provide an uplink arrow
   
   =item *
   
   recursively go through all the directories and output as appropriate
   
   =item *
   
   information useful for group import
   
   =item *
   
   end the tables
   
   =item *
   
   end the output and return
   
   =back
   
   =head1 OTHER SUBROUTINES
   
   =over 4
   
   =item *
   
   scanDir - recursive scan of a directory
   
   =item *
   
   get_list - get complete matched list based on the uri (returns an array)
   
   =item *
   
   match_ext - filters out files based on extensions (returns an array)
   
   =item *
   
   display_line - displays one line in appropriate table format
   
   =item *
   
   begin_form - prints the beginning of a form for directory or file link
   
   =item *
   
   start_fresh_session - settings whenever the user causes the indexer window
   to be launched
   
   =back
   
   =cut

Removed from v.1.16  
changed lines
  Added in v.1.192


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.