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

1.1       www         1: # The LearningOnline Network with CAPA
1.24      harris41    2: # Directory Indexer
                      3: #
1.212   ! www         4: # $Id: lonindexer.pm,v 1.211 2011/10/17 12:41:30 raeburn 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.209     foxr      123:     my $diropendb = LONCAPA::tempdir() .
                    124: 	"$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.199     droeschl  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.199     droeschl  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.199     droeschl  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) {
1.206     raeburn   324:         var elementname  = "$element";
1.39      matthew   325: 	window.opener.document.forms["$form"].elements[elementname].value=val;
                    326:     } else {
                    327: 	    alert("The file you selected is: "+val);
                    328:     }
                    329: }
                    330: 
                    331: END
                    332:             }
1.15      harris41  333:         }
1.38      matthew   334:         $catalogmodefunctions.=<<END;
                    335: var acts='';
                    336: function rep_dirpath(suffix,val) {
                    337:     eval("document.forms.dirpath"+suffix+".acts.value=val");
                    338: }
                    339: END
1.145     www       340: 	if ($env{'form.catalogmode'} eq 'import') {
1.38      matthew   341:             $catalogmodefunctions.=<<END;
1.16      harris41  342: function queue(val) {
                    343:     if (eval("document.forms."+val+".filelink.checked")) {
                    344: 	var l=val.length;
                    345: 	var v=val.substring(4,l);
                    346: 	document.forms.fileattr.acts.value+='1a'+v+'b';
                    347:     }
                    348:     else {
                    349: 	var l=val.length;
                    350: 	var v=val.substring(4,l);
                    351: 	document.forms.fileattr.acts.value+='0a'+v+'b';
                    352:     }
                    353: }
                    354: END
                    355: 	}
1.17      harris41  356: 
1.170     albertel  357:         my $inhibit_menu = "+'&".&Apache::loncommon::inhibit_menu_check()."'";
1.1       www       358: # ---------------------------------------------------------------- Print Header
1.170     albertel  359:         
1.141     albertel  360: 	my $js = <<"ENDHEADER";
1.19      harris41  361: <script type="text/javascript">
1.199     droeschl  362: // <![CDATA[
1.175     banghart  363: $catalogmodefunctions;
                    364: function update_only(field) {
                    365:     alert(field.name);
                    366: }
1.163     banghart  367: function checkAll() {
1.160     banghart  368:     var numForms = document.forms.length;
                    369:     for (i=0;i<numForms;i++) {
                    370:         var numElements = document.forms[i].elements.length;
                    371:         for (j=0;j<numElements;j++){
1.163     banghart  372:             var fieldName = document.forms[i].elements[j].name;
                    373:             if (fieldName == 'filelink') {
                    374:                 document.forms[i].elements[j].checked = true;
1.168     banghart  375:                 queue(document.forms[i].name);
1.163     banghart  376:             }
                    377:         }
                    378:     }
                    379: }
                    380: function uncheckAll() {
                    381:     var numForms = document.forms.length;
                    382:     for (i=0;i<numForms;i++) {
                    383:         var numElements = document.forms[i].elements.length;
                    384:         for (j=0;j<numElements;j++){
                    385:             var fieldName = document.forms[i].elements[j].name;
                    386:             if (fieldName == 'filelink') {
                    387:                 document.forms[i].elements[j].checked = false;
1.168     banghart  388:                 queue(document.forms[i].name);
1.160     banghart  389:             }
                    390:         }
                    391:     }
                    392: }
1.69      www       393: function openWindow(url, wdwName, w, h, toolbar,scrollbar,locationbar) {
1.71      ng        394:     var xpos = (screen.width-w)/2;
                    395:     xpos = (xpos < 0) ? '0' : xpos;
                    396:     var ypos = (screen.height-h)/2-30;
                    397:     ypos = (ypos < 0) ? '0' : ypos;
                    398:     var options = "width=" + w + ",height=" + h + ",screenx="+xpos+",screeny="+ypos+",";
1.2       harris41  399:     options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
1.69      www       400:     options += "menubar=no,toolbar="+toolbar+",location="+locationbar+",directories=no";
1.2       harris41  401:     var newWin = window.open(url, wdwName, options);
                    402:     newWin.focus();
                    403: }
1.16      harris41  404: function gothere(val) {
1.170     albertel  405:     window.location=val+'?acts='+document.forms.fileattr.acts.value$inhibit_menu;
1.16      harris41  406: }
1.199     droeschl  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.198     bisitz    412: 
                    413:         if ($env{'form.catalogmode'}) {
                    414:             # "Popup mode"
                    415:             $r->print(&Apache::loncommon::start_page('Browse published resources',$js,
                    416:                                                      {'only_body' => 1,
                    417:                                                       'domain' => $headerdom,}));
                    418:         } else {
                    419:             # Only display page header and breadcrumbs in non-popup mode
                    420:             &Apache::lonhtmlcommon::clear_breadcrumbs();
                    421:             &Apache::lonhtmlcommon::add_breadcrumb({
                    422:                 'text'  => 'Browse published resources',
                    423:                 'href'  => '/res/fhwfdev/?launch=1',
                    424:             });
                    425:             $r->print(&Apache::loncommon::start_page('Browse published resources',$js,
                    426:                                                      {'domain' => $headerdom,})
                    427:                      .&Apache::lonhtmlcommon::breadcrumbs()
                    428:             );
                    429:         }
                    430: 
1.175     banghart  431: # ---------------------------------- get state of file types to be showing
                    432: 	if ($env{'form.only'}) {
1.176     banghart  433: 	    $typeselect = $env{'form.only'};
1.175     banghart  434: 	} else {
1.176     banghart  435: 	    $typeselect = '';
1.175     banghart  436: 	}
                    437: 
1.23      harris41  438: # ---------------------------------- get state of file attributes to be showing
1.133     albertel  439: 	if ($env{'form.attrs'}) {
1.195     jms       440: 	    for (my $i=0; $i<=16; $i++) {
1.6       harris41  441: 		delete $hash{'display_attrs_'.$i};
1.133     albertel  442: 		if ($env{'form.attr'.$i} == 1) {
1.45      ng        443: 		    $attrchk[$i] = 'checked';
1.6       harris41  444: 		    $hash{'display_attrs_'.$i} = 1;
                    445: 		}
                    446: 	    }
                    447: 	} else {
1.195     jms       448: 	    for (my $i=0; $i<=16; $i++) {
1.199     droeschl  449: 		$attrchk[$i] = 'checked="checked"' if $hash{'display_attrs_'.$i} == 1;
1.6       harris41  450: 	    }
                    451: 	}
1.87      www       452: 
1.205     raeburn   453:         my @file_categories = &Apache::loncommon::filecategories();
                    454:         my %select_file_categories;
                    455:         my @select_form_order = ('');
                    456:         $select_file_categories{''} = &mt('All file types');
                    457:         foreach my $cat (@file_categories) {
                    458:             my $types = join(",",&Apache::loncommon::filecategorytypes($cat));
                    459:             $select_file_categories{$types} = &mt($cat);
                    460:             push(@select_form_order,$types);
                    461:         }
                    462:         $select_file_categories{'select_form_order'} = \@select_form_order;
1.207     raeburn   463:         my $onchange = 'this.form.submit();';
1.205     raeburn   464:         my $type_element=
                    465:             &Apache::loncommon::select_form(
                    466:                 $typeselect,
                    467:                 'only',
1.207     raeburn   468:                 \%select_file_categories,$onchange);
1.205     raeburn   469:         my $type_selector = '<label>'.&mt('File Type Displayed: [_1]',
                    470:                                           $type_element).'</label>';
                    471: 
1.23      harris41  472: # ------------------------------- output state of file attributes to be showing
1.71      ng        473: #                                 All versions has to the last item
                    474: #                                 since it does not take an extra col
