Annotation of loncom/interface/lonindexer.pm, revision 1.195

1.1       www         1: # The LearningOnline Network with CAPA
1.24      harris41    2: # Directory Indexer
                      3: #
1.195   ! jms         4: # $Id: lonindexer.pm,v 1.194 2009/03/19 14:24:50 jms Exp $
1.24      harris41    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
1.14      harris41   14: #
1.24      harris41   15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
1.14      harris41   27: #
1.23      harris41   28: ###
                     29: 
                     30: ###############################################################################
                     31: ##                                                                           ##
                     32: ## ORGANIZATION OF THIS PERL MODULE                                          ##
                     33: ##                                                                           ##
                     34: ## 1. Description of functions                                               ##
                     35: ## 2. Modules used by this module                                            ##
                     36: ## 3. Choices for different output views (detailed, summary, xml, etc)       ##
                     37: ## 4. BEGIN block (to be run once after compilation)                         ##
                     38: ## 5. Handling routine called via Apache and mod_perl                        ##
                     39: ## 6. Other subroutines                                                      ##
                     40: ##                                                                           ##
                     41: ###############################################################################
1.7       harris41   42: 
1.1       www        43: package Apache::lonindexer;
                     44: 
1.23      harris41   45: # ------------------------------------------------- modules used by this module
1.1       www        46: use strict;
1.133     albertel   47: use Apache::lonnet;
1.30      harris41   48: use Apache::loncommon();
1.83      www        49: use Apache::lonhtmlcommon();
1.94      www        50: use Apache::lonsequence();
1.1       www        51: use Apache::Constants qw(:common);
1.70      ng         52: use Apache::lonmeta;
1.2       harris41   53: use Apache::File;
1.77      www        54: use Apache::lonlocal;
1.109     taceyjo1   55: use Apache::lonsource();
1.172     albertel   56: use Apache::groupsort();
1.2       harris41   57: use GDBM_File;
1.154     albertel   58: use LONCAPA qw(:match);
1.2       harris41   59: 
1.23      harris41   60: # ---------------------------------------- variables used throughout the module
1.87      www        61: my %hash; # global user-specific gdbm file
1.17      harris41   62: my %dirs; # keys are directories, values are the open/close status
                     63: my %language; # has the reference information present in language.tab
1.111     www        64: my %dynhash; # hash of hashes for dynamic metadata
1.117     www        65: my %dynread; # hash of directories already read for dynamic metadata
1.113     www        66: my %fieldnames; # Metadata fieldnames
1.17      harris41   67: # ----- Values which are set by the handler subroutine and are accessible to
                     68: # -----     other methods.
                     69: my $extrafield; # default extra table cell
                     70: my $fnum; # file counter
                     71: my $dnum; # directory counter
1.1       www        72: 
1.40      matthew    73: # ----- Used to include or exclude files with certain extensions.
1.43      matthew    74: my @Only = ();
1.40      matthew    75: my @Omit = ();
                     76: 
                     77: 
1.125     foxr       78: 
                     79: 
1.23      harris41   80: # ----------------------------- Handling routine called via Apache and mod_perl
1.1       www        81: sub handler {
                     82:     my $r = shift;
1.67      matthew    83:     my $c = $r->connection();
1.76      www        84:     &Apache::loncommon::content_type($r,'text/html');
1.50      albertel   85:     &Apache::loncommon::no_cache($r);
1.1       www        86:     $r->send_http_header;
                     87:     return OK if $r->header_only;
1.9       harris41   88:     $fnum=0;
1.16      harris41   89:     $dnum=0;
1.17      harris41   90: 
1.43      matthew    91:     # Deal with stupid global variables (is there a way around making
                     92:     # these global to this package?  It is just so wrong....)
                     93:     undef (@Only);
                     94:     undef (@Omit);
1.113     www        95:     %fieldnames=&Apache::lonmeta::fieldnames();
1.43      matthew    96: 
1.23      harris41   97: # ------------------------------------- read in machine configuration variables
1.10      harris41   98:     my $iconpath= $r->dir_config('lonIconsURL') . "/";
1.1       www        99:     my $domain  = $r->dir_config('lonDefDomain');
                    100:     my $role    = $r->dir_config('lonRole');
                    101:     my $loadlim = $r->dir_config('lonLoadLim');
                    102:     my $servadm = $r->dir_config('lonAdmEMail');
                    103:     my $sysadm  = $r->dir_config('lonSysEMail');
                    104:     my $lonhost = $r->dir_config('lonHostID');
                    105:     my $tabdir  = $r->dir_config('lonTabDir');
                    106: 
1.182     bisitz    107: #SB my $fileclr='#ffffe6';
1.15      harris41  108:     my $line;
1.176     banghart  109:     my (@attrchk,@openpath,$typeselect);
1.15      harris41  110:     my $uri=$r->uri;
                    111: 
1.7       harris41  112: # -------------------------------------- see if called from an interactive mode
1.35      matthew   113:     # Get the parameters from the query string
1.36      matthew   114:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.40      matthew   115: 	     ['catalogmode','launch','acts','mode','form','element',
1.79      albertel  116:               'only','omit','titleelement']);
1.35      matthew   117:     #-------------------------------------------------------------------
1.17      harris41  118:     my $closebutton='';
1.7       harris41  119:     my $groupimportbutton='';
                    120:     my $colspan=''; 
1.141     albertel  121:     
1.14      harris41  122:     $extrafield='';
1.17      harris41  123:     my $diropendb = 
1.144     www       124: 	"/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_sel_res.db";
1.67      matthew   125:     %hash = ();
1.68      albertel  126:     {
                    127: 	my %dbfile;
1.149     albertel  128: 	if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_WRITER(),0640)) {
                    129: 	    if ($env{'form.launch'} eq '1') {
                    130: 		&start_fresh_session(\%dbfile);
                    131: 	    }
1.68      albertel  132: 	    while(my($key,$value)=each(%dbfile)) {
                    133: 		$hash{$key}=$value;
                    134: 	    }
                    135: 	    untie(%dbfile);
                    136: 	}
                    137:     }
1.174     banghart  138: # - Evaluate actions from previous page (both cumulatively and chronologically)
                    139:         if ($env{'form.catalogmode'} eq 'import' || $hash{'form.catalogmode'} eq 'import') {
                    140: 	    &Apache::groupsort::update_actions_hash(\%hash);
                    141: 	}
                    142:     
