Diff for /loncom/interface/lonsearchcat.pm between versions 1.100 and 1.114

version 1.100, 2001/08/28 12:12:38 version 1.114, 2002/01/06 01:29:53
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 #  
 # Search Catalog  # Search Catalog
 #  #
 # YEAR=2001  # $Id$
 # 03/08/2001 Scott Harrison  
 # Scott Harrison: 03/12/2001, 03/13/2001, 03/14/2001, 03/15/2001, 03/19/2001  
 # Scott Harrison: 03/20/2001, 03/21/2001, 03/22/2001, 03/26/2001, 03/27/2001  
 # Scott Harrison: 04/02/2001, 08/15/2001, 08/24/2001, 08/25/2001  
   
 ###############################################################################  
 ##                                                                           ##  
 ## ORGANIZATION OF THIS PERL MODULE                                          ##  
 ##                                                                           ##  
 ## 1. Description of functions                                               ##  
 ## 2. Modules used by this module                                            ##  
 ## 3. Choices for different output views (detailed, summary, xml, etc)       ##  
 ## 4. BEGIN block (to be run once after compilation)                         ##  
 ## 5. Handling routine called via Apache and mod_perl                        ##  
 ## 6. Other subroutines                                                      ##  
 ##                                                                           ##  
 ###############################################################################  
   
 # ---------------------------------------------------- Description of functions  
 #  
 #  
 # === WEB HANDLER FUNCTIONS  
 # BEGIN() : run once after compilation to initialize values  
 # handler(server reference) : interacts with the Apache server layer  
 #                             (for /adm/searchcat URLs)  
 # get_unprocessed_cgi() : reads in critical name/value pairs that may have not  
 #                         been processed and passed into %ENV by the web server  
 # make_persistent() : makes a set of hidden HTML fields to make  
 #                     SQL search interface information to be persistent  
 #  #
   # Copyright Michigan State University Board of Trustees
 #  #
 # === WEB INTERFACE COMPONENT FUNCTIONS  # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
 # simpletextfield(name,value) : returns HTML formatted string for simple text  
 #                               field  
 # simplecheckbox(name,value) : returns HTML formatted string for simple  
 #                              checkbox  
 # searchphrasefield(title,name,value) : returns HTML formatted string for  
 #                                       a search expression phrase field  
 # dateboxes(name, defaultmonth, defaultday, defaultyear) : returns HTML  
 #                                                          formatted string  
 #                                                          for a calendar date  
 # selectbox(title,name,value,%HASH=options) : returns HTML formatted string for  
 #                                             a selection box field  
 #  #
   # LON-CAPA is free software; you can redistribute it and/or modify
   # it under the terms of the GNU General Public License as published by
   # the Free Software Foundation; either version 2 of the License, or
   # (at your option) any later version.
 #  #
 # === SEARCH FUNCTIONS  # LON-CAPA is distributed in the hope that it will be useful,
 # advancedsearch(server reference, environment reference) : perform a complex  # but WITHOUT ANY WARRANTY; without even the implied warranty of
 #                                  multi-field logical query  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # basicsearch(server reference, environment reference) : perform a simple  # GNU General Public License for more details.
 #                               single-field logical query  
 # build_SQL_query(field name, logic) : builds a SQL query string from a  
 #                                      logical expression with AND/OR keywords  
 # build_custommetadata_query(field_name, logic_statement) : builds a perl  
 #                 regular expression from a logical expression with AND/OR  
 #                 keywords  
 # recursive_SQL_query_build(field name, reverse notation expression) :   
 #                 builds a SQL query string from a reverse notation expression  
 #                 logical expression with AND/OR keywords  
 # build_date_queries(cmonth1, cday1, cyear1, cmonth2, cday2, cyear2,  
 #                    lmonth1, lday1, lyear1, lmonth2, lday2, lyear2) :  
 #                 Builds a SQL logic query to check time/date entries.  
 #  #
   # You should have received a copy of the GNU General Public License
   # along with LON-CAPA; if not, write to the Free Software
   # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #  #
 # === OUTPUTTING RESULTS FUNCTION  # /home/httpd/html/adm/gpl.txt
 # output_results(output mode,  
 #                server reference,   
 #                environment reference,  
 #                reply list reference) : outputs results from search  
 #  #
   # http://www.lon-capa.org/
 #  #
 # === DIFFERENT WAYS TO VIEW METADATA RECORDS  # YEAR=2001
 # detailed_citation_view(ORDERED METADATA LIST FOR A RESULT OBJECT INSTANCE) :  # 3/8, 3/12, 3/13, 3/14, 3/15, 3/19 Scott Harrison
 #          see metadata viewing notes below   # 3/20, 3/21, 3/22, 3/26, 3/27, 4/2, 8/15, 8/24, 8/25 Scott Harrison
 # summary_view(ORDERED METADATA LIST FOR A RESULT OBJECT INSTANCE) :  # 10/12,10/14,10/15,10/16,11/28,11/29,12/10,12/12,12/16 Scott Harrison
 #          see metadata viewing notes below   
 # fielded_format_view(ORDERED METADATA LIST FOR A RESULT OBJECT INSTANCE) :  
 #          see metadata viewing notes below   
 # xml_sgml_view(ORDERED METADATA LIST FOR A RESULT OBJECT INSTANCE) :  
 #          see metadata viewing notes below   
 #  ___________________________________________________________________________  
 # | * Metadata viewing notes                                                  |  
 # | Output is a HTML-ified string.                                            |  
 # | Input arguments are title, author, subject, url, keywords, version, notes,|  
 # | short abstract, mime, language, creation date, last revision date, owner, |  
 # | copyright, hostname, httphost, and extra custom metadata to show.         |  
 #  ---------------------------------------------------------------------------  
 #  
 #  
 # === TEST CONDITIONAL FUNCTIONS  
 # filled(field) : determines whether a given field has been filled  
 #  
 #  #
 # === ERROR FUNCTIONS  ###
 # output_blank_field_error(server reference) : outputs a message saying that  
 #                                              more fields need to be filled in  ###############################################################################
 # output_date_error(server reference, error message) : outputs  ##                                                                           ##
 #         an error message specific to bad date format.  ## ORGANIZATION OF THIS PERL MODULE                                          ##
   ##                                                                           ##
   ## 1. Modules used by this module                                            ##
   ## 2. Choices for different output views (detailed, summary, xml, etc)       ##
   ## 3. BEGIN block (to be run once after compilation)                         ##
   ## 4. Handling routine called via Apache and mod_perl                        ##
   ## 5. Other subroutines                                                      ##
   ##                                                                           ##
   ###############################################################################
   
 package Apache::lonsearchcat;  package Apache::lonsearchcat;
   
