Diff for /loncom/interface/lonsearchcat.pm between versions 1.153 and 1.161

version 1.153, 2002/08/16 13:52:51 version 1.161, 2002/11/22 18:36:07
Line 115  that produces it.  Adding a new view typ Line 115  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 141  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 171  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 182  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 217  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'}).
Line 213  sub handler { Line 230  sub handler {
             $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 243  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 349  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 361  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 390  Returns a scalar which holds html for th Line 410  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 402  sub print_basic_search_form{ Line 423  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 421  ENDDOCUMENT Line 439  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 474  END Line 494  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 486  END Line 507  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 526  ENDHEADER Line 544  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 676  sub get_persistent_form_data { Line 694  sub get_persistent_form_data {
                            &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)) {
Line 1118  sub parse_advanced_search { Line 1136  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 1129  sub parse_advanced_search { Line 1147  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 1153  sub parse_advanced_search { Line 1168  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 1172  sub parse_advanced_search { Line 1187  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 1671  sub print_sort_form { Line 1706  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="" />  <input type="hidden" name="Queue" value="" />
 END  END
Line 1858  sub revise_button { Line 1893  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 1889  sub run_search { Line 1925  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
Line 1959  END Line 1995  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 1977  END Line 2013  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 2040  END Line 2082  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 2131  sub display_results { Line 2174  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 2209  sub display_results { Line 2256  sub display_results {
         }          }
         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 2240  sub display_results { Line 2288  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 2271  END Line 2315  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 2527  SCRIPT Line 2568  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 2543  SCRIPT Line 2584  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 2555  END Line 2597  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 2582  sub print_frames_interface { Line 2624  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 2827  sub output_blank_field_error { Line 2870  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 2874  sub output_date_error { Line 2917  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">

Removed from v.1.153  
changed lines
  Added in v.1.161


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