1.68      albertel  143:     {
1.105     taceyjo1  144:   #Hijack lonindexer to verify a title and be close down.
1.133     albertel  145:    if ($env{'form.launch'} eq '2') {
1.130     albertel  146:        &Apache::loncommon::content_type($r,'text/html');
1.108     albertel  147:        my $extra='';
1.133     albertel  148:        if (defined($env{'form.titleelement'}) && 
                    149: 	   $env{'form.titleelement'} ne '') {
                    150: 	   my $verify_title = &Apache::lonnet::gettitle($env{'form.acts'});
                    151: #	   &Apache::lonnet::logthis("Hrrm $env{'form.acts'} -- $verify_title");
1.108     albertel  152: 	   $verify_title=~s/'/\\'/g;
1.133     albertel  153: 	   $extra='window.opener.document.forms["'.$env{'form.form'}.'"].elements["'.$env{'form.titleelement'}.'"].value=\''.$verify_title.'\';';
1.108     albertel  154:        }
1.141     albertel  155:        my $js = <<ENDSUBM;
1.129     albertel  156: 	       <script type="text/javascript">
1.105     taceyjo1  157: 		function load() {
1.133     albertel  158: 			window.opener.document.forms["$env{'form.form'}"]
                    159: 			    .elements["$env{'form.element'}"]
                    160: 			    .value='$env{'form.acts'}';
1.108     albertel  161: 			$extra
1.105     taceyjo1  162: 			window.close();
                    163: 		}
1.129     albertel  164:    	       </script>
1.105     taceyjo1  165: ENDSUBM
1.141     albertel  166:        $r->print(&Apache::loncommon::start_page(undef,$js,
                    167: 						{'only_body'   =>1,
                    168: 						 'add_entries' =>
1.142     albertel  169: 						     {'onload' => "load();"},}
                    170: 						).
1.141     albertel  171: 		 &Apache::loncommon::end_page());
1.108     albertel  172:        return OK;
1.105     taceyjo1  173:    }
                    174:     
1.17      harris41  175: # -------------------- refresh environment with user database values (in %hash)
1.133     albertel  176: 	&setvalues(\%hash,'form.catalogmode',\%env,'form.catalogmode'   );
1.15      harris41  177: 
1.17      harris41  178: # --------------------- define extra fields and buttons in case of special mode
1.133     albertel  179: 	if ($env{'form.catalogmode'} eq 'interactive') {
1.182     bisitz    180: #SB	    $extrafield='<td bgcolor="'.$fileclr.'" valign="bottom">'.
1.194     jms       181:             $extrafield='<td class="LC_bottom">'.
1.152     albertel  182: 		'<img alt="" src="'.$iconpath.'whitespace1.gif"'.
1.162     albertel  183: 		' class="LC_icon" /></td>';
1.15      harris41  184: 	    $colspan=" colspan='2' ";
1.77      www       185:             my $cl=&mt('Close');
1.15      harris41  186:             $closebutton=<<END;
1.131     albertel  187: <input type="button" name="close" value='$cl' onClick="self.close()" />
1.7       harris41  188: END
1.16      harris41  189:         }
1.145     www       190: 	elsif ($env{'form.catalogmode'} eq 'import') {
1.182     bisitz    191: #SB	    $extrafield='<td bgcolor="'.$fileclr.'" valign="bottom">'.
1.194     jms       192:             $extrafield='<td class="LC_bottom">'.
1.152     albertel  193: 		'<img alt="" src="'.$iconpath.'whitespace1.gif"'.
1.162     albertel  194: 		' class="LC_icon" /></td>';
1.15      harris41  195: 	    $colspan=" colspan='2' ";
1.77      www       196: 	    my $cl=&mt('Close');
1.123     matthew   197:             my $gi=&mt('Import');
1.15      harris41  198:             $closebutton=<<END;
1.131     albertel  199: <input type="button" name="close" value='$cl' onClick="self.close()" />
1.7       harris41  200: END
1.15      harris41  201:             $groupimportbutton=<<END;
1.77      www       202: <input type="button" name="groupimport" value='$gi'
1.131     albertel  203: onClick="javascript:select_group()" />
1.7       harris41  204: END
1.15      harris41  205:         }
1.35      matthew   206: 	# Additions made by Matthew to make the browser a little easier to deal
                    207: 	# with in the future.
                    208: 	#
                    209: 	# $mode (at this time) indicates if we are in edit mode.
                    210: 	# $form is the name of the form that the URL is placed when the
                    211: 	#       selection is made.
                    212: 	# $element is the name of the element in $formname which receives
                    213: 	#       the URL.
1.91      taceyjo1  214: 	#&Apache::lonxml::debug('Checking mode, form, element');
1.133     albertel  215: 	&setvalues(\%hash,'form.mode'        ,\%env,'form.mode'   );
                    216: 	&setvalues(\%hash,'form.form'        ,\%env,'form.form'   );
                    217: 	&setvalues(\%hash,'form.element'     ,\%env,'form.element');
                    218: 	&setvalues(\%hash,'form.titleelement',\%env,'form.titleelement');
                    219: 	&setvalues(\%hash,'form.only'        ,\%env,'form.only'   );
                    220: 	&setvalues(\%hash,'form.omit'        ,\%env,'form.omit'   );
1.35      matthew   221: 
1.40      matthew   222:         # Deal with 'omit' and 'only' 
1.133     albertel  223:         if (exists $env{'form.omit'}) {
                    224:             @Omit = split(',',$env{'form.omit'});
1.40      matthew   225:         }
1.133     albertel  226:         if (exists $env{'form.only'}) {
                    227:             @Only = split(',',$env{'form.only'});
1.40      matthew   228:         }
                    229:         
1.133     albertel  230: 	my $mode = $env{'form.mode'};
1.79      albertel  231: 	my ($form,$element,$titleelement);
1.39      matthew   232: 	if ($mode eq 'edit' || $mode eq 'parmset') {
1.133     albertel  233: 	    $form         = $env{'form.form'};
                    234: 	    $element      = $env{'form.element'};
                    235: 	    $titleelement = $env{'form.titleelement'};
1.35      matthew   236: 	}
1.90      taceyjo1  237: 	#&Apache::lonxml::debug("mode=$mode form=$form element=$element titleelement=$titleelement");
1.17      harris41  238: # ------ set catalogmodefunctions to have extra needed javascript functionality
1.15      harris41  239: 	my $catalogmodefunctions='';
1.133     albertel  240: 	if ($env{'form.catalogmode'} eq 'interactive' or
1.145     www       241: 	    $env{'form.catalogmode'} eq 'import') {
1.35      matthew   242: 	    # The if statement below sets us up to use the old version
                    243: 	    # by default (ie. if $mode is undefined).  This is the easy
                    244: 	    # way out.  Hopefully in the future I'll find a way to get 
                    245: 	    # the calls dealt with in a more comprehensive manner.
1.41      www       246: 
                    247: #
                    248: # There is now also mode "simple", which is for the simple version of the rat
                    249: #
                    250: #
1.39      matthew   251: 	    if (!defined($mode) || ($mode ne 'edit' && $mode ne 'parmset')) {
1.170     albertel  252:                 my $location = "/adm/groupsort?&inhibitmenu=yes&catalogmode=import&";
1.41      www       253:                 $location .= "mode=".$mode."&";
1.40      matthew   254:                 $location .= "acts=";
1.35      matthew   255: 		$catalogmodefunctions=<<"END";
1.108     albertel  256: function select_data(url) {
1.7       harris41  257:     changeURL(url);
1.8       harris41  258:     self.close();
                    259: }
                    260: function select_group() {
1.40      matthew   261:     window.location="$location"+document.forms.fileattr.acts.value;
1.16      harris41  262: }
1.35      matthew   263: function changeURL(val) {
                    264:     if (opener.inf) {
                    265:         if (opener.inf.document.forms.resinfo.elements.u) {
                    266: 	    opener.inf.document.forms.resinfo.elements.u.value=val;
                    267:         }
1.7       harris41  268:     }
                    269: }
1.35      matthew   270: END
1.39      matthew   271:             } elsif ($mode eq 'edit') { # we are in 'edit' mode
1.40      matthew   272:                 my $location = "/adm/groupsort?catalogmode=interactive&";
                    273:                 $location .= "form=$form&element=$element&mode=edit&acts=";
1.35      matthew   274: 		$catalogmodefunctions=<<END;
                    275: // mode = $mode
1.108     albertel  276: function select_data(url) {
                    277:    var location = "/res/?launch=2&form=$form&element=$element&titleelement=$titleelement&acts=" + url;
1.105     taceyjo1  278:    window.location=location;
1.173     banghart  279:    if (window.opener.document.forms["$form"].elements["$element"].value != url) {
                    280:        window.opener.unClean();
                    281:    }
1.35      matthew   282: }
                    283: function select_group() {
1.40      matthew   284:     window.location="$location"+document.forms.fileattr.acts.value;
1.35      matthew   285: }
                    286: 
1.7       harris41  287: function changeURL(val) {
1.35      matthew   288:     if (window.opener.document) {
                    289: 	window.opener.document.forms["$form"].elements["$element"].value=val;
                    290:     } else {
                    291: 	    alert("The file you selected is: "+val);
1.7       harris41  292:     }
                    293: }
                    294: END
1.79      albertel  295:                 if (!$titleelement) {
                    296: 		    $catalogmodefunctions.='function changeTitle(val) {}';
                    297: 		} else {
                    298: 		    $catalogmodefunctions.=<<END;
                    299: function changeTitle(val) {
                    300:     if (window.opener.document) {
                    301: 	    window.opener.document.forms["$form"].elements["$titleelement"].value=val;
                    302:     } else {
                    303: 	    alert("The title of the file you selected is: "+val);
                    304:     }
                    305: }
                    306: END
                    307:                 }
1.39      matthew   308:             } elsif ($mode eq 'parmset') {
1.40      matthew   309:                 my $location = "/adm/groupsort?catalogmode=interactive&";
                    310:                 $location .= "form=$form&element=$element&mode=parmset&acts=";
1.39      matthew   311: 		$catalogmodefunctions=<<END;
                    312: // mode = $mode
1.108     albertel  313: function select_data(url) {
1.39      matthew   314:     changeURL(url);
                    315:     self.close();
                    316: }
                    317: 
                    318: function select_group() {
1.40      matthew   319:     window.location="$location"+document.forms.fileattr.acts.value;
1.39      matthew   320: }
                    321: 
                    322: function changeURL(val) {
                    323:     if (window.opener.document) {
                    324:         var elementname  = "$element"+"_value";
                    325:         var checkboxname = "$element"+"_setparmval";
                    326: 	window.opener.document.forms["$form"].elements[elementname].value=val;
                    327:         window.opener.document.forms["$form"].elements[checkboxname].checked=true;
                    328:     } else {
                    329: 	    alert("The file you selected is: "+val);
                    330:     }
                    331: }
                    332: 
                    333: END
                    334:             }
1.15      harris41  335:         }
1.38      matthew   336:         $catalogmodefunctions.=<<END;
                    337: var acts='';
                    338: function rep_dirpath(suffix,val) {
                    339:     eval("document.forms.dirpath"+suffix+".acts.value=val");
                    340: }
                    341: END
1.145     www       342: 	if ($env{'form.catalogmode'} eq 'import') {
1.38      matthew   343:             $catalogmodefunctions.=<<END;
1.16      harris41  344: function queue(val) {
                    345:     if (eval("document.forms."+val+".filelink.checked")) {
                    346: 	var l=val.length;
                    347: 	var v=val.substring(4,l);
                    348: 	document.forms.fileattr.acts.value+='1a'+v+'b';
                    349:     }
                    350:     else {
                    351: 	var l=val.length;
                    352: 	var v=val.substring(4,l);
                    353: 	document.forms.fileattr.acts.value+='0a'+v+'b';
                    354:     }
                    355: }
                    356: END
                    357: 	}
1.17      harris41  358: 
1.170     albertel  359:         my $inhibit_menu = "+'&".&Apache::loncommon::inhibit_menu_check()."'";
1.1       www       360: # ---------------------------------------------------------------- Print Header
1.170     albertel  361:         
1.141     albertel  362: 	my $js = <<"ENDHEADER";
1.19      harris41  363: <script type="text/javascript">
1.175     banghart  364: $catalogmodefunctions;
                    365: function update_only(field) {
                    366:     alert(field.name);
                    367: }
1.163     banghart  368: function checkAll() {
1.160     banghart  369:     var numForms = document.forms.length;
                    370:     for (i=0;i<numForms;i++) {
                    371:         var numElements = document.forms[i].elements.length;
                    372:         for (j=0;j<numElements;j++){
1.163     banghart  373:             var fieldName = document.forms[i].elements[j].name;
                    374:             if (fieldName == 'filelink') {
                    375:                 document.forms[i].elements[j].checked = true;
1.168     banghart  376:                 queue(document.forms[i].name);
1.163     banghart  377:             }
                    378:         }
                    379:     }
                    380: }
                    381: function uncheckAll() {
                    382:     var numForms = document.forms.length;
                    383:     for (i=0;i<numForms;i++) {
                    384:         var numElements = document.forms[i].elements.length;
                    385:         for (j=0;j<numElements;j++){
                    386:             var fieldName = document.forms[i].elements[j].name;
                    387:             if (fieldName == 'filelink') {
                    388:                 document.forms[i].elements[j].checked = false;
1.168     banghart  389:                 queue(document.forms[i].name);
1.160     banghart  390:             }
                    391:         }
                    392:     }
                    393: }
1.69      www       394: function openWindow(url, wdwName, w, h, toolbar,scrollbar,locationbar) {
1.71      ng        395:     var xpos = (screen.width-w)/2;
                    396:     xpos = (xpos < 0) ? '0' : xpos;
                    397:     var ypos = (screen.height-h)/2-30;
                    398:     ypos = (ypos < 0) ? '0' : ypos;
                    399:     var options = "width=" + w + ",height=" + h + ",screenx="+xpos+",screeny="+ypos+",";
1.2       harris41  400:     options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
1.69      www       401:     options += "menubar=no,toolbar="+toolbar+",location="+locationbar+",directories=no";
1.2       harris41  402:     var newWin = window.open(url, wdwName, options);
                    403:     newWin.focus();
                    404: }
1.16      harris41  405: function gothere(val) {
1.170     albertel  406:     window.location=val+'?acts='+document.forms.fileattr.acts.value$inhibit_menu;
1.16      harris41  407: }
1.14      harris41  408: </script>
1.141     albertel  409: ENDHEADER
1.3       harris41  410: 
1.154     albertel  411:         my ($headerdom)=($uri=~m{^/res/($match_domain)/});
1.194     jms       412: 	$r->print(&Apache::loncommon::start_page('Content Library',$js,
1.141     albertel  413: 						 {'domain' => $headerdom,}));
1.175     banghart  414: # ---------------------------------- get state of file types to be showing
                    415: 	if ($env{'form.only'}) {
1.176     banghart  416: 	    $typeselect = $env{'form.only'};
1.175     banghart  417: 	} else {
1.176     banghart  418: 	    $typeselect = '';
1.175     banghart  419: 	}
                    420: 
1.23      harris41  421: # ---------------------------------- get state of file attributes to be showing
1.133     albertel  422: 	if ($env{'form.attrs'}) {
1.195   ! jms       423: 	    for (my $i=0; $i<=16; $i++) {
1.6       harris41  424: 		delete $hash{'display_attrs_'.$i};
1.133     albertel  425: 		if ($env{'form.attr'.$i} == 1) {
1.45      ng        426: 		    $attrchk[$i] = 'checked';
1.6       harris41  427: 		    $hash{'display_attrs_'.$i} = 1;
                    428: 		}
                    429: 	    }
                    430: 	} else {
1.195   ! jms       431: 	    for (my $i=0; $i<=16; $i++) {
1.45      ng        432: 		$attrchk[$i] = 'checked' if $hash{'display_attrs_'.$i} == 1;
1.6       harris41  433: 	    }
                    434: 	}
1.87      www       435: 
1.23      harris41  436: # ------------------------------- output state of file attributes to be showing
1.71      ng        437: #                                 All versions has to the last item
                    438: #                                 since it does not take an extra col
1.77      www       439: 	my %lt=&Apache::lonlocal::texthash(
                    440: 					   'ti' => 'Title',
                    441: 					   'si' => 'Size',
                    442: 					   'la' => 'Last access',
                    443: 					   'lm' => 'Last modified',
                    444: 					   'st' => 'Statistics',
                    445: 					   'au' => 'Author',
                    446: 					   'kw' => 'Keywords',
1.185     jms       447: 					   'sb' => 'Subject',
1.187     bisitz    448: 					   'nt' => 'Notes',
                    449: 					   'ab' => 'Abstract',
1.78      www       450: 					   'ln' => 'Language',
1.194     jms       451: 					   'gl' => 'Grade Level',
1.195   ! jms       452: 					   'sd' => 'Standards',
1.109     taceyjo1  453: 					   'sa' => 'Source Available',
1.77      www       454: 					   'sr' => 'Show resource',
1.111     www       455: 					   'li' => 'Linked/Related Resources',
1.77      www       456: 					   'av' => 'All versions',
1.174     banghart  457: 					   'ud' => 'Update Display',
                    458: 					   'pr' => 'Problems',
                    459: 					   'gr' => 'Graphics',
1.183     bisitz    460: 					   'at' => 'All types',
                    461: 					   'hd' => 'Display Options'
1.77      www       462: 					   );
1.15      harris41  463: 	$r->print(<<END);
1.183     bisitz    464: <fieldset>
                    465: <legend>$lt{'hd'}</legend>
1.17      harris41  466: <form method="post" name="fileattr" action="$uri"
                    467:  enctype="application/x-www-form-urlencoded">
1.124     matthew   468: <label><input type="checkbox" name="attr9" value="1" $attrchk[9] onClick="this.form.submit();" /> $lt{'av'}</label>
1.115     www       469: <table border="0">
                    470: <tr>
1.124     matthew   471: <td><label><input type="checkbox" name="attr0" value="1" $attrchk[0] onClick="this.form.submit();" /> $lt{'ti'}</label></td>
                    472: <td><label><input type="checkbox" name="attr4" value="1" $attrchk[4] onClick="this.form.submit();" /> $lt{'au'}</label></td>
                    473: <td><label><input type="checkbox" name="attr5" value="1" $attrchk[5] onClick="this.form.submit();" /> $lt{'kw'}</label></td>
                    474: <td><label><input type="checkbox" name="attr6" value="1" $attrchk[6] onClick="this.form.submit();" /> $lt{'ln'}</label></td>
1.186     jms       475: <td><label><input type="checkbox" name="attr13" value="1" $attrchk[13] onClick="this.form.submit();" /> $lt{'nt'}</label></td>
1.195   ! jms       476: <td><label><input type="checkbox" name="attr16" value="1" $attrchk[16] onClick="this.form.submit();" /> $lt{'sd'}</label></td>
1.115     www       477: </tr>
                    478: <tr>
1.124     matthew   479: <td><label><input type="checkbox" name="attr1" value="1" $attrchk[1] onClick="this.form.submit();" /> $lt{'si'}</label></td>
                    480: <td><label><input type="checkbox" name="attr2" value="1" $attrchk[2] onClick="this.form.submit();" /> $lt{'la'}</label></td>
                    481: <td><label><input type="checkbox" name="attr3" value="1" $attrchk[3] onClick="this.form.submit();" /> $lt{'lm'}</label></td>
                    482: <td><label><input type="checkbox" name="attr10" value="1" $attrchk[10] onClick="this.form.submit();" /> $lt{'sa'}</label></td>
1.186     jms       483: <td><label><input type="checkbox" name="attr14" value="1" $attrchk[14] onClick="this.form.submit();" /> $lt{'ab'}</label></td>
1.195   ! jms       484: <td>&nbsp;</td>
1.115     www       485: </tr>
                    486: <tr>
1.124     matthew   487: <td><label><input type="checkbox" name="attr8" value="1" $attrchk[8] onClick="this.form.submit();" /> $lt{'st'}</label></td>
                    488: <td><label><input type="checkbox" name="attr11" value="1" $attrchk[11] onClick="this.form.submit();" /> $lt{'li'}</label></td>
                    489: <td><label><input type="checkbox" name="attr7" value="1" $attrchk[7] onClick="this.form.submit();" /> $lt{'sr'}</label></td>
1.185     jms       490: <td><label><input type="checkbox" name="attr12" value="1" $attrchk[12] onClick="this.form.submit();" /> $lt{'sb'}</label></td>
1.193     jms       491: <td><label><input type="checkbox" name="attr15" value="1" $attrchk[15] onClick="this.form.submit();" /> $lt{'gl'}</label></td>
1.115     www       492: <td>&nbsp;</td>
                    493: </tr>
                    494: </table>
1.87      www       495: <input type="hidden" name="attrs" value="1" />
1.176     banghart  496: END
1.178     albertel  497:         my @file_categories = &Apache::loncommon::filecategories();
                    498:         my %select_file_categories;
                    499:         my @select_form_order = ('');
1.179     banghart  500:         $select_file_categories{''} = &mt('All file types');
1.178     albertel  501:         foreach my $cat (@file_categories) {
                    502: 	    my $types = join(",",&Apache::loncommon::filecategorytypes($cat));
                    503: 	    $select_file_categories{$types} = $cat;
                    504: 	    push(@select_form_order,$types);
                    505: 	}
                    506:         $select_file_categories{'select_form_order'} = \@select_form_order;
                    507:         my $type_element=
                    508: 	    &Apache::loncommon::select_form($typeselect,'only',
                    509: 					    %select_file_categories);
                    510:         $type_element = '<label>'.&mt('File Type Displayed: [_1]',
                    511: 				      $type_element).'</label>';
1.183     bisitz    512:         $r->print($type_element
                    513:                  .'</fieldset>');
1.178     albertel  514:         $r->print(<<END);
1.174     banghart  515: <br />
1.87      www       516: <input type="submit" name="updatedisplay" value="$lt{'ud'}" />
1.16      harris41  517: <input type="hidden" name="acts" value="" />
1.87      www       518: $closebutton $groupimportbutton
1.1       www       519: END
1.170     albertel  520:         $r->print(&Apache::loncommon::inhibit_menu_check('input'));
1.178     albertel  521:    
1.97      www       522: # -------------- Filter out sequence containment in crumbs and "recent folders"
                    523: 	my $storeuri=$uri;
                    524: 	$storeuri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1];
                    525: 	$storeuri=~s/\/+/\//g;