Line 110  use Apache::lonnet(); Line 53  use Apache::lonnet();
 use Apache::File();  use Apache::File();
 use CGI qw(:standard);  use CGI qw(:standard);
 use Text::Query;  use Text::Query;
   use GDBM_File;
   use Apache::loncommon();
   
 # ---------------------------------------- variables used throughout the module  # ---------------------------------------- variables used throughout the module
   
 # -- information holders  # -- information holders
 my %language; # holds contents of language.tab  
 my %cprtag; # holds contents of copyright.tab  
 my %mimetag; # holds contents of filetypes.tab  
 my %hostdomains; # matches host name to host domain  my %hostdomains; # matches host name to host domain
 my %hostips; # matches host name to host ip  my %hostips; # matches host name to host ip
 my %hitcount; # stores number of hits per host  my %hitcount; # stores number of hits per host
Line 127  my $importbutton; # button to take the s Line 69  my $importbutton; # button to take the s
   
 # -- miscellaneous variables  # -- miscellaneous variables
 my $scrout; # string that holds portions of the screen output  my $scrout; # string that holds portions of the screen output
 my $fnum; # search result counter  
 my $yourself; # allows for quickly limiting to oneself  my $yourself; # allows for quickly limiting to oneself
   my %hash;
   
 # ------------------------------------------ choices for different output views  # ------------------------------------------ choices for different output views
 # Detailed Citation View ---> sub detailed_citation_view  # Detailed Citation View ---> sub detailed_citation_view
