Diff for /loncom/interface/lonindexer.pm between versions 1.66 and 1.144

version 1.66, 2003/06/14 00:15:01 version 1.144, 2006/06/08 07:20:41
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # YEAR=1999  
 # 5/21/99, 5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14 Gerd Kortemeyer)  
 # 11/23 Gerd Kortemeyer  
 # YEAR=2000  
 # 07/20-08/04 H.K. Ng  
 # YEAR=2001  
 # 05/9-05/19/2001 H. K. Ng  
 # 05/21/2001 H. K. Ng  
 # 05/23/2001 H. K. Ng  
 # 6/26,7/8 H. K. Ng  
 # 8/14 H. K. Ng  
 # 11/30 Matthew Hall  
 # YEAR=2002  
 # 6/29/2002 H. K. Ng  
 #  
 ###  ###
   
 ###############################################################################  ###############################################################################
Line 59  package Apache::lonindexer; Line 44  package Apache::lonindexer;
   
 # ------------------------------------------------- modules used by this module  # ------------------------------------------------- modules used by this module
 use strict;  use strict;
 use Apache::lonnet();  use Apache::lonnet;
 use Apache::loncommon();  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 GDBM_File;  use GDBM_File;
   
 # ---------------------------------------- variables used throughout the module  # ---------------------------------------- variables used throughout the module
 my %hash; # tied to a user-specific gdbm file  my %hash; # global user-specific gdbm file
 my %dirs; # keys are directories, values are the open/close status  my %dirs; # keys are directories, values are the open/close status
 my %language; # has the reference information present in language.tab  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  # ----- Values which are set by the handler subroutine and are accessible to
 # -----     other methods.  # -----     other methods.
 my $extrafield; # default extra table cell  my $extrafield; # default extra table cell
Line 81  my @Only = (); Line 73  my @Only = ();
 my @Omit = ();  my @Omit = ();
   
   
   
   
 # ----------------------------- Handling routine called via Apache and mod_perl  # ----------------------------- 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);      &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;
     untie %hash;  
   
     # Deal with stupid global variables (is there a way around making      # Deal with stupid global variables (is there a way around making
     # these global to this package?  It is just so wrong....)      # these global to this package?  It is just so wrong....)
     undef (@Only);      undef (@Only);
     undef (@Omit);      undef (@Omit);
       %fieldnames=&Apache::lonmeta::fieldnames();
   
 # ------------------------------------- read in machine configuration variables  # ------------------------------------- read in machine configuration variables
     my $iconpath= $r->dir_config('lonIconsURL') . "/";      my $iconpath= $r->dir_config('lonIconsURL') . "/";
Line 116  sub handler { Line 111  sub handler {
     # Get the parameters from the query string      # Get the parameters from the query string
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
      ['catalogmode','launch','acts','mode','form','element',       ['catalogmode','launch','acts','mode','form','element',
               'only','omit']);                'only','omit','titleelement']);
     #-------------------------------------------------------------------      #-------------------------------------------------------------------
     my $closebutton='';      my $closebutton='';
     my $groupimportbutton='';      my $groupimportbutton='';
     my $colspan='';       my $colspan=''; 
       
     $extrafield='';      $extrafield='';
     my $diropendb =       my $diropendb = 
  "/home/httpd/perl/tmp/$ENV{'user.domain'}_$ENV{'user.name'}_indexer.db";   "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_sel_res.db";
       %hash = ();
     if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) {      {
  if ($ENV{'form.launch'} eq '1') {   my %dbfile;
    if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_READER(),0640)) {
       while(my($key,$value)=each(%dbfile)) {
    $hash{$key}=$value;
       }
       untie(%dbfile);
    }
       }
       {
    if ($env{'form.launch'} eq '1') {
     &start_fresh_session();      &start_fresh_session();
         }   }
     #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)  # -------------------- refresh environment with user database values (in %hash)
  &setvalues(\%hash,'form.catalogmode',\%ENV,'form.catalogmode'   );   &setvalues(\%hash,'form.catalogmode',\%env,'form.catalogmode'   );
   
 # --------------------- define extra fields and buttons in case of special mode  # --------------------- define extra fields and buttons in case of special mode
  if ($ENV{'form.catalogmode'} eq 'interactive') {   if ($env{'form.catalogmode'} eq 'interactive') {
     $extrafield='<td bgcolor="'.$fileclr.'" valign="bottom">'.      $extrafield='<td bgcolor="'.$fileclr.'" valign="bottom">'.
  '<a name="$anchor"><img src="'.$iconpath.'whitespace1.gif"'.   '<a name="$anchor"><img src="'.$iconpath.'whitespace1.gif"'.
  ' border="0" /></td>';   ' border="0" /></td>';
     $colspan=" colspan='2' ";      $colspan=" colspan='2' ";
               my $cl=&mt('Close');
             $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 'groupimport') {
     $extrafield='<td bgcolor="'.$fileclr.'" valign="bottom">'.      $extrafield='<td bgcolor="'.$fileclr.'" valign="bottom">'.
  '<a name="$anchor"><img src="'.$iconpath.'whitespace1.gif"'.   '<a name="$anchor"><img src="'.$iconpath.'whitespace1.gif"'.
  ' border="0" /></td>';   ' border="0" /></td>';
     $colspan=" colspan='2' ";      $colspan=" colspan='2' ";
       my $cl=&mt('Close');
               my $gi=&mt('Import');
             $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'  <input type="button" name="groupimport" value='$gi'
 onClick="javascript:select_group()">  onClick="javascript:select_group()" />
 END  END
         }          }
  # Additions made by Matthew to make the browser a little easier to deal   # Additions made by Matthew to make the browser a little easier to deal