1.82      www       526: # ---------------------------------------------------------------- Bread crumbs
1.97      www       527:         $r->print(&Apache::lonhtmlcommon::crumbs($storeuri,'','',
1.145     www       528: 				(($env{'form.catalogmode'} eq 'import')?
1.87      www       529: 				 'document.forms.fileattr':'')).
                    530: 		  &Apache::lonhtmlcommon::select_recent('residx','resrecent',
1.128     foxr      531: '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();'));
1.100     www       532: # -------------------------------------------------------- Resource Home Button
1.133     albertel  533: 	my $reshome=$env{'course.'.$env{'request.course.id'}.'.reshome'};
1.100     www       534: 	if ($reshome) {
1.194     jms       535: 	    $r->print("<span class=\"LC_fontsize_large\"><a href='");
1.145     www       536: 	    if ($env{'form.catalogmode'} eq 'import') {
1.170     albertel  537: 		$r->print('javascript:document.forms.fileattr.action="'.&Apache::loncommon::inhibit_menu_check($reshome).'";document.forms.fileattr.submit();');
1.100     www       538: 	    } else {
                    539: 		$r->print($reshome);
                    540: 	    }
1.194     jms       541: 	    $r->print("'>".&mt('Home').'</a></span>');
1.100     www       542: 	}
                    543: 	$r->print('</form>');
1.85      www       544: # ------------------------------------------------------ Remember where we were
1.97      www       545: 	&Apache::loncommon::storeresurl($storeuri);
                    546: 	&Apache::lonhtmlcommon::store_recent('residx',$storeuri,$storeuri);
1.163     banghart  547: # -------------------------------------------------- Check All and Uncheck all
1.171     albertel  548: 	if ($env{'form.catalogmode'} eq 'import') {
                    549: 	    $r->print('<br /><input type="button" value="'.&mt("Check All").'" id="checkallbutton" onClick="javascript:checkAll()" />');
                    550: 	    $r->print('<input type="button" value="'.&mt("Uncheck All").'" id="uncheckallbutton" onClick="javascript:uncheckAll()" />');
                    551: 	}
1.23      harris41  552: # ----------------- output starting row to the indexed file/directory hierarchy
1.129     albertel  553:         #$r->print(&initdebug());
                    554:         #$r->print(&writedebug("Omit:@Omit")) if (@Omit);
                    555:         #$r->print(&writedebug("Only:@Only")) if (@Only);
1.182     bisitz    556:         $r->print('<br /><br />');
1.194     jms       557:         $r->print(&Apache::loncommon::start_data_table("LC_tableBrowseRes")
1.182     bisitz    558:                  .&Apache::loncommon::start_data_table_header_row());
                    559: 	$r->print("<th $colspan>".&mt('Name')."</th>\n");
                    560: 	$r->print("<th>".&mt('Title')."</th>\n") 
1.45      ng        561: 	    if ($hash{'display_attrs_0'} == 1);
1.194     jms       562: 	$r->print('<th class="LC_right">'.&mt("Size")." (".&mt("bytes").") ".
1.182     bisitz    563: 		  "</th>\n") if ($hash{'display_attrs_1'} == 1);
                    564: 	$r->print("<th>".&mt("Last accessed")."</th>\n") 
1.17      harris41  565: 	    if ($hash{'display_attrs_2'} == 1);
1.182     bisitz    566: 	$r->print("<th>".&mt("Last modified")."</th>\n")
1.17      harris41  567: 	    if ($hash{'display_attrs_3'} == 1);
1.182     bisitz    568: 	$r->print("<th>".&mt("Author(s)")."</th>\n")
1.17      harris41  569: 	    if ($hash{'display_attrs_4'} == 1);
1.182     bisitz    570: 	$r->print("<th>".&mt("Keywords")."</th>\n")
1.17      harris41  571: 	    if ($hash{'display_attrs_5'} == 1);
1.182     bisitz    572: 	$r->print("<th>".&mt("Language")."</th>\n")
1.45      ng        573: 	    if ($hash{'display_attrs_6'} == 1);
1.182     bisitz    574: 	$r->print("<th>".&mt("Usage Statistics")." <br />(".
                    575: 		  &mt("Courses/Network Hits").") ".&mt('updated periodically')."</th>\n")