1.77      www       475: 	my %lt=&Apache::lonlocal::texthash(
                    476: 					   'av' => 'All versions',
1.174     banghart  477: 					   'ud' => 'Update Display',
                    478: 					   'pr' => 'Problems',
                    479: 					   'gr' => 'Graphics',
1.183     bisitz    480: 					   'at' => 'All types',
                    481: 					   'hd' => 'Display Options'
1.77      www       482: 					   );
1.205     raeburn   483:         my @disp_order = ('0','4','5','6','13','1','2','3','10','14','8','11','7','12','15','16');
                    484:         my %disp_options = &Apache::lonlocal::texthash (
                    485:                               0  => 'Title',
                    486:                               4  => 'Author',
                    487:                               5  => 'Keywords',
                    488:                               6  => 'Language',
                    489:                               13 => 'Notes',
                    490:                               1  => 'Size',
                    491:                               2  => 'Last access',
                    492:                               3  => 'Last modified',
                    493:                               10 => 'Source Available',
                    494:                               14 => 'Abstract',
                    495:                               8  => 'Statistics',
                    496:                               11 => 'Linked/Related Resources',
                    497:                               7  => 'Show resource',
                    498:                               12 => 'Subject',
                    499:                               15 => 'Grade Level',
                    500:                               16 => 'Standards',
                    501:                            );
                    502:         my $cell = 0;
                    503:         my $numinrow = 4;
                    504: 	$r->print('
                    505: <form method="post" name="fileattr" action="'.$uri.'" enctype="application/x-www-form-urlencoded">
1.183     bisitz    506: <fieldset>
1.205     raeburn   507: <legend>'.$lt{'hd'}.'</legend>
                    508: <table style=" border-collapse: collapse; border-style: none;">'."\n");
                    509:         foreach my $item (@disp_order) {
                    510:             my $style = 'padding-left: 12px; padding-right: 8px;';
                    511:             if ($cell%$numinrow == 0) {
                    512:                 $r->print('<tr>');
                    513:             }
                    514:             $cell ++;
                    515:             if ($cell > 3 * $numinrow) {
                    516:                 $style .= ' padding-bottom: 6px;'; 
                    517:             }
                    518:             if (defined($disp_options{$item})) {
                    519:                 $r->print('<td style="'.$style.'"><span class="LC_nobreak">'.
                    520:                           '<label><input type="checkbox" name="attr'.$item.'" value="1" '.
                    521:                           $attrchk[$item].' onclick="this.form.submit();" /> '.$disp_options{$item}.
                    522:                           '</label></span></td>'."\n");
                    523:             }
                    524:             if ($cell > 1 && $cell%$numinrow == 0) {
                    525:                 $r->print('</tr>');
                    526:             }
                    527:         }
                    528:         $r->print(<<END);
                    529: <tr>
                    530: <td style="font-style: italic; border-top: 1px solid black; padding-top: 6px"> 
1.199     droeschl  531: <label><input type="checkbox" name="attr9" value="1" $attrchk[9] onclick="this.form.submit();" /> $lt{'av'}</label>
1.205     raeburn   532: </td>
                    533: <td colspan="3" style="padding-left:8px; padding-top: 4px; font-style: italic; border-top: 1px solid black; padding-top: 8px">$type_selector</td>
1.115     www       534: </tr>
                    535: </table>
1.87      www       536: <input type="hidden" name="attrs" value="1" />
1.205     raeburn   537: </fieldset>
1.87      www       538: <input type="submit" name="updatedisplay" value="$lt{'ud'}" />
1.16      harris41  539: <input type="hidden" name="acts" value="" />
1.87      www       540: $closebutton $groupimportbutton
1.1       www       541: END
1.170     albertel  542:         $r->print(&Apache::loncommon::inhibit_menu_check('input'));
1.178     albertel  543:    
1.97      www       544: # -------------- Filter out sequence containment in crumbs and "recent folders"
                    545: 	my $storeuri=$uri;
                    546: 	$storeuri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1];
                    547: 	$storeuri=~s/\/+/\//g;
1.82      www       548: # ---------------------------------------------------------------- Bread crumbs
1.202     bisitz    549:         $r->print(
                    550:             '<p>'
                    551:            .&Apache::lonhtmlcommon::crumbs(
                    552:                 $storeuri,
                    553:                 '',
                    554:                 '',
                    555:                 (($env{'form.catalogmode'} eq 'import')?
                    556:                                  'document.forms.fileattr':''))
                    557:            .'<br />'
                    558:            .&Apache::lonhtmlcommon::select_recent(
                    559:                 'residx',
                    560:                 'resrecent',
                    561:                 '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();')
                    562:            .'</p>'
                    563:         );
1.100     www       564: # -------------------------------------------------------- Resource Home Button
1.133     albertel  565: 	my $reshome=$env{'course.'.$env{'request.course.id'}.'.reshome'};
1.100     www       566: 	if ($reshome) {
1.194     jms       567: 	    $r->print("<span class=\"LC_fontsize_large\"><a href='");
1.145     www       568: 	    if ($env{'form.catalogmode'} eq 'import') {
1.170     albertel  569: 		$r->print('javascript:document.forms.fileattr.action="'.&Apache::loncommon::inhibit_menu_check($reshome).'";document.forms.fileattr.submit();');
1.100     www       570: 	    } else {
                    571: 		$r->print($reshome);
                    572: 	    }
1.194     jms       573: 	    $r->print("'>".&mt('Home').'</a></span>');
1.100     www       574: 	}
                    575: 	$r->print('</form>');
1.85      www       576: # ------------------------------------------------------ Remember where we were
1.97      www       577: 	&Apache::loncommon::storeresurl($storeuri);
                    578: 	&Apache::lonhtmlcommon::store_recent('residx',$storeuri,$storeuri);
1.163     banghart  579: # -------------------------------------------------- Check All and Uncheck all
1.171     albertel  580: 	if ($env{'form.catalogmode'} eq 'import') {
1.202     bisitz    581: 	    $r->print('<p><input type="button" value="'.&mt("Check All").'" id="checkallbutton" onclick="javascript:checkAll()" />');
                    582: 	    $r->print('<input type="button" value="'.&mt("Uncheck All").'" id="uncheckallbutton" onclick="javascript:uncheckAll()" /></p>');
1.171     albertel  583: 	}
1.23      harris41  584: # ----------------- output starting row to the indexed file/directory hierarchy
1.129     albertel  585:         #$r->print(&initdebug());
                    586:         #$r->print(&writedebug("Omit:@Omit")) if (@Omit);
                    587:         #$r->print(&writedebug("Only:@Only")) if (@Only);
1.194     jms       588:         $r->print(&Apache::loncommon::start_data_table("LC_tableBrowseRes")
1.182     bisitz    589:                  .&Apache::loncommon::start_data_table_header_row());
                    590: 	$r->print("<th $colspan>".&mt('Name')."</th>\n");
1.208     wenzelju  591: 	$r->print("<th></th>\n");
1.182     bisitz    592: 	$r->print("<th>".&mt('Title')."</th>\n") 
1.45      ng        593: 	    if ($hash{'display_attrs_0'} == 1);
1.194     jms       594: 	$r->print('<th class="LC_right">'.&mt("Size")." (".&mt("bytes").") ".
1.182     bisitz    595: 		  "</th>\n") if ($hash{'display_attrs_1'} == 1);
                    596: 	$r->print("<th>".&mt("Last accessed")."</th>\n") 
1.17      harris41  597: 	    if ($hash{'display_attrs_2'} == 1);
1.182     bisitz    598: 	$r->print("<th>".&mt("Last modified")."</th>\n")
1.17      harris41  599: 	    if ($hash{'display_attrs_3'} == 1);
1.182     bisitz    600: 	$r->print("<th>".&mt("Author(s)")."</th>\n")
1.17      harris41  601: 	    if ($hash{'display_attrs_4'} == 1);
1.182     bisitz    602: 	$r->print("<th>".&mt("Keywords")."</th>\n")
1.17      harris41  603: 	    if ($hash{'display_attrs_5'} == 1);
1.182     bisitz    604: 	$r->print("<th>".&mt("Language")."</th>\n")
1.45      ng        605: 	    if ($hash{'display_attrs_6'} == 1);
1.182     bisitz    606: 	$r->print("<th>".&mt("Usage Statistics")." <br />(".
                    607: 		  &mt("Courses/Network Hits").") ".&mt('updated periodically')."</th>\n")
1.70      ng        608: 	    if ($hash{'display_attrs_8'} == 1);
1.182     bisitz    609: 	$r->print("<th>".&mt("Source Available")."</th>\n")
1.109     taceyjo1  610: 	    if ($hash{'display_attrs_10'} == 1);
1.182     bisitz    611: 	$r->print("<th>".&mt("Linked/Related Resources")."</th>\n")
1.111     www       612: 	    if ($hash{'display_attrs_11'} == 1);
1.182     bisitz    613: 	$r->print("<th>".&mt("Resource")."</th>\n")
1.115     www       614: 	    if ($hash{'display_attrs_7'} == 1);
1.185     jms       615: 	$r->print("<th>".&mt("Subject")."</th>\n")
                    616: 	    if ($hash{'display_attrs_12'} == 1);
1.186     jms       617: 	$r->print("<th>".&mt("Notes")."</th>\n")
                    618: 	    if ($hash{'display_attrs_13'} == 1);
                    619: 	$r->print("<th>".&mt("Abstract")."</th>\n")
                    620: 	    if ($hash{'display_attrs_14'} == 1);
1.193     jms       621: 	$r->print("<th>".&mt("Grade Level")."</th>\n")
                    622: 	    if ($hash{'display_attrs_15'} == 1);
1.195     jms       623: 	$r->print("<th>".&mt("Standards")."</th>\n")
                    624: 	    if ($hash{'display_attrs_16'} == 1);
1.185     jms       625: 	    
                    626:     $r->print(&Apache::loncommon::end_data_table_header_row());
                    627:     
                    628:     	
1.5       harris41  629: 
1.23      harris41  630: # ----------------- read in what directories have previously been set to "open"
1.27      harris41  631: 	foreach (keys %hash) {
1.4       harris41  632: 	    if ($_ =~ /^diropen_status_/) {
                    633: 		my $key = $_;
                    634: 		$key =~ s/^diropen_status_//;
                    635: 		$dirs{$key} = $hash{$_};
                    636: 	    }
1.27      harris41  637: 	}
1.4       harris41  638: 
1.133     albertel  639: 	if ($env{'form.openuri'}) {  # take care of review and refresh options
                    640: 	    my $uri=$env{'form.openuri'};
1.4       harris41  641: 	    if (exists($hash{'diropen_status_'.$uri})) {
                    642: 		my $cursta = $hash{'diropen_status_'.$uri};
1.2       harris41  643: 		$dirs{$uri} = 'open';
1.4       harris41  644: 		$hash{'diropen_status_'.$uri} = 'open';
                    645: 		if ($cursta eq 'open') {
                    646: 		    $dirs{$uri} = 'closed';
                    647: 		    $hash{'diropen_status_'.$uri} = 'closed';
                    648: 		}
1.2       harris41  649: 	    } else {
1.4       harris41  650: 		$hash{'diropen_status_'.$uri} = 'open';
1.2       harris41  651: 		$dirs{$uri} = 'open';
                    652: 	    }
                    653: 	}