Line 153  my $advancedviewselect=<<END; Line 95  my $advancedviewselect=<<END;
 END  END
   
 # ----------------------------------------------------------------------- BEGIN  # ----------------------------------------------------------------------- BEGIN
 sub BEGIN {  BEGIN {
 # --------------------------------- Compute various listings of metadata values  
     $language{'any'}='Any language';  
     {  
  my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.  
  '/language.tab');  
  map {  
     $_=~/(\w+)\s+([\w\s\-]+)/; chomp;  
     $language{$1}=$2;  
  } <$fh>;  
     }  
     $cprtag{'any'}='Any copyright/distribution';  
     {  
  my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonIncludes'}.  
  '/copyright.tab');  
  map {  
     $_=~/(\w+)\s+([\w\s\-]+)/; chomp;  
     $cprtag{$1}=$2;  
  } <$fh>;  
     }  
     $mimetag{'any'}='Any type';  
     {  
  my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.  
  '/filetypes.tab');  
  map {  
     $_=~/(\w+)\s+(\w+)\s+([\w\s\-]+)/; chomp;  
     $mimetag{$1}=".$1 $3";  
  } <$fh>;  
     }  
     {      {
  my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.   my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.
  '/hosts.tab');   '/hosts.tab');
  map {   while (<$fh>) {
     $_=~/(\w+?)\:(\w+?)\:(\w+?)\:(.*)/; chomp;      $_=~/(\w+?)\:(\w+?)\:(\w+?)\:(.*)/; chomp;
     if ($3 eq 'library') {      if ($3 eq 'library') {
  $hostdomains{$1}=$2;   $hostdomains{$1}=$2;
  $hostips{$1}=$4;   $hostips{$1}=$4;
     }      }
  } <$fh>;   }
     }      }
 }  }
   
   my $diropendb = "";
   my $domain = "";
   
 # ----------------------------- Handling routine called via Apache and mod_perl  # ----------------------------- Handling routine called via Apache and mod_perl
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
       untie %hash;
     &get_unprocessed_cgi();      &get_unprocessed_cgi();
   
     $r->content_type('text/html');      $r->content_type('text/html');
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
   
       $domain  = $r->dir_config('lonDefDomain');
   
       $diropendb= "/home/httpd/perl/tmp/$domain\_$ENV{'user.name'}_searchcat.db";
   
       if ($ENV{'form.launch'} eq '1') {
    if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {
       &start_fresh_session();
       untie %hash;
    }
    else {
       $r->print('<html><head></head><body>Unable to tie hash to db '.
         'file</body></html>');
       return OK;
    }
       }
   
 # ----------------------------------- configure dynamic components of interface  # ----------------------------------- configure dynamic components of interface
     my $hidden='';      my $hidden='';
     if ($ENV{'form.catalogmode'} eq 'interactive') {      if ($ENV{'form.catalogmode'} eq 'interactive') {
Line 236  END Line 169  END
   
 # ----------------------------------- See if a search invocation should be done  # ----------------------------------- See if a search invocation should be done
     if ($ENV{'form.basicsubmit'} eq 'SEARCH') {      if ($ENV{'form.basicsubmit'} eq 'SEARCH') {
  return &basicsearch($r,\%ENV);   untie %hash; return &basicsearch($r,\%ENV);
     }      }
     elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {      elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {
  return &advancedsearch($r,\%ENV);   untie %hash; return &advancedsearch($r,\%ENV);
     }      }
   
 # ----------------------------- Else, begin building search interface to output  # ----------------------------- Else, begin building search interface to output
Line 268  END Line 201  END
     $scrout.=&searchphrasefield('Limit by abstract','abstract',      $scrout.=&searchphrasefield('Limit by abstract','abstract',
  $ENV{'form.abstract'});   $ENV{'form.abstract'});
   
     $ENV{'form.mime'}='notxxx' unless length($ENV{'form.mime'});      $ENV{'form.mime'}='any' unless length($ENV{'form.mime'});
     $scrout.=&selectbox('Limit by MIME type','mime',      $scrout.=&selectbox('Limit by MIME type','mime',
  $ENV{'form.mime'},%mimetag);   $ENV{'form.mime'},
    'any','Any type',
    \&{Apache::loncommon::filedescriptionex},
    (&Apache::loncommon::fileextensions));
   
     $ENV{'form.language'}='any' unless length($ENV{'form.language'});      $ENV{'form.language'}='any' unless length($ENV{'form.language'});
   
     $scrout.=&selectbox('Limit by language','language',      $scrout.=&selectbox('Limit by language','language',
  $ENV{'form.language'},%language);   $ENV{'form.language'},'any','Any Language',
        \&{Apache::loncommon::languagedescription},
    (&Apache::loncommon::languageids),
    );
   
 # ------------------------------------------------ Compute date selection boxes  # ------------------------------------------------ Compute date selection boxes
     $scrout.=<<CREATIONDATESTART;      $scrout.=<<CREATIONDATESTART;
Line 327  LASTREVISIONDATEEND Line 265  LASTREVISIONDATEEND
   
     $ENV{'form.copyright'}='any' unless length($ENV{'form.copyright'});      $ENV{'form.copyright'}='any' unless length($ENV{'form.copyright'});
     $scrout.=&selectbox('Limit by copyright/distribution','copyright',      $scrout.=&selectbox('Limit by copyright/distribution','copyright',
  $ENV{'form.copyright'},%cprtag);   $ENV{'form.copyright'},
    'any','Any copyright/distribution',
    \&{Apache::loncommon::copyrightdescription},
    (&Apache::loncommon::copyrightids),
    );
   
 # ------------------------------------------- Compute customized metadata field  # ------------------------------------------- Compute customized metadata field
     $scrout.=<<CUSTOMMETADATA;      $scrout.=<<CUSTOMMETADATA;
Line 413  ENDDOCUMENT Line 355  ENDDOCUMENT
   
 # ----------- grab unprocessed CGI variables that may have been appended to URL  # ----------- grab unprocessed CGI variables that may have been appended to URL
 sub get_unprocessed_cgi {  sub get_unprocessed_cgi {
     map {      foreach (split(/&/,$ENV{'QUERY_STRING'})) {
        my ($name, $value) = split(/=/,$_);         my ($name, $value) = split(/=/,$_);
        $value =~ tr/+/ /;         $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;         $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
        if ($name eq 'catalogmode') {         if ($name eq 'catalogmode' or $name eq 'launch' or $name eq 'acts') {
    $ENV{'form.'.$name}=$value;     $ENV{'form.'.$name}=$value;
        }         }
     } (split(/&/,$ENV{'QUERY_STRING'}));      }
 }  }
   
 # ------------------------------------------------------------- make persistent  # ------------------------------------------------------------- make persistent
 sub make_persistent {  sub make_persistent {
     my $persistent='';      my $persistent='';
           
     map {      foreach (keys %ENV) {
  if (/^form\./ && !/submit/) {   if (/^form\./ && !/submit/) {
     my $name=$_;      my $name=$_;
     my $key=$name;      my $key=$name;
Line 437  sub make_persistent { Line 379  sub make_persistent {
 <input type='hidden' name='$name' value='$ENV{$key}' />  <input type='hidden' name='$name' value='$ENV{$key}' />
 END  END
         }          }
     } (keys %ENV);      }
     return $persistent;      return $persistent;
 }  }
   
Line 613  END Line 555  END
 }  }
   
 sub selectbox {  sub selectbox {
     my ($title,$name,$value,%options)=@_;      my ($title,$name,$value,$anyvalue,$anytag,$functionref,@idlist)=@_;
     my $uctitle=uc($title);      my $uctitle=uc($title);
     my $selout="\n<p><font color=\"#800000\" face=\"helvetica\"><b>$uctitle:".      my $selout="\n<p><font color=\"#800000\" face=\"helvetica\"><b>$uctitle:".
  "</b></font><br />".'<select name="'.$name.'">';   "</b></font><br />".'<select name="'.$name.'">';
     map {      foreach ($anyvalue,@idlist) {
         $selout.='<option value=\''.$_.'\'';          $selout.='<option value=\''.$_.'\'';
         if ($_ eq $value) { $selout.=' selected'; }          if ($_ eq $value and !/^any$/) {
         $selout.='>'.$options{$_}.'</option>';      $selout.=' selected>'.&{$functionref}($_).'</option>';
     } sort keys %options;   }
    elsif ($_ eq $value and /^$anyvalue$/) {
       $selout.=' selected>'.$anytag.'</option>';
    }
           else {$selout.='>'.&{$functionref}($_).'</option>';}
       }
     return $selout.'</select>';      return $selout.'</select>';
 }  }
   
   sub testf {
       return @_[0];
   }
   
 # ----------------------------------------------- Performing an advanced search  # ----------------------------------------------- Performing an advanced search
 sub advancedsearch {  sub advancedsearch {
     my ($r,$envhash)=@_;      my ($r,$envhash)=@_;
Line 641  sub advancedsearch { Line 592  sub advancedsearch {
    'lastrevisiondateend_day','lastrevisiondateend_year',     'lastrevisiondateend_day','lastrevisiondateend_year',
    'notes','abstract','mime','language','owner',     'notes','abstract','mime','language','owner',
    'custommetadata','customshow') {     'custommetadata','customshow') {
  $ENV{"form.$field"}=~s/[^\w\s\(\)\=\-\"\']//g;   $ENV{"form.$field"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
     }      }
   
     # Check to see if enough information was filled in      # Check to see if enough information was filled in
Line 891  sub build_date_queries { Line 842  sub build_date_queries {
 # gives the status of the network search (time elapsed, number of machines  # gives the status of the network search (time elapsed, number of machines
 # contacted, etc.)  # contacted, etc.)
 sub output_results {  sub output_results {
       my $fnum; # search result counter
     my ($mode,$r,$envhash,$query,$replyref)=@_;      my ($mode,$r,$envhash,$query,$replyref)=@_;
     my %ENV=%{$envhash};      my %ENV=%{$envhash};
     my %rhash=%{$replyref};      my %rhash=%{$replyref};
     my $compiledresult='';      my $compiledresult='';
     my $timeremain=30;      my $timeremain=300;
     my $elapsetime=0;      my $elapsetime=0;
     my $resultflag=0;      my $resultflag=0;
     my $tflag=1;      my $tflag=1;
Line 934  SCRIPT Line 886  SCRIPT
         $r->print(<<SCRIPT) if $ENV{'form.catalogmode'} eq 'groupsearch';          $r->print(<<SCRIPT) if $ENV{'form.catalogmode'} eq 'groupsearch';
 <script type="text/javascript">  <script type="text/javascript">
     function select_data(title,url) {      function select_data(title,url) {
  alert('DEBUG: Should be storing '+title+' and '+url);  // alert('DEBUG: Should be storing '+title+' and '+url);
     }      }
     function queue(val) {      function queue(val) {
  if (eval("document.forms."+val+".filelink.checked")) {   if (eval("document.forms.results.returnvalues["+val+"].checked")) {
     document.forms.results.acts.value+='1a'+val+'b';      document.forms.results.acts.value+='1a'+val+'b';
  }   }
  else {   else {
Line 945  SCRIPT Line 897  SCRIPT
  }   }
     }      }
     function select_group() {      function select_group() {
  alert('DEBUG: Should be moving on to group sorting stage'+' acts');   window.location="/adm/groupsort?catalogmode=groupsearch&acts="+
       document.forms.results.acts.value;
     }      }
 </script>  </script>
 SCRIPT  SCRIPT
Line 959  SCRIPT Line 912  SCRIPT
      'scrollbars=1,width=400,height=300');       'scrollbars=1,width=400,height=300');
  openhelpwin.focus();   openhelpwin.focus();
     }      }
       function abortsearch(val) {
    openhelpwin=open('/adm/help/searchcat.html','helpscreen',
        'scrollbars=1,width=400,height=300');
    openhelpwin.focus();
       }
 </script>  </script>
 SCRIPT  SCRIPT
     $r->rflush();      $r->rflush();
Line 1067  RESULTS Line 1025  RESULTS
  '<'+'br />'+   '<'+'br />'+
  ' <'+'input type="button" name="button"'+   ' <'+'input type="button" name="button"'+
  ' value="abort search and view current results" '+   ' value="abort search and view current results" '+
  ' />'+   ' onClick="javascript:opener.abortsearch()" />'+
  ' <'+'input type="button" name="button"'+   ' <'+'input type="button" name="button"'+
  ' value="help" onClick="javascript:opener.openhelp()" />'+   ' value="help" onClick="javascript:opener.openhelp()" />'+
  '<'+'/tt>'+   '<'+'/tt>'+
Line 1079  ENDPOP Line 1037  ENDPOP
     $r->rflush();      $r->rflush();
   
     my $servercount=0;      my $servercount=0;
     $sn=0;  
     my $hitcountsum=0;      my $hitcountsum=0;
     foreach my $rkey (sort keys %rhash) {      my $bloop=$servernum;
       my %orkey;
     BLOOP: while(1) {
         my $sn=0;
         last BLOOP unless $bloop;
         last BLOOP unless $timeremain;
       RLOOP: foreach my $rkey (sort keys %rhash) {
  $sn++;   $sn++;
    next RLOOP if $orkey{$rkey};
  $servercount++;   $servercount++;
  $tflag=1;   $tflag=1;
  $compiledresult='';   $compiledresult='';
Line 1098  ENDPOP Line 1062  ENDPOP
       'src="/adm/lonIcons/srvbad.gif";</script>'.        'src="/adm/lonIcons/srvbad.gif";</script>'.
       "\n");        "\n");
     $r->rflush();      $r->rflush();
       $bloop--;
       $orkey{$rkey}=1;
  }   }
  else {   else {
     $reply=~/^([\.\w]+)$/; # must do since 'use strict' checks for tainting      $reply=~/^([\.\w]+)$/; # must do since 'use strict' checks for tainting
Line 1119  ENDPOP Line 1085  ENDPOP
       $r->rflush();        $r->rflush();
       $tflag=0;        $tflag=0;
   }    }
   last WLOOP if $temp>5;  
   if (-e "$replyfile.end") {    if (-e "$replyfile.end") {
         $bloop--;
         $orkey{$rkey}=1;
       if (-s $replyfile) {        if (-s $replyfile) {
   $r->print('<script type="text/javascript">'.    $r->print('<script type="text/javascript">'.
     'popwin.document.img'.$sn.'.'.      'popwin.document.img'.$sn.'.'.
Line 1161  ENDPOP Line 1128  ENDPOP
       }        }
       last WLOOP;        last WLOOP;
   }    }
     if ($temp>1) {
         sleep 1;
         $timeremain--;
         $elapsetime++;
         last WLOOP;
     }
   last WLOOP unless $timeremain;    last WLOOP unless $timeremain;
   sleep 1;    sleep 1;
   $timeremain--;    $timeremain--;
Line 1202  ENDPOP Line 1175  ENDPOP
  $customhash{$k}=$v;   $customhash{$k}=$v;
     }      }
  }   }
  foreach my $result (@results) {   if (keys %hash) {
     next if $result=~/^custom\=/;      untie %hash;
     chomp $result;   }
     next unless $result;   if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {
     my @fields=map      if ($ENV{'form.launch'} eq '1') {
     {&Apache::lonnet::unescape($_)}   &start_fresh_session();
     (split(/\,/,$result));      }
     my ($title,$author,$subject,$url,$keywords,$version,      foreach my $result (@results) {
  $notes,$abstract,$mime,$lang,   next if $result=~/^custom\=/;
  $creationdate,$lastrevisiondate,$owner,$copyright)=@fields;   chomp $result;
     my $shortabstract=$abstract;   next unless $result;
     $shortabstract=substr($abstract,0,200) if length($abstract)>200;   my @fields=map
     $fields[7]=$shortabstract;   {&Apache::lonnet::unescape($_)}
     my $extrashow2=$extrashow;   (split(/\,/,$result));
     if ($extrashow) {   my ($title,$author,$subject,$url,$keywords,$version,
  foreach my $field (@customfields) {      $notes,$abstract,$mime,$lang,
     my $value='';      $creationdate,$lastrevisiondate,$owner,$copyright)=@fields;
     if ($customhash{$url}=~/\<${field}[^\>]*\>(.*?)\<\/${field}[^\>]*\>/s) {  
         $value=$1;   unless ($ENV{'user.adv'}) {
     }      $keywords='<i>- not displayed -</i>';
             $extrashow2=~s/\<\!\-\- $field \-\-\>/ $value/g;      $fields[4]=$keywords;
         }      $notes='<i>- not displayed -</i>';
             }      $fields[6]=$notes;
       $abstract='<i>- not displayed -</i>';
       $fields[7]=$abstract;
       $subject='<i>- not displayed -</i>';
       $fields[2]=$subject;
    }
   
    my $shortabstract=$abstract;
    $shortabstract=substr($abstract,0,200).'...' if length($abstract)>200;
    $fields[7]=$shortabstract;
    my $shortkeywords=$keywords;
    $shortkeywords=substr($keywords,0,200).'...' if length($keywords)>200;
    $fields[4]=$shortkeywords;
   
    my $extrashow2=$extrashow;
    if ($extrashow) {
       foreach my $field (@customfields) {
    my $value='';
    if ($customhash{$url}=~/\<${field}[^\>]*\>(.*?)\<\/${field}[^\>]*\>/s) {
               $value=$1;
    }
           $extrashow2=~s/\<\!\-\- $field \-\-\>/ $value/g;
               }
                   }
   
             $compiledresult.=<<END if $compiledresult or $servercount!=$servernum;          $compiledresult.=<<END if $compiledresult or $servercount!=$servernum;
 <hr align='left' width='200' noshade />  <hr align='left' width='200' noshade />
 END  END
             $compiledresult.=<<END;                  $compiledresult.=<<END;
 <p>  <p>
 END  END
             $compiledresult.=<<END if $ENV{'form.catalogmode'} eq 'interactive';                  $compiledresult.=<<END if $ENV{'form.catalogmode'} eq 'interactive';
 <font size='-1'><INPUT TYPE="button" NAME="returnvalues" VALUE="SELECT"  <font size='-1'><INPUT TYPE="button" NAME="returnvalues" VALUE="SELECT"
 onClick="javascript:select_data('$title','$url')">  onClick="javascript:select_data('$title','$url')">
 </font>  </font>
 <br />  <br />
 END  END
             $compiledresult.=<<END if $ENV{'form.catalogmode'} eq 'groupsearch';                  if ($ENV{'form.catalogmode'} eq 'groupsearch') {
       $fnum+=0;
       $hash{"pre_${fnum}_link"}=$url;
       $hash{"pre_${fnum}_title"}=$title;
       $compiledresult.=<<END;
 <font size='-1'><input type="checkbox" name="returnvalues" value="SELECT"  <font size='-1'><input type="checkbox" name="returnvalues" value="SELECT"
 onClick="javascript:queue($fnum)" />  onClick="javascript:queue($fnum)" />
 </font>  </font>
 <input type="hidden" name="title$fnum" value="$title" />  
 <input type="hidden" name="url$fnum" value="$url" />  
 <br />  <br />
 END  END
             my $httphost=$ENV{'HTTP_HOST'};  # <input type="hidden" name="title$fnum" value="$title" />
   # <input type="hidden" name="url$fnum" value="$url" />
             my $viewselect;                      $fnum++;
             if ($mode eq 'Basic') {   }
  $viewselect=$ENV{'form.basicviewselect'};          my $httphost=$ENV{'HTTP_HOST'};
     }  
             elsif ($mode eq 'Advanced') {          my $viewselect;
         $viewselect=$ENV{'form.advancedviewselect'};          if ($mode eq 'Basic') {
             }      $viewselect=$ENV{'form.basicviewselect'};
    }
           elsif ($mode eq 'Advanced') {
       $viewselect=$ENV{'form.advancedviewselect'};
    }
   
             if ($viewselect eq 'Detailed Citation View') {          if ($viewselect eq 'Detailed Citation View') {
         $compiledresult.=&detailed_citation_view(@fields,      $compiledresult.=&detailed_citation_view(@fields,
  $hostname,$httphost,   $hostname,$httphost,
  $extrashow2);   $extrashow2);
     }   }
             elsif ($viewselect eq 'Summary View') {                  elsif ($viewselect eq 'Summary View') {
  $compiledresult.=&summary_view(@fields,$hostname,$httphost,      $compiledresult.=&summary_view(@fields,$hostname,$httphost,
        $extrashow2);         $extrashow2);
     }          }
             elsif ($viewselect eq 'Fielded Format') {                  elsif ($viewselect eq 'Fielded Format') {
  $compiledresult.=&fielded_format_view(@fields,$hostname,      $compiledresult.=&fielded_format_view(@fields,$hostname,
       $httphost,$extrashow2);        $httphost,$extrashow2);
     }          }
             elsif ($viewselect eq 'XML/SGML') {                  elsif ($viewselect eq 'XML/SGML') {
  $compiledresult.=&xml_sgml_view(@fields,$hostname,$httphost,      $compiledresult.=&xml_sgml_view(@fields,$hostname,$httphost,
  $extrashow2);   $extrashow2);
     }   }
           
         }              }
   
               untie %hash;
           }
           else {
       $r->print('<html><head></head><body>Unable to tie hash to db '.
     'file</body></html>');
    }
  if ($compiledresult) {   if ($compiledresult) {
     $resultflag=1;      $resultflag=1;
  }   }
Line 1285  $compiledresult Line 1293  $compiledresult
 RESULTS  RESULTS
         my $percent=sprintf('%3.0f',($servercount/$servernum*100));          my $percent=sprintf('%3.0f',($servercount/$servernum*100));
     }      }
     }
     unless ($resultflag) {      unless ($resultflag) {
         $r->print("\nThere were no results that matched your query\n");          $r->print("\nThere were no results that matched your query\n");
     }      }