1.70      ng        576: 	    if ($hash{'display_attrs_8'} == 1);
1.182     bisitz    577: 	$r->print("<th>".&mt("Source Available")."</th>\n")
1.109     taceyjo1  578: 	    if ($hash{'display_attrs_10'} == 1);
1.182     bisitz    579: 	$r->print("<th>".&mt("Linked/Related Resources")."</th>\n")
1.111     www       580: 	    if ($hash{'display_attrs_11'} == 1);
1.182     bisitz    581: 	$r->print("<th>".&mt("Resource")."</th>\n")
1.115     www       582: 	    if ($hash{'display_attrs_7'} == 1);
1.185     jms       583: 	$r->print("<th>".&mt("Subject")."</th>\n")
                    584: 	    if ($hash{'display_attrs_12'} == 1);
1.186     jms       585: 	$r->print("<th>".&mt("Notes")."</th>\n")
                    586: 	    if ($hash{'display_attrs_13'} == 1);
                    587: 	$r->print("<th>".&mt("Abstract")."</th>\n")
                    588: 	    if ($hash{'display_attrs_14'} == 1);
1.193     jms       589: 	$r->print("<th>".&mt("Grade Level")."</th>\n")
                    590: 	    if ($hash{'display_attrs_15'} == 1);
1.195   ! jms       591: 	$r->print("<th>".&mt("Standards")."</th>\n")
        !           592: 	    if ($hash{'display_attrs_16'} == 1);
1.185     jms       593: 	    
                    594:     $r->print(&Apache::loncommon::end_data_table_header_row());
                    595:     
                    596:     	
1.5       harris41  597: 
1.23      harris41  598: # ----------------- read in what directories have previously been set to "open"
1.27      harris41  599: 	foreach (keys %hash) {
1.4       harris41  600: 	    if ($_ =~ /^diropen_status_/) {
                    601: 		my $key = $_;
                    602: 		$key =~ s/^diropen_status_//;
                    603: 		$dirs{$key} = $hash{$_};
                    604: 	    }
1.27      harris41  605: 	}
1.4       harris41  606: 
1.133     albertel  607: 	if ($env{'form.openuri'}) {  # take care of review and refresh options
                    608: 	    my $uri=$env{'form.openuri'};
1.4       harris41  609: 	    if (exists($hash{'diropen_status_'.$uri})) {
                    610: 		my $cursta = $hash{'diropen_status_'.$uri};
1.2       harris41  611: 		$dirs{$uri} = 'open';
1.4       harris41  612: 		$hash{'diropen_status_'.$uri} = 'open';
                    613: 		if ($cursta eq 'open') {
                    614: 		    $dirs{$uri} = 'closed';
                    615: 		    $hash{'diropen_status_'.$uri} = 'closed';
                    616: 		}
1.2       harris41  617: 	    } else {
1.4       harris41  618: 		$hash{'diropen_status_'.$uri} = 'open';
1.2       harris41  619: 		$dirs{$uri} = 'open';
                    620: 	    }
                    621: 	}
1.12      ng        622: 	
                    623: 	my $toplevel;
1.13      ng        624: 	my $indent = 0;
1.12      ng        625: 	$uri = $uri.'/' if $uri !~ /.*\/$/;
1.17      harris41  626: 
1.133     albertel  627:  	if ($env{'form.dirPointer'} ne 'on') {
1.88      www       628:  	    $hash{'top.level'} = $uri;
                    629:  	    $toplevel = $uri;
                    630:  	} else {
                    631:  	    $toplevel = $hash{'top.level'};
                    632:  	}
1.17      harris41  633: 
1.23      harris41  634: # -------------------------------- if not at top level, provide an uplink arrow
1.45      ng        635: 	if ($toplevel ne '/res/'){
1.13      ng        636: 	    my (@uri_com) = split(/\//,$uri);
                    637: 	    pop @uri_com;
                    638: 	    my $upone = join('/',@uri_com);
                    639: 	    my @list = qw (0);
                    640: 	    &display_line ($r,'opened',$upone.'&viewOneUp',0,$upone,@list);
                    641: 	    $indent = 1;
1.12      ng        642: 	}
1.17      harris41  643: 
1.23      harris41  644: # -------- recursively go through all the directories and output as appropriate
1.16      harris41  645: 	&scanDir ($r,$toplevel,$indent,\%hash);
1.152     albertel  646: 
                    647: # -------------------------------------------------------------- end the tables
1.182     bisitz    648:         $r->print(&Apache::loncommon::end_data_table());
                    649: 
1.23      harris41  650: # ---------------------------- embed hidden information useful for group import
1.152     albertel  651: 	$r->print("<form name='fnum' action=''>");
1.131     albertel  652: 	$r->print("<input type='hidden' name='fnum' value='$fnum' /></form>");
1.17      harris41  653: 
1.23      harris41  654: # --------------------------------------------------- end the output and return
1.141     albertel  655: 	$r->print(&Apache::loncommon::end_page()."\n");
1.2       harris41  656:     }
1.67      matthew   657:     if(! $c->aborted()) {
1.87      www       658: # write back into the temporary file
1.68      albertel  659: 	my %dbfile;
1.67      matthew   660:         if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_NEWDB(),0640)) {
                    661:             while (my($key,$value) = each(%hash)) {
                    662:                 $dbfile{$key}=$value;
                    663:             }
                    664:             untie(%dbfile);
                    665:         }
                    666:     }
                    667: 
1.1       www       668:     return OK;
                    669: }
1.2       harris41  670: 
1.17      harris41  671: # ----------------------------------------------- recursive scan of a directory
1.2       harris41  672: sub scanDir {
1.16      harris41  673:     my ($r,$startdir,$indent,$hashref)=@_;
1.67      matthew   674:     my $c = $r->connection();
1.3       harris41  675:     my ($compuri,$curdir);
                    676:     my $dirptr=16384;
1.90      taceyjo1  677:     my $obs;
1.1       www       678:     $indent++;
1.2       harris41  679:     my %dupdirs = %dirs;
                    680:     my @list=&get_list($r,$startdir);
                    681:     foreach my $line (@list) {
1.67      matthew   682:         return if ($c->aborted());
1.90      taceyjo1  683: 	#This is a kludge, sorry aboot this
1.92      taceyjo1  684: 	my ($strip,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); 
1.90      taceyjo1  685: 	next if($strip =~ /.*\.meta$/ | $obs eq '1');
1.18      ng        686: 	my (@fileparts) = split(/\./,$strip);
1.70      ng        687: 	if ($hash{'display_attrs_9'} != 1) {
1.181     bisitz    688:             # if not all versions to be shown
1.18      ng        689: 	    if (scalar(@fileparts) >= 3) {
                    690: 		my $fext = pop @fileparts;
                    691: 		my $ov = pop @fileparts;
                    692: 		my $fname = join ('.',@fileparts,$fext);
1.75      albertel  693: 		next if (grep /\Q$fname\E/,@list and $ov =~ /^\d+$/);
1.18      ng        694: 	    }
                    695: 	}
                    696: 
1.45      ng        697: 	if ($dom eq 'domain') {
1.72      albertel  698: 	    # dom list has full path /res/<domain name>/ already
                    699: 	    $curdir='';
1.73      albertel  700: 	    $compuri = (split(/\&/,$line))[0];
1.2       harris41  701: 	} else {
1.17      harris41  702: 	    # user, dir & file have name only, i.e., w/o path
1.45      ng        703: 	    $compuri = join('',$startdir,$strip,'/');
1.3       harris41  704: 	    $curdir = $startdir;
1.2       harris41  705: 	}
1.45      ng        706: 	my $diropen = 'closed';
1.96      www       707: 	if (($dirptr&$testdir) or ($dom =~ /^(domain|user)$/) or ($compuri=~/\.(sequence|page)\/$/)) {
1.3       harris41  708: 	    while (my ($key,$val)= each %dupdirs) {
1.5       harris41  709: 		if ($key eq $compuri and $val eq "open") {
1.11      ng        710: 		    $diropen = "opened";
1.53      albertel  711: 		    delete($dupdirs{$key});
                    712: 		    delete($dirs{$key});
1.5       harris41  713: 		}
1.3       harris41  714: 	    }
1.1       www       715: 	}
1.16      harris41  716: 	&display_line($r,$diropen,$line,$indent,$curdir,$hashref,@list);
1.45      ng        717: 	&scanDir ($r,$compuri,$indent) if $diropen eq 'opened';
1.1       www       718:     }
                    719:     $indent--;
                    720: }
                    721: 
1.17      harris41  722: # --------------- get complete matched list based on the uri (returns an array)
1.1       www       723: sub get_list {
                    724:     my ($r,$uri)=@_;
1.97      www       725:     my @list=();
1.45      ng        726:     (my $luri = $uri) =~ s/\//_/g;
1.133     albertel  727:     if ($env{'form.updatedisplay'}) {
1.27      harris41  728: 	foreach (keys %hash) {
1.4       harris41  729: 	    delete $hash{$_} if ($_ =~ /^dirlist_files_/);
1.121     albertel  730: 	    delete $hash{$_} if ($_ =~ /^dirlist_timestamp_files_/);
1.87      www       731: 	}
1.2       harris41  732:     }
                    733: 
1.121     albertel  734:     if (defined($hash{'dirlist_files_'.$luri}) &&
                    735: 	$hash{'dirlist_timestamp_files_'.$luri}+600 > (time)) {
1.4       harris41  736: 	@list = split(/\n/,$hash{'dirlist_files_'.$luri});
1.97      www       737:     } elsif ($uri=~/\.(page|sequence)\/$/) {
1.94      www       738: # is a page or a sequence
1.97      www       739: 	$uri=~s/\/$//;
                    740: 	$uri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1];
                    741: 	$uri=~s/\/+/\//g;
                    742: 	foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$uri))) {
                    743: 	    my @ratpart=split(/\:/,$_);
1.156     albertel  744: 	    push(@list,&LONCAPA::map::qtescape($ratpart[1]));
1.97      www       745: 	} 
1.94      www       746: 	$hash{'dirlist_files_'.$luri} = join("\n",@list);
1.1       www       747:     } else {
1.94      www       748: # is really a directory
1.4       harris41  749: 	@list = &Apache::lonnet::dirlist($uri);
1.87      www       750: 	$hash{'dirlist_files_'.$luri} = join("\n",@list);
1.121     albertel  751: 	$hash{'dirlist_timestamp_files_'.$luri} = time;
1.1       www       752:     }
1.156     albertel  753:     return @list=&match_ext($r,@list);    
1.1       www       754: }
                    755: 
1.112     www       756: sub dynmetaread {
                    757:     my $uri=shift;
                    758:     if (($hash{'display_attrs_8'}==1) || ($hash{'display_attrs_11'}==1)) {
1.117     www       759: # We don't want the filename
                    760: 	$uri=~s/\/[^\/]+$//;
                    761: # Did we already see this?
                    762: 	my $builddir=$uri;
                    763: 	while ($builddir) {
                    764: 	    if ($dynread{$builddir}) {
                    765: 		return 0;
                    766: 	    }
                    767: 	    $builddir=~s/\/[^\/]+$//;
                    768: 	}
                    769: # Actually get the data
1.112     www       770: 	%dynhash=
1.143     www       771: 	    (%dynhash,&Apache::lonmeta::get_dynamic_metadata_from_sql($uri.'/'));
1.117     www       772: # Remember that we got it
                    773: 	$dynread{$uri}=1;
1.112     www       774:     } 
                    775: }
                    776: 