1.12      ng        654: 	
                    655: 	my $toplevel;
1.13      ng        656: 	my $indent = 0;
1.12      ng        657: 	$uri = $uri.'/' if $uri !~ /.*\/$/;
1.17      harris41  658: 
1.133     albertel  659:  	if ($env{'form.dirPointer'} ne 'on') {
1.88      www       660:  	    $hash{'top.level'} = $uri;
                    661:  	    $toplevel = $uri;
                    662:  	} else {
                    663:  	    $toplevel = $hash{'top.level'};
                    664:  	}
1.17      harris41  665: 
1.23      harris41  666: # -------------------------------- if not at top level, provide an uplink arrow
1.45      ng        667: 	if ($toplevel ne '/res/'){
1.13      ng        668: 	    my (@uri_com) = split(/\//,$uri);
                    669: 	    pop @uri_com;
                    670: 	    my $upone = join('/',@uri_com);
                    671: 	    my @list = qw (0);
                    672: 	    &display_line ($r,'opened',$upone.'&viewOneUp',0,$upone,@list);
                    673: 	    $indent = 1;
1.12      ng        674: 	}
1.17      harris41  675: 
1.23      harris41  676: # -------- recursively go through all the directories and output as appropriate
1.16      harris41  677: 	&scanDir ($r,$toplevel,$indent,\%hash);
1.152     albertel  678: 
                    679: # -------------------------------------------------------------- end the tables
1.182     bisitz    680:         $r->print(&Apache::loncommon::end_data_table());
                    681: 
1.23      harris41  682: # ---------------------------- embed hidden information useful for group import
1.152     albertel  683: 	$r->print("<form name='fnum' action=''>");
1.131     albertel  684: 	$r->print("<input type='hidden' name='fnum' value='$fnum' /></form>");
1.17      harris41  685: 
1.23      harris41  686: # --------------------------------------------------- end the output and return
1.141     albertel  687: 	$r->print(&Apache::loncommon::end_page()."\n");
1.2       harris41  688:     }
1.67      matthew   689:     if(! $c->aborted()) {
1.87      www       690: # write back into the temporary file
1.68      albertel  691: 	my %dbfile;
1.67      matthew   692:         if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_NEWDB(),0640)) {
                    693:             while (my($key,$value) = each(%hash)) {
                    694:                 $dbfile{$key}=$value;
                    695:             }
                    696:             untie(%dbfile);
                    697:         }
                    698:     }
                    699: 
1.1       www       700:     return OK;
                    701: }
1.2       harris41  702: 
1.17      harris41  703: # ----------------------------------------------- recursive scan of a directory
1.2       harris41  704: sub scanDir {
1.16      harris41  705:     my ($r,$startdir,$indent,$hashref)=@_;
1.67      matthew   706:     my $c = $r->connection();
1.3       harris41  707:     my ($compuri,$curdir);
                    708:     my $dirptr=16384;
1.90      taceyjo1  709:     my $obs;
1.1       www       710:     $indent++;
1.2       harris41  711:     my %dupdirs = %dirs;
                    712:     my @list=&get_list($r,$startdir);
                    713:     foreach my $line (@list) {
1.67      matthew   714:         return if ($c->aborted());
1.90      taceyjo1  715: 	#This is a kludge, sorry aboot this
1.92      taceyjo1  716: 	my ($strip,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); 
1.90      taceyjo1  717: 	next if($strip =~ /.*\.meta$/ | $obs eq '1');
1.18      ng        718: 	my (@fileparts) = split(/\./,$strip);
1.70      ng        719: 	if ($hash{'display_attrs_9'} != 1) {
1.181     bisitz    720:             # if not all versions to be shown
1.18      ng        721: 	    if (scalar(@fileparts) >= 3) {
                    722: 		my $fext = pop @fileparts;
                    723: 		my $ov = pop @fileparts;
                    724: 		my $fname = join ('.',@fileparts,$fext);
1.75      albertel  725: 		next if (grep /\Q$fname\E/,@list and $ov =~ /^\d+$/);
1.18      ng        726: 	    }
                    727: 	}
                    728: 
1.45      ng        729: 	if ($dom eq 'domain') {
1.72      albertel  730: 	    # dom list has full path /res/<domain name>/ already
                    731: 	    $curdir='';
1.73      albertel  732: 	    $compuri = (split(/\&/,$line))[0];
1.2       harris41  733: 	} else {
1.17      harris41  734: 	    # user, dir & file have name only, i.e., w/o path
1.45      ng        735: 	    $compuri = join('',$startdir,$strip,'/');
1.3       harris41  736: 	    $curdir = $startdir;
1.2       harris41  737: 	}
1.45      ng        738: 	my $diropen = 'closed';
1.96      www       739: 	if (($dirptr&$testdir) or ($dom =~ /^(domain|user)$/) or ($compuri=~/\.(sequence|page)\/$/)) {
1.3       harris41  740: 	    while (my ($key,$val)= each %dupdirs) {
1.5       harris41  741: 		if ($key eq $compuri and $val eq "open") {
1.11      ng        742: 		    $diropen = "opened";
1.53      albertel  743: 		    delete($dupdirs{$key});
                    744: 		    delete($dirs{$key});
1.5       harris41  745: 		}
1.3       harris41  746: 	    }
1.1       www       747: 	}
1.16      harris41  748: 	&display_line($r,$diropen,$line,$indent,$curdir,$hashref,@list);
1.45      ng        749: 	&scanDir ($r,$compuri,$indent) if $diropen eq 'opened';
1.1       www       750:     }
                    751:     $indent--;
                    752: }
                    753: 
1.17      harris41  754: # --------------- get complete matched list based on the uri (returns an array)
1.1       www       755: sub get_list {
                    756:     my ($r,$uri)=@_;
1.97      www       757:     my @list=();
1.211     raeburn   758:     my $listerror;
1.210     dseaton   759:     
1.45      ng        760:     (my $luri = $uri) =~ s/\//_/g;
1.133     albertel  761:     if ($env{'form.updatedisplay'}) {
1.27      harris41  762: 	foreach (keys %hash) {
1.4       harris41  763: 	    delete $hash{$_} if ($_ =~ /^dirlist_files_/);
1.121     albertel  764: 	    delete $hash{$_} if ($_ =~ /^dirlist_timestamp_files_/);
1.87      www       765: 	}
1.2       harris41  766:     }
                    767: 
1.121     albertel  768:     if (defined($hash{'dirlist_files_'.$luri}) &&
                    769: 	$hash{'dirlist_timestamp_files_'.$luri}+600 > (time)) {
1.4       harris41  770: 	@list = split(/\n/,$hash{'dirlist_files_'.$luri});
1.97      www       771:     } elsif ($uri=~/\.(page|sequence)\/$/) {
1.94      www       772: # is a page or a sequence
1.97      www       773: 	$uri=~s/\/$//;
                    774: 	$uri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1];
                    775: 	$uri=~s/\/+/\//g;
                    776: 	foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$uri))) {
                    777: 	    my @ratpart=split(/\:/,$_);
1.156     albertel  778: 	    push(@list,&LONCAPA::map::qtescape($ratpart[1]));
1.97      www       779: 	} 
1.94      www       780: 	$hash{'dirlist_files_'.$luri} = join("\n",@list);
1.1       www       781:     } else {
1.94      www       782: # is really a directory
1.211     raeburn   783: 	(my $listref,$listerror) = &Apache::lonnet::dirlist($uri);
                    784:         if (ref($listref) eq 'ARRAY') {
                    785:             @list = @{$listref};
                    786:         }
1.87      www       787: 	$hash{'dirlist_files_'.$luri} = join("\n",@list);
1.121     albertel  788: 	$hash{'dirlist_timestamp_files_'.$luri} = time;
1.1       www       789:     }
1.210     dseaton   790: #Checking for error messages associated with empty directories or inaccessible servers (See Bug 4984)
1.212   ! www       791:     if (($listerror eq 'no_such_dir') || ($listerror eq 'no_such_host') || ($listerror eq 'no_host')) { 
1.210     dseaton   792:         $r->print("<p class='LC_info'>" . &mt("Directory does not exist."). "</p>");
1.211     raeburn   793:     } elsif ($listerror eq 'con_lost') {
1.210     dseaton   794:         $r->print("<p class='LC_info'>" . &mt("Directory temporarily not accessible."). "</p>");
                    795:     }
                    796: 
1.156     albertel  797:     return @list=&match_ext($r,@list);    
1.1       www       798: }
                    799: 