Line 1310  sub detailed_citation_view { Line 1319  sub detailed_citation_view {
 <b>Subject:</b> $subject<br />  <b>Subject:</b> $subject<br />
 <b>Keyword(s):</b> $keywords<br />  <b>Keyword(s):</b> $keywords<br />
 <b>Notes:</b> $notes<br />  <b>Notes:</b> $notes<br />
 <b>MIME Type:</b> $mimetag{$mime}<br />  <b>MIME Type:</b>
 <b>Language:</b> $language{$lang}<br />  END
 <b>Copyright/Distribution:</b> $cprtag{$copyright}<br />      $result.=&Apache::loncommon::filedescription($mime);
       $result.=<<END;
   <br />
   <b>Language:</b> 
   END
       $result.=&Apache::loncommon::languagedescription($lang);
       $result.=<<END;
   <br />
   <b>Copyright/Distribution:</b> 
   END
       $result.=&Apache::loncommon::copyrightdescription($copyright);
       $result.=<<END;
   <br />
 </p>  </p>
 $extrashow  $extrashow
 <p>  <p>
Line 1328  sub summary_view { Line 1349  sub summary_view {
  $notes,$shortabstract,$mime,$lang,   $notes,$shortabstract,$mime,$lang,
  $creationdate,$lastrevisiondate,$owner,$copyright,   $creationdate,$lastrevisiondate,$owner,$copyright,
  $hostname,$httphost,$extrashow)=@_;   $hostname,$httphost,$extrashow)=@_;
       my $cprtag=&Apache::loncommon::copyrightdescription($copyright);
     my $result=<<END;      my $result=<<END;
 <a href="http://$httphost$url" TARGET='search_preview'>$author</a><br />  <a href="http://$httphost$url" TARGET='search_preview'>$author</a><br />
 $title<br />  $title<br />
 $owner -- $lastrevisiondate<br />  $owner -- $lastrevisiondate<br />
 $cprtag{$copyright}<br />  $cprtag<br />
 $extrashow  $extrashow
 </p>  </p>
 END  END
Line 1345  sub fielded_format_view { Line 1367  sub fielded_format_view {
  $notes,$shortabstract,$mime,$lang,   $notes,$shortabstract,$mime,$lang,
  $creationdate,$lastrevisiondate,$owner,$copyright,   $creationdate,$lastrevisiondate,$owner,$copyright,
  $hostname,$httphost,$extrashow)=@_;   $hostname,$httphost,$extrashow)=@_;
       my $mimetag=&Apache::loncommon::filedescription($mime);
       my $language=&Apache::loncommon::languagedescription($lang);
       my $cprtag=&Apache::loncommon::copyrightdescription($copyright);
     my $result=<<END;      my $result=<<END;
 <b>URL: </b> <A HREF="http://$httphost$url" TARGET='search_preview'>$url</A>  <b>URL: </b> <A HREF="http://$httphost$url" TARGET='search_preview'>$url</A>
 <br />  <br />
Line 1353  sub fielded_format_view { Line 1378  sub fielded_format_view {
 <b>Subject:</b> $subject<br />  <b>Subject:</b> $subject<br />
 <b>Keyword(s):</b> $keywords<br />  <b>Keyword(s):</b> $keywords<br />
 <b>Notes:</b> $notes<br />  <b>Notes:</b> $notes<br />
 <b>MIME Type:</b> $mimetag{$mime}<br />  <b>MIME Type:</b> $mimetag<br />
 <b>Language:</b> $language{$lang}<br />  <b>Language:</b> $language<br />
 <b>Creation Date:</b> $creationdate<br />  <b>Creation Date:</b> $creationdate<br />
 <b>Last Revision Date:</b> $lastrevisiondate<br />  <b>Last Revision Date:</b> $lastrevisiondate<br />
 <b>Publisher/Owner:</b> $owner<br />  <b>Publisher/Owner:</b> $owner<br />
 <b>Copyright/Distribution:</b> $cprtag{$copyright}<br />  <b>Copyright/Distribution:</b> $cprtag<br />
 <b>Repository Location:</b> $hostname<br />  <b>Repository Location:</b> $hostname<br />
 <b>Abstract:</b> $shortabstract<br />  <b>Abstract:</b> $shortabstract<br />
 $extrashow  $extrashow
Line 1373  sub xml_sgml_view { Line 1398  sub xml_sgml_view {
  $notes,$shortabstract,$mime,$lang,   $notes,$shortabstract,$mime,$lang,
  $creationdate,$lastrevisiondate,$owner,$copyright,   $creationdate,$lastrevisiondate,$owner,$copyright,
  $hostname,$httphost,$extrashow)=@_;   $hostname,$httphost,$extrashow)=@_;
       my $cprtag=&Apache::loncommon::copyrightdescription($copyright);
       my $mimetag=&Apache::loncommon::filedescription($mime);
       my $language=&Apache::loncommon::languagedescription($lang);
     my $result=<<END;      my $result=<<END;
 <pre>  <pre>
 &lt;LonCapaResource&gt;  &lt;LonCapaResource&gt;
Line 1384  sub xml_sgml_view { Line 1412  sub xml_sgml_view {
 &lt;notes&gt;$notes&lt;/notes&gt;  &lt;notes&gt;$notes&lt;/notes&gt;
 &lt;mimeInfo&gt;  &lt;mimeInfo&gt;
 &lt;mime&gt;$mime&lt;/mime&gt;  &lt;mime&gt;$mime&lt;/mime&gt;
 &lt;mimetag&gt;$mimetag{$mime}&lt;/mimetag&gt;  &lt;mimetag&gt;$mimetag&lt;/mimetag&gt;
 &lt;/mimeInfo&gt;  &lt;/mimeInfo&gt;
 &lt;languageInfo&gt;  &lt;languageInfo&gt;
 &lt;language&gt;$lang&lt;/language&gt;  &lt;language&gt;$lang&lt;/language&gt;
 &lt;languagetag&gt;$language{$lang}&lt;/languagetag&gt;  &lt;languagetag&gt;$language&lt;/languagetag&gt;
 &lt;/languageInfo&gt;  &lt;/languageInfo&gt;
 &lt;creationdate&gt;$creationdate&lt;/creationdate&gt;  &lt;creationdate&gt;$creationdate&lt;/creationdate&gt;
 &lt;lastrevisiondate&gt;$lastrevisiondate&lt;/lastrevisiondate&gt;  &lt;lastrevisiondate&gt;$lastrevisiondate&lt;/lastrevisiondate&gt;
 &lt;owner&gt;$owner&lt;/owner&gt;  &lt;owner&gt;$owner&lt;/owner&gt;
 &lt;copyrightInfo&gt;  &lt;copyrightInfo&gt;
 &lt;copyright&gt;$copyright&lt;/copyright&gt;  &lt;copyright&gt;$copyright&lt;/copyright&gt;
 &lt;copyrighttag&gt;$cprtag{$copyright}&lt;/copyrighttag&gt;  &lt;copyrighttag&gt;$cprtag&lt;/copyrighttag&gt;
 &lt;/copyrightInfo&gt;  &lt;/copyrightInfo&gt;
 &lt;repositoryLocation&gt;$hostname&lt;/repositoryLocation&gt;  &lt;repositoryLocation&gt;$hostname&lt;/repositoryLocation&gt;
 &lt;shortabstract&gt;$shortabstract&lt;/shortabstract&gt;  &lt;shortabstract&gt;$shortabstract&lt;/shortabstract&gt;
Line 1482  $message Line 1510  $message
 RESULTS  RESULTS
 }  }
   
   # --------- settings whenever the user causes the search window to be launched
   sub start_fresh_session {
       delete $hash{'mode_catalog'};
       foreach (keys %hash) {
           if ($_ =~ /^pre_/) {
               delete $hash{$_};
           }
           if ($_ =~ /^store/) {
       delete $hash{$_};
    }
       }
   }
   
 1;  1;
   
 __END__  __END__
   
   =head1 NAME
   
   Apache::lonsearchcat - mod_perl module for handling a searchable catalog
   
   =head1 SYNOPSIS
   
   Invoked by /etc/httpd/conf/srm.conf:
   
    <Location /adm/searchcat>
    PerlAccessHandler       Apache::lonacc
    SetHandler perl-script
    PerlHandler Apache::lonsearchcat
    ErrorDocument     403 /adm/login
    ErrorDocument  500 /adm/errorhandler
    </Location>
   
   =head1 INTRODUCTION
   
   This module enables searching for a distributed browseable catalog.
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   =head1 BEGIN SUBROUTINE
   
   This routine is only run once after compilation.
   
   =over 4
   
   =item *
   
   Initializes %hostdomains and hostips hash table (for hosts.tab).
   
   =back
   
   =head1 HANDLER SUBROUTINE
   
   This routine is called by Apache and mod_perl.
   
   =over 4
   
   =item *
   
   configure dynamic components of interface
   
   =item *
   
   determine current user
   
   =item *
   
   see if a search invocation should be done
   
   =item *
   
   else, begin building search interface to output
   
   =item *
   
   compute date selection boxes
   
   =item *
   
   compute customized metadata field
   
   =item *
   
   print screen
   
   =back
   
   =head1 OTHER SUBROUTINES
   
   =over 4
   
   =item *
   
   get_unprocessed_cgi() : reads in critical name/value pairs that may have not
   been processed and passed into %ENV by the web server
   
   =item *
   
   make_persistent() : makes a set of hidden HTML fields to make
   SQL search interface information to be persistent
   
   =back
   
   WEB INTERFACE COMPONENT FUNCTIONS
   
   =over 4
   
   =item *
   
   simpletextfield(name,value) : returns HTML formatted string for simple text
   field
   
   =item *
   
   simplecheckbox(name,value) : returns HTML formatted string for simple
   checkbox
   
   =item *
   
   searchphrasefield(title,name,value) : returns HTML formatted string for
   a search expression phrase field
   
   =item *
   
   dateboxes(name, defaultmonth, defaultday, defaultyear) : returns HTML
   formatted string for a calendar date
   
   =item *
   
   selectbox(title,name,value,%HASH=options) : returns HTML formatted string for
   a selection box field
   
   =back
   
   SEARCH FUNCTIONS
   
   =over 4
   
   =item *
   
   advancedsearch(server reference, environment reference) : perform a complex
   multi-field logical query
   
   =item *
   
   basicsearch(server reference, environment reference) : perform a simple
   single-field logical query
   
   =item *
   
   build_SQL_query(field name, logic) : builds a SQL query string from a
   logical expression with AND/OR keywords
   
   =item *
   
   build_custommetadata_query(field_name, logic_statement) : builds a perl
   regular expression from a logical expression with AND/OR keywords
   
   =item *
   
   recursive_SQL_query_build(field name, reverse notation expression) : 
   builds a SQL query string from a reverse notation expression
   logical expression with AND/OR keywords
   
   =item *
   
   build_date_queries(cmonth1, cday1, cyear1, cmonth2, cday2, cyear2,
   lmonth1, lday1, lyear1, lmonth2, lday2, lyear2) :
   Builds a SQL logic query to check time/date entries.
   
   =back
   
   OUTPUTTING RESULTS FUNCTION
   
   =over 4
   
   =item *
   
   output_results(output mode, server reference, environment reference,
   reply list reference) : outputs results from search
   
   =back
   
   DIFFERENT WAYS TO VIEW METADATA RECORDS
   
   =over 4
   
   =item *
   
   detailed_citation_view(ORDERED METADATA LIST FOR A RESULT OBJECT INSTANCE) :
   see metadata viewing notes below 
   
   =item *
   
   summary_view(ORDERED METADATA LIST FOR A RESULT OBJECT INSTANCE) :
   see metadata viewing notes below 
   
   =item *
   
   fielded_format_view(ORDERED METADATA LIST FOR A RESULT OBJECT INSTANCE) :
   see metadata viewing notes below 
   
   =item *
   
   xml_sgml_view(ORDERED METADATA LIST FOR A RESULT OBJECT INSTANCE) :
   see metadata viewing notes below 
   
   =back
   
     _____________________________________________________________________
    | * Metadata viewing notes                                            |
    | Output is a HTML-ified string.                                      |
    | Input arguments are title, author, subject, url, keywords, version, |
    | notes, short abstract, mime, language, creation date,               |
    | last revision date, owner, copyright, hostname, httphost, and       |
    | extra custom metadata to show.                                      |
     ---------------------------------------------------------------------
   
   TEST CONDITIONAL FUNCTIONS
   
   =over 4
   
   =item *
   
   filled(field) : determines whether a given field has been filled
   
   =back
   
   ERROR FUNCTIONS
   
   =over 4
   
   =item *
   
   output_blank_field_error(server reference) : outputs a message saying that
   more fields need to be filled in
   
   =item *
   
   output_date_error(server reference, error message) : outputs
   an error message specific to bad date format.
   
   =back
   
   =cut

Removed from v.1.100  
changed lines
  Added in v.1.114


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>