Diff for /loncom/interface/lonsearchcat.pm between versions 1.151 and 1.164

version 1.151, 2002/08/04 18:28:01 version 1.164, 2003/02/03 04:02:17
Line 79  use Apache::lonnet(); Line 79  use Apache::lonnet();
 use Apache::File();  use Apache::File();
 use CGI qw(:standard);  use CGI qw(:standard);
 use Text::Query;  use Text::Query;
 use DBI;  
 use GDBM_File;  use GDBM_File;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonmysql();  use Apache::lonmysql();
Line 115  that produces it.  Adding a new view typ Line 114  that produces it.  Adding a new view typ
 adding a line to the definition of this hash and making sure the function  adding a line to the definition of this hash and making sure the function
 takes the proper parameters.  takes the proper parameters.
   
   =item $bodytag
   
   LON-CAPA standard body tag, gotten from &Apache::lonnet::bodytag.
   No title, no table, just a <body> tag.
   
 =back   =back 
   
 =cut  =cut
Line 136  my %Views = ("Detailed Citation View" => Line 140  my %Views = ("Detailed Citation View" =>
              "Compact View"           => \&compact_view);               "Compact View"           => \&compact_view);
 my %persistent_db;  my %persistent_db;
 my $hidden_fields;  my $hidden_fields;
   my $bodytag;
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
Line 164  string that holds portions of the screen Line 170  string that holds portions of the screen
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
     #      #
   
       my $loaderror=&Apache::lonnet::overloaderror($r);
       if ($loaderror) { return $loaderror; }
   
     my $closebutton;  # button that closes the search window       my $closebutton;  # button that closes the search window 
                       # This button is different for the RAT compared to                        # This button is different for the RAT compared to
                       # normal invocation.                        # normal invocation.
Line 171  sub handler { Line 181  sub handler {
     $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;
       ##
       ## Prevent caching of the search interface window.  Hopefully this means
       ## we will get the launch=1 passed in a little more.
       &Apache::loncommon::no_cache($r);
     ##       ## 
     ## Pick up form fields passed in the links.      ## Pick up form fields passed in the links.
     ##      ##
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
              ['catalogmode','launch','acts','mode','form','element','pause',               ['catalogmode','launch','acts','mode','form','element','pause',
               'phase','persistent_db_id','table','start','show']);                'phase','persistent_db_id','table','start','show',
                 'cleargroupsort']);
     ##      ##
     ## The following is a trick - we wait a few seconds if asked to so      ## The following is a trick - we wait a few seconds if asked to so
     ##     the daemon running the search can get ahead of the daemon      ##     the daemon running the search can get ahead of the daemon