Line 164  END Line 202  END
  #       selection is made.   #       selection is made.
  # $element is the name of the element in $formname which receives   # $element is the name of the element in $formname which receives
  #       the URL.   #       the URL.
  # &Apache::lonxml::debug('Checking mode, form, element');   #&Apache::lonxml::debug('Checking mode, form, element');
  &setvalues(\%hash,'form.mode'   ,\%ENV,'form.mode'   );   &setvalues(\%hash,'form.mode'        ,\%env,'form.mode'   );
  &setvalues(\%hash,'form.form'   ,\%ENV,'form.form'   );   &setvalues(\%hash,'form.form'        ,\%env,'form.form'   );
  &setvalues(\%hash,'form.element',\%ENV,'form.element');   &setvalues(\%hash,'form.element'     ,\%env,'form.element');
  &setvalues(\%hash,'form.only'   ,\%ENV,'form.only'   );   &setvalues(\%hash,'form.titleelement',\%env,'form.titleelement');
  &setvalues(\%hash,'form.omit'   ,\%ENV,'form.omit'   );   &setvalues(\%hash,'form.only'        ,\%env,'form.only'   );
    &setvalues(\%hash,'form.omit'        ,\%env,'form.omit'   );
   
         # Deal with 'omit' and 'only'           # Deal with 'omit' and 'only' 
         if (exists $ENV{'form.omit'}) {          if (exists $env{'form.omit'}) {
             @Omit = split(',',$ENV{'form.omit'});              @Omit = split(',',$env{'form.omit'});
         }          }
         if (exists $ENV{'form.only'}) {          if (exists $env{'form.only'}) {
             @Only = split(',',$ENV{'form.only'});              @Only = split(',',$env{'form.only'});
         }          }
                   
  my $mode = $ENV{'form.mode'};   my $mode = $env{'form.mode'};
  my ($form,$element);   my ($form,$element,$titleelement);
  if ($mode eq 'edit' || $mode eq 'parmset') {   if ($mode eq 'edit' || $mode eq 'parmset') {
     $form    = $ENV{'form.form'};      $form         = $env{'form.form'};
     $element = $ENV{'form.element'};      $element      = $env{'form.element'};
       $titleelement = $env{'form.titleelement'};
  }   }
  &Apache::lonxml::debug("mode=$mode form=$form element=$element");   #&Apache::lonxml::debug("mode=$mode form=$form element=$element titleelement=$titleelement");
 # ------ set catalogmodefunctions to have extra needed javascript functionality  # ------ 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 'groupimport') {
     # The if statement below sets us up to use the old version      # The if statement below sets us up to use the old version
     # by default (ie. if $mode is undefined).  This is the easy      # by default (ie. if $mode is undefined).  This is the easy
     # way out.  Hopefully in the future I'll find a way to get       # way out.  Hopefully in the future I'll find a way to get 