1.40      matthew   777: sub initdebug {
1.141     albertel  778:     my $start_page=
                    779: 	&Apache::loncommon::start_page('Debug',undef,
                    780: 				       {'only_body' => 1,});
                    781:     $start_page =~ s/\n/ /g;
1.40      matthew   782:     return <<ENDJS;
1.141     albertel  783: <script type="text/javascript">
1.40      matthew   784: var debugging = true;
                    785: if (debugging) {
                    786:     var debuggingWindow = window.open('','Debug','width=400,height=300',true);
                    787: } 
                    788: 
                    789: function output(text) {
                    790:     if (debugging) {
                    791:         debuggingWindow.document.writeln(text);
                    792:     }
                    793: }
1.141     albertel  794: output('$start_page<pre>');   
1.40      matthew   795: </script>
                    796: ENDJS
                    797: }
                    798: 
                    799: sub writedebug {
1.141     albertel  800:     my ($text) = @_;
                    801:     return "<script type=\"text/javascript\">output('$text');</script>";
1.40      matthew   802: }
                    803: 
1.17      harris41  804: # -------------------- filters out files based on extensions (returns an array)
1.1       www       805: sub match_ext {
                    806:     my ($r,@packlist)=@_;
                    807:     my @trimlist;
                    808:     my $nextline;
                    809:     my @fileext;
                    810:     my $dirptr=16384;
                    811: 
1.2       harris41  812:     foreach my $line (@packlist) {
                    813: 	chomp $line;
                    814: 	$line =~ s/^\/home\/httpd\/html//;
                    815: 	my @unpackline = split (/\&/,$line);
1.45      ng        816: 	next if ($unpackline[0] eq '.');
                    817: 	next if ($unpackline[0] eq '..');
1.2       harris41  818: 	my @filecom = split (/\./,$unpackline[0]);
                    819: 	my $fext = pop(@filecom);
1.96      www       820: 	my $fnptr = ($unpackline[3]&$dirptr) || ($fext=~/\.(page|sequence)$/);
1.2       harris41  821:  	if ($fnptr == 0 and $unpackline[3] ne "") {
1.28      harris41  822: 	    my $embstyle = &Apache::loncommon::fileembstyle($fext);
1.25      matthew   823:             push @trimlist,$line if (defined($embstyle) && 
1.32      harris41  824: 				     ($embstyle ne 'hdn' or $fext eq 'meta'));
1.1       www       825: 	} else {
1.2       harris41  826: 	    push @trimlist,$line;
1.1       www       827: 	}
                    828:     }
1.80      albertel  829:     @trimlist = sort {uc($a) cmp uc($b)} (@trimlist);
1.1       www       830:     return @trimlist;
                    831: }
                    832: 