1.112     www       800: sub dynmetaread {
                    801:     my $uri=shift;
                    802:     if (($hash{'display_attrs_8'}==1) || ($hash{'display_attrs_11'}==1)) {
1.117     www       803: # We don't want the filename
                    804: 	$uri=~s/\/[^\/]+$//;
                    805: # Did we already see this?
                    806: 	my $builddir=$uri;
                    807: 	while ($builddir) {
                    808: 	    if ($dynread{$builddir}) {
                    809: 		return 0;
                    810: 	    }
                    811: 	    $builddir=~s/\/[^\/]+$//;
                    812: 	}
                    813: # Actually get the data
1.112     www       814: 	%dynhash=
1.143     www       815: 	    (%dynhash,&Apache::lonmeta::get_dynamic_metadata_from_sql($uri.'/'));
1.117     www       816: # Remember that we got it
                    817: 	$dynread{$uri}=1;
1.112     www       818:     } 
                    819: }
                    820: 
1.40      matthew   821: sub initdebug {
1.141     albertel  822:     my $start_page=
                    823: 	&Apache::loncommon::start_page('Debug',undef,
                    824: 				       {'only_body' => 1,});
                    825:     $start_page =~ s/\n/ /g;
1.40      matthew   826:     return <<ENDJS;
1.141     albertel  827: <script type="text/javascript">
1.40      matthew   828: var debugging = true;
                    829: if (debugging) {
                    830:     var debuggingWindow = window.open('','Debug','width=400,height=300',true);
                    831: } 
                    832: 
                    833: function output(text) {
                    834:     if (debugging) {
                    835:         debuggingWindow.document.writeln(text);
                    836:     }
                    837: }
1.141     albertel  838: output('$start_page<pre>');   
1.40      matthew   839: </script>
                    840: ENDJS
                    841: }
                    842: 
                    843: sub writedebug {
1.141     albertel  844:     my ($text) = @_;
                    845:     return "<script type=\"text/javascript\">output('$text');</script>";
1.40      matthew   846: }
                    847: 
1.17      harris41  848: # -------------------- filters out files based on extensions (returns an array)
1.1       www       849: sub match_ext {
                    850:     my ($r,@packlist)=@_;
                    851:     my @trimlist;
                    852:     my $nextline;
                    853:     my @fileext;
                    854:     my $dirptr=16384;
                    855: 
1.2       harris41  856:     foreach my $line (@packlist) {
                    857: 	chomp $line;
                    858: 	$line =~ s/^\/home\/httpd\/html//;
                    859: 	my @unpackline = split (/\&/,$line);
1.45      ng        860: 	next if ($unpackline[0] eq '.');
                    861: 	next if ($unpackline[0] eq '..');
1.2       harris41  862: 	my @filecom = split (/\./,$unpackline[0]);
                    863: 	my $fext = pop(@filecom);
1.96      www       864: 	my $fnptr = ($unpackline[3]&$dirptr) || ($fext=~/\.(page|sequence)$/);
1.2       harris41  865:  	if ($fnptr == 0 and $unpackline[3] ne "") {
1.28      harris41  866: 	    my $embstyle = &Apache::loncommon::fileembstyle($fext);
1.25      matthew   867:             push @trimlist,$line if (defined($embstyle) && 
1.32      harris41  868: 				     ($embstyle ne 'hdn' or $fext eq 'meta'));
1.1       www       869: 	} else {
1.2       harris41  870: 	    push @trimlist,$line;
1.1       www       871: 	}
                    872:     }
1.80      albertel  873:     @trimlist = sort {uc($a) cmp uc($b)} (@trimlist);
1.1       www       874:     return @trimlist;
                    875: }
                    876: 