Line 204  END Line 244  END
                 $location .= "mode=".$mode."&";                  $location .= "mode=".$mode."&";
                 $location .= "acts=";                  $location .= "acts=";
  $catalogmodefunctions=<<"END";   $catalogmodefunctions=<<"END";
 function select_data(title,url) {  function select_data(url) {
     changeTitle(title);  
     changeURL(url);      changeURL(url);
     self.close();      self.close();
 }  }
 function select_group() {  function select_group() {
     window.location="$location"+document.forms.fileattr.acts.value;      window.location="$location"+document.forms.fileattr.acts.value;
 }  }
 function changeTitle(val) {  
     if (opener.inf) {  
         if (opener.inf.document.forms.resinfo.elements.t) {  
             opener.inf.document.forms.resinfo.elements.t.value=val;  
         }  
     }  
 }  
 function changeURL(val) {  function changeURL(val) {
     if (opener.inf) {      if (opener.inf) {
         if (opener.inf.document.forms.resinfo.elements.u) {          if (opener.inf.document.forms.resinfo.elements.u) {
Line 232  END Line 264  END
                 $location .= "form=$form&element=$element&mode=edit&acts=";                  $location .= "form=$form&element=$element&mode=edit&acts=";
  $catalogmodefunctions=<<END;   $catalogmodefunctions=<<END;
 // mode = $mode  // mode = $mode
 function select_data(title,url) {  function select_data(url) {
     changeURL(url);     var location = "/res/?launch=2&form=$form&element=$element&titleelement=$titleelement&acts=" + url;
     self.close();     window.location=location;
 }  }
   
 function select_group() {  function select_group() {
     window.location="$location"+document.forms.fileattr.acts.value;      window.location="$location"+document.forms.fileattr.acts.value;
 }  }
Line 248  function changeURL(val) { Line 279  function changeURL(val) {
     alert("The file you selected is: "+val);      alert("The file you selected is: "+val);
     }      }
 }  }
   
 END  END
                   if (!$titleelement) {
       $catalogmodefunctions.='function changeTitle(val) {}';
    } else {
       $catalogmodefunctions.=<<END;
   function changeTitle(val) {
       if (window.opener.document) {
       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') {              } elsif ($mode eq 'parmset') {
                 my $location = "/adm/groupsort?catalogmode=interactive&";                  my $location = "/adm/groupsort?catalogmode=interactive&";
                 $location .= "form=$form&element=$element&mode=parmset&acts=";                  $location .= "form=$form&element=$element&mode=parmset&acts=";
  $catalogmodefunctions=<<END;   $catalogmodefunctions=<<END;
 // mode = $mode  // mode = $mode
 function select_data(title,url) {  function select_data(url) {
     changeURL(url);      changeURL(url);
     self.close();      self.close();
 }  }
Line 284  function rep_dirpath(suffix,val) { Line 327  function rep_dirpath(suffix,val) {
     eval("document.forms.dirpath"+suffix+".acts.value=val");      eval("document.forms.dirpath"+suffix+".acts.value=val");
 }  }
 END  END
  if ($ENV{'form.catalogmode'} eq 'groupimport') {   if ($env{'form.catalogmode'} eq 'groupimport') {
             $catalogmodefunctions.=<<END;              $catalogmodefunctions.=<<END;
 function queue(val) {  function queue(val) {
     if (eval("document.forms."+val+".filelink.checked")) {      if (eval("document.forms."+val+".filelink.checked")) {
Line 302  END Line 345  END
  }   }
   
 # ---------------------------------------------------------------- Print Header  # ---------------------------------------------------------------- Print Header
  $r->print(<<ENDHEADER);   my $js = <<"ENDHEADER";
 <html>  
 <head>  
 <title>The LearningOnline Network With CAPA Directory Browser</title>  
   
 <script type="text/javascript">  <script type="text/javascript">
 $catalogmodefunctions  $catalogmodefunctions
 function openWindow(url, wdwName, w, h, toolbar,scrollbar) {  function openWindow(url, wdwName, w, h, toolbar,scrollbar,locationbar) {
     var options = "width=" + w + ",height=" + h + ",";      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();
 }  }
Line 320  function gothere(val) { Line 363  function gothere(val) {
     window.location=val+'?acts='+document.forms.fileattr.acts.value;      window.location=val+'?acts='+document.forms.fileattr.acts.value;
 }  }
 </script>  </script>
   
 </head>  
 ENDHEADER  ENDHEADER
 $r->print(&Apache::loncommon::bodytag('Browse Resources'));  
           my ($headerdom)=($uri=~/^\/res\/(\w+)\//);
    $r->print(&Apache::loncommon::start_page('Browse Resources',$js,
    {'domain' => $headerdom,}));
 # - Evaluate actions from previous page (both cumulatively and chronologically)  # - Evaluate actions from previous page (both cumulatively and chronologically)
         if ($ENV{'form.catalogmode'} eq 'groupimport') {          if ($env{'form.catalogmode'} eq 'groupimport') {
     my $acts=$ENV{'form.acts'};      my $acts=$env{'form.acts'};
     my @Acts=split(/b/,$acts);      my @Acts=split(/b/,$acts);
     my %ahash;      my %ahash;
     my %achash;      my %achash;
Line 338  $r->print(&Apache::loncommon::bodytag('B Line 382  $r->print(&Apache::loncommon::bodytag('B
  $achash{$ref}=$ac;   $achash{$ref}=$ac;
  $ac++;   $ac++;
     }      }
     # sorting through the actions and changing the tied database hash      # sorting through the actions and changing the global database hash
     foreach (sort {$achash{$a}<=>$achash{$b}} (keys %ahash)) {      foreach (sort {$achash{$a}<=>$achash{$b}} (keys %ahash)) {
  my $key=$_;   my $key=$_;
  if ($ahash{$key} eq '1') {   if ($ahash{$key} eq '1') {
Line 367  $r->print(&Apache::loncommon::bodytag('B Line 411  $r->print(&Apache::loncommon::bodytag('B
  }   }
   
 # ---------------------------------- get state of file attributes to be showing  # ---------------------------------- get state of file attributes to be showing
  if ($ENV{'form.attrs'} ne '') {   if ($env{'form.attrs'}) {
     for (my $i=0; $i<=8; $i++) {      for (my $i=0; $i<=11; $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<=8; $i++) {      for (my $i=0; $i<=11; $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  # ------------------------------- 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',
      'ln' => 'Language',
      'sa' => 'Source Available',
      'sr' => 'Show resource',
      'li' => 'Linked/Related Resources',
      'av' => 'All versions',
      'ud' => 'Update Display'
      );
  $r->print(<<END);   $r->print(<<END);
 <form method="post" name="fileattr" action="$uri"  <form method="post" name="fileattr" action="$uri"
  enctype="application/x-www-form-urlencoded">   enctype="application/x-www-form-urlencoded">
 <b><font color="#666666">Display file attributes</font></b><br />  <label><input type="checkbox" name="attr9" value="1" $attrchk[9] onClick="this.form.submit();" /> $lt{'av'}</label>
 <table border=0><tr>  <table border="0">
 <td><input type="checkbox" name="attr0" value="1" $attrchk[0] /> Title</td>  <tr>
 <td><input type="checkbox" name="attr1" value="1" $attrchk[1] /> Size</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="attr2" value="1" $attrchk[2] /> Last access</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="attr3" value="1" $attrchk[3] /> Last modified</td>  <td><label><input type="checkbox" name="attr5" value="1" $attrchk[5] onClick="this.form.submit();" /> $lt{'kw'}</label></td>
 <td><input type="checkbox" name="attr8" value="1" $attrchk[8] /> All versions</td></tr><tr>  <td><label><input type="checkbox" name="attr6" value="1" $attrchk[6] onClick="this.form.submit();" /> $lt{'ln'}</label></td>
 <td><input type="checkbox" name="attr4" value="1" $attrchk[4] /> Author</td>  </tr>
 <td><input type="checkbox" name="attr5" value="1" $attrchk[5] /> Keywords</td>  <tr>
 <td><input type="checkbox" name="attr6" value="1" $attrchk[6] /> Language</td>  <td><label><input type="checkbox" name="attr1" value="1" $attrchk[1] onClick="this.form.submit();" /> $lt{'si'}</label></td>
 <td><input type="checkbox" name="attr7" value="1" $attrchk[7] /> Show Resource</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>
   </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>&nbsp;</td>  <td>&nbsp;</td>
 </tr></table>  </tr>
 <input type="hidden" name="dirPointer" value="on" />  </table>
   <input type="hidden" name="attrs" value="1" />
   <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" />  
 $closebutton  
 $groupimportbutton  
 </form>  
 END  END
   # -------------- Filter out sequence containment in crumbs and "recent folders"
    my $storeuri=$uri;
    $storeuri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1];
    $storeuri=~s/\/+/\//g;
   # ---------------------------------------------------------------- Bread crumbs
           $r->print(&Apache::lonhtmlcommon::crumbs($storeuri,'','',
    (($env{'form.catalogmode'} eq 'groupimport')?
    'document.forms.fileattr':'')).
     &Apache::lonhtmlcommon::select_recent('residx','resrecent',
   '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();'));
   # -------------------------------------------------------- Resource Home Button
    my $reshome=$env{'course.'.$env{'request.course.id'}.'.reshome'};
    if ($reshome) {
       $r->print("<font size='+2'><a href='");
       if ($env{'form.catalogmode'} eq 'groupimport') {
    $r->print('javascript:document.forms.fileattr.action="'.$reshome.'";document.forms.fileattr.submit();');
       } else {
    $r->print($reshome);
       }
       $r->print("'>".&mt('Home').'</a></font>');
    }
    $r->print('</form>');
   # ------------------------------------------------------ Remember where we were
    &Apache::loncommon::storeresurl($storeuri);
    &Apache::lonhtmlcommon::store_recent('residx',$storeuri,$storeuri);
 # ----------------- output starting row to the indexed file/directory hierarchy  # ----------------- output starting row to the indexed file/directory hierarchy
         my $titleclr="#ddffff";          my $titleclr="#ddffff";
 #        $r->print(&initdebug());          #$r->print(&initdebug());
 #        $r->print(&writedebug("Omit:@Omit")) if (@Omit);          #$r->print(&writedebug("Omit:@Omit")) if (@Omit);
 #        $r->print(&writedebug("Only:@Only")) if (@Only);          #$r->print(&writedebug("Only:@Only")) if (@Only);
         $r->print("<table width='100\%' border=0><tr><td bgcolor=#777777>\n");          $r->print('<table width="100%" border="0"><tr><td bgcolor="#777777">'."\n");
  $r->print("<table width='100\%' border=0><tr bgcolor=$titleclr>\n");   $r->print('<table width="100%" border="0"><tr bgcolor="'.$titleclr.'">'."\n");
  $r->print("<td $colspan><b>Name</b></td>\n");   $r->print("<td $colspan><b>".&mt('Name')."</b></td>\n");
  $r->print("<td><b>Title</b></td>\n")    $r->print("<td><b>".&mt('Title')."</b></td>\n") 
     if ($hash{'display_attrs_0'} == 1);      if ($hash{'display_attrs_0'} == 1);
  $r->print("<td align=right><b>Size (bytes) ".   $r->print("<td align=right><b>".&mt("Size")." (".&mt("bytes").") ".
   "</b></td>\n") if ($hash{'display_attrs_1'} == 1);    "</b></td>\n") if ($hash{'display_attrs_1'} == 1);
  $r->print("<td><b>Last accessed</b></td>\n")    $r->print("<td><b>".&mt("Last accessed")."</b></td>\n") 
     if ($hash{'display_attrs_2'} == 1);      if ($hash{'display_attrs_2'} == 1);
  $r->print("<td><b>Last modified</b></td>\n")   $r->print("<td><b>".&mt("Last modified")."</b></td>\n")
     if ($hash{'display_attrs_3'} == 1);      if ($hash{'display_attrs_3'} == 1);
  $r->print("<td><b>Author(s)</b></td>\n")   $r->print("<td><b>".&mt("Author(s)")."</b></td>\n")
     if ($hash{'display_attrs_4'} == 1);      if ($hash{'display_attrs_4'} == 1);
  $r->print("<td><b>Keywords</b></td>\n")   $r->print("<td><b>".&mt("Keywords")."</b></td>\n")
     if ($hash{'display_attrs_5'} == 1);      if ($hash{'display_attrs_5'} == 1);
  $r->print("<td><b>Language</b></td>\n")   $r->print("<td><b>".&mt("Language")."</b></td>\n")
     if ($hash{'display_attrs_6'} == 1);      if ($hash{'display_attrs_6'} == 1);
  $r->print("<td><b>Resource</b></td>\n")   $r->print("<td><b>".&mt("Usage Statistics")." <br />(".
     &mt("Courses/Network Hits").")</b> ".&mt('updated periodically')."</td>\n")
       if ($hash{'display_attrs_8'} == 1);
    $r->print("<td><b>".&mt("Source Available")."</b></td>\n")
       if ($hash{'display_attrs_10'} == 1);
    $r->print("<td><b>".&mt("Linked/Related Resources")."</b></td>\n")
       if ($hash{'display_attrs_11'} == 1);
    $r->print("<td><b>".&mt("Resource")."</b></td>\n")
     if ($hash{'display_attrs_7'} == 1);      if ($hash{'display_attrs_7'} == 1);
  $r->print('</tr>');   $r->print('</tr>');
   
Line 441  END Line 539  END
     }      }
  }   }
   
  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 457  END Line 555  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') {    if ($env{'form.dirPointer'} ne 'on') {
     $hash{'top.level'} = $uri;       $hash{'top.level'} = $uri;
     $toplevel = $uri;       $toplevel = $uri;
     } else {
  } else {       $toplevel = $hash{'top.level'};
     $toplevel = $hash{'top.level'};    }
  }  
   
 # -------------------------------- if not at top level, provide an uplink arrow  # -------------------------------- if not at top level, provide an uplink arrow
  if ($toplevel ne '/res/'){   if ($toplevel ne '/res/'){
Line 485  END Line 581  END
   
 # ---------------------------- embed hidden information useful for group import  # ---------------------------- embed hidden information useful for group import
  $r->print("<form name='fnum'>");   $r->print("<form name='fnum'>");
  $r->print("<input type='hidden' name='fnum' value='$fnum'></form>");   $r->print("<input type='hidden' name='fnum' value='$fnum' /></form>");
   
 # -------------------------------------------------------------- end the tables  # -------------------------------------------------------------- end the tables
  $r->print('</table>');   $r->print('</table>');
  $r->print('</td></tr></table>');   $r->print('</td></tr></table>');
   
 # --------------------------------------------------- end the output and return  # --------------------------------------------------- end the output and return
  $r->print('</body></html>'."\n");   $r->print(&Apache::loncommon::end_page()."\n");
  untie(%hash);      }
     } else {      if(! $c->aborted()) {
  $r->print('<html><head></head><body>Unable to tie hash to db '.  # write back into the temporary file
   'file</body></html>');   my %dbfile;
  return OK;          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,undef,$testdir,undef)=split(/\&/,$line,5);           return if ($c->aborted());
  next if $strip =~ /.*\.meta$/;   #This is a kludge, sorry aboot this
    my ($strip,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); 
    next if($strip =~ /.*\.meta$/ | $obs eq '1');
  my (@fileparts) = split(/\./,$strip);   my (@fileparts) = split(/\./,$strip);
  if ($hash{'display_attrs_8'} != 1) {   if ($hash{'display_attrs_9'} != 1) {
   # if not all versions to be shown
     if (scalar(@fileparts) >= 3) {      if (scalar(@fileparts) >= 3) {
  my $fext = pop @fileparts;   my $fext = pop @fileparts;
  my $ov = pop @fileparts;   my $ov = pop @fileparts;
  my $fname = join ('.',@fileparts,$fext);   my $fname = join ('.',@fileparts,$fext);
  next if (grep /\Q$fname\E/,@list and $ov =~ /\d+/);   next if (grep /\Q$fname\E/,@list and $ov =~ /^\d+$/);
     }      }
  }   }
   
  if ($dom eq 'domain') {   if ($dom eq 'domain') {
     $compuri = join('',$strip,'/');  # dom list has /res/<domain name>      # dom list has full path /res/<domain name>/ already
     $curdir = $compuri;      $curdir='';
       $compuri = (split(/\&/,$line))[0];
  } else {   } else {
     # 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,'/');      $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";
Line 551  sub scanDir { Line 658  sub scanDir {
 # --------------- get complete matched list based on the uri (returns an array)  # --------------- 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) =~ s/\//_/g;      (my $luri = $uri) =~ s/\//_/g;
       if ($env{'form.updatedisplay'}) {
     if ($ENV{'form.attrs'} eq 'Refresh') {  
  foreach (keys %hash) {   foreach (keys %hash) {
     delete $hash{$_} if ($_ =~ /^dirlist_files_/);      delete $hash{$_} if ($_ =~ /^dirlist_files_/);
     }      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,$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);      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 {  sub initdebug {
       my $start_page=
    &Apache::loncommon::start_page('Debug',undef,
          {'only_body' => 1,});
       $start_page =~ s/\n/ /g;
     return <<ENDJS;      return <<ENDJS;
 <script>  <script type="text/javascript">
 var debugging = true;  var debugging = true;
 if (debugging) {  if (debugging) {
     var debuggingWindow = window.open('','Debug','width=400,height=300',true);      var debuggingWindow = window.open('','Debug','width=400,height=300',true);
Line 582  function output(text) { Line 727  function output(text) {
         debuggingWindow.document.writeln(text);          debuggingWindow.document.writeln(text);
     }      }
 }  }
 output("<html><head><title>Debugging Window</title></head><body><pre>");     output('$start_page<pre>');   
 </script>  </script>
 ENDJS  ENDJS
 }  }
   
 sub writedebug {  sub writedebug {
     my $text = shift;      my ($text) = @_;
     return "<script>output('$text');</script>";      return "<script type=\"text/javascript\">output('$text');</script>";
 }  }
   
 # -------------------- filters out files based on extensions (returns an array)  # -------------------- filters out files based on extensions (returns an array)
Line 608  sub match_ext { Line 753  sub match_ext {
  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 "") {
     my $embstyle = &Apache::loncommon::fileembstyle($fext);      my $embstyle = &Apache::loncommon::fileembstyle($fext);
             push @trimlist,$line if (defined($embstyle) &&               push @trimlist,$line if (defined($embstyle) && 
Line 617  sub match_ext { Line 762  sub match_ext {
     push @trimlist,$line;      push @trimlist,$line;
  }   }
     }      }
     @trimlist = sort (@trimlist);      @trimlist = sort {uc($a) cmp uc($b)} (@trimlist);
     return @trimlist;      return @trimlist;
 }  }
   
Line 625  sub match_ext { Line 770  sub match_ext {
 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);      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";      my $fileclr="#ffffe6";
     my $iconpath= $r->dir_config('lonIconsURL') . '/';      my $iconpath= $r->dir_config('lonIconsURL') . '/';
Line 633  sub display_line { Line 789  sub display_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 $tabtag='</td>';      my $tabtag='</td>';
     my $i=0;      my $i=0;
       while ($i<=11) {
     while ($i<=7) {  
  $tabtag=join('',$tabtag,"<td>&nbsp;</td>")   $tabtag=join('',$tabtag,"<td>&nbsp;</td>")
     if $hash{'display_attrs_'.$i} == 1;      if $hash{'display_attrs_'.$i} == 1;
  $i++;   $i++;
     }      }
   
     my $valign = ($hash{'display_attrs_7'} == 1 ? 'top' : 'bottom');      my $valign = ($hash{'display_attrs_7'} == 1 ? 'top' : 'bottom');
   
 # display uplink arrow  # display uplink arrow
     if ($filecom[1] eq 'viewOneUp') {      if ($filecom[1] eq 'viewOneUp') {
  $r->print("<tr bgcolor=$fileclr>$extrafield");   my $updir=$startdir;
  $r->print("<td valign=$valign>\n");  # -------------- Filter out sequence containment in crumbs and "recent folders"
  $r->print ('<form method="post" name="dirpathUP" action="'.$startdir.   $updir='/'.(split(/\.(page|sequence)\/\//,$startdir))[-1];
    $updir=~s/\/+/\//g;
   
    $r->print("<tr valign='$valign' bgcolor=$fileclr>$extrafield");
    $r->print("<td>\n");
    $r->print ('<form method="post" name="dirpathUP" action="'.$updir.
    '/" '.     '/" '.
    'onSubmit="return rep_dirpath(\'UP\','.     'onSubmit="return rep_dirpath(\'UP\','.
    'document.forms.fileattr.acts.value)" '.     'document.forms.fileattr.acts.value)" '.
    'enctype="application/x-www-form-urlencoded"'.     'enctype="application/x-www-form-urlencoded"'.
                    '>'."\n");                     '>'."\n");
  $r->print ('<input type=hidden name=openuri value="'.   $r->print ('<input type=hidden name=openuri value="'.
    $startdir.'">'."\n");     $startdir.'" />'."\n");
  $r->print ('<input type="hidden" name="acts" value="">'."\n");   $r->print ('<input type="hidden" name="acts" value="" />'."\n");
  $r->print ('<input src="'.$iconpath.'arrow_up.gif"');   $r->print ('<input src="'.$iconpath.'arrow_up.gif"');
  $r->print (' name="'.$msg.'" height="22" type="image" border="0">'.   $r->print (' name="'.$msg.'" height="22" type="image" border="0" />'.
    "\n");     "\n");
  $r->print("Up $tabtag</tr></form>\n");   $r->print(&mt("Up")."</form>$tabtag</tr>\n");
  return OK;   return OK;
     }      }
 # Do we have permission to look at this?  # Do we have permission to look at this?
   
     return OK if (!&Apache::lonnet::allowed('bre',$startdir.$filecom[0]));      if($filecom[15] ne '1') { return OK if (!&Apache::lonnet::allowed('bre',$pathprefix.$filecom[0])); }
   
   # make absolute links appear on different background
       if ($absolute) { $fileclr='#ccdd99'; }
   
 # display domain  # display domain
     if ($filecom[1] eq 'domain') {      if ($filecom[1] eq 'domain') {
  $r->print ('<input type="hidden" name="dirPointer" value="on">'."\n")    $r->print ('<input type="hidden" name="dirPointer" value="on" />'."\n")
     if ($ENV{'form.dirPointer'} eq "on");       if ($env{'form.dirPointer'} eq "on");
  $r->print("<tr bgcolor=$fileclr>$extrafield");   $r->print("<tr valign='$valign' bgcolor=$fileclr>$extrafield");
  $r->print("<td valign=$valign>");   $r->print("<td>");
  &begin_form ($r,$filecom[0].'/');   &begin_form ($r,$filecom[0]);
  my $anchor = $filecom[0].'/';   my $anchor = $filecom[0];
  $anchor =~ s/\///g;   $anchor =~ s/\///g;
  $r->print ('<a name="'.$anchor.'">');   $r->print ('<a name="'.$anchor.'">');
  $r->print ('<input type="hidden" name="acts" value="">');   $r->print ('<input type="hidden" name="acts" value="" />');
  $r->print ('<input src="'.$iconpath.'folder_pointer_'.   $r->print ('<input src="'.$iconpath.'folder_pointer_'.
    $diropen.'.gif"');      $diropen.'.gif"'); 
  $r->print (' name="'.$msg.'" height="22" type="image" border="0">'.   $r->print (' name="'.$msg.'" height="22" type="image" border="0" />'.
    "\n");     "\n");
  $r->print ('<a href="javascript:gothere(\''.$filecom[0].   my $quotable_filecom = &Apache::loncommon::escape_single($filecom[0]);
    '/\')"><img src="'.$iconpath.'server.gif"');   $r->print ('<a href="javascript:gothere(\''.$quotable_filecom.
      '\')"><img src="'.$iconpath.'server.gif"');
  $r->print (' border="0" /></a>'."\n");   $r->print (' border="0" /></a>'."\n");
  $r->print ("Domain - $listname ");   $r->print (&mt("Domain")." - $listname ");
  if ($Apache::lonnet::domaindescription{$listname}) {   if ($Apache::lonnet::domaindescription{$listname}) {
     $r->print("(".$Apache::lonnet::domaindescription{$listname}.      $r->print("(".$Apache::lonnet::domaindescription{$listname}.
       ")");        ")");
  }   }
  $r->print (" $tabtag</tr></form>\n");   $r->print ("</form>$tabtag</tr>\n");
  return OK;   return OK;
   
 # display user directory  # display user directory
     }      }
     if ($filecom[1] eq 'user') {      if ($filecom[1] eq 'user') {
  $r->print("<tr bgcolor=$fileclr>$extrafield");   $r->print("<tr valign=$valign bgcolor=$fileclr>$extrafield");
  $r->print("<td valign=$valign nowrap>\n");   $r->print("<td nowrap>\n");
  my $curdir = $startdir.$filecom[0].'/';   my $curdir = $startdir.$filecom[0].'/';
  my $anchor = $curdir;   my $anchor = $curdir;
  $anchor =~ s/\///g;   $anchor =~ s/\///g;
  &begin_form ($r,$curdir);   &begin_form ($r,$curdir);
  $r->print ('<a name="'.$anchor.'"><img src="'.$iconpath.   $r->print ('<a name="'.$anchor.'"><img src="'.$iconpath.
    'whitespace1.gif" border="0" />'."\n");     'whitespace1.gif" border="0" />'."\n");
  $r->print ('<input type="hidden" name="acts" value="">');   $r->print ('<input type="hidden" name="acts" value="" />');
  $r->print ('<input src="'.$iconpath.'folder_pointer_'.$diropen.   $r->print ('<input src="'.$iconpath.'folder_pointer_'.$diropen.
    '.gif"');      '.gif"'); 
  $r->print (' name="'.$msg.'" height="22" type="image" border="0">'.   $r->print (' name="'.$msg.'" height="22" type="image" border="0" />'.
    "\n");     "\n");
  $r->print ('<a href="javascript:gothere(\''.$curdir.'\')"><img src='.   my $quotable_curdir = &Apache::loncommon::escape_single($curdir);
    $r->print ('<a href="javascript:gothere(\''.$quotable_curdir
      .'\')"><img src='.
    $iconpath.'quill.gif border="0" name="'.$msg.     $iconpath.'quill.gif border="0" name="'.$msg.
    '" height="22" /></a>');     '" height="22" /></a>');
  my $domain=(split(m|/|,$startdir))[2];   my $domain=(split(m|/|,$startdir))[2];
  my $plainname=&Apache::loncommon::plainname($listname,$domain);   my $plainname=&Apache::loncommon::plainname($listname,$domain);
  $r->print ($listname);   $r->print ($listname);
  if (defined($plainname) && $plainname) { $r->print(" ($plainname) "); }   if (defined($plainname) && $plainname) { $r->print(" ($plainname) "); }
  $r->print ($tabtag.'</tr></form>'."\n");   $r->print ('</form>'.$tabtag.'</tr>'."\n");
  return OK;   return OK;
     }      }
   
 # display file  # display file
     if ($fnptr == 0 and $filecom[3] ne '') {      if (($fnptr == 0 and $filecom[3] ne '') or $absolute) {
  my $filelink = $startdir.$filecom[0];   my $filelink = $pathprefix.$filecom[0];
  my @file_ext = split (/\./,$listname);   my @file_ext = split (/\./,$listname);
  my $curfext = $file_ext[-1];   my $curfext = $file_ext[-1];
         if (@Omit) {          if (@Omit) {
Line 737  sub display_line { Line 902  sub display_line {
             return OK if ($skip > 0);              return OK if ($skip > 0);
         }          }
  # Set the icon for the file   # Set the icon for the file
  my $iconname = "unknown.gif";   my $iconname = &Apache::loncommon::icon($listname);
  my $embstyle = &Apache::loncommon::fileembstyle($curfext);   $r->print("<tr valign='$valign' bgcolor=$fileclr><td nowrap='nowrap' valign='top'>");
  # The unless conditional that follows is a bit of overkill  
  $iconname = $curfext.".gif" unless          if ($env{'form.catalogmode'} eq 'interactive') {
     (!defined($embstyle) || $embstyle eq 'unk' || $embstyle eq 'hdn');      my $quotable_filelink = &Apache::loncommon::escape_single($filelink);
  #  
  $r->print("<tr bgcolor=$fileclr><td nowrap valign='$valign'>");  
  my $metafile = grep /^\Q$filecom[0]\E\.meta\&/, @list;  
  my $title;  
         if ($ENV{'form.catalogmode'} eq 'interactive') {  
     $title=$listname;  
     $title = &Apache::lonnet::metadata($filelink,'title')  
  if ($metafile == 1);  
     $title=$listname unless $title;  
     my $titleesc=HTML::Entities::encode($title);  
     $titleesc=~s/\'/\\'/; #' (clean up this spare quote)  
             $r->print("<a href=\"javascript:select_data(\'",              $r->print("<a href=\"javascript:select_data(\'",
                       $titleesc,"','",$filelink,"')\">");                        $quotable_filelink,"')\">");
     $r->print("<img src='",$iconpath,"select.gif' border='0' /></a>".      $r->print("<img src='",$iconpath,"select.gif' border='0' /></a>".
       "\n");        "\n");
     $r->print("</td><td valign='$valign' nowrap>");      $r->print("</td><td nowrap>");
  }   } elsif ($env{'form.catalogmode'} eq 'groupimport') {
         elsif ($ENV{'form.catalogmode'} eq 'groupimport') {  
     $title=$listname;  
     $title = &Apache::lonnet::metadata($filelink,'title')  
  if ($metafile == 1);  
     $title=$listname unless $title;  
     my $titleesc=&HTML::Entities::encode($title);  
     $r->print("<form name='form$fnum'>\n");      $r->print("<form name='form$fnum'>\n");
     $r->print("<input type='checkbox' name='filelink"."' ".      $r->print("<input type='checkbox' name='filelink"."' ".
       "value='$filelink' onClick='".        "value='$filelink' onClick='".
Line 772  sub display_line { Line 920  sub display_line {
     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 nowrap>");
       "value='$titleesc'>\n");  
     $r->print("</form>\n");  
     $r->print("</td><td valign='$valign' nowrap>");  
     $hash{"pre_${fnum}_link"}=$filelink;      $hash{"pre_${fnum}_link"}=$filelink;
     $hash{"pre_${fnum}_title"}=$titleesc;  
      $fnum++;       $fnum++;
  }   }
   # Form to open or close sequences
    if ($filelink=~/\.(page|sequence)$/) {
       my $curdir = $startdir.$filecom[0].'/';
       my $anchor = $curdir;
       $anchor =~ s/\///g;
       &begin_form($r,$curdir);
       $indent--;
    }
   # General indentation
  if ($indent > 0 and $indent < 11) {   if ($indent > 0 and $indent < 11) {
     $r->print("<img src=",$iconpath,"whitespace",$indent,      $r->print("<img src=",$iconpath,"whitespace",$indent,
       ".gif border='0' />\n");        ".gif border='0' />\n");
Line 797  sub display_line { Line 949  sub display_line {
     $r->print("<img src=",$iconpath,"whitespace",$rem,      $r->print("<img src=",$iconpath,"whitespace",$rem,
       ".gif border='0' />\n") if $rem > 0;        ".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/\///g;
       $r->print ('<input type="hidden" name="acts" value="" />');
       $r->print ('<a name="'.$anchor.'"><input src="'.$iconpath.
          'folder_pointer_'.$diropen.'.gif"');
       $r->print (' name="'.$msg.'" height="22" type="image" border="0" />'.
          "\n");
    }
   # Filetype icons
    $r->print("<img src='$iconname' border='0' />\n");
    my $quotable_filelink = &Apache::loncommon::escape_single($filelink);
   
  $r->print("<img src=$iconpath$iconname border='0' />\n");  
  $r->print (" <a href=\"javascript:openWindow('".$filelink.  
    "', 'metadatafile', '450', '500', 'no', 'yes')\";".  
    " TARGET=_self>$listname</a> ");  
   
  $r->print (" (<a href=\"javascript:openWindow('".$filelink.   $r->print (" <a href=\"javascript:openWindow('".$quotable_filelink.
    ".meta', 'metadatafile', '400', '450', 'no', 'yes')\"; ".     "', 'previewfile', '450', '500', 'no', 'yes','yes')\";".
    "TARGET=_self>metadata</a>) ") if ($metafile == 1);     " TARGET=_self>$listname</a> ");
   
    $r->print (" (<a href=\"javascript:openWindow('".$quotable_filelink.
      ".meta', 'metadatafile', '500', '550', 'no', 'yes','no')\"; ".
      "TARGET=_self>metadata</a>) ");
   # Close form to open/close sequence
    if ($filelink=~/\.(page|sequence)$/) {
       $r->print('</form>');
    }
  $r->print("</td>\n");   $r->print("</td>\n");
  if ($hash{'display_attrs_0'} == 1) {   if ($hash{'display_attrs_0'} == 1) {
     my $title = &Apache::lonnet::metadata($filelink,'title')      my $title = &Apache::lonnet::gettitle($filelink,'title');
  if ($metafile == 1);      $r->print('<td> '.($title eq '' ? '&nbsp;' : $title).
     $r->print('<td valign=$valign> '.($title eq '' ? '&nbsp;' : $title).  
       ' </td>'."\n");        ' </td>'."\n");
  }   }
  $r->print('<td align=right valign=$valign> ',   $r->print('<td align=right> ',
   $filecom[8]," </td>\n")     $filecom[8]," </td>\n") 
     if $hash{'display_attrs_1'} == 1;      if $hash{'display_attrs_1'} == 1;
  $r->print('<td valign=$valign> '.   $r->print('<td> '.
   (localtime($filecom[9]))." </td>\n")     (localtime($filecom[9]))." </td>\n") 
     if $hash{'display_attrs_2'} == 1;      if $hash{'display_attrs_2'} == 1;
  $r->print('<td valign=$valign> '.   $r->print('<td> '.
   (localtime($filecom[10]))." </td>\n")     (localtime($filecom[10]))." </td>\n") 
     if $hash{'display_attrs_3'} == 1;      if $hash{'display_attrs_3'} == 1;
   
  if ($hash{'display_attrs_4'} == 1) {   if ($hash{'display_attrs_4'} == 1) {
     my $author = &Apache::lonnet::metadata($filelink,'author')      my $author = &Apache::lonnet::metadata($filelink,'author');
  if ($metafile == 1);      $r->print('<td> '.($author eq '' ? '&nbsp;' : $author).
     $r->print('<td valign=$valign> '.($author eq '' ? '&nbsp;' : $author).  
       " </td>\n");        " </td>\n");
  }   }
  if ($hash{'display_attrs_5'} == 1) {   if ($hash{'display_attrs_5'} == 1) {
     my $keywords = &Apache::lonnet::metadata($filelink,'keywords')      my $keywords = &Apache::lonnet::metadata($filelink,'keywords');
  if ($metafile == 1);  
     # $keywords = '&nbsp;' if (!$keywords);      # $keywords = '&nbsp;' if (!$keywords);
     $r->print('<td valign=$valign> '.($keywords eq '' ? '&nbsp;' : $keywords).      $r->print('<td> '.($keywords eq '' ? '&nbsp;' : $keywords).
       " </td>\n");        " </td>\n");
  }   }
   #'
   
  if ($hash{'display_attrs_6'} == 1) {   if ($hash{'display_attrs_6'} == 1) {
     my $lang = &Apache::lonnet::metadata($filelink,'language')      my $lang = &Apache::lonnet::metadata($filelink,'language');
  if ($metafile == 1);  
     $lang = &Apache::loncommon::languagedescription($lang);      $lang = &Apache::loncommon::languagedescription($lang);
     $r->print('<td valign=$valign> '.($lang eq '' ? '&nbsp;' : $lang).      $r->print('<td> '.($lang eq '' ? '&nbsp;' : $lang).
       " </td>\n");        " </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);
    $r->print('<td>'."<a href=\"javascript:openWindow('"
     .$quotable_sourcelink.
     "', 'previewsource', '700', '700', 'no', 'yes','yes')\";".
     " TARGET=_self>Yes</a> "."</td>\n");
       } else { #A cuddled else. :P
    $r->print("<td>&nbsp;</td>\n");
       }
    }
    if ($hash{'display_attrs_11'} == 1) {
   # links
      &dynmetaread($filelink);
      $r->print('<td>');
      &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) {          if ($hash{'display_attrs_7'} == 1) {
             my $output='';  # Show resource
             my $embstyle=&Apache::loncommon::fileembstyle($curfext);     my $output=&showpreview($filelink);
     if ($embstyle eq 'ssi') {             $r->print('<td> '.($output eq '' ? '&nbsp;':$output).
        $output=&Apache::lonnet::ssi_body($filelink);  
                $output='<font size="-2">'.$output.'</font>';  
    } elsif ($embstyle eq 'img') {  
                $output='<img src="'.$filelink.'" />';  
            } elsif ($filelink=~/^\/res\/(\w+)\/(\w+)\//) {  
                $output='<img src="http://'.  
  $Apache::lonnet::hostname{&Apache::lonnet::homeserver($2,$1)}.  
                  '/cgi-bin/thumbnail.gif?url='.$filelink.'" />';  
            }  
    $r->print('<td valign=$valign> '.($output eq '' ? '&nbsp;':$output).  
       " </td>\n");        " </td>\n");
         }          }
  $r->print("</tr>\n");   $r->print("</tr>\n");
Line 865  sub display_line { Line 1064  sub display_line {
   
 # -- 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/\///g;
Line 888  sub display_line { Line 1085  sub display_line {
     $r->print ("<img src=",$iconpath,"whitespace",$rem,      $r->print ("<img src=",$iconpath,"whitespace",$rem,
        ".gif border='0' />\n") if $rem > 0;         ".gif border='0' />\n") if $rem > 0;
  }   }
  $r->print ('<input type="hidden" name="acts" value="">');   $r->print ('<input type="hidden" name="acts" value="" />');
  $r->print ('<a name="'.$anchor.'"><input src="'.$iconpath.   $r->print ('<a name="'.$anchor.'"><input src="'.$iconpath.
    'folder_pointer_'.$diropen.'.gif"');     'folder_pointer_'.$diropen.'.gif"');
  $r->print (' name="'.$msg.'" height="22" type="image" border="0">'.   $r->print (' name="'.$msg.'" height="22" type="image" border="0" />'.
    "\n");     "\n");
  $r->print ('<a href="javascript:gothere(\''.$curdir.'\')"><img src="'.   my $quotable_curdir = &Apache::loncommon::escape_single($curdir);
    $r->print ('<a href="javascript:gothere(\''
      .$quotable_curdir.'\')"><img src="'.
    $iconpath.'folder_'.$diropen.'.gif" border="0" /></a>'.     $iconpath.'folder_'.$diropen.'.gif" border="0" /></a>'.
    "\n");     "\n");
  $r->print ("$listname$tabtag</tr></form>\n");   $r->print ("$listname</td>\n");
   # Attributes
    my $filelink = $startdir.$filecom[0].'/default';
   
    if ($hash{'display_attrs_0'} == 1) {
       my $title = &Apache::lonnet::gettitle($filelink,'title');
       $r->print('<td> '.($title eq '' ? '&nbsp;' : $title).
         ' </td>'."\n");
    }
    $r->print('<td align=right> ',
     $filecom[8]," </td>\n") 
       if $hash{'display_attrs_1'} == 1;
    $r->print('<td> '.
     (localtime($filecom[9]))." </td>\n") 
       if $hash{'display_attrs_2'} == 1;
    $r->print('<td> '.
     (localtime($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_11'} == 1) {
      $r->print('<td>&nbsp;</td>');
    }
    if ($hash{'display_attrs_7'} == 1) {
      $r->print('<td>&nbsp;</td>');
           }
    $r->print('</form></tr>');
     }      }
   
 }  }
   
   sub showpreview {
       my ($filelink)=@_;
       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 {
             $output=&Apache::lonnet::ssi_body($filelink);
             if ($output=~/LONCAPAACCESSCONTROLERRORSCREEN/s) {
                $output='';
             } else {
                open(FH,">$cache");
                print FH $output;
                close(FH);
             }
          }
          $output='<font size="-2">'.$output.'</font>';
       } elsif ($embstyle eq 'img') {
          $output='<img src="'.$filelink.'" />';
       } elsif ($filelink=~/^\/res\/(\w+)\/(\w+)\//) {
          $output='<img 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 'groupimport')?'preview':''),
     '',
     (($env{'form.catalogmode'} eq 'groupimport')?'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) = @_;
Line 911  sub begin_form { Line 1204  sub begin_form {
        '" onSubmit="return rep_dirpath(\''.$dnum.'\''.         '" onSubmit="return rep_dirpath(\''.$dnum.'\''.
        ',document.forms.fileattr.acts.value)" '.         ',document.forms.fileattr.acts.value)" '.
        'enctype="application/x-www-form-urlencoded">'."\n");         'enctype="application/x-www-form-urlencoded">'."\n");
     $r->print ('<input type="hidden" name="openuri" value="'.$uri.'">'.      $r->print ('<input type="hidden" name="openuri" value="'.$uri.'" />'.
        "\n");         "\n");
     $r->print ('<input type="hidden" name="dirPointer" value="on">'."\n");      $r->print ('<input type="hidden" name="dirPointer" value="on" />'."\n");
     $dnum++;      $dnum++;
 }  }
   
Line 948  sub setvalues { Line 1241  sub setvalues {
 sub cleanup {  sub cleanup {
     if (tied(%hash)){      if (tied(%hash)){
  &Apache::lonnet::logthis('Cleanup indexer: hash');   &Apache::lonnet::logthis('Cleanup indexer: hash');
         unless (untie(%hash)) {  
     &Apache::lonnet::logthis('Failed cleanup indexer: hash');  
         }  
     }      }
       return OK;
 }  }
   
   
   
   
   
 =head1 NAME  =head1 NAME
   
 Apache::lonindexer - mod_perl module for cross server filesystem browsing  Apache::lonindexer - mod_perl module for cross server filesystem browsing

Removed from v.1.66  
changed lines
  Added in v.1.144


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.