Line 201  sub handler { Line 216  sub handler {
         ($ENV{'form.launch'} eq '1')) {          ($ENV{'form.launch'} eq '1')) {
         $ENV{'form.persistent_db_id'} = time;          $ENV{'form.persistent_db_id'} = time;
     }      }
       $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1);
     my $persistent_db_file = "/home/httpd/perl/tmp/".      my $persistent_db_file = "/home/httpd/perl/tmp/".
         &Apache::lonnet::escape($domain).          &Apache::lonnet::escape($domain).
             '_'.&Apache::lonnet::escape($ENV{'user.name'}).              '_'.&Apache::lonnet::escape($ENV{'user.name'}).
                 '_'.$ENV{'form.persistent_db_id'}.'_persistent_search.db';                  '_'.$ENV{'form.persistent_db_id'}.'_persistent_search.db';
     ##      ##
     if (! &get_persistent_form_data($r,$persistent_db_file)) {      if (! &get_persistent_form_data($persistent_db_file)) {
         if ($ENV{'form.phase'} =~ /(run_search|results)/) {          if ($ENV{'form.phase'} =~ /(run_search|results)/) {
             &Apache::lonnet::logthis("lonsearchcat:Unable to recover data ".              &Apache::lonnet::logthis("lonsearchcat:Unable to recover data ".
                                      "from $persistent_db_file");                                       "from $persistent_db_file");
             $r->print(<<END);              $r->print(<<END);
 <html>  <html>
 <head><title>LON-CAPA Search Error</title></head>  <head><title>LON-CAPA Search Error</title></head>
 <body>  $bodytag
 We were unable to retrieve data describing your search.  This is a serious  We were unable to retrieve data describing your search.  This is a serious
 error and has been logged.  Please alert your LON-CAPA administrator.  error and has been logged.  Please alert your LON-CAPA administrator.
 </body>  </body>
Line 226  END Line 242  END
     ## Clear out old values from groupsearch database      ## Clear out old values from groupsearch database
     ##      ##
     untie %groupsearch_db if (tied(%groupsearch_db));      untie %groupsearch_db if (tied(%groupsearch_db));
     if ($ENV{'form.launch'} eq '1' &&       if (($ENV{'form.cleargroupsort'} eq '1') || 
         ($ENV{'form.catalogmode'} eq 'groupsearch') &&           (($ENV{'form.launch'} eq '1') && 
         ($ENV{'form.phase'} eq 'results')) {           ($ENV{'form.catalogmode'} eq 'groupsearch'))) {
  if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) {   if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) {
     &start_fresh_session();      &start_fresh_session();
     untie %groupsearch_db;      untie %groupsearch_db;
               delete($ENV{'form.cleargroupsort'});
  } else {   } else {
     $r->print('<html><head></head><body>Unable to tie hash to db '.              # This is a stupid error to give to the user.  
       'file</body></html>');              # It really tells them nothing.
       $r->print('<html><head></head>'.$bodytag.
                         'Unable to tie hash to db file</body></html>');
     return OK;      return OK;
  }   }
     }      }
Line 329  END Line 348  END
         if (! defined(&create_results_table())) {          if (! defined(&create_results_table())) {
             $r->print(<<END);              $r->print(<<END);
 <html><head><title>Search Error</title></head>  <html><head><title>Search Error</title></head>
 <body>  $bodytag
 Unable to create table in which to store search results.    Unable to create table in which to store search results.  
 The search has been aborted.  The search has been aborted.
 </body>  </body>
Line 341  END Line 360  END
         if (! &make_form_data_persistent($r,$persistent_db_file)) {          if (! &make_form_data_persistent($r,$persistent_db_file)) {
             $r->print(<<END);              $r->print(<<END);
 <html><head><title>Search Error</title></head>  <html><head><title>Search Error</title></head>
 <body>  $bodytag
 Unable to properly store search information.  The search has been aborted.  Unable to properly store search information.  The search has been aborted.
 </body>  </body>
 </html>  </html>
Line 360  END Line 379  END
                 = &parse_advanced_search($r,$closebutton);                  = &parse_advanced_search($r,$closebutton);
             return OK if (! defined($query));              return OK if (! defined($query));
         }          }
         &make_persistent($r,          &make_persistent({ query => $query,
                          { query => $query,  
                            customquery => $customquery,                             customquery => $customquery,
                            customshow => $customshow,                             customshow => $customshow,
                            libraries => $libraries,                             libraries => $libraries,
Line 391  Returns a scalar which holds html for th Line 409  Returns a scalar which holds html for th
   
 sub print_basic_search_form{  sub print_basic_search_form{
     my ($r,$closebutton) = @_;      my ($r,$closebutton) = @_;
       my $bodytag=&Apache::loncommon::bodytag('Catalog Search');
     my $scrout=<<"ENDDOCUMENT";      my $scrout=<<"ENDDOCUMENT";
 <html>  <html>
 <head>  <head>
Line 403  sub print_basic_search_form{ Line 422  sub print_basic_search_form{
     }      }
 </script>  </script>
 </head>  </head>
 <body bgcolor="#FFFFFF">  $bodytag
 <img align='right' src='/adm/lonIcons/lonlogos.gif' />  
 <h1>Search Catalog</h1>  
 <form method="post" action="/adm/searchcat">  <form method="post" action="/adm/searchcat">
 <input type="hidden" name="phase" value="basic_search" />  <input type="hidden" name="phase" value="basic_search" />
 $hidden_fields  $hidden_fields
 <h3>Basic Search</h3>  
 <p>  <p>
 Enter terms or phrases separated by AND, OR, or NOT   Enter terms or phrases separated by AND, OR, or NOT 
 then press SEARCH below.  then press SEARCH below.
Line 422  ENDDOCUMENT Line 438  ENDDOCUMENT
         '&nbsp;';          '&nbsp;';
     my $checkbox = &simplecheckbox('related',$ENV{'form.related'});      my $checkbox = &simplecheckbox('related',$ENV{'form.related'});
     $scrout.=<<END;      $scrout.=<<END;
 </td><td><a href="/adm/searchcat?phase=disp_adv">Advanced Search</a></td></tr>  </td><td><a
   href="/adm/searchcat?phase=disp_adv&catalogmode=$ENV{'form.catalogmode'}&launch=$ENV{'form.launch'}"
   >Advanced Search</a></td></tr>
 <tr><td>$checkbox use related words</td><td></td></tr>  <tr><td>$checkbox use related words</td><td></td></tr>
 </table>  </table>
 </p>  </p>
Line 475  END Line 493  END
     if (!defined($ENV{'form.viewselect'})) {      if (!defined($ENV{'form.viewselect'})) {
         $ENV{'form.viewselect'} ="Detailed Citation View";          $ENV{'form.viewselect'} ="Detailed Citation View";
     }      }
       my $bodytag=&Apache::loncommon::bodytag('Advanced Catalog Search');
     my $scrout=<<"ENDHEADER";      my $scrout=<<"ENDHEADER";
 <html>  <html>
 <head>  <head>
Line 487  END Line 506  END
     }      }
 </script>  </script>
 </head>  </head>
 <body bgcolor="#FFFFFF">  $bodytag
 <img align='right' src='/adm/lonIcons/lonlogos.gif' />  
 <h1>Advanced Catalog Search</h1>  
 <hr />  
 Enter terms or phrases separated by search operators   Enter terms or phrases separated by search operators 
 such as AND, OR, or NOT.<br />  such as AND, OR, or NOT.<br />
 <form method="post" action="/adm/searchcat">  <form method="post" action="/adm/searchcat">
Line 527  ENDHEADER Line 543  ENDHEADER
                                              $ENV{'form.abstract'});                                               $ENV{'form.abstract'});
     # Hack - an empty table row.      # Hack - an empty table row.
     $scrout.="<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>\n";      $scrout.="<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>\n";
     $scrout.=&searchphrasefield('file<br />extension','mime',      $scrout.=&searchphrasefield('file<br />extension','extension',
                         $ENV{'form.mime'});                          $ENV{'form.extension'});
     $scrout.="<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>\n";      $scrout.="<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>\n";
     $scrout.=&searchphrasefield('publisher<br />owner','owner',      $scrout.=&searchphrasefield('publisher<br />owner','owner',
  $ENV{'form.owner'});   $ENV{'form.owner'});
     $scrout.="</table>\n";      $scrout.="</table>\n";
     $ENV{'form.category'}='any' unless length($ENV{'form.category'});      $ENV{'form.category'}='any' if (! defined($ENV{'form.category'}));
     $scrout.=&selectbox('File Category','category',      $scrout.=&selectbox('File Category','category',
  $ENV{'form.category'},   $ENV{'form.category'},
  'any','Any category',   'any','Any category',
Line 620  LASTREVISIONDATEEND Line 636  LASTREVISIONDATEEND
  (&Apache::loncommon::copyrightids),   (&Apache::loncommon::copyrightids),
  );   );
 # ------------------------------------------- Compute customized metadata field  # ------------------------------------------- Compute customized metadata field
     $scrout.=<<CUSTOMMETADATA;  #    $scrout.=<<CUSTOMMETADATA;
 <p>  #<p>
 <font color="#800000" face="helvetica"><b>LIMIT BY SPECIAL METADATA FIELDS:</b>  #<font color="#800000" face="helvetica"><b>LIMIT BY SPECIAL METADATA FIELDS:</b>
 </font>  #</font>
 For resource-specific metadata, enter in an expression in the form of   #For resource-specific metadata, enter in an expression in the form of 
 <i>key</i>=<i>value</i> separated by operators such as AND, OR or NOT.<br />  #<i>key</i>=<i>value</i> separated by operators such as AND, OR or NOT.<br />
 <b>Example:</b> grandmother=75 OR grandfather=85  #<b>Example:</b> grandmother=75 OR grandfather=85
 <br />  #<br />
 CUSTOMMETADATA  #CUSTOMMETADATA
     $scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'});  #    $scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'});
     $scrout.=<<CUSTOMSHOW;  #    $scrout.=<<CUSTOMSHOW;
 <p>  #<p>
 <font color="#800000" face="helvetica"><b>SHOW SPECIAL METADATA FIELDS:</b>  #<font color="#800000" face="helvetica"><b>SHOW SPECIAL METADATA FIELDS:</b>
 </font>  #</font>
 Enter in a space-separated list of special metadata fields to show  #Enter in a space-separated list of special metadata fields to show
 in a fielded listing for each record result.  #in a fielded listing for each record result.
 <br />  #<br />
 CUSTOMSHOW  #CUSTOMSHOW
     $scrout.=&simpletextfield('customshow',$ENV{'form.customshow'});  #    $scrout.=&simpletextfield('customshow',$ENV{'form.customshow'});
     $scrout.=<<ENDDOCUMENT;      $scrout.=<<ENDDOCUMENT;
 $advanced_buttons  $advanced_buttons
 </form>  </form>
Line 671  to them. Line 687  to them.
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub get_persistent_form_data {  sub get_persistent_form_data {
     my $r = shift;  
     my $filename = shift;      my $filename = shift;
     return 0 if (! -e $filename);      return 0 if (! -e $filename);
     return undef if (! tie(%persistent_db,'GDBM_File',$filename,      return undef if (! tie(%persistent_db,'GDBM_File',$filename,
                            &GDBM_READER(),0640));                             &GDBM_READER(),0640));
     #      #
     # These make sure we do not get array references printed out as 'values'.      # These make sure we do not get array references printed out as 'values'.
     my %arrays_allowed = ('form.category'=>1,'form.domains'=>1);      my %arrays_allowed = ('form.domains'=>1);
     #      #
     # Loop through the keys, looking for 'form.'      # Loop through the keys, looking for 'form.'
     foreach my $name (keys(%persistent_db)) {      foreach my $name (keys(%persistent_db)) {
         next if ($name !~ /^form./);          next if ($name !~ /^form./);
           next if (exists($ENV{$name}));
         my @values = map {           my @values = map { 
             &Apache::lonnet::unescape($_);              &Apache::lonnet::unescape($_);
         } split(',',$persistent_db{$name});          } split(',',$persistent_db{$name});
         next if (@values <1);          next if (@values <1);
         if (exists($ENV{$name})) {          if ($arrays_allowed{$name}) {
             if (ref($ENV{$name}) eq 'ARRAY') {              $ENV{$name} = [@values];
                 # If it is an array, tack @values on the end of it.  
                 $ENV{$name} = [@$ENV{$name},@values];  
             } elsif (! ref($ENV{$name}) && $arrays_allowed{$name}) {  
                 # if arrays are allowed, turn it into one and add @values  
                 $ENV{$name} = [$ENV{$name},@values];  
             } # otherwise, assume the value in $ENV{$name} is better than ours.  
         } else {          } else {
             if ($arrays_allowed{$name}) {              $ENV{$name} = $values[0] if ($values[0]);
                 $ENV{$name} = [@values];  
             } else {  
                 $ENV{$name} = $values[0] if ($values[0]);  
             }  
         }          }
     }      }
     untie (%persistent_db);      untie (%persistent_db);
Line 741  sub get_persistent_data { Line 747  sub get_persistent_data {
         my @values = map {           my @values = map { 
             &Apache::lonnet::unescape($_);              &Apache::lonnet::unescape($_);
         } split(',',$persistent_db{$name});          } split(',',$persistent_db{$name});
         if (@values == 1) {          if (@values <= 1) {
             push @Values,$values[0];              push @Values,$values[0];
         } else {          } else {
             push @Values,\@values;              push @Values,\@values;
Line 769  elements escaped and concatenated in a c Line 775  elements escaped and concatenated in a c
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub make_persistent {  sub make_persistent {
     my $r = shift;  
     my %save = %{shift()};      my %save = %{shift()};
     my $filename = shift;      my $filename = shift;
     return undef if (! tie(%persistent_db,'GDBM_File',      return undef if (! tie(%persistent_db,'GDBM_File',
                            $filename,&GDBM_WRCREAT(),0640));                             $filename,&GDBM_WRCREAT(),0640));
     foreach my $name (keys(%save)) {      foreach my $name (keys(%save)) {
         next if (! exists($save{$name}));  
         next if (! defined($save{$name}) || $save{$name} eq '');  
         my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));          my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));
         # We handle array references, but not recursively.          # We handle array references, but not recursively.
         my $store = join(',', map { &Apache::lonnet::escape($_); } @values );          my $store = join(',', map { &Apache::lonnet::escape($_); } @values );
Line 811  sub make_form_data_persistent { Line 814  sub make_form_data_persistent {
         next if (!/^form/ || /submit/);          next if (!/^form/ || /submit/);
         $save{$_} = $ENV{$_};          $save{$_} = $ENV{$_};
     }      }
     return &make_persistent($r,\%save,$filename);      return &make_persistent(\%save,$filename);
 }  }
   
 ######################################################################  ######################################################################
Line 1132  sub parse_advanced_search { Line 1135  sub parse_advanced_search {
    'lastrevisiondatestart_month','lastrevisiondatestart_day',     'lastrevisiondatestart_month','lastrevisiondatestart_day',
    'lastrevisiondatestart_year','lastrevisiondateend_month',     'lastrevisiondatestart_year','lastrevisiondateend_month',
    'lastrevisiondateend_day','lastrevisiondateend_year',     'lastrevisiondateend_day','lastrevisiondateend_year',
    'notes','abstract','mime','language','owner',     'notes','abstract','extension','language','owner',
    'custommetadata','customshow','category') {     'custommetadata','customshow','category') {
  $ENV{"form.$field"}=~s/[^\w\/\s\(\)\=\-\"\']//g;   $ENV{"form.$field"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
     }      }
Line 1143  sub parse_advanced_search { Line 1146  sub parse_advanced_search {
  $ENV{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;   $ENV{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
     }      }
     # Preprocess the category form element.      # Preprocess the category form element.
     $ENV{'form.category'} = 'any' if (ref($ENV{'form.category'}));      $ENV{'form.category'} = 'any' if (! defined($ENV{'form.category'}) ||
     if ($ENV{'form.category'} ne 'any') {                                        ref($ENV{'form.category'}));
         my @extensions = &Apache::loncommon::filecategorytypes      #
             ($ENV{'form.category'});  
         $ENV{'form.mime'} = join ' OR ',@extensions;  
     }  
     # Check to see if enough information was filled in      # Check to see if enough information was filled in
     for my $field ('title','author','subject','keywords','url','version',      for my $field ('title','author','subject','keywords','url','version',
    'notes','abstract','mime','language','owner',     'notes','abstract','category','extension','language',
    'custommetadata') {                     'owner','custommetadata') {
  if (&filled($ENV{"form.$field"})) {   if (&filled($ENV{"form.$field"})) {
     $fillflag++;      $fillflag++;
  }   }
Line 1167  sub parse_advanced_search { Line 1167  sub parse_advanced_search {
     my $font = '<font color="#800000" face="helvetica">';      my $font = '<font color="#800000" face="helvetica">';
     # Evaluate logical expression AND/OR/NOT phrase fields.      # Evaluate logical expression AND/OR/NOT phrase fields.
     foreach my $field ('title','author','subject','notes','abstract','url',      foreach my $field ('title','author','subject','notes','abstract','url',
        'keywords','version','owner','mime') {         'keywords','version','owner') {
  if ($ENV{'form.'.$field}) {   if ($ENV{'form.'.$field}) {
             my $searchphrase = $ENV{'form.'.$field};              my $searchphrase = $ENV{'form.'.$field};
             $pretty_search_string .= $font."$field</font> contains <b>".              $pretty_search_string .= $font."$field</font> contains <b>".
Line 1186  sub parse_advanced_search { Line 1186  sub parse_advanced_search {
     push @queries,&build_SQL_query($field,$searchphrase);      push @queries,&build_SQL_query($field,$searchphrase);
         }          }
     }      }
     # I dislike the hack below.      #
     if ($ENV{'form.category'}) {      # Make the 'mime' from 'form.category' and 'form.extension'
         $ENV{'form.mime'}='';      #
       my $searchphrase;
       if (exists($ENV{'form.category'})    && 
           $ENV{'form.category'} !~ /^\s*$/ &&
           $ENV{'form.category'} ne 'any')     {
           my @extensions = &Apache::loncommon::filecategorytypes
                                                      ($ENV{'form.category'});
           if (scalar(@extensions) > 0) {
               $searchphrase = join(' OR ',@extensions);
           }
       }
       if (exists($ENV{'form.extension'}) && $ENV{'form.extension'} !~ /^\s*$/) {
           $searchphrase .= ' OR ' if (defined($searchphrase));
           my @extensions = split(/,/,$ENV{'form.extension'});
           $searchphrase .= join(' OR ',@extensions);
       }
       if (defined($searchphrase)) {
           push @queries,&build_SQL_query('mime',$searchphrase);
           $pretty_search_string .=$font.'mime</font> contains <b>'.
               $searchphrase.'</b><br />';
     }      }
       #####
     # Evaluate option lists      # Evaluate option lists
     if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {      if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {
  push @queries,"(language like \"$ENV{'form.language'}\")";   push @queries,"(language like \"$ENV{'form.language'}\")";
Line 1230  sub parse_advanced_search { Line 1250  sub parse_advanced_search {
     }      }
     # Process form information for custom metadata querying      # Process form information for custom metadata querying
     my $customquery=undef;      my $customquery=undef;
     if ($ENV{'form.custommetadata'}) {  #    if ($ENV{'form.custommetadata'}) {
         $pretty_search_string .=$font."Custom Metadata Search</font>: <b>".  #        $pretty_search_string .=$font."Custom Metadata Search</font>: <b>".
             $ENV{'form.custommetadata'}."</b><br />\n";  #            $ENV{'form.custommetadata'}."</b><br />\n";
  $customquery=&build_custommetadata_query('custommetadata',  # $customquery=&build_custommetadata_query('custommetadata',
       $ENV{'form.custommetadata'});  #      $ENV{'form.custommetadata'});
     }  #    }
     my $customshow=undef;      my $customshow=undef;
     if ($ENV{'form.customshow'}) {  #    if ($ENV{'form.customshow'}) {
         $pretty_search_string .=$font."Custom Metadata Display</font>: <b>".  #        $pretty_search_string .=$font."Custom Metadata Display</font>: <b>".
             $ENV{'form.customshow'}."</b><br />\n";  #            $ENV{'form.customshow'}."</b><br />\n";
  $customshow=$ENV{'form.customshow'};  # $customshow=$ENV{'form.customshow'};
  $customshow=~s/[^\w\s]//g;  # $customshow=~s/[^\w\s]//g;
  my @fields=split(/\s+/,$customshow);  # my @fields=split(/\s+/,$customshow);
  $customshow=join(" ",@fields);  # $customshow=join(" ",@fields);
     }  #    }
     ## ---------------------------------------------------------------      ## ---------------------------------------------------------------
     ## Deal with restrictions to given domains      ## Deal with restrictions to given domains
     ##       ## 
Line 1259  sub parse_advanced_search { Line 1279  sub parse_advanced_search {
         $domain_hash{$_}++;          $domain_hash{$_}++;
     }      }
     if ($domain_hash{'any'}) {      if ($domain_hash{'any'}) {
         $pretty_domains_string = "Searching all domains.";          $pretty_domains_string = "In all LON-CAPA domains.";
     } else {      } else {
         if (@allowed_domains > 1) {          if (@allowed_domains > 1) {
             $pretty_domains_string = "Searching domains:";              $pretty_domains_string = "In LON-CAPA domains:";
         } else {          } else {
             $pretty_domains_string = "Searching domain ";              $pretty_domains_string = "In LON-CAPA domain ";
         }          }
         foreach (sort @allowed_domains) {          foreach (sort @allowed_domains) {
             $pretty_domains_string .= "<b>$_</b> ";              $pretty_domains_string .= "<b>".$_."</b> ";
         }          }
         foreach (keys(%Apache::lonnet::libserv)) {          foreach (keys(%Apache::lonnet::libserv)) {
             if (exists($domain_hash{$Apache::lonnet::hostdom{$_}})) {              if (exists($domain_hash{$Apache::lonnet::hostdom{$_}})) {
Line 1685  sub print_sort_form { Line 1705  sub print_sort_form {
 </script>  </script>
 <title>Results</title>  <title>Results</title>
 </head>  </head>
 <body>  $bodytag
 <form name="statusform" action="" method="post">  <form name="statusform" action="" method="post">
   <input type="hidden" name="Queue" value="" />
 END  END
   
 #<h2>Sort Results</h2>  #<h2>Sort Results</h2>
Line 1871  sub revise_button { Line 1892  sub revise_button {
     $revise_phase = 'disp_adv' if ($ENV{'form.searchmode'} eq 'advanced');      $revise_phase = 'disp_adv' if ($ENV{'form.searchmode'} eq 'advanced');
     my $newloc = '/adm/searchcat'.      my $newloc = '/adm/searchcat'.
         '?persistent_db_id='.$ENV{'form.persistent_db_id'}.          '?persistent_db_id='.$ENV{'form.persistent_db_id'}.
               '&cleargroupsort=1'.
             '&phase='.$revise_phase;              '&phase='.$revise_phase;
     my $result = qq{<input type="button" value="Revise search" name="revise"} .      my $result = qq{<input type="button" value="Revise search" name="revise"} .
         qq{ onClick="parent.location='$newloc';" /> };          qq{ onClick="parent.location='$newloc';" /> };
Line 1902  sub run_search { Line 1924  sub run_search {
     $r->print(<<END);      $r->print(<<END);
 <html>  <html>
 <head><title>Search Status</title></head>  <head><title>Search Status</title></head>
 <body>  $bodytag
 <form name="statusform" action="" method="post">  <form name="statusform" action="" method="post">
 <input type="hidden" name="Queue" value="" />  <input type="hidden" name="Queue" value="" />
 END  END
     # Check to see if $pretty_string has more than one carriage return.      # Check to see if $pretty_string has more than one carriage return.
     # Assume \n s are following <br /> s and truncate the value.      # Assume \n s are following <br /> s and truncate the value.
     # (there is probably a better way)...      # (there is probably a better way)...
     my @Lines = split /\n/,$pretty_string;      my @Lines = split /<br \/>/,$pretty_string;
     if (@Lines > 1) {      if (@Lines > 2) {
         $pretty_string = join /\n/,(@Lines[0..1],'....<br />');          $pretty_string = join '<br \>',(@Lines[0..2],'....<br />');
     }      }
     $r->print("Search: ".$pretty_string);      $r->print("Search: ".$pretty_string);
     $r->rflush();      $r->rflush();
Line 1920  END Line 1942  END
     #      #
     my @Servers_to_contact;      my @Servers_to_contact;
     if (defined($serverlist)) {      if (defined($serverlist)) {
         @Servers_to_contact = @$serverlist;          if (ref($serverlist) eq 'ARRAY') {
               @Servers_to_contact = @$serverlist;
           } else {
               @Servers_to_contact = ($serverlist);
           }
     } else {      } else {
         @Servers_to_contact = sort(keys(%Apache::lonnet::libserv));          @Servers_to_contact = sort(keys(%Apache::lonnet::libserv));
     }      }
Line 1968  END Line 1994  END
     my $time_remaining = $max_time - (time - $starttime) ;      my $time_remaining = $max_time - (time - $starttime) ;
     my $last_time = $time_remaining;      my $last_time = $time_remaining;
     &update_seconds($r,$time_remaining);      &update_seconds($r,$time_remaining);
     while (($time_remaining > 0) &&       while (($time_remaining > 0) &&
            ((@Servers_to_contact) || keys(%Server_status))) {             ((@Servers_to_contact) || keys(%Server_status))) {
         # Send out a search request if it needs to be done.          # Send out a search request if it needs to be done.
         if (@Servers_to_contact) {          if (@Servers_to_contact) {
Line 1986  END Line 2012  END
             # left to contact.                # left to contact.  
             sleep(1)              sleep(1)
         }          }
         &update_status($r,'waiting on '.(join(' ',keys(%Server_status))));          #
           if (scalar (keys(%Server_status))) {
               &update_status($r,'waiting on '.(join(' ',keys(%Server_status))));
           }
           #
           # Loop through the servers we have contacted but do not
           # have results from yet, looking for results.
         while (my ($server,$status) = each(%Server_status)) {          while (my ($server,$status) = each(%Server_status)) {
             last if ($connection->aborted());              last if ($connection->aborted());
             if ($status eq 'con_lost') {              if ($status eq 'con_lost') {
Line 2049  END Line 2081  END
         }          }
         last if ($connection->aborted());          last if ($connection->aborted());
         # Finished looping through the servers          # Finished looping through the servers
           $starttime = time if (@Servers_to_contact);
         $time_remaining = $max_time - (time - $starttime) ;          $time_remaining = $max_time - (time - $starttime) ;
         if ($last_time - $time_remaining > 0) {          if ($last_time - $time_remaining > 0) {
             $last_time = $time_remaining;              $last_time = $time_remaining;
Line 2061  END Line 2094  END
     # We have run out of time or run out of servers to talk to and      # We have run out of time or run out of servers to talk to and
     # results to get.        # results to get.  
     $r->print("</body></html>");      $r->print("</body></html>");
     $r->print("<script>window.location='/adm/searchcat?phase=sort&persistent_db_id=$ENV{'form.persistent_db_id'}';</script>");      if ($ENV{'form.catalogmode'} ne 'groupsearch') {
           $r->print("<script>".
                         "window.location='/adm/searchcat?".
                         "phase=sort&".
                         "persistent_db_id=$ENV{'form.persistent_db_id'}';".
                     "</script>");
       }
     return;      return;
 }  }
   
Line 2134  sub display_results { Line 2173  sub display_results {
         return;          return;
     }      }
     ##      ##
       ## $checkbox_num is a count of the number of checkboxes output on the 
       ## page this is used only during catalogmode=groupsearch.
       my $checkbox_num = 0;
       ##
     ## Get the catalog controls setup      ## Get the catalog controls setup
     ##      ##
     my $action = "/adm/searchcat?phase=results";      my $action = "/adm/searchcat?phase=results";
Line 2206  sub display_results { Line 2249  sub display_results {
     ##      ##
     foreach my $row (@Results) {      foreach my $row (@Results) {
         if ($connection->aborted()) {          if ($connection->aborted()) {
             untie %groupsearch_db if (tied(%groupsearch_db));              &cleanup();
             &Apache::lonmysql::disconnect_from_db();  
             return;              return;
         }          }
         my %Fields = %{&parse_row(@$row)};          my %Fields = %{&parse_row(@$row)};
         my $output="<p>\n";          my $output="<p>\n";
         my $prefix=&catalogmode_output($Fields{'title'},$Fields{'url'});          my $prefix=&catalogmode_output($Fields{'title'},$Fields{'url'},
                                          $Fields{'id'},$checkbox_num++);
         # Render the result into html          # Render the result into html
         $output.= &$viewfunction($prefix,%Fields);          $output.= &$viewfunction($prefix,%Fields);
         # Print them out as they come in.          # Print them out as they come in.
Line 2243  sub display_results { Line 2286  sub display_results {
   
 =pod  =pod
   
 =item &catalogmode_output($title,$url)  =item &catalogmode_output($title,$url,$fnum,$checkbox_num)
   
 Returns html needed for the various catalog modes.  Gets inputs from  Returns html needed for the various catalog modes.  Gets inputs from
 $ENV{'form.catalogmode'}.  Stores data in %groupsearch_db and $fnum   $ENV{'form.catalogmode'}.  Stores data in %groupsearch_db.
 (local variable).  
   
 =cut  =cut
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 {   
 my $fnum = 0;  
   
 sub catalogmode_output {  sub catalogmode_output {
     my $output = '';      my $output = '';
     my ($title,$url) = @_;      my ($title,$url,$fnum,$checkbox_num) = @_;
     if ($ENV{'form.catalogmode'} eq 'interactive') {      if ($ENV{'form.catalogmode'} eq 'interactive') {
         $title=~ s/\'/\\\'/g;          $title=~ s/\'/\\\'/g;
         if ($ENV{'form.catalogmode'} eq 'interactive') {          if ($ENV{'form.catalogmode'} eq 'interactive') {
Line 2274  END Line 2313  END
         $output.=<<END;          $output.=<<END;
 <font size='-1'>  <font size='-1'>
 <input type="checkbox" name="returnvalues" value="SELECT"  <input type="checkbox" name="returnvalues" value="SELECT"
 onClick="javascript:queue($fnum)" />  onClick="javascript:queue($checkbox_num,$fnum)" />
 </font>  </font>
 END  END
         $fnum++;  
     }      }
     return $output;      return $output;
 }  }
   
 }  
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
Line 2494  sub search_results_header { Line 2530  sub search_results_header {
  parent.close();   parent.close();
     }      }
     function changeTitle(val) {      function changeTitle(val) {
  if (opener.inf.document.forms.resinfo.elements.t) {   if (parent.opener.inf.document.forms.resinfo.elements.t) {
     opener.inf.document.forms.resinfo.elements.t.value=val;      parent.opener.inf.document.forms.resinfo.elements.t.value=val;
  }   }
     }      }
     function changeURL(val) {      function changeURL(val) {
  if (opener.inf.document.forms.resinfo.elements.u) {   if (parent.opener.inf.document.forms.resinfo.elements.u) {
     opener.inf.document.forms.resinfo.elements.u.value=val;      parent.opener.inf.document.forms.resinfo.elements.u.value=val;
  }   }
     }      }
 </script>  </script>
Line 2530  SCRIPT Line 2566  SCRIPT
     }      }
     $result.=<<SCRIPT if $ENV{'form.catalogmode'} eq 'groupsearch';      $result.=<<SCRIPT if $ENV{'form.catalogmode'} eq 'groupsearch';
 <script type="text/javascript">  <script type="text/javascript">
     function queue(val) {      function queue(checkbox_num,val) {
         if (document.forms.results.returnvalues[val].checked) {          if (document.forms.results.returnvalues[checkbox_num].checked) {
             parent.statusframe.document.forms.statusform.elements.Queue.value +='1a'+val+'b';              parent.statusframe.document.forms.statusform.elements.Queue.value +='1a'+val+'b';
         } else {          } else {
             parent.statusframe.document.forms.statusform.elements.Queue.value +='0a'+val+'b';              parent.statusframe.document.forms.statusform.elements.Queue.value +='0a'+val+'b';
Line 2546  SCRIPT Line 2582  SCRIPT
 SCRIPT  SCRIPT
     $result.=<<END;      $result.=<<END;
 </head>  </head>
   $bodytag
 <form name="results" method="post" action="" >  <form name="results" method="post" action="" >
 <input type="hidden" name="Queue" value="" />  <input type="hidden" name="Queue" value="" />
 $importbutton  $importbutton
Line 2558  END Line 2595  END
 sub search_status_header {  sub search_status_header {
     return <<ENDSTATUS;      return <<ENDSTATUS;
 <html><head><title>Search Status</title></head>  <html><head><title>Search Status</title></head>
 <body>  $bodytag
 <h3>Search Status</h3>  <h3>Search Status</h3>
 Sending search request to LON-CAPA servers.<br />  Sending search request to LON-CAPA servers.<br />
 ENDSTATUS  ENDSTATUS
Line 2585  sub print_frames_interface { Line 2622  sub print_frames_interface {
 <head>  <head>
 <script>  <script>
 var targetwin = opener;  var targetwin = opener;
   var queue = '';
 </script>  </script>
 <title>LON-CAPA Digital Library Search Results</title>  <title>LON-CAPA Digital Library Search Results</title>
 </head>  </head>
Line 2830  sub output_blank_field_error { Line 2868  sub output_blank_field_error {
 BEGINNING  BEGINNING
     $r->print(<<RESULTS);      $r->print(<<RESULTS);
 </head>  </head>
 <body bgcolor="#ffffff">  $bodytag
 <img align='right' src='/adm/lonIcons/lonlogos.gif' />  <img align='right' src='/adm/lonIcons/lonlogos.gif' />
 <h1>Search Catalog</h1>  <h1>Search Catalog</h1>
 <form method="post" action="/adm/searchcat">  <form method="post" action="/adm/searchcat">
Line 2877  sub output_date_error { Line 2915  sub output_date_error {
 <head>  <head>
 <title>The LearningOnline Network with CAPA</title>  <title>The LearningOnline Network with CAPA</title>
 </head>  </head>
 <body bgcolor="#ffffff">  $bodytag
 <img align='right' src='/adm/lonIcons/lonlogos.gif' />  <img align='right' src='/adm/lonIcons/lonlogos.gif' />
 <h1>Search Catalog</h1>  <h1>Search Catalog</h1>
 <form method="post" action="/adm/searchcat">  <form method="post" action="/adm/searchcat">
Line 2923  sub start_fresh_session { Line 2961  sub start_fresh_session {
   
 1;  1;
   
   sub cleanup {
       if (tied(%groupsearch_db)) {
    &Apache::lonnet::logthis('Cleanup searchcat: groupsearch_db');
           unless (untie(%groupsearch_db)) {
     &Apache::lonnet::logthis('Failed cleanup searchcat: groupsearch_db');
           }
       }
       &Apache::lonmysql::disconnect_from_db();
   }
   
 __END__  __END__
   
 =pod  =pod

Removed from v.1.151  
changed lines
  Added in v.1.164


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