1.17      harris41  877: # ------------------------------- displays one line in appropriate table format
1.23      harris41  878: sub display_line {
1.16      harris41  879:     my ($r,$diropen,$line,$indent,$startdir,$hashref,@list)=@_;
1.53      albertel  880:     my (@pathfn, $fndir);
1.97      www       881: # there could be relative paths (files actually belonging into this directory)
                    882: # or absolute paths (for example, from sequences)
                    883:     my $absolute;
                    884:     my $pathprefix;
1.107     albertel  885:     if ($line=~m|^/res/| && $startdir ne '') {
1.97      www       886: 	$absolute=1;
                    887: 	$pathprefix='';
                    888:     } else {
                    889: 	$absolute=0;
                    890: 	$pathprefix=$startdir;
                    891:     }
1.1       www       892:     my $dirptr=16384;
1.182     bisitz    893: #SB my $fileclr="#ffffe6";
1.45      ng        894:     my $iconpath= $r->dir_config('lonIconsURL') . '/';
1.1       www       895: 
                    896:     my @filecom = split (/\&/,$line);
                    897:     my @pathcom = split (/\//,$filecom[0]);
                    898:     my $listname = $pathcom[scalar(@pathcom)-1];
                    899:     my $fnptr = $filecom[3]&$dirptr;
1.77      www       900:     my $msg = &mt('View').' '.$filecom[0].' '.&mt('resources');
                    901:     $msg = &mt('Close').' '.$filecom[0].' '.&mt('directory') if $diropen eq 'opened';
1.194     jms       902:     my $nowOpen = ($diropen eq 'opened' ? 1 : 0);
1.1       www       903: 
1.45      ng        904:     my $tabtag='</td>';
1.1       www       905:     my $i=0;
1.195     jms       906:     while ($i<=16) {
1.45      ng        907: 	$tabtag=join('',$tabtag,"<td>&nbsp;</td>")
1.155     albertel  908: 	    if ($i != 9 &&
                    909: 		$hash{'display_attrs_'.$i} == 1);
1.194     jms       910: 	$i++;
1.1       www       911:     }
1.63      ng        912:     my $valign = ($hash{'display_attrs_7'} == 1 ? 'top' : 'bottom');
1.17      harris41  913: 
                    914: # display uplink arrow
1.45      ng        915:     if ($filecom[1] eq 'viewOneUp') {
1.98      www       916: 	my $updir=$startdir;
                    917: # -------------- Filter out sequence containment in crumbs and "recent folders"
                    918: 	$updir='/'.(split(/\.(page|sequence)\/\//,$startdir))[-1];
                    919: 	$updir=~s/\/+/\//g;
                    920: 
1.182     bisitz    921: #SB	$r->print("<tr valign='$valign' bgcolor=\"$fileclr\">$extrafield");
                    922:         $r->print(&Apache::loncommon::start_data_table_row()); # valign="$valign" ?!?
                    923:         $r->print($extrafield);
1.70      ng        924: 	$r->print("<td>\n");
1.98      www       925: 	$r->print ('<form method="post" name="dirpathUP" action="'.$updir.
1.16      harris41  926: 		   '/" '.
1.199     droeschl  927: 		   'onsubmit="return rep_dirpath(\'UP\','.
1.17      harris41  928: 		   'document.forms.fileattr.acts.value)" '.
1.16      harris41  929: 		   'enctype="application/x-www-form-urlencoded"'.
                    930:                    '>'."\n");
1.170     albertel  931: 	$r->print(&Apache::loncommon::inhibit_menu_check('input'));
1.197     bisitz    932: 	$r->print ('<input type="hidden" name="openuri" value="'.
1.131     albertel  933: 		   $startdir.'" />'."\n");
1.194     jms       934:         $r->print ('<input type="hidden" name="acts" value="" />'."\n");
1.199     droeschl  935: 	$r->print ('<a href="#" onclick="document.dirpathUP.submit()"><img src="'.$iconpath.'arrow.up.gif"');
                    936: 	$r->print (' alt="'.$msg.'" class="LC_fileicon" />'.
1.17      harris41  937: 		   "\n");
1.208     wenzelju  938: 	$r->print(&mt("Up")."</a></form></td><td>$tabtag");
1.182     bisitz    939:         $r->print(&Apache::loncommon::end_data_table_row());
1.13      ng        940: 	return OK;
                    941:     }
1.97      www       942: # Do we have permission to look at this?
1.201     raeburn   943:     if($filecom[15] ne '1') { return OK if ((!&Apache::lonnet::allowed('bre',$pathprefix.$filecom[0])) && (!&Apache::lonnet::allowed('bro',$pathprefix.$filecom[0]))); }
1.97      www       944: 
                    945: # make absolute links appear on different background
1.182     bisitz    946: #SB    if ($absolute) { $fileclr='#ccdd99'; }
1.17      harris41  947: 
                    948: # display domain
1.45      ng        949:     if ($filecom[1] eq 'domain') {
1.131     albertel  950:  	$r->print ('<input type="hidden" name="dirPointer" value="on" />'."\n")
1.133     albertel  951:  	    if ($env{'form.dirPointer'} eq "on");
1.182     bisitz    952: #SB	$r->print("<tr valign='$valign' bgcolor=\"$fileclr\">$extrafield");
                    953: 	$r->print(&Apache::loncommon::start_data_table_row()); # valign="$valign" ?!?"
                    954:         $r->print($extrafield);
1.70      ng        955: 	$r->print("<td>");
1.73      albertel  956: 	&begin_form ($r,$filecom[0]);
                    957: 	my $anchor = $filecom[0];
1.162     albertel  958: 	$anchor =~ s/\W//g;
1.152     albertel  959: 	$r->print ('<a name="'.$anchor.'"></a>');
1.194     jms       960: $r->print ('<input type="hidden" name="acts" value="" />');
1.199     droeschl  961: 	$r->print ('<a href="#" onclick="document.dirpath'.($dnum-1).'.submit()"><img src="'.$iconpath.'arrow.'.($nowOpen ? "open" : "closed" ).'.gif"'); 
                    962: 	$r->print (' alt="'.$msg.'" class="LC_fileicon" /></a>'.
1.17      harris41  963: 		   "\n");
1.128     foxr      964: 	my $quotable_filecom = &Apache::loncommon::escape_single($filecom[0]);
1.125     foxr      965: 	$r->print ('<a href="javascript:gothere(\''.$quotable_filecom.
1.152     albertel  966: 		   '\')"><img alt="" src="'.$iconpath.'server.gif"');
1.194     jms       967: 	$r->print (' class="LC_fileicon" />'."\n");
                    968: 	$r->print (&mt("Domain")." - $listname </a>");
1.158     albertel  969: 	if (&Apache::lonnet::domain($listname,'description')) {
1.194     jms       970: 	    $r->print("<br />(".&Apache::lonnet::domain($listname,'description').
1.60      albertel  971: 		      ")");
                    972: 	}
1.208     wenzelju  973: 	$r->print("</form></td><td>$tabtag");
1.182     bisitz    974:          $r->print(&Apache::loncommon::end_data_table_row());
1.1       www       975: 	return OK;
1.17      harris41  976: 
                    977: # display user directory
1.1       www       978:     }
1.45      ng        979:     if ($filecom[1] eq 'user') {
1.160     banghart  980: 	# $r->print("<tr valign=$valign bgcolor=\"$fileclr\">$extrafield");
1.2       harris41  981: 	my $curdir = $startdir.$filecom[0].'/';
1.3       harris41  982: 	my $anchor = $curdir;
1.162     albertel  983: 	$anchor =~ s/\W//g;
1.182     bisitz    984: #SB	$r->print("<tr bgcolor=\"$fileclr\">$extrafield<td valign=$valign>");
                    985:         $r->print(&Apache::loncommon::start_data_table_row()
1.194     jms       986:                  .$extrafield.'<td class="LC_'.$valign.'">');
1.13      ng        987: 	&begin_form ($r,$curdir);
1.152     albertel  988: 	$r->print ('<a name="'.$anchor.'"></a><img alt="" src="'.$iconpath.
1.194     jms       989: 		   'whitespace_21.gif" class="LC_icon" />'."\n");
1.131     albertel  990: 	$r->print ('<input type="hidden" name="acts" value="" />');
1.199     droeschl  991: 	$r->print ('<a href="#" onclick="document.dirpath'.($dnum-1).'.submit()">');
1.194     jms       992:         $r->print ('<img src="'.$iconpath.'arrow.'.($nowOpen ? "open" : "closed" ).
                    993: 		   '.gif" class="LC_fileicon"'); 
1.199     droeschl  994: 	$r->print (' alt="'.$msg.'"/></a>'.
1.17      harris41  995: 		   "\n");
1.128     foxr      996: 	my $quotable_curdir = &Apache::loncommon::escape_single($curdir);
1.125     foxr      997: 	$r->print ('<a href="javascript:gothere(\''.$quotable_curdir
1.162     albertel  998: 		   .'\')"><img alt="'.$msg.'" src="'.
1.194     jms       999: 		   $iconpath.'quill.gif" class="LC_fileicon" />');
1.60      albertel 1000: 	my $domain=(split(m|/|,$startdir))[2];
                   1001: 	my $plainname=&Apache::loncommon::plainname($listname,$domain);
1.194     jms      1002:         $r->print ($listname.'</a>');
                   1003: 
                   1004:         if (defined($plainname) && $plainname) { $r->print(" ($plainname) "); }
1.208     wenzelju 1005: # Wishlistlink
                   1006:         $r->print('</form></td><td><a href="javascript:;" '.
                   1007:                   'title="'.&mt('Set a link for this folder to wishlist').'" '.
                   1008:                   'onclick="set_wishlistlink('."'$plainname','$startdir$listname'".')">'.
                   1009:                   '<img class="LC_icon" src="/res/adm/pages/wishlist.png" '.
                   1010:                   'alt="'.&mt('set wishlistlink').'" style="width:22px;"/></a>'.$tabtag);
1.182     bisitz   1011:         $r->print(&Apache::loncommon::end_data_table_row());
1.194     jms      1012:         return OK;
1.1       www      1013:     }
1.17      harris41 1014: 
1.1       www      1015: # display file
1.194     jms      1016:         if (($fnptr == 0 and $filecom[3] ne '') or $absolute) {
                   1017:             my $title;
                   1018:             my $filelink = $pathprefix.$filecom[0];
                   1019:             if ($hash{'display_attrs_0'} == 1) {
                   1020:                 $title = &Apache::lonnet::gettitle($filelink);
                   1021:             }
                   1022:             my @file_ext = split (/\./,$listname);
                   1023:             my $curfext = $file_ext[-1];
                   1024:             if (@Omit) {
                   1025:                 foreach (@Omit) { return OK if (lc($curfext) eq $_); }
                   1026:             }
                   1027:             if (@Only) {
                   1028:                 my $skip = 1;
                   1029:                 foreach (@Only) { $skip = 0 if (lc($curfext) eq $_); }
                   1030:                 return OK if ($skip > 0);
                   1031:             }
                   1032:             # Set the icon for the file
                   1033:             my $iconname = &Apache::loncommon::icon($listname);
1.184     bisitz   1034: #SB	$r->print("<tr valign='$valign' bgcolor=\"$fileclr\">);
1.194     jms      1035:         $r->print(&Apache::loncommon::start_data_table_row()); #SB valign="$valign" ?!?
                   1036:         $r->print('<td class="LC_middle LC_nobreak">');
1.104     albertel 1037: 	
1.133     albertel 1038:         if ($env{'form.catalogmode'} eq 'interactive') {
1.128     foxr     1039: 	    my $quotable_filelink = &Apache::loncommon::escape_single($filelink);
1.35      matthew  1040:             $r->print("<a href=\"javascript:select_data(\'",
1.125     foxr     1041:                       $quotable_filelink,"')\">");
1.162     albertel 1042: 	    $r->print("<img alt=\"\" src='",$iconpath,"select.gif' class='LC_icon' /></a>".
1.17      harris41 1043: 		      "\n");
1.199     droeschl 1044: 	    $r->print('</td><td class="LC_middle">');
1.145     www      1045: 	} elsif ($env{'form.catalogmode'} eq 'import') {
1.152     albertel 1046: 	    $r->print("<form name='form$fnum' action=''>\n");
1.8       harris41 1047: 	    $r->print("<input type='checkbox' name='filelink"."' ".
1.199     droeschl 1048: 		      "value='$filelink' onclick='".
1.16      harris41 1049: 		      "javascript:queue(\"form$fnum\")' ");
                   1050: 	    if ($hash{'store_'.$filelink}) {
                   1051: 		$r->print("checked");
                   1052: 	    }
1.131     albertel 1053: 	    $r->print(" />\n");
1.199     droeschl 1054: 	    $r->print('</form></td><td class="LC_middle">');
1.16      harris41 1055: 	    $hash{"pre_${fnum}_link"}=$filelink;
1.166     banghart 1056: 	    $hash{"pre_${fnum}_title"}=$title;
1.165     banghart 1057: 	    if (!$hash{"pre_${fnum}_title"}) {
1.167     banghart 1058: 	        $hash{"pre_${fnum}_title"} = 'Not_retrieved';
1.165     banghart 1059: 	    }
1.8       harris41 1060:   	    $fnum++;
1.7       harris41 1061: 	}
1.95      www      1062: # Form to open or close sequences
                   1063: 	if ($filelink=~/\.(page|sequence)$/) {
                   1064: 	    my $curdir = $startdir.$filecom[0].'/';
                   1065: 	    &begin_form($r,$curdir);
                   1066: 	    $indent--;
                   1067: 	}
                   1068: # General indentation
1.4       harris41 1069: 	    my $count = 0;
1.194     jms      1070: 	    while ($count < $indent) {
1.199     droeschl 1071:             $r->print('<img alt="" src="'.$iconpath.'whitespace_21.gif" 
                   1072:                 class="LC_icon" />');
1.194     jms      1073: 	        $count++;
1.4       harris41 1074: 	    }
1.95      www      1075: # Sequence open/close icon
                   1076: 	if ($filelink=~/\.(page|sequence)$/) {
                   1077: 	    my $curdir = $startdir.$filecom[0].'/';
                   1078: 	    my $anchor = $curdir;
1.162     albertel 1079: 	    $anchor =~ s/\W//g;
1.131     albertel 1080: 	    $r->print ('<input type="hidden" name="acts" value="" />');
1.194     jms      1081: 	    $r->print ('<a name="'.$anchor.'"></a>');
1.199     droeschl 1082:             $r->print ('<a href="#" onclick="document.dirpath'.($dnum-1).'.submit()">');
1.194     jms      1083:             $r->print ('<img src="'.$iconpath.'arrow.'.($nowOpen ? "open" : "closed" ).
                   1084:                        '.gif" class="LC_fileicon"');
1.199     droeschl 1085: 	    $r->print (' alt="'.$msg.'" /></a>'.
1.95      www      1086: 		       "\n");
                   1087: 	}
                   1088: # Filetype icons
1.194     jms      1089: 	$r->print("<img alt=\"\" src='$iconname' class='LC_fileicon' />\n");
1.128     foxr     1090: 	my $quotable_filelink = &Apache::loncommon::escape_single($filelink);
1.125     foxr     1091: 
                   1092: 	$r->print (" <a href=\"javascript:openWindow('".$quotable_filelink.
1.170     albertel 1093: 		   "?inhibitmenu=yes','previewfile','450','500','no','yes','yes');\"".
1.152     albertel 1094: 		   " target=\"_self\">$listname</a> ");
1.170     albertel 1095: 	$quotable_filelink = &Apache::loncommon::escape_single($filelink.'.meta');
                   1096: 	&Apache::loncommon::inhibit_menu_check(\$quotable_filelink);
1.125     foxr     1097: 	$r->print (" (<a href=\"javascript:openWindow('".$quotable_filelink.
1.170     albertel 1098: 		   "?inhibitmenu=yes','metadatafile','500','550','no','yes','no');\" ".
1.180     bisitz   1099: 		   " target=\"_self\">".&mt('metadata')."</a>) ");
1.134     www      1100: # Close form to open/close sequence
                   1101: 	if ($filelink=~/\.(page|sequence)$/) {
                   1102: 	    $r->print('</form>');
                   1103: 	}
1.199     droeschl 1104: 	$r->print("</td>\n");
1.208     wenzelju 1105: # Wishlistlink
                   1106:         $r->print('<td><a href="javascript:;" title="'.&mt('Set a link for this resource to wishlist').'" '.
                   1107:                   'onclick="set_wishlistlink('."'".&Apache::lonnet::gettitle($filelink).
                   1108:                   "','$startdir$listname'".')">'.
                   1109:                   '<img class="LC_icon" src="/res/adm/pages/wishlist.png" '.
                   1110:                   'alt="'.&mt('set wishlistlink').'" style="width:22px;"/></a></td>');
1.45      ng       1111: 	if ($hash{'display_attrs_0'} == 1) {
1.70      ng       1112: 	    $r->print('<td> '.($title eq '' ? '&nbsp;' : $title).
1.45      ng       1113: 		      ' </td>'."\n");
                   1114: 	}
1.194     jms      1115: 	$r->print('<td class="LC_right"> ',
1.17      harris41 1116: 		  $filecom[8]," </td>\n") 
1.45      ng       1117: 	    if $hash{'display_attrs_1'} == 1;
1.194     jms      1118: 	$r->print('<td class="LC_nobreak"> '.
1.181     bisitz   1119:                   (&Apache::lonlocal::locallocaltime($filecom[9]))." </td>\n")
1.45      ng       1120: 	    if $hash{'display_attrs_2'} == 1;
1.194     jms      1121: 	$r->print('<td class="LC_nobreak"> '.
1.181     bisitz   1122:                   (&Apache::lonlocal::locallocaltime($filecom[10]))." </td>\n")
1.45      ng       1123: 	    if $hash{'display_attrs_3'} == 1;
1.2       harris41 1124: 
1.45      ng       1125: 	if ($hash{'display_attrs_4'} == 1) {
1.104     albertel 1126: 	    my $author = &Apache::lonnet::metadata($filelink,'author');
1.194     jms      1127: 	    $r->print('<td class="LC_nobreak"> '.($author eq '' ? '&nbsp;' : $author).
1.17      harris41 1128: 		      " </td>\n");
1.2       harris41 1129: 	}
1.45      ng       1130: 	if ($hash{'display_attrs_5'} == 1) {
1.104     albertel 1131: 	    my $keywords = &Apache::lonnet::metadata($filelink,'keywords');
1.45      ng       1132: 	    # $keywords = '&nbsp;' if (!$keywords);
1.70      ng       1133: 	    $r->print('<td> '.($keywords eq '' ? '&nbsp;' : $keywords).
1.17      harris41 1134: 		      " </td>\n");
1.2       harris41 1135: 	}
1.109     taceyjo1 1136: 
1.45      ng       1137: 	if ($hash{'display_attrs_6'} == 1) {
1.104     albertel 1138: 	    my $lang = &Apache::lonnet::metadata($filelink,'language');
1.28      harris41 1139: 	    $lang = &Apache::loncommon::languagedescription($lang);
1.70      ng       1140: 	    $r->print('<td> '.($lang eq '' ? '&nbsp;' : $lang).
1.17      harris41 1141: 		      " </td>\n");
1.2       harris41 1142: 	}
1.70      ng       1143: 	if ($hash{'display_attrs_8'} == 1) {
1.111     www      1144: # statistics
1.117     www      1145: 	    &dynmetaread($filelink);
1.112     www      1146: 	    $r->print("<td>");
1.196     droeschl 1147: 
                   1148:         for (qw(count course stdno avetries difficulty disc clear technical
                   1149:             correct helpful depth)) {
                   1150: 
                   1151:             dynmetaprint($r,$filelink,$_);
                   1152:         }
                   1153: 
1.112     www      1154: 	    $r->print("&nbsp;</td>\n");
1.111     www      1155: 
1.70      ng       1156: 	}
1.109     taceyjo1 1157: 	if ($hash{'display_attrs_10'} == 1) {
                   1158: 	    my $source = &Apache::lonnet::metadata($filelink,'sourceavail');
1.110     albertel 1159: 	    if($source eq 'open') {
1.119     taceyjo1 1160: 		my $sourcelink = &Apache::lonsource::make_link($filelink,$listname);
1.128     foxr     1161: 		my $quotable_sourcelink = &Apache::loncommon::escape_single($sourcelink);
1.170     albertel 1162: 		&Apache::loncommon::inhibit_menu_check(\$quotable_sourcelink);
1.125     foxr     1163: 		$r->print('<td>'."<a href=\"javascript:openWindow('"
                   1164: 			  .$quotable_sourcelink.
1.152     albertel 1165: 			  "', 'previewsource', '700', '700', 'no', 'yes','yes');\"".
1.181     bisitz   1166: 			  " target=\"_self\">".&mt('Source Code')."</a> "."</td>\n");
1.110     albertel 1167: 	    } else { #A cuddled else. :P
1.111     www      1168: 		$r->print("<td>&nbsp;</td>\n");
1.110     albertel 1169: 	    }
1.109     taceyjo1 1170: 	}
1.111     www      1171: 	if ($hash{'display_attrs_11'} == 1) {
                   1172: # links
1.117     www      1173: 	   &dynmetaread($filelink);
1.113     www      1174: 	   $r->print('<td>');
1.148     www      1175: 	   &coursecontext($r,$filelink);
1.196     droeschl 1176:        for (qw(goto_list comefrom_list sequsage_list dependencies course_list)) {
                   1177:              dynmetaprint($r,$filelink,$_);
                   1178:        }
1.113     www      1179: 	   $r->print('</td>');
1.114     www      1180:         }
1.185     jms      1181:         
                   1182:    
                   1183: 	
                   1184: 	if ($hash{'display_attrs_7'} == 1) {
1.115     www      1185: # Show resource
1.140     www      1186: 	   my $output=&showpreview($filelink);
1.200     droeschl 1187:            $r->print('<td class="LC_fontsize_medium">'.($output eq '' ? '&nbsp;':$output).
1.115     www      1188: 		      " </td>\n");
1.1       www      1189:     }
1.185     jms      1190:     
                   1191:     if ($hash{'display_attrs_12'} == 1) {
                   1192: 	    my $subject = &Apache::lonnet::metadata($filelink,'subject');
                   1193: 	    $r->print('<td> '.($subject eq '' ? '&nbsp;' : $subject).
                   1194: 		      " </td>\n");
                   1195: 	}
                   1196: 	
1.186     jms      1197: 	if ($hash{'display_attrs_13'} == 1) {
                   1198: 	    my $notes = &Apache::lonnet::metadata($filelink,'notes');
                   1199: 	    $r->print('<td> '.($notes eq '' ? '&nbsp;' : $notes).
                   1200: 		      " </td>\n");
                   1201: 	}
                   1202: 	
                   1203: 	if ($hash{'display_attrs_14'} == 1) {
                   1204: 	    my $abstract = &Apache::lonnet::metadata($filelink,'abstract');
                   1205: 	    $r->print('<td> '.($abstract eq '' ? '&nbsp;' : $abstract).
                   1206: 		      " </td>\n");
                   1207: 	}
                   1208: 	
1.193     jms      1209: 	if ($hash{'display_attrs_15'} == 1) {
                   1210: 	    my $gradelevel = &Apache::lonnet::metadata($filelink,'gradelevel');
                   1211: 	    $r->print('<td> '.($gradelevel eq '' ? '&nbsp;' : $gradelevel).
                   1212: 		      " </td>\n");
                   1213: 	}
                   1214: 	
1.195     jms      1215: 	if ($hash{'display_attrs_16'} == 1) {
                   1216: 	    my $standards = &Apache::lonnet::metadata($filelink,'standards');
                   1217: 	    $r->print('<td> '.($standards eq '' ? '&nbsp;' : $standards).
                   1218: 		      " </td>\n");
                   1219: 	}
                   1220: 	
1.185     jms      1221: 	$r->print(&Apache::loncommon::end_data_table_row());
                   1222: }
                   1223:     
                   1224:     
1.17      harris41 1225: 
1.2       harris41 1226: # -- display directory
1.1       www      1227:     if ($fnptr == $dirptr) {
1.2       harris41 1228: 	my $curdir = $startdir.$filecom[0].'/';
1.3       harris41 1229: 	my $anchor = $curdir;
1.162     albertel 1230: 	$anchor =~ s/\W//g;
1.182     bisitz   1231: #SB	$r->print("<tr bgcolor=\"$fileclr\">$extrafield<td valign=$valign>");
                   1232:         $r->print(&Apache::loncommon::start_data_table_row()); # SB: bgcolor suggestion: darkgrey ("LC_info_row"?!?)
                   1233: #	$r->print('<tr class="LC_info_row">');
1.194     jms      1234:         $r->print($extrafield.'<td class="LC_middle LC_nobreak">');
1.2       harris41 1235: 	&begin_form ($r,$curdir);
1.4       harris41 1236: 	my $indentm1 = $indent-1;
1.194     jms      1237: 	my $count = 0;
                   1238: 	while ($count < $indentm1) {
1.199     droeschl 1239: 	    $r->print ('<img alt="" src="',$iconpath
                   1240: 	               ,'whitespace_21.gif" class="LC_icon" />');
1.194     jms      1241:             $count++;
1.1       www      1242: 	}
1.131     albertel 1243: 	$r->print ('<input type="hidden" name="acts" value="" />');
1.194     jms      1244: 	$r->print ('<a name="'.$anchor.'"></a>');
1.199     droeschl 1245:         $r->print ('<a href="#" onclick="document.dirpath'.($dnum-1).'.submit()"><img src="'.$iconpath.
1.194     jms      1246: 		   'arrow.'.($nowOpen ? "open" : "closed" ).'.gif"');
1.199     droeschl 1247: 	$r->print (' alt="'.$msg.'" class="LC_fileicon" /></a>'.
1.17      harris41 1248: 		   "\n");
1.128     foxr     1249: 	my $quotable_curdir = &Apache::loncommon::escape_single($curdir);
1.194     jms      1250:         
                   1251:         my $location = &Apache::loncommon::lonhttpdurl("/adm/lonIcons");
                   1252: 	my $icon = "navmap.folder.".($nowOpen ? "open":"closed").'.gif';
1.204     raeburn  1253:         $r->print ('<a href="javascript:gothere('
                   1254:                   ."'$quotable_curdir'".');">'
                   1255:                   .'<img class="LC_fileicon" alt="'.&mt('Open Folder').'" src="'
                   1256:                   .$location.'/'.$icon.'" />'
                   1257:                   ."\n");
1.208     wenzelju 1258: 	$r->print ("$listname</a></form>");
                   1259: # Wishlistlink
                   1260:         $r->print('</td><td><a href="javascript:;" '.
                   1261:                   'title="'.&mt('Set a link for this folder to wishlist').'" '.
                   1262:                   'onclick="set_wishlistlink('."'$listname','$startdir$listname'".')">'.
                   1263:                   '<img class="LC_icon" src="/res/adm/pages/wishlist.png" '.
                   1264:                   'alt="'.&mt('set wishlistlink').'" style="width:22px;"/></a></td>');
1.86      www      1265: # Attributes
                   1266: 	my $filelink = $startdir.$filecom[0].'/default';
                   1267: 
                   1268: 	if ($hash{'display_attrs_0'} == 1) {
1.169     albertel 1269: 	    my $title = &Apache::lonnet::gettitle($filelink);
1.86      www      1270: 	    $r->print('<td> '.($title eq '' ? '&nbsp;' : $title).
                   1271: 		      ' </td>'."\n");
                   1272: 	}
1.194     jms      1273: 	$r->print('<td class="LC_right"> ',
1.86      www      1274: 		  $filecom[8]," </td>\n") 
                   1275: 	    if $hash{'display_attrs_1'} == 1;
1.194     jms      1276: 	$r->print('<td class="LC_break"> '.
1.181     bisitz   1277:                   (&Apache::lonlocal::locallocaltime($filecom[9]))." </td>\n")
1.86      www      1278: 	    if $hash{'display_attrs_2'} == 1;
1.194     jms      1279: 	$r->print('<td class="LC_break"> '.
1.181     bisitz   1280:                   (&Apache::lonlocal::locallocaltime($filecom[10]))." </td>\n")
1.86      www      1281: 	    if $hash{'display_attrs_3'} == 1;
                   1282: 
                   1283: 	if ($hash{'display_attrs_4'} == 1) {
                   1284: 	    my $author = &Apache::lonnet::metadata($filelink,'author');
                   1285: 	    $r->print('<td> '.($author eq '' ? '&nbsp;' : $author).
                   1286: 		      " </td>\n");
                   1287: 	}
                   1288: 	if ($hash{'display_attrs_5'} == 1) {
                   1289: 	    my $keywords = &Apache::lonnet::metadata($filelink,'keywords');
                   1290: 	    # $keywords = '&nbsp;' if (!$keywords);
                   1291: 	    $r->print('<td> '.($keywords eq '' ? '&nbsp;' : $keywords).
                   1292: 		      " </td>\n");
                   1293: 	}
                   1294: 	if ($hash{'display_attrs_6'} == 1) {
                   1295: 	    my $lang = &Apache::lonnet::metadata($filelink,'language');
                   1296: 	    $lang = &Apache::loncommon::languagedescription($lang);
                   1297: 	    $r->print('<td> '.($lang eq '' ? '&nbsp;' : $lang).
                   1298: 		      " </td>\n");
                   1299: 	}
1.185     jms      1300: 	
1.86      www      1301: 	if ($hash{'display_attrs_8'} == 1) {
                   1302: 	   $r->print('<td>&nbsp;</td>');
                   1303: 	}
1.115     www      1304:  	if ($hash{'display_attrs_10'} == 1) {
1.109     taceyjo1 1305: 	   $r->print('<td>&nbsp;</td>');
                   1306: 	}
1.185     jms      1307: 	if ($hash{'display_attrs_7'} == 1) {
                   1308: 	   $r->print('<td>&nbsp;</td>');
                   1309:     }     
                   1310:     if ($hash{'display_attrs_11'} == 1) {
1.111     www      1311: 	   $r->print('<td>&nbsp;</td>');
                   1312: 	}
1.185     jms      1313: 	if ($hash{'display_attrs_12'} == 1) {
                   1314: 	    my $subject = &Apache::lonnet::metadata($filelink,'subject');
                   1315: 	    $r->print('<td> '.($subject eq '' ? '&nbsp;' : $subject).
                   1316: 		      " </td>\n");
                   1317: 	}
1.186     jms      1318: 	if ($hash{'display_attrs_13'} == 1) {
                   1319: 	    my $notes = &Apache::lonnet::metadata($filelink,'notes');
                   1320: 	    $r->print('<td> '.($notes eq '' ? '&nbsp;' : $notes).
                   1321: 		      " </td>\n");
                   1322: 	}
                   1323: 	
                   1324: 	if ($hash{'display_attrs_14'} == 1) {
                   1325: 	    my $abstract = &Apache::lonnet::metadata($filelink,'abstract');
                   1326: 	    $r->print('<td> '.($abstract eq '' ? '&nbsp;' : $abstract).
                   1327: 		      " </td>\n");
                   1328: 	}
1.185     jms      1329: 	
1.193     jms      1330: 	if ($hash{'display_attrs_15'} == 1) {
                   1331: 	    my $gradelevel = &Apache::lonnet::metadata($filelink,'gradelevel');
                   1332: 	    $r->print('<td> '.($gradelevel eq '' ? '&nbsp;' : $gradelevel).
                   1333: 		      " </td>\n");
                   1334: 	}
                   1335: 	
1.195     jms      1336: 	if ($hash{'display_attrs_16'} == 1) {
                   1337: 	    my $standards = &Apache::lonnet::metadata($filelink,'standards');
                   1338: 	    $r->print('<td> '.($standards eq '' ? '&nbsp;' : $standards).
                   1339: 		      " </td>\n");
                   1340: 	}
                   1341: 	
                   1342: 	
1.185     jms      1343: 	$r->print(&Apache::loncommon::end_data_table_row());
1.1       www      1344:     }
1.2       harris41 1345: 
1.1       www      1346: }
                   1347: 
1.148     www      1348: sub coursecontext {
                   1349:     my ($r,$filelink)=@_;
                   1350:     my $filesymb=&Apache::lonnet::symbread($filelink);
                   1351:     if ($filesymb) {
                   1352: 	my ($map,$index,$resource)=&Apache::lonnet::decode_symb($filesymb);
                   1353: 	$r->print(&mt('Already in this course:<br />[_1] in folder/map [_2].<br />',
                   1354: 	      &Apache::lonnet::gettitle($resource),
                   1355: 	      &Apache::lonnet::gettitle($map)));
                   1356:     }
                   1357: }
                   1358: 
1.140     www      1359: sub showpreview {
                   1360:     my ($filelink)=@_;
1.151     albertel 1361:     if ($filelink=~m-^(/ext/|http://)-) {
1.150     www      1362: 	return &mt('External Resource, preview not enabled');
                   1363:     }
1.140     www      1364:     my ($curfext)=($filelink=~/\.(\w+)$/);
                   1365:     my $output='';
                   1366:     my $embstyle=&Apache::loncommon::fileembstyle($curfext);
                   1367:     if ($embstyle eq 'ssi') {
                   1368:        my $cache=$Apache::lonnet::perlvar{'lonDocRoot'}.$filelink.
                   1369:                     '.tmp';
                   1370:        if ((!$env{'form.updatedisplay'}) &&
                   1371:                     (-e $cache)) {
                   1372:           open(FH,$cache);
                   1373:           $output=join("\n",<FH>);
                   1374:           close(FH);
                   1375:        } else {
1.147     www      1376: # In update display mode, remove old cache. This is done to retroactively
                   1377: # clean up course context renderings.
                   1378: 	  if (-e $cache) {
                   1379: 	       unlink($cache);
                   1380: 	  }
1.140     www      1381:           $output=&Apache::lonnet::ssi_body($filelink);
1.146     www      1382: # Is access denied? Don't render, don't store
1.140     www      1383:           if ($output=~/LONCAPAACCESSCONTROLERRORSCREEN/s) {
                   1384:              $output='';
1.146     www      1385: # Was this rendered in course content? Don't store
                   1386:           } elsif (!&Apache::lonnet::symbread($filelink)) {
1.140     www      1387:              open(FH,">$cache");
                   1388:              print FH $output;
                   1389:              close(FH);
                   1390:           }
                   1391:        }
                   1392:     } elsif ($embstyle eq 'img') {
1.152     albertel 1393:        $output='<img alt="'.&mt('Preview').'" src="'.$filelink.'" />';
1.154     albertel 1394:     } elsif ($filelink=~m{^/res/($match_domain)/($match_username)/}) {
1.152     albertel 1395:        $output='<img  alt="'.&mt('Preview').'" src="http://'.
1.157     albertel 1396:                  &Apache::lonnet::hostname(&Apache::lonnet::homeserver($2,$1)).
1.140     www      1397:                  '/cgi-bin/thumbnail.gif?url='.$filelink.'" />';
                   1398:     }
                   1399:     return $output;
                   1400: }
                   1401: 
1.113     www      1402: sub dynmetaprint {
                   1403:     my ($r,$filelink,$item)=@_;
                   1404:     if ($dynhash{$filelink}->{$item}) {
1.114     www      1405: 	$r->print("\n<br />".$fieldnames{$item}.': '.
1.113     www      1406: 		  &Apache::lonmeta::prettyprint($item,
                   1407: 						$dynhash{$filelink}->{$item},
1.145     www      1408: 		  (($env{'form.catalogmode'} ne 'import')?'preview':''),
1.113     www      1409: 		  '',
1.145     www      1410: 		  (($env{'form.catalogmode'} eq 'import')?'document.forms.fileattr':''),1));
1.113     www      1411:     }
                   1412: }
                   1413: 
1.14      harris41 1414: # ------------------- prints the beginning of a form for directory or file link
1.1       www      1415: sub begin_form {
                   1416:     my ($r,$uri) = @_;
1.3       harris41 1417:     my $anchor = $uri;
1.162     albertel 1418:     $anchor =~ s/\W//g;
                   1419:     $uri=&Apache::loncommon::escape_single($uri);
1.17      harris41 1420:     $r->print ('<form method="post" name="dirpath'.$dnum.'" action="'.$uri.
                   1421: 	       '#'.$anchor.
1.199     droeschl 1422: 	       '" onsubmit="return rep_dirpath(\''.$dnum.'\''.
1.17      harris41 1423: 	       ',document.forms.fileattr.acts.value)" '.
1.16      harris41 1424: 	       'enctype="application/x-www-form-urlencoded">'."\n");
1.131     albertel 1425:     $r->print ('<input type="hidden" name="openuri" value="'.$uri.'" />'.
1.17      harris41 1426: 	       "\n");
1.131     albertel 1427:     $r->print ('<input type="hidden" name="dirPointer" value="on" />'."\n");
1.170     albertel 1428:     $r->print(&Apache::loncommon::inhibit_menu_check('input'));
1.16      harris41 1429:     $dnum++;
1.17      harris41 1430: }
                   1431: 
                   1432: # --------- settings whenever the user causes the indexer window to be launched
                   1433: sub start_fresh_session {
1.149     albertel 1434:     my ($hash) = @_;
                   1435:     delete $hash->{'form.catalogmode'};
                   1436:     delete $hash->{'form.mode'};
                   1437:     delete $hash->{'form.form'};
                   1438:     delete $hash->{'form.element'};
                   1439:     delete $hash->{'form.omit'};
                   1440:     delete $hash->{'form.only'};
                   1441:     foreach (keys %{$hash}) {
                   1442:         delete $hash->{$_} if (/^(pre_|store)/);
1.27      harris41 1443:     }
1.1       www      1444: }
                   1445: 
1.35      matthew  1446: # ------------------------------------------------------------------- setvalues
                   1447: sub setvalues {
                   1448:     # setvalues is used in registerurl to synchronize the database
                   1449:     # hash and environment hashes
                   1450:     my ($H1,$h1key,$H2,$h2key) =@_;
                   1451:     #
                   1452:     if (exists $H2->{$h2key}) {
                   1453: 	$H1->{$h1key} = $H2->{$h2key};
                   1454:     } elsif (exists $H1->{$h1key}) {
                   1455: 	$H2->{$h2key} = $H1->{$h1key};
                   1456:     } 
                   1457: }
                   1458: 
1.1       www      1459: 1;
1.54      www      1460: 
                   1461: sub cleanup {
1.55      www      1462:     if (tied(%hash)){
                   1463: 	&Apache::lonnet::logthis('Cleanup indexer: hash');
                   1464:     }
1.138     albertel 1465:     return OK;
1.54      www      1466: }
1.23      harris41 1467: 
1.126     foxr     1468: 
                   1469: 
                   1470: 
                   1471: 
1.23      harris41 1472: =head1 NAME
                   1473: 
                   1474: Apache::lonindexer - mod_perl module for cross server filesystem browsing
                   1475: 
                   1476: =head1 SYNOPSIS
                   1477: 
                   1478: Invoked by /etc/httpd/conf/srm.conf:
                   1479: 
                   1480:  <LocationMatch "^/res.*/$">
                   1481:  SetHandler perl-script
                   1482:  PerlHandler Apache::lonindexer
                   1483:  </LocationMatch>
                   1484: 
                   1485: =head1 INTRODUCTION
                   1486: 
                   1487: This module enables a scheme of browsing across a cross server.
                   1488: 
                   1489: This is part of the LearningOnline Network with CAPA project
                   1490: described at http://www.lon-capa.org.
                   1491: 
                   1492: =head1 BEGIN SUBROUTINE
                   1493: 
                   1494: This routine is only run once after compilation.
                   1495: 
                   1496: =over 4
                   1497: 
                   1498: =item *
                   1499: 
                   1500: Initializes %language hash table.
                   1501: 
                   1502: =back
                   1503: 
                   1504: =head1 HANDLER SUBROUTINE
                   1505: 
                   1506: This routine is called by Apache and mod_perl.
                   1507: 
                   1508: =over 4
                   1509: 
                   1510: =item *
                   1511: 
                   1512: read in machine configuration variables
                   1513: 
                   1514: =item *
                   1515: 
                   1516: see if called from an interactive mode
                   1517: 
                   1518: =item *
                   1519: 
                   1520: refresh environment with user database values (in %hash)
                   1521: 
                   1522: =item *
                   1523: 
                   1524: define extra fields and buttons in case of special mode
                   1525: 
                   1526: =item *
                   1527: 
                   1528: set catalogmodefunctions to have extra needed javascript functionality
                   1529: 
                   1530: =item *
                   1531: 
                   1532: print header
                   1533: 
                   1534: =item *
                   1535: 
                   1536: evaluate actions from previous page (both cumulatively and chronologically)
                   1537: 
                   1538: =item *
                   1539: 
                   1540: output title
                   1541: 
                   1542: =item *
                   1543: 
                   1544: get state of file attributes to be showing
                   1545: 
                   1546: =item *
                   1547: 
                   1548: output state of file attributes to be showing
                   1549: 
                   1550: =item *
                   1551: 
                   1552: output starting row to the indexed file/directory hierarchy
                   1553: 
                   1554: =item *
                   1555: 
                   1556: read in what directories have previously been set to "open"
                   1557: 
                   1558: =item *
                   1559: 
                   1560: if not at top level, provide an uplink arrow
                   1561: 
                   1562: =item *
                   1563: 
                   1564: recursively go through all the directories and output as appropriate
                   1565: 
                   1566: =item *
                   1567: 
                   1568: information useful for group import
                   1569: 
                   1570: =item *
                   1571: 
                   1572: end the tables
                   1573: 
                   1574: =item *
                   1575: 
                   1576: end the output and return
                   1577: 
                   1578: =back
                   1579: 
                   1580: =head1 OTHER SUBROUTINES
                   1581: 
                   1582: =over 4
                   1583: 
                   1584: =item *
                   1585: 
                   1586: scanDir - recursive scan of a directory
                   1587: 
                   1588: =item *
                   1589: 
                   1590: get_list - get complete matched list based on the uri (returns an array)
                   1591: 
                   1592: =item *
                   1593: 
                   1594: match_ext - filters out files based on extensions (returns an array)
                   1595: 
                   1596: =item *
                   1597: 
                   1598: display_line - displays one line in appropriate table format
                   1599: 
                   1600: =item *
                   1601: 
                   1602: begin_form - prints the beginning of a form for directory or file link
                   1603: 
                   1604: =item *
                   1605: 
                   1606: start_fresh_session - settings whenever the user causes the indexer window
                   1607: to be launched
                   1608: 
                   1609: =back
                   1610: 
                   1611: =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.