1.17      harris41  833: # ------------------------------- displays one line in appropriate table format
1.23      harris41  834: sub display_line {
1.16      harris41  835:     my ($r,$diropen,$line,$indent,$startdir,$hashref,@list)=@_;
1.53      albertel  836:     my (@pathfn, $fndir);
1.97      www       837: # there could be relative paths (files actually belonging into this directory)
                    838: # or absolute paths (for example, from sequences)
                    839:     my $absolute;
                    840:     my $pathprefix;
1.107     albertel  841:     if ($line=~m|^/res/| && $startdir ne '') {
1.97      www       842: 	$absolute=1;
                    843: 	$pathprefix='';
                    844:     } else {
                    845: 	$absolute=0;
                    846: 	$pathprefix=$startdir;
                    847:     }
1.1       www       848:     my $dirptr=16384;
1.182     bisitz    849: #SB my $fileclr="#ffffe6";
1.45      ng        850:     my $iconpath= $r->dir_config('lonIconsURL') . '/';
1.1       www       851: 
                    852:     my @filecom = split (/\&/,$line);
                    853:     my @pathcom = split (/\//,$filecom[0]);
                    854:     my $listname = $pathcom[scalar(@pathcom)-1];
                    855:     my $fnptr = $filecom[3]&$dirptr;
1.77      www       856:     my $msg = &mt('View').' '.$filecom[0].' '.&mt('resources');
                    857:     $msg = &mt('Close').' '.$filecom[0].' '.&mt('directory') if $diropen eq 'opened';
1.194     jms       858:     my $nowOpen = ($diropen eq 'opened' ? 1 : 0);
1.1       www       859: 
1.45      ng        860:     my $tabtag='</td>';
1.1       www       861:     my $i=0;
1.195   ! jms       862:     while ($i<=16) {
1.45      ng        863: 	$tabtag=join('',$tabtag,"<td>&nbsp;</td>")
1.155     albertel  864: 	    if ($i != 9 &&
                    865: 		$hash{'display_attrs_'.$i} == 1);
1.194     jms       866: 	$i++;
1.1       www       867:     }
1.63      ng        868:     my $valign = ($hash{'display_attrs_7'} == 1 ? 'top' : 'bottom');
1.17      harris41  869: 
                    870: # display uplink arrow
1.45      ng        871:     if ($filecom[1] eq 'viewOneUp') {
1.98      www       872: 	my $updir=$startdir;
                    873: # -------------- Filter out sequence containment in crumbs and "recent folders"
                    874: 	$updir='/'.(split(/\.(page|sequence)\/\//,$startdir))[-1];
                    875: 	$updir=~s/\/+/\//g;
                    876: 
1.182     bisitz    877: #SB	$r->print("<tr valign='$valign' bgcolor=\"$fileclr\">$extrafield");
                    878:         $r->print(&Apache::loncommon::start_data_table_row()); # valign="$valign" ?!?
                    879:         $r->print($extrafield);
1.70      ng        880: 	$r->print("<td>\n");
1.98      www       881: 	$r->print ('<form method="post" name="dirpathUP" action="'.$updir.
1.16      harris41  882: 		   '/" '.
1.17      harris41  883: 		   'onSubmit="return rep_dirpath(\'UP\','.
                    884: 		   'document.forms.fileattr.acts.value)" '.
1.16      harris41  885: 		   'enctype="application/x-www-form-urlencoded"'.
                    886:                    '>'."\n");
1.170     albertel  887: 	$r->print(&Apache::loncommon::inhibit_menu_check('input'));
1.17      harris41  888: 	$r->print ('<input type=hidden name=openuri value="'.
1.131     albertel  889: 		   $startdir.'" />'."\n");
1.194     jms       890:         $r->print ('<input type="hidden" name="acts" value="" />'."\n");
                    891: 	$r->print ('<a href="#" onClick="document.dirpathUP.submit()"><img src="'.$iconpath.'arrow.up.gif"');
                    892: 	$r->print (' name="'.$msg.'" type="image" class="LC_fileicon" />'.
1.17      harris41  893: 		   "\n");
1.194     jms       894: 	$r->print(&mt("Up")."</a></form>$tabtag");
1.182     bisitz    895:         $r->print(&Apache::loncommon::end_data_table_row());
1.13      ng        896: 	return OK;
                    897:     }
1.97      www       898: # Do we have permission to look at this?
                    899: 
                    900:     if($filecom[15] ne '1') { return OK if (!&Apache::lonnet::allowed('bre',$pathprefix.$filecom[0])); }
                    901: 
                    902: # make absolute links appear on different background
1.182     bisitz    903: #SB    if ($absolute) { $fileclr='#ccdd99'; }
1.17      harris41  904: 
                    905: # display domain
1.45      ng        906:     if ($filecom[1] eq 'domain') {
1.131     albertel  907:  	$r->print ('<input type="hidden" name="dirPointer" value="on" />'."\n")
1.133     albertel  908:  	    if ($env{'form.dirPointer'} eq "on");
1.182     bisitz    909: #SB	$r->print("<tr valign='$valign' bgcolor=\"$fileclr\">$extrafield");
                    910: 	$r->print(&Apache::loncommon::start_data_table_row()); # valign="$valign" ?!?"
                    911:         $r->print($extrafield);
1.70      ng        912: 	$r->print("<td>");
1.73      albertel  913: 	&begin_form ($r,$filecom[0]);
                    914: 	my $anchor = $filecom[0];
1.162     albertel  915: 	$anchor =~ s/\W//g;
1.152     albertel  916: 	$r->print ('<a name="'.$anchor.'"></a>');
1.194     jms       917: $r->print ('<input type="hidden" name="acts" value="" />');
                    918: 	$r->print ('<a href="#" onClick="document.dirpath'.($dnum-1).'.submit()"><img src="'.$iconpath.'arrow.'.($nowOpen ? "open" : "closed" ).'.gif"'); 
                    919: 	$r->print (' name="'.$msg.'" type="image" class="LC_fileicon" /></a>'.
1.17      harris41  920: 		   "\n");
1.128     foxr      921: 	my $quotable_filecom = &Apache::loncommon::escape_single($filecom[0]);
1.125     foxr      922: 	$r->print ('<a href="javascript:gothere(\''.$quotable_filecom.
1.152     albertel  923: 		   '\')"><img alt="" src="'.$iconpath.'server.gif"');
1.194     jms       924: 	$r->print (' class="LC_fileicon" />'."\n");
                    925: 	$r->print (&mt("Domain")." - $listname </a>");
1.158     albertel  926: 	if (&Apache::lonnet::domain($listname,'description')) {
1.194     jms       927: 	    $r->print("<br />(".&Apache::lonnet::domain($listname,'description').
1.60      albertel  928: 		      ")");
                    929: 	}
1.182     bisitz    930: 	$r->print("</form>$tabtag");
                    931:          $r->print(&Apache::loncommon::end_data_table_row());
1.1       www       932: 	return OK;
1.17      harris41  933: 
                    934: # display user directory
1.1       www       935:     }
1.45      ng        936:     if ($filecom[1] eq 'user') {
1.160     banghart  937: 	# $r->print("<tr valign=$valign bgcolor=\"$fileclr\">$extrafield");
1.2       harris41  938: 	my $curdir = $startdir.$filecom[0].'/';
1.3       harris41  939: 	my $anchor = $curdir;
1.162     albertel  940: 	$anchor =~ s/\W//g;
1.182     bisitz    941: #SB	$r->print("<tr bgcolor=\"$fileclr\">$extrafield<td valign=$valign>");
                    942:         $r->print(&Apache::loncommon::start_data_table_row()
1.194     jms       943:                  .$extrafield.'<td class="LC_'.$valign.'">');
1.13      ng        944: 	&begin_form ($r,$curdir);
1.152     albertel  945: 	$r->print ('<a name="'.$anchor.'"></a><img alt="" src="'.$iconpath.
1.194     jms       946: 		   'whitespace_21.gif" class="LC_icon" />'."\n");
1.131     albertel  947: 	$r->print ('<input type="hidden" name="acts" value="" />');
1.194     jms       948: 	$r->print ('<a href="#" onClick="document.dirpath'.($dnum-1).'.submit()">');
                    949:         $r->print ('<img src="'.$iconpath.'arrow.'.($nowOpen ? "open" : "closed" ).
                    950: 		   '.gif" class="LC_fileicon"'); 
                    951: 	$r->print (' name="'.$msg.'"/></a>'.
1.17      harris41  952: 		   "\n");
1.128     foxr      953: 	my $quotable_curdir = &Apache::loncommon::escape_single($curdir);
1.125     foxr      954: 	$r->print ('<a href="javascript:gothere(\''.$quotable_curdir
1.162     albertel  955: 		   .'\')"><img alt="'.$msg.'" src="'.
1.194     jms       956: 		   $iconpath.'quill.gif" class="LC_fileicon" />');
1.60      albertel  957: 	my $domain=(split(m|/|,$startdir))[2];
                    958: 	my $plainname=&Apache::loncommon::plainname($listname,$domain);
1.194     jms       959:         $r->print ($listname.'</a>');
                    960: 
                    961:         if (defined($plainname) && $plainname) { $r->print(" ($plainname) "); }
                    962:         $r->print('</form>'.$tabtag);
1.182     bisitz    963:         $r->print(&Apache::loncommon::end_data_table_row());
1.194     jms       964:         return OK;
1.1       www       965:     }
1.17      harris41  966: 
1.1       www       967: # display file
1.194     jms       968:         if (($fnptr == 0 and $filecom[3] ne '') or $absolute) {
                    969:             my $title;
                    970:             my $filelink = $pathprefix.$filecom[0];
                    971:             if ($hash{'display_attrs_0'} == 1) {
                    972:                 $title = &Apache::lonnet::gettitle($filelink);
                    973:             }
                    974:             my @file_ext = split (/\./,$listname);
                    975:             my $curfext = $file_ext[-1];
                    976:             if (@Omit) {
                    977:                 foreach (@Omit) { return OK if (lc($curfext) eq $_); }
                    978:             }
                    979:             if (@Only) {
                    980:                 my $skip = 1;
                    981:                 foreach (@Only) { $skip = 0 if (lc($curfext) eq $_); }
                    982:                 return OK if ($skip > 0);
                    983:             }
                    984:             # Set the icon for the file
                    985:             my $iconname = &Apache::loncommon::icon($listname);
1.184     bisitz    986: #SB	$r->print("<tr valign='$valign' bgcolor=\"$fileclr\">);
1.194     jms       987:         $r->print(&Apache::loncommon::start_data_table_row()); #SB valign="$valign" ?!?
                    988:         $r->print('<td class="LC_middle LC_nobreak">');
1.104     albertel  989: 	
1.133     albertel  990:         if ($env{'form.catalogmode'} eq 'interactive') {
1.128     foxr      991: 	    my $quotable_filelink = &Apache::loncommon::escape_single($filelink);
1.35      matthew   992:             $r->print("<a href=\"javascript:select_data(\'",
1.125     foxr      993:                       $quotable_filelink,"')\">");
1.162     albertel  994: 	    $r->print("<img alt=\"\" src='",$iconpath,"select.gif' class='LC_icon' /></a>".
1.17      harris41  995: 		      "\n");
1.194     jms       996: 	    $r->print('</td><td class="LC_middle"><span class="LC_nobreak">');
1.145     www       997: 	} elsif ($env{'form.catalogmode'} eq 'import') {
1.152     albertel  998: 	    $r->print("<form name='form$fnum' action=''>\n");
1.8       harris41  999: 	    $r->print("<input type='checkbox' name='filelink"."' ".
1.16      harris41 1000: 		      "value='$filelink' onClick='".
                   1001: 		      "javascript:queue(\"form$fnum\")' ");
                   1002: 	    if ($hash{'store_'.$filelink}) {
                   1003: 		$r->print("checked");
                   1004: 	    }
1.131     albertel 1005: 	    $r->print(" />\n");
1.194     jms      1006: 	    $r->print('</form></td><td class="LC_middle"><span class="LC_nobreak">');
1.16      harris41 1007: 	    $hash{"pre_${fnum}_link"}=$filelink;
1.166     banghart 1008: 	    $hash{"pre_${fnum}_title"}=$title;
1.165     banghart 1009: 	    if (!$hash{"pre_${fnum}_title"}) {
1.167     banghart 1010: 	        $hash{"pre_${fnum}_title"} = 'Not_retrieved';
1.165     banghart 1011: 	    }
1.8       harris41 1012:   	    $fnum++;
1.7       harris41 1013: 	}
1.95      www      1014: # Form to open or close sequences
                   1015: 	if ($filelink=~/\.(page|sequence)$/) {
                   1016: 	    my $curdir = $startdir.$filecom[0].'/';
                   1017: 	    &begin_form($r,$curdir);
                   1018: 	    $indent--;
                   1019: 	}
                   1020: # General indentation
1.4       harris41 1021: 	    my $count = 0;
1.194     jms      1022: 	    while ($count < $indent) {
1.162     albertel 1023: 		$r->print("<img alt=\"\" src=".$iconpath.
1.194     jms      1024: 			  "whitespace_21.gif class='LC_icon' />\n");
                   1025: 	        $count++;
1.4       harris41 1026: 	    }
1.95      www      1027: # Sequence open/close icon
                   1028: 	if ($filelink=~/\.(page|sequence)$/) {
                   1029: 	    my $curdir = $startdir.$filecom[0].'/';
                   1030: 	    my $anchor = $curdir;
1.162     albertel 1031: 	    $anchor =~ s/\W//g;
1.131     albertel 1032: 	    $r->print ('<input type="hidden" name="acts" value="" />');
1.194     jms      1033: 	    $r->print ('<a name="'.$anchor.'"></a>');
                   1034:             $r->print ('<a href="#" onClick="document.dirpath'.($dnum-1).'.submit()">');
                   1035:             $r->print ('<img src="'.$iconpath.'arrow.'.($nowOpen ? "open" : "closed" ).
                   1036:                        '.gif" class="LC_fileicon"');
                   1037: 	    $r->print (' name="'.$msg.'" type="image" class="LC_fileicon" /></a>'.
1.95      www      1038: 		       "\n");
                   1039: 	}
                   1040: # Filetype icons
1.194     jms      1041: 	$r->print("<img alt=\"\" src='$iconname' class='LC_fileicon' />\n");
1.128     foxr     1042: 	my $quotable_filelink = &Apache::loncommon::escape_single($filelink);
1.125     foxr     1043: 
                   1044: 	$r->print (" <a href=\"javascript:openWindow('".$quotable_filelink.
1.170     albertel 1045: 		   "?inhibitmenu=yes','previewfile','450','500','no','yes','yes');\"".
1.152     albertel 1046: 		   " target=\"_self\">$listname</a> ");
1.170     albertel 1047: 	$quotable_filelink = &Apache::loncommon::escape_single($filelink.'.meta');
                   1048: 	&Apache::loncommon::inhibit_menu_check(\$quotable_filelink);
1.125     foxr     1049: 	$r->print (" (<a href=\"javascript:openWindow('".$quotable_filelink.
1.170     albertel 1050: 		   "?inhibitmenu=yes','metadatafile','500','550','no','yes','no');\" ".
1.180     bisitz   1051: 		   " target=\"_self\">".&mt('metadata')."</a>) ");
1.134     www      1052: # Close form to open/close sequence
                   1053: 	if ($filelink=~/\.(page|sequence)$/) {
                   1054: 	    $r->print('</form>');
                   1055: 	}
1.184     bisitz   1056: 	$r->print("</span></td>\n");
1.45      ng       1057: 	if ($hash{'display_attrs_0'} == 1) {
1.70      ng       1058: 	    $r->print('<td> '.($title eq '' ? '&nbsp;' : $title).
1.45      ng       1059: 		      ' </td>'."\n");
                   1060: 	}
1.194     jms      1061: 	$r->print('<td class="LC_right"> ',
1.17      harris41 1062: 		  $filecom[8]," </td>\n") 
1.45      ng       1063: 	    if $hash{'display_attrs_1'} == 1;
1.194     jms      1064: 	$r->print('<td class="LC_nobreak"> '.
1.181     bisitz   1065:                   (&Apache::lonlocal::locallocaltime($filecom[9]))." </td>\n")
1.45      ng       1066: 	    if $hash{'display_attrs_2'} == 1;
1.194     jms      1067: 	$r->print('<td class="LC_nobreak"> '.
1.181     bisitz   1068:                   (&Apache::lonlocal::locallocaltime($filecom[10]))." </td>\n")
1.45      ng       1069: 	    if $hash{'display_attrs_3'} == 1;
1.2       harris41 1070: 
1.45      ng       1071: 	if ($hash{'display_attrs_4'} == 1) {
1.104     albertel 1072: 	    my $author = &Apache::lonnet::metadata($filelink,'author');
1.194     jms      1073: 	    $r->print('<td class="LC_nobreak"> '.($author eq '' ? '&nbsp;' : $author).
1.17      harris41 1074: 		      " </td>\n");
1.2       harris41 1075: 	}
1.45      ng       1076: 	if ($hash{'display_attrs_5'} == 1) {
1.104     albertel 1077: 	    my $keywords = &Apache::lonnet::metadata($filelink,'keywords');
1.45      ng       1078: 	    # $keywords = '&nbsp;' if (!$keywords);
1.70      ng       1079: 	    $r->print('<td> '.($keywords eq '' ? '&nbsp;' : $keywords).
1.17      harris41 1080: 		      " </td>\n");
1.2       harris41 1081: 	}
1.109     taceyjo1 1082: 
1.45      ng       1083: 	if ($hash{'display_attrs_6'} == 1) {
1.104     albertel 1084: 	    my $lang = &Apache::lonnet::metadata($filelink,'language');
1.28      harris41 1085: 	    $lang = &Apache::loncommon::languagedescription($lang);
1.70      ng       1086: 	    $r->print('<td> '.($lang eq '' ? '&nbsp;' : $lang).
1.17      harris41 1087: 		      " </td>\n");
1.2       harris41 1088: 	}
1.70      ng       1089: 	if ($hash{'display_attrs_8'} == 1) {
1.111     www      1090: # statistics
1.117     www      1091: 	    &dynmetaread($filelink);
1.112     www      1092: 	    $r->print("<td>");
1.114     www      1093: 	    &dynmetaprint($r,$filelink,'count');
                   1094: 	    &dynmetaprint($r,$filelink,'course');
                   1095: 	    &dynmetaprint($r,$filelink,'stdno');
                   1096: 	    &dynmetaprint($r,$filelink,'avetries');
                   1097: 	    &dynmetaprint($r,$filelink,'difficulty');
                   1098: 	    &dynmetaprint($r,$filelink,'disc');
                   1099: 	    &dynmetaprint($r,$filelink,'clear');
                   1100: 	    &dynmetaprint($r,$filelink,'technical');
                   1101: 	    &dynmetaprint($r,$filelink,'correct');
                   1102: 	    &dynmetaprint($r,$filelink,'helpful');
                   1103: 	    &dynmetaprint($r,$filelink,'depth');
1.112     www      1104: 	    $r->print("&nbsp;</td>\n");
1.111     www      1105: 
1.70      ng       1106: 	}
1.109     taceyjo1 1107: 	if ($hash{'display_attrs_10'} == 1) {
                   1108: 	    my $source = &Apache::lonnet::metadata($filelink,'sourceavail');
1.110     albertel 1109: 	    if($source eq 'open') {
1.119     taceyjo1 1110: 		my $sourcelink = &Apache::lonsource::make_link($filelink,$listname);
1.128     foxr     1111: 		my $quotable_sourcelink = &Apache::loncommon::escape_single($sourcelink);
1.170     albertel 1112: 		&Apache::loncommon::inhibit_menu_check(\$quotable_sourcelink);
1.125     foxr     1113: 		$r->print('<td>'."<a href=\"javascript:openWindow('"
                   1114: 			  .$quotable_sourcelink.
1.152     albertel 1115: 			  "', 'previewsource', '700', '700', 'no', 'yes','yes');\"".
1.181     bisitz   1116: 			  " target=\"_self\">".&mt('Source Code')."</a> "."</td>\n");
1.110     albertel 1117: 	    } else { #A cuddled else. :P
1.111     www      1118: 		$r->print("<td>&nbsp;</td>\n");
1.110     albertel 1119: 	    }
1.109     taceyjo1 1120: 	}
1.111     www      1121: 	if ($hash{'display_attrs_11'} == 1) {
                   1122: # links
1.117     www      1123: 	   &dynmetaread($filelink);
1.113     www      1124: 	   $r->print('<td>');
1.148     www      1125: 	   &coursecontext($r,$filelink);
1.113     www      1126: 	   &dynmetaprint($r,$filelink,'goto_list');
                   1127: 	   &dynmetaprint($r,$filelink,'comefrom_list');
                   1128: 	   &dynmetaprint($r,$filelink,'sequsage_list');
1.114     www      1129: 	   &dynmetaprint($r,$filelink,'dependencies');
1.139     www      1130:            &dynmetaprint($r,$filelink,'course_list');
1.113     www      1131: 	   $r->print('</td>');
1.114     www      1132:         }
1.185     jms      1133:         
                   1134:    
                   1135: 	
                   1136: 	if ($hash{'display_attrs_7'} == 1) {
1.115     www      1137: # Show resource
1.140     www      1138: 	   my $output=&showpreview($filelink);
                   1139:            $r->print('<td> '.($output eq '' ? '&nbsp;':$output).
1.115     www      1140: 		      " </td>\n");
1.1       www      1141:     }
1.185     jms      1142:     
                   1143:     if ($hash{'display_attrs_12'} == 1) {
                   1144: 	    my $subject = &Apache::lonnet::metadata($filelink,'subject');
                   1145: 	    $r->print('<td> '.($subject eq '' ? '&nbsp;' : $subject).
                   1146: 		      " </td>\n");
                   1147: 	}
                   1148: 	
1.186     jms      1149: 	if ($hash{'display_attrs_13'} == 1) {
                   1150: 	    my $notes = &Apache::lonnet::metadata($filelink,'notes');
                   1151: 	    $r->print('<td> '.($notes eq '' ? '&nbsp;' : $notes).
                   1152: 		      " </td>\n");
                   1153: 	}
                   1154: 	
                   1155: 	if ($hash{'display_attrs_14'} == 1) {
                   1156: 	    my $abstract = &Apache::lonnet::metadata($filelink,'abstract');
                   1157: 	    $r->print('<td> '.($abstract eq '' ? '&nbsp;' : $abstract).
                   1158: 		      " </td>\n");
                   1159: 	}
                   1160: 	
1.193     jms      1161: 	if ($hash{'display_attrs_15'} == 1) {
                   1162: 	    my $gradelevel = &Apache::lonnet::metadata($filelink,'gradelevel');
                   1163: 	    $r->print('<td> '.($gradelevel eq '' ? '&nbsp;' : $gradelevel).
                   1164: 		      " </td>\n");
                   1165: 	}
                   1166: 	
1.195   ! jms      1167: 	if ($hash{'display_attrs_16'} == 1) {
        !          1168: 	    my $standards = &Apache::lonnet::metadata($filelink,'standards');
        !          1169: 	    $r->print('<td> '.($standards eq '' ? '&nbsp;' : $standards).
        !          1170: 		      " </td>\n");
        !          1171: 	}
        !          1172: 	
1.185     jms      1173: 	$r->print(&Apache::loncommon::end_data_table_row());
                   1174: }
                   1175:     
                   1176:     
1.17      harris41 1177: 
1.2       harris41 1178: # -- display directory
1.1       www      1179:     if ($fnptr == $dirptr) {
1.2       harris41 1180: 	my $curdir = $startdir.$filecom[0].'/';
1.3       harris41 1181: 	my $anchor = $curdir;
1.162     albertel 1182: 	$anchor =~ s/\W//g;
1.182     bisitz   1183: #SB	$r->print("<tr bgcolor=\"$fileclr\">$extrafield<td valign=$valign>");
                   1184:         $r->print(&Apache::loncommon::start_data_table_row()); # SB: bgcolor suggestion: darkgrey ("LC_info_row"?!?)
                   1185: #	$r->print('<tr class="LC_info_row">');
1.194     jms      1186:         $r->print($extrafield.'<td class="LC_middle LC_nobreak">');
1.2       harris41 1187: 	&begin_form ($r,$curdir);
1.4       harris41 1188: 	my $indentm1 = $indent-1;
1.194     jms      1189: 	my $count = 0;
                   1190: 	while ($count < $indentm1) {
                   1191: 	    $r->print ("<img alt=\"\" src=",$iconpath
                   1192: 	               ,"whitespace_21.gif class='LC_icon' />\n");
                   1193:             $count++;
1.1       www      1194: 	}
1.131     albertel 1195: 	$r->print ('<input type="hidden" name="acts" value="" />');
1.194     jms      1196: 	$r->print ('<a name="'.$anchor.'"></a>');
                   1197:         $r->print ('<a href="#" onClick="document.dirpath'.($dnum-1).'.submit()"><img src="'.$iconpath.
                   1198: 		   'arrow.'.($nowOpen ? "open" : "closed" ).'.gif"');
                   1199: 	$r->print (' name="'.$msg.'" class="LC_fileicon" /></a>'.
1.17      harris41 1200: 		   "\n");
1.128     foxr     1201: 	my $quotable_curdir = &Apache::loncommon::escape_single($curdir);
1.194     jms      1202:         
                   1203:         my $location = &Apache::loncommon::lonhttpdurl("/adm/lonIcons");
                   1204: 	my $icon = "navmap.folder.".($nowOpen ? "open":"closed").'.gif';
                   1205:         $r->print ('<a href="javascript:gothere(\''
                   1206: 		   .$quotable_curdir.'\')"">'
                   1207: 		   .'<img class="LC_fileicon" alt="'.&mt('Open Folder').'" src="'.
                   1208:                    $location."/".$icon.'" />'.
                   1209:                    "\n");
                   1210: 	$r->print ("$listname</a></form></td>\n");
1.86      www      1211: # Attributes
                   1212: 	my $filelink = $startdir.$filecom[0].'/default';
                   1213: 
                   1214: 	if ($hash{'display_attrs_0'} == 1) {
1.169     albertel 1215: 	    my $title = &Apache::lonnet::gettitle($filelink);
1.86      www      1216: 	    $r->print('<td> '.($title eq '' ? '&nbsp;' : $title).
                   1217: 		      ' </td>'."\n");
                   1218: 	}
1.194     jms      1219: 	$r->print('<td class="LC_right"> ',
1.86      www      1220: 		  $filecom[8]," </td>\n") 
                   1221: 	    if $hash{'display_attrs_1'} == 1;
1.194     jms      1222: 	$r->print('<td class="LC_break"> '.
1.181     bisitz   1223:                   (&Apache::lonlocal::locallocaltime($filecom[9]))." </td>\n")
1.86      www      1224: 	    if $hash{'display_attrs_2'} == 1;
1.194     jms      1225: 	$r->print('<td class="LC_break"> '.
1.181     bisitz   1226:                   (&Apache::lonlocal::locallocaltime($filecom[10]))." </td>\n")
1.86      www      1227: 	    if $hash{'display_attrs_3'} == 1;
                   1228: 
                   1229: 	if ($hash{'display_attrs_4'} == 1) {
                   1230: 	    my $author = &Apache::lonnet::metadata($filelink,'author');
                   1231: 	    $r->print('<td> '.($author eq '' ? '&nbsp;' : $author).
                   1232: 		      " </td>\n");
                   1233: 	}
                   1234: 	if ($hash{'display_attrs_5'} == 1) {
                   1235: 	    my $keywords = &Apache::lonnet::metadata($filelink,'keywords');
                   1236: 	    # $keywords = '&nbsp;' if (!$keywords);
                   1237: 	    $r->print('<td> '.($keywords eq '' ? '&nbsp;' : $keywords).
                   1238: 		      " </td>\n");
                   1239: 	}
                   1240: 	if ($hash{'display_attrs_6'} == 1) {
                   1241: 	    my $lang = &Apache::lonnet::metadata($filelink,'language');
                   1242: 	    $lang = &Apache::loncommon::languagedescription($lang);
                   1243: 	    $r->print('<td> '.($lang eq '' ? '&nbsp;' : $lang).
                   1244: 		      " </td>\n");
                   1245: 	}
1.185     jms      1246: 	
1.86      www      1247: 	if ($hash{'display_attrs_8'} == 1) {
                   1248: 	   $r->print('<td>&nbsp;</td>');
                   1249: 	}
1.115     www      1250:  	if ($hash{'display_attrs_10'} == 1) {
1.109     taceyjo1 1251: 	   $r->print('<td>&nbsp;</td>');
                   1252: 	}
1.185     jms      1253: 	if ($hash{'display_attrs_7'} == 1) {
                   1254: 	   $r->print('<td>&nbsp;</td>');
                   1255:     }     
                   1256:     if ($hash{'display_attrs_11'} == 1) {
1.111     www      1257: 	   $r->print('<td>&nbsp;</td>');
                   1258: 	}
1.185     jms      1259: 	if ($hash{'display_attrs_12'} == 1) {
                   1260: 	    my $subject = &Apache::lonnet::metadata($filelink,'subject');
                   1261: 	    $r->print('<td> '.($subject eq '' ? '&nbsp;' : $subject).
                   1262: 		      " </td>\n");
                   1263: 	}
1.186     jms      1264: 	if ($hash{'display_attrs_13'} == 1) {
                   1265: 	    my $notes = &Apache::lonnet::metadata($filelink,'notes');
                   1266: 	    $r->print('<td> '.($notes eq '' ? '&nbsp;' : $notes).
                   1267: 		      " </td>\n");
                   1268: 	}
                   1269: 	
                   1270: 	if ($hash{'display_attrs_14'} == 1) {
                   1271: 	    my $abstract = &Apache::lonnet::metadata($filelink,'abstract');
                   1272: 	    $r->print('<td> '.($abstract eq '' ? '&nbsp;' : $abstract).
                   1273: 		      " </td>\n");
                   1274: 	}
1.185     jms      1275: 	
1.193     jms      1276: 	if ($hash{'display_attrs_15'} == 1) {
                   1277: 	    my $gradelevel = &Apache::lonnet::metadata($filelink,'gradelevel');
                   1278: 	    $r->print('<td> '.($gradelevel eq '' ? '&nbsp;' : $gradelevel).
                   1279: 		      " </td>\n");
                   1280: 	}
                   1281: 	
1.195   ! jms      1282: 	if ($hash{'display_attrs_16'} == 1) {
        !          1283: 	    my $standards = &Apache::lonnet::metadata($filelink,'standards');
        !          1284: 	    $r->print('<td> '.($standards eq '' ? '&nbsp;' : $standards).
        !          1285: 		      " </td>\n");
        !          1286: 	}
        !          1287: 	
        !          1288: 	
1.185     jms      1289: 	$r->print(&Apache::loncommon::end_data_table_row());
1.1       www      1290:     }
1.2       harris41 1291: 
1.1       www      1292: }
                   1293: 
1.148     www      1294: sub coursecontext {
                   1295:     my ($r,$filelink)=@_;
                   1296:     my $filesymb=&Apache::lonnet::symbread($filelink);
                   1297:     if ($filesymb) {
                   1298: 	my ($map,$index,$resource)=&Apache::lonnet::decode_symb($filesymb);
                   1299: 	$r->print(&mt('Already in this course:<br />[_1] in folder/map [_2].<br />',
                   1300: 	      &Apache::lonnet::gettitle($resource),
                   1301: 	      &Apache::lonnet::gettitle($map)));
                   1302:     }
                   1303: }
                   1304: 
1.140     www      1305: sub showpreview {
                   1306:     my ($filelink)=@_;
1.151     albertel 1307:     if ($filelink=~m-^(/ext/|http://)-) {
1.150     www      1308: 	return &mt('External Resource, preview not enabled');
                   1309:     }
1.140     www      1310:     my ($curfext)=($filelink=~/\.(\w+)$/);
                   1311:     my $output='';
                   1312:     my $embstyle=&Apache::loncommon::fileembstyle($curfext);
                   1313:     if ($embstyle eq 'ssi') {
                   1314:        my $cache=$Apache::lonnet::perlvar{'lonDocRoot'}.$filelink.
                   1315:                     '.tmp';
                   1316:        if ((!$env{'form.updatedisplay'}) &&
                   1317:                     (-e $cache)) {
                   1318:           open(FH,$cache);
                   1319:           $output=join("\n",<FH>);
                   1320:           close(FH);
                   1321:        } else {
1.147     www      1322: # In update display mode, remove old cache. This is done to retroactively
                   1323: # clean up course context renderings.
                   1324: 	  if (-e $cache) {
                   1325: 	       unlink($cache);
                   1326: 	  }
1.140     www      1327:           $output=&Apache::lonnet::ssi_body($filelink);
1.146     www      1328: # Is access denied? Don't render, don't store
1.140     www      1329:           if ($output=~/LONCAPAACCESSCONTROLERRORSCREEN/s) {
                   1330:              $output='';
1.146     www      1331: # Was this rendered in course content? Don't store
                   1332:           } elsif (!&Apache::lonnet::symbread($filelink)) {
1.140     www      1333:              open(FH,">$cache");
                   1334:              print FH $output;
                   1335:              close(FH);
                   1336:           }
                   1337:        }
1.194     jms      1338:        $output='<span class="LC_fontsize_medium">'.$output.'</span>';
1.140     www      1339:     } elsif ($embstyle eq 'img') {
1.152     albertel 1340:        $output='<img alt="'.&mt('Preview').'" src="'.$filelink.'" />';
1.154     albertel 1341:     } elsif ($filelink=~m{^/res/($match_domain)/($match_username)/}) {
1.152     albertel 1342:        $output='<img  alt="'.&mt('Preview').'" src="http://'.
1.157     albertel 1343:                  &Apache::lonnet::hostname(&Apache::lonnet::homeserver($2,$1)).
1.140     www      1344:                  '/cgi-bin/thumbnail.gif?url='.$filelink.'" />';
                   1345:     }
                   1346:     return $output;
                   1347: }
                   1348: 
1.113     www      1349: sub dynmetaprint {
                   1350:     my ($r,$filelink,$item)=@_;
                   1351:     if ($dynhash{$filelink}->{$item}) {
1.114     www      1352: 	$r->print("\n<br />".$fieldnames{$item}.': '.
1.113     www      1353: 		  &Apache::lonmeta::prettyprint($item,
                   1354: 						$dynhash{$filelink}->{$item},
1.145     www      1355: 		  (($env{'form.catalogmode'} ne 'import')?'preview':''),
1.113     www      1356: 		  '',
1.145     www      1357: 		  (($env{'form.catalogmode'} eq 'import')?'document.forms.fileattr':''),1));
1.113     www      1358:     }
                   1359: }
                   1360: 
1.14      harris41 1361: # ------------------- prints the beginning of a form for directory or file link
1.1       www      1362: sub begin_form {
                   1363:     my ($r,$uri) = @_;
1.3       harris41 1364:     my $anchor = $uri;
1.162     albertel 1365:     $anchor =~ s/\W//g;
                   1366:     $uri=&Apache::loncommon::escape_single($uri);
1.17      harris41 1367:     $r->print ('<form method="post" name="dirpath'.$dnum.'" action="'.$uri.
                   1368: 	       '#'.$anchor.
                   1369: 	       '" onSubmit="return rep_dirpath(\''.$dnum.'\''.
                   1370: 	       ',document.forms.fileattr.acts.value)" '.
1.16      harris41 1371: 	       'enctype="application/x-www-form-urlencoded">'."\n");
1.131     albertel 1372:     $r->print ('<input type="hidden" name="openuri" value="'.$uri.'" />'.
1.17      harris41 1373: 	       "\n");
1.131     albertel 1374:     $r->print ('<input type="hidden" name="dirPointer" value="on" />'."\n");
1.170     albertel 1375:     $r->print(&Apache::loncommon::inhibit_menu_check('input'));
1.16      harris41 1376:     $dnum++;
1.17      harris41 1377: }
                   1378: 
                   1379: # --------- settings whenever the user causes the indexer window to be launched
                   1380: sub start_fresh_session {
1.149     albertel 1381:     my ($hash) = @_;
                   1382:     delete $hash->{'form.catalogmode'};
                   1383:     delete $hash->{'form.mode'};
                   1384:     delete $hash->{'form.form'};
                   1385:     delete $hash->{'form.element'};
                   1386:     delete $hash->{'form.omit'};
                   1387:     delete $hash->{'form.only'};
                   1388:     foreach (keys %{$hash}) {
                   1389:         delete $hash->{$_} if (/^(pre_|store)/);
1.27      harris41 1390:     }
1.1       www      1391: }
                   1392: 
1.35      matthew  1393: # ------------------------------------------------------------------- setvalues
                   1394: sub setvalues {
                   1395:     # setvalues is used in registerurl to synchronize the database
                   1396:     # hash and environment hashes
                   1397:     my ($H1,$h1key,$H2,$h2key) =@_;
                   1398:     #
                   1399:     if (exists $H2->{$h2key}) {
                   1400: 	$H1->{$h1key} = $H2->{$h2key};
                   1401:     } elsif (exists $H1->{$h1key}) {
                   1402: 	$H2->{$h2key} = $H1->{$h1key};
                   1403:     } 
                   1404: }
                   1405: 
1.1       www      1406: 1;
1.54      www      1407: 
                   1408: sub cleanup {
1.55      www      1409:     if (tied(%hash)){
                   1410: 	&Apache::lonnet::logthis('Cleanup indexer: hash');
                   1411:     }
1.138     albertel 1412:     return OK;
1.54      www      1413: }
1.23      harris41 1414: 
1.126     foxr     1415: 
                   1416: 
                   1417: 
                   1418: 
1.23      harris41 1419: =head1 NAME
                   1420: 
                   1421: Apache::lonindexer - mod_perl module for cross server filesystem browsing
                   1422: 
                   1423: =head1 SYNOPSIS
                   1424: 
                   1425: Invoked by /etc/httpd/conf/srm.conf:
                   1426: 
                   1427:  <LocationMatch "^/res.*/$">
                   1428:  SetHandler perl-script
                   1429:  PerlHandler Apache::lonindexer
                   1430:  </LocationMatch>
                   1431: 
                   1432: =head1 INTRODUCTION
                   1433: 
                   1434: This module enables a scheme of browsing across a cross server.
                   1435: 
                   1436: This is part of the LearningOnline Network with CAPA project
                   1437: described at http://www.lon-capa.org.
                   1438: 
                   1439: =head1 BEGIN SUBROUTINE
                   1440: 
                   1441: This routine is only run once after compilation.
                   1442: 
                   1443: =over 4
                   1444: 
                   1445: =item *
                   1446: 
                   1447: Initializes %language hash table.
                   1448: 
                   1449: =back
                   1450: 
                   1451: =head1 HANDLER SUBROUTINE
                   1452: 
                   1453: This routine is called by Apache and mod_perl.
                   1454: 
                   1455: =over 4
                   1456: 
                   1457: =item *
                   1458: 
                   1459: read in machine configuration variables
                   1460: 
                   1461: =item *
                   1462: 
                   1463: see if called from an interactive mode
                   1464: 
                   1465: =item *
                   1466: 
                   1467: refresh environment with user database values (in %hash)
                   1468: 
                   1469: =item *
                   1470: 
                   1471: define extra fields and buttons in case of special mode
                   1472: 
                   1473: =item *
                   1474: 
                   1475: set catalogmodefunctions to have extra needed javascript functionality
                   1476: 
                   1477: =item *
                   1478: 
                   1479: print header
                   1480: 
                   1481: =item *
                   1482: 
                   1483: evaluate actions from previous page (both cumulatively and chronologically)
                   1484: 
                   1485: =item *
                   1486: 
                   1487: output title
                   1488: 
                   1489: =item *
                   1490: 
                   1491: get state of file attributes to be showing
                   1492: 
                   1493: =item *
                   1494: 
                   1495: output state of file attributes to be showing
                   1496: 
                   1497: =item *
                   1498: 
                   1499: output starting row to the indexed file/directory hierarchy
                   1500: 
                   1501: =item *
                   1502: 
                   1503: read in what directories have previously been set to "open"
                   1504: 
                   1505: =item *
                   1506: 
                   1507: if not at top level, provide an uplink arrow
                   1508: 
                   1509: =item *
                   1510: 
                   1511: recursively go through all the directories and output as appropriate
                   1512: 
                   1513: =item *
                   1514: 
                   1515: information useful for group import
                   1516: 
                   1517: =item *
                   1518: 
                   1519: end the tables
                   1520: 
                   1521: =item *
                   1522: 
                   1523: end the output and return
                   1524: 
                   1525: =back
                   1526: 
                   1527: =head1 OTHER SUBROUTINES
                   1528: 
                   1529: =over 4
                   1530: 
                   1531: =item *
                   1532: 
                   1533: scanDir - recursive scan of a directory
                   1534: 
                   1535: =item *
                   1536: 
                   1537: get_list - get complete matched list based on the uri (returns an array)
                   1538: 
                   1539: =item *
                   1540: 
                   1541: match_ext - filters out files based on extensions (returns an array)
                   1542: 
                   1543: =item *
                   1544: 
                   1545: display_line - displays one line in appropriate table format
                   1546: 
                   1547: =item *
                   1548: 
                   1549: begin_form - prints the beginning of a form for directory or file link
                   1550: 
                   1551: =item *
                   1552: 
                   1553: start_fresh_session - settings whenever the user causes the indexer window
                   1554: to be launched
                   1555: 
                   1556: =back
                   1557: 
                   1558: =cut

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.