Diff for /loncom/interface/lonsearchcat.pm between versions 1.239 and 1.262

version 1.239, 2005/03/16 22:46:24 version 1.262, 2006/04/11 19:53:11
Line 63  package Apache::lonsearchcat; Line 63  package Apache::lonsearchcat;
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonnet();  use Apache::lonnet;
 use Apache::File();  use Apache::File();
 use CGI qw(:standard);  use CGI qw(:standard);
 use Text::Query;  use Text::Query;
Line 77  use LONCAPA::lonmetadata(); Line 77  use LONCAPA::lonmetadata();
 use HTML::Entities();  use HTML::Entities();
 use Parse::RecDescent;  use Parse::RecDescent;
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
   use Apache::lonindexer();
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 93  my %persistent_db;   # gdbm hash which h Line 94  my %persistent_db;   # gdbm hash which h
 # The different view modes and associated functions  # The different view modes and associated functions
   
 my %Views = ("detailed" => \&detailed_citation_view,  my %Views = ("detailed" => \&detailed_citation_view,
                "detailedpreview" => \&detailed_citation_preview,
      "summary"  => \&summary_view,       "summary"  => \&summary_view,
                "summarypreview" => \&summary_preview,
      "fielded"  => \&fielded_format_view,       "fielded"  => \&fielded_format_view,
      "xml"      => \&xml_sgml_view,       "xml"      => \&xml_sgml_view,
      "compact"  => \&compact_view);       "compact"  => \&compact_view);
Line 113  sub handler { Line 116  sub handler {
     my $diropendb;    # The full path to the (temporary) search database file.      my $diropendb;    # The full path to the (temporary) search database file.
                       # This is set and used in &handler() and is also used in                         # This is set and used in &handler() and is also used in 
                       # &output_results().                        # &output_results().
     my $bodytag;  # LON-CAPA standard body tag, gotten from   
                   # &Apache::lonnet::bodytag.   
                   # No title, no table, just a <body> tag.  
   
     my $loaderror=&Apache::lonnet::overloaderror($r);      my $loaderror=&Apache::lonnet::overloaderror($r);
     if ($loaderror) { return $loaderror; }      if ($loaderror) { return $loaderror; }
Line 144  sub handler { Line 144  sub handler {
     ##     printing the results.  We only need (theoretically) to do      ##     printing the results.  We only need (theoretically) to do
     ##     this once, so the pause indicator is deleted      ##     this once, so the pause indicator is deleted
     ##      ##
     if (exists($ENV{'form.pause'})) {      if (exists($env{'form.pause'})) {
         sleep(1);          sleep(1);
         delete($ENV{'form.pause'});          delete($env{'form.pause'});
     }      }
     ##      ##
     ## Initialize global variables      ## Initialize global variables
     ##      ##
     my $domain  = $r->dir_config('lonDefDomain');      my $domain  = $r->dir_config('lonDefDomain');
     $diropendb= "/home/httpd/perl/tmp/".      $diropendb= "/home/httpd/perl/tmp/".
         "$ENV{'user.domain'}_$ENV{'user.name'}_searchcat.db";          "$env{'user.domain'}_$env{'user.name'}_searchcat.db";
     #      #
     # set the name of the persistent database      # set the name of the persistent database
     #          $ENV{'form.persistent_db_id'} can only have digits in it.      #          $env{'form.persistent_db_id'} can only have digits in it.
     if (! exists($ENV{'form.persistent_db_id'}) ||      if (! exists($env{'form.persistent_db_id'}) ||
         ($ENV{'form.persistent_db_id'} =~ /\D/) ||          ($env{'form.persistent_db_id'} =~ /\D/) ||
         ($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';
     ##      ##
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     if (exists($ENV{'request.course.id'}) && $ENV{'request.course.id'} ne '') {      if (exists($env{'request.course.id'}) && $env{'request.course.id'} ne '') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
              ({href=>'/adm/searchcat?'.               ({href=>'/adm/searchcat?'.
                    'catalogmode='.$ENV{'form.catalogmode'}.                     'catalogmode='.$env{'form.catalogmode'}.
                    '&launch='.$ENV{'form.launch'}.                     '&launch='.$env{'form.launch'}.
                    '&mode='.$ENV{'form.mode'},                     '&mode='.$env{'form.mode'},
               text=>"Course and Catalog Search",                text=>"Course and Catalog Search",
               target=>'_top',                target=>'_top',
               bug=>'Searching',});                bug=>'Searching',});
     } else {      } else {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
              ({href=>'/adm/searchcat?'.               ({href=>'/adm/searchcat?'.
                    'catalogmode='.$ENV{'form.catalogmode'}.                     'catalogmode='.$env{'form.catalogmode'}.
                    '&launch='.$ENV{'form.launch'}.                     '&launch='.$env{'form.launch'}.
                    '&mode='.$ENV{'form.mode'},                     '&mode='.$env{'form.mode'},
               text=>"Catalog Search",                text=>"Catalog Search",
               target=>'_top',                target=>'_top',
               bug=>'Searching',});                bug=>'Searching',});
     }      }
     #      #
     if ($ENV{'form.phase'} !~ m/(basic|adv|course)_search/) {      if ($env{'form.phase'} !~ m/(basic|adv|course)_search/) {
         if (! &get_persistent_form_data($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:'.                  &Apache::lonnet::logthis('lonsearchcat:'.
                                          'Unable to recover data from '.                                           'Unable to recover data from '.
                                          $persistent_db_file);                                           $persistent_db_file);
  my $html=&Apache::lonxml::xmlbegin();   my $msg =
  $r->print(<<END);      'We were unable to retrieve data describing your search. '.
 $html      'This is a serious error and has been logged. '.
 <head>      'Please alert your LON-CAPA administrator.';
 <title>LON-CAPA Search Error</title></head>   &Apache::loncommon::simple_error_page($r,'Search Error',
 $bodytag        $msg);
 We were unable to retrieve data describing your search.  This is a serious   return OK;
 error and has been logged.  Please alert your LON-CAPA administrator.  
 </body>  
 </html>  
 END  
                 return OK;  
             }              }
         }          }
     } else {      } else {
Line 216  END Line 211  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.cleargroupsort'} eq '1') ||       if (($env{'form.cleargroupsort'} eq '1') || 
         (($ENV{'form.launch'} eq '1') &&           (($env{'form.launch'} eq '1') && 
          ($ENV{'form.catalogmode'} eq 'groupsearch'))) {           ($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'});              delete($env{'form.cleargroupsort'});
  } else {   } else {
             # This is a stupid error to give to the user.                # This is a stupid error to give to the user.  
             # It really tells them nothing.              # It really tells them nothing.
     my $html=&Apache::lonxml::xmlbegin();      my $msg = 'Unable to tie hash to db file.';
     $r->print($html.'<head></head>'.$bodytag.      &Apache::loncommon::simple_error_page($r,'Search Error',
                       'Unable to tie hash to db file</body></html>');    $msg);
     return OK;      return OK;
  }   }
     }      }
Line 236  END Line 231  END
     ## Configure hidden fields      ## Configure hidden fields
     ##      ##
     $hidden_fields = '<input type="hidden" name="persistent_db_id" value="'.      $hidden_fields = '<input type="hidden" name="persistent_db_id" value="'.
         $ENV{'form.persistent_db_id'}.'" />'."\n";          $env{'form.persistent_db_id'}.'" />'."\n";
     if (exists($ENV{'form.catalogmode'})) {      if (exists($env{'form.catalogmode'})) {
         $hidden_fields .= &hidden_field('catalogmode');          $hidden_fields .= &hidden_field('catalogmode');
     }      }
     if (exists($ENV{'form.form'})) {      if (exists($env{'form.form'})) {
         $hidden_fields .= &hidden_field('form');          $hidden_fields .= &hidden_field('form');
     }      }
     if (exists($ENV{'form.element'})) {      if (exists($env{'form.element'})) {
         $hidden_fields .= &hidden_field('element');          $hidden_fields .= &hidden_field('element');
     }      }
     if (exists($ENV{'form.titleelement'})) {      if (exists($env{'form.titleelement'})) {
         $hidden_fields .= &hidden_field('titleelement');          $hidden_fields .= &hidden_field('titleelement');
     }      }
     if (exists($ENV{'form.mode'})) {      if (exists($env{'form.mode'})) {
         $hidden_fields .= &hidden_field('mode');          $hidden_fields .= &hidden_field('mode');
     }      }
     ##      ##
     ## Configure dynamic components of interface      ## Configure dynamic components of interface
     ##      ##
     if ($ENV{'form.catalogmode'} eq 'interactive') {      if ($env{'form.catalogmode'} eq 'interactive') {
         $closebutton="<input type='button' name='close' value='CLOSE' ";          $closebutton="<input type='button' name='close' value='CLOSE' ";
         if ($ENV{'form.phase'} =~ /(results|run_search)/) {          if ($env{'form.phase'} =~ /(results|run_search)/) {
     $closebutton .="onClick='parent.close()'";      $closebutton .="onClick='parent.close()'";
         } else {          } else {
             $closebutton .="onClick='self.close()'";              $closebutton .="onClick='self.close()'";
         }          }
         $closebutton .=">\n";          $closebutton .=">\n";
     } elsif ($ENV{'form.catalogmode'} eq 'groupsearch') {      } elsif ($env{'form.catalogmode'} eq 'groupsearch') {
         $closebutton="<input type='button' name='close' value='CLOSE' ";          $closebutton="<input type='button' name='close' value='CLOSE' ";
         if ($ENV{'form.phase'} =~ /(results|run_search)/) {          if ($env{'form.phase'} =~ /(results|run_search)/) {
     $closebutton .="onClick='parent.close()'";      $closebutton .="onClick='parent.close()'";
         } else {          } else {
             $closebutton .="onClick='self.close()'";              $closebutton .="onClick='self.close()'";
Line 282  END Line 277  END
     ##      ##
     ## Sanity checks on form elements      ## Sanity checks on form elements
     ##      ##
     if (!defined($ENV{'form.viewselect'})) {      if (!defined($env{'form.viewselect'})) {
         if (($ENV{'form.catalogmode'} eq 'groupsearch') ||   $env{'form.viewselect'} ="summary";
             ($ENV{'form.catalogmode'} eq 'interactive')) {  
             $ENV{'form.viewselect'} ="Compact View";  
         } else {  
             $ENV{'form.viewselect'} ="Detailed Citation View";  
         }  
     }      }
     $ENV{'form.phase'} = 'disp_basic' if (! exists($ENV{'form.phase'}));      $env{'form.phase'} = 'disp_basic' if (! exists($env{'form.phase'}));
     $ENV{'form.show'} = 20 if (! exists($ENV{'form.show'}));      $env{'form.show'} = 20 if (! exists($env{'form.show'}));
     #      #
     $ENV{'form.searchmode'} = 'basic' if (! exists($ENV{'form.searchmode'}));      $env{'form.searchmode'} = 'basic' if (! exists($env{'form.searchmode'}));
     if ($ENV{'form.phase'} eq 'adv_search' ||      if ($env{'form.phase'} eq 'adv_search' ||
         $ENV{'form.phase'} eq 'disp_adv') {          $env{'form.phase'} eq 'disp_adv') {
         $ENV{'form.searchmode'} = 'advanced';          $env{'form.searchmode'} = 'advanced';
     } elsif ($ENV{'form.phase'} eq 'course_search') {      } elsif ($env{'form.phase'} eq 'course_search') {
         $ENV{'form.searchmode'} = 'course_search';          $env{'form.searchmode'} = 'course_search';
     }      }
     #      #
     if ($ENV{'form.searchmode'} eq 'advanced') {      if ($env{'form.searchmode'} eq 'advanced') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/searchcat?phase=disp_adv&'.              ({href=>'/adm/searchcat?phase=disp_adv&'.
                   'catalogmode='.$ENV{'form.catalogmode'}.                    'catalogmode='.$env{'form.catalogmode'}.
                   '&launch='.$ENV{'form.launch'}.                    '&launch='.$env{'form.launch'}.
                   '&mode='.$ENV{'form.mode'},                    '&mode='.$env{'form.mode'},
                   text=>"Advanced Search",                    text=>"Advanced Search",
                   bug=>'Searching',});                    bug=>'Searching',});
     } elsif ($ENV{'form.searchmode'} eq 'course search') {      } elsif ($env{'form.searchmode'} eq 'course search') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/searchcat?phase=disp_adv&'.              ({href=>'/adm/searchcat?phase=disp_adv&'.
                   'catalogmode='.$ENV{'form.catalogmode'}.                    'catalogmode='.$env{'form.catalogmode'}.
                   '&launch='.$ENV{'form.launch'}.                    '&launch='.$env{'form.launch'}.
                   '&mode='.$ENV{'form.mode'},                    '&mode='.$env{'form.mode'},
                   text=>"Course Search",                    text=>"Course Search",
                   bug=>'Searching',});                    bug=>'Searching',});
     }      }
     ##      ##
     ## Switch on the phase      ## Switch on the phase
     ##      ##
     if ($ENV{'form.phase'} eq 'disp_basic') {      if ($env{'form.phase'} eq 'disp_basic') {
         &print_basic_search_form($r,$closebutton,$hidden_fields);          &print_basic_search_form($r,$closebutton,$hidden_fields);
     } elsif ($ENV{'form.phase'} eq 'disp_adv') {      } elsif ($env{'form.phase'} eq 'disp_adv') {
         &print_advanced_search_form($r,$closebutton,$hidden_fields);          &print_advanced_search_form($r,$closebutton,$hidden_fields);
     } elsif ($ENV{'form.phase'} eq 'results') {      } elsif ($env{'form.phase'} eq 'results') {
         &display_results($r,$importbutton,$closebutton,$diropendb);          &display_results($r,$importbutton,$closebutton,$diropendb);
     } elsif ($ENV{'form.phase'} =~ /^(sort|run_search)$/) {      } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {
         my ($query,$customquery,$customshow,$libraries,$pretty_string) =          my ($query,$customquery,$customshow,$libraries,$pretty_string) =
             &get_persistent_data($persistent_db_file,              &get_persistent_data($persistent_db_file,
                  ['query','customquery','customshow',                   ['query','customquery','customshow',
                   'libraries','pretty_string']);                    'libraries','pretty_string']);
         if ($ENV{'form.phase'} eq 'sort') {          if ($env{'form.phase'} eq 'sort') {
             &print_sort_form($r,$pretty_string);              &print_sort_form($r,$pretty_string);
         } elsif ($ENV{'form.phase'} eq 'run_search') {          } elsif ($env{'form.phase'} eq 'run_search') {
             &run_search($r,$query,$customquery,$customshow,              &run_search($r,$query,$customquery,$customshow,
                         $libraries,$pretty_string);                          $libraries,$pretty_string);
         }          }
     } elsif ($ENV{'form.phase'} eq 'course_search') {      } elsif ($env{'form.phase'} eq 'course_search') {
         &course_search($r);          &course_search($r);
     } elsif(($ENV{'form.phase'} eq 'basic_search') ||      } elsif(($env{'form.phase'} eq 'basic_search') ||
             ($ENV{'form.phase'} eq 'adv_search')) {              ($env{'form.phase'} eq 'adv_search')) {
         #          #
         # We are running a search, try to parse it          # We are running a search, try to parse it
         my ($query,$customquery,$customshow,$libraries) =           my ($query,$customquery,$customshow,$libraries) = 
             (undef,undef,undef,undef);              (undef,undef,undef,undef);
         my $pretty_string;          my $pretty_string;
         if ($ENV{'form.phase'} eq 'basic_search') {          if ($env{'form.phase'} eq 'basic_search') {
             ($query,$pretty_string,$libraries) =               ($query,$pretty_string,$libraries) = 
                 &parse_basic_search($r,$closebutton,$hidden_fields);                  &parse_basic_search($r,$closebutton,$hidden_fields);
             return OK if (! defined($query));              return OK if (! defined($query));
             &make_persistent({ basicexp => $ENV{'form.basicexp'}},              &make_persistent({ basicexp => $env{'form.basicexp'}},
                              $persistent_db_file);                               $persistent_db_file);
         } else {                      # Advanced search          } else {                      # Advanced search
             ($query,$customquery,$customshow,$libraries,$pretty_string)               ($query,$customquery,$customshow,$libraries,$pretty_string) 
Line 371  END Line 361  END
             &Apache::lonnet::logthis('lonsearchcat.pm: Unable to create '.              &Apache::lonnet::logthis('lonsearchcat.pm: Unable to create '.
                                      'needed table.  lonmysql error:'.                                       'needed table.  lonmysql error:'.
                                      $errorstring);                                       $errorstring);
     my $html=&Apache::lonxml::xmlbegin();  
             $r->print(<<END);      my $msg = 
 $html   'Unable to create table in which to store search results. '.
 <head>   'The search has been aborted.';
 <title>Search Error</title></head>      &Apache::loncommon::simple_error_page($r,'Search Error',
 $bodytag    $msg);
 Unable to create table in which to store search results.        return OK;
 The search has been aborted.  
 </body>  
 </html>  
 END  
             return OK;  
         }          }
         delete($ENV{'form.launch'});          delete($env{'form.launch'});
         if (! &make_form_data_persistent($r,$persistent_db_file)) {          if (! &make_form_data_persistent($r,$persistent_db_file)) {
     my $html=&Apache::lonxml::xmlbegin();      my $msg=
     $r->print(<<END);   'Unable to properly store search information. '.
 $html   'The search has been aborted.';
 <head>      &Apache::loncommon::simple_error_page($r,'Search Error',
 <title>Search Error</title></head>    $msg);
 $bodytag      return OK;
 Unable to properly store search information.  The search has been aborted.   }
 </body>  
 </html>  
 END  
             return OK;  
         }  
         ##          ##
         ## Print out the frames interface          ## Print out the frames interface
         ##          ##
Line 415  END Line 395  END
 # This routine sets non existant checkbox form elements to ''.  # This routine sets non existant checkbox form elements to ''.
 #  #
 sub clean_up_environment {  sub clean_up_environment {
     if ($ENV{'form.phase'} eq 'basic_search') {      if ($env{'form.phase'} eq 'basic_search') {
         if (! exists($ENV{'form.related'})) {          if (! exists($env{'form.related'})) {
             $ENV{'form.related'} = '';              $env{'form.related'} = '';
         }          }
         if (! exists($ENV{'form.domains'})) {          if (! exists($env{'form.domains'})) {
             $ENV{'form.domains'} = '';              $env{'form.domains'} = '';
         }          }
     } elsif ($ENV{'form.phase'} eq 'adv_search') {      } elsif ($env{'form.phase'} eq 'adv_search') {
         foreach my $field ('title','keywords','notes',          foreach my $field ('title','keywords','notes',
                            'abstract','standards','mime') {                             'abstract','standards','mime') {
             if (! exists($ENV{'form.'.$field.'_related'})) {              if (! exists($env{'form.'.$field.'_related'})) {
                 $ENV{'form.'.$field.'_related'} = '';                  $env{'form.'.$field.'_related'} = '';
             }              }
         }          }
     } elsif ($ENV{'form.phase'} eq 'course_search') {      } elsif ($env{'form.phase'} eq 'course_search') {
         if (! exists($ENV{'form.crsrelated'})) {          if (! exists($env{'form.crsrelated'})) {
             $ENV{'form.crsrelated'} = '';              $env{'form.crsrelated'} = '';
         }          }
     }      }
 }  }
Line 439  sub clean_up_environment { Line 419  sub clean_up_environment {
 sub hidden_field {  sub hidden_field {
     my ($name,$value) = @_;      my ($name,$value) = @_;
     if (! defined($value)) {      if (! defined($value)) {
         $value = $ENV{'form.'.$name};          $value = $env{'form.'.$name};
     }      }
     return '<input type="hidden" name="'.$name.'" value="'.$value.'" />'.$/;      return '<input type="hidden" name="'.$name.'" value="'.$value.'" />'.$/;
 }  }
Line 469  sub make_symb { Line 449  sub make_symb {
   
 sub course_search {  sub course_search {
     my $r=shift;      my $r=shift;
     my $bodytag=&Apache::loncommon::bodytag('Course Search');      my $pretty_search_string = '<b>'.$env{'form.courseexp'}.'</b>';
     my $pretty_search_string = '<b>'.$ENV{'form.courseexp'}.'</b>';      my $search_string = $env{'form.courseexp'};
     my $search_string = $ENV{'form.courseexp'};  
     my @New_Words;      my @New_Words;
     undef(%alreadyseen);      undef(%alreadyseen);
     if ($ENV{'form.crsrelated'}) {      if ($env{'form.crsrelated'}) {
         ($search_string,@New_Words) = &related_version($ENV{'form.courseexp'});          ($search_string,@New_Words) = &related_version($env{'form.courseexp'});
         if (@New_Words) {          if (@New_Words) {
             $pretty_search_string .= ' '.&mt("with related words").": <b>@New_Words</b>.";              $pretty_search_string .= ' '.&mt("with related words").": <b>@New_Words</b>.";
         } else {          } else {
             $pretty_search_string .= ' '.&mt('with no related words').".";              $pretty_search_string .= ' '.&mt('with no related words').".";
         }          }
     }      }
     my $fulltext=$ENV{'form.crsfulltext'};      my $fulltext=$env{'form.crsfulltext'};
     my $discuss=$ENV{'form.crsdiscuss'};      my $discuss=$env{'form.crsdiscuss'};
     my @allwords=($search_string,@New_Words);      my @allwords=($search_string,@New_Words);
     $totalfound=0;      $totalfound=0;
     my $html=&Apache::lonxml::xmlbegin();      $r->print(&Apache::loncommon::start_page('Course Search').
     $r->print($html.'<head><title>LON-CAPA Course Search</title></head>'.        '<hr /><center><font size="+2" face="arial">'.
       $bodytag.'<hr /><center><font size="+2" face="arial">'.$pretty_search_string.'</font></center><hr /><b>'.&mt('Course content').':</b><br />');        $pretty_search_string.'</font></center>'.
         '<hr /><b>'.&mt('Course content').':</b><br />');
     $r->rflush();      $r->rflush();
 # ======================================================= Go through the course  # ======================================================= Go through the course
     my $c=$r->connection;      my $c=$r->connection;
     if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.".db",      if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
             &GDBM_READER(),0640)) {              &GDBM_READER(),0640)) {
         foreach (sort(keys(%hash))) {          foreach (sort(keys(%hash))) {
             if ($c->aborted()) { last; }              if ($c->aborted()) { last; }
             if (($_=~/^src\_(.+)$/)) {              if (($_=~/^src\_(.+)$/)) {
  if ($hash{'randomout_'.$1} & !$ENV{'request.role.adv'}) {   if ($hash{'randomout_'.$1} & !$env{'request.role.adv'}) {
     next;       next; 
  }   }
  my $symb=&make_symb($1);   my $symb=&make_symb($1);
Line 518  sub course_search { Line 498  sub course_search {
         my $navmap = Apache::lonnavmaps::navmap->new();          my $navmap = Apache::lonnavmaps::navmap->new();
         my @allres=$navmap->retrieveResources();          my @allres=$navmap->retrieveResources();
         my %discussiontime = &Apache::lonnet::dump('discussiontimes',          my %discussiontime = &Apache::lonnet::dump('discussiontimes',
                                $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},                                 $env{'course.'.$env{'request.course.id'}.'.domain'},
                                $ENV{'course.'.$ENV{'request.course.id'}.'.num'});                                 $env{'course.'.$env{'request.course.id'}.'.num'});
         foreach my $resource (@allres) {          foreach my $resource (@allres) {
             my $result = '';              my $result = '';
             my $applies = 0;              my $applies = 0;
Line 532  sub course_search { Line 512  sub course_search {
                 }                  }
             }              }
             if (defined($discussiontime{$ressymb})) {               if (defined($discussiontime{$ressymb})) { 
                 my %contrib = &Apache::lonnet::restore($ressymb,$ENV{'request.course.id'},                  my %contrib = &Apache::lonnet::restore($ressymb,$env{'request.course.id'},
                      $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},                       $env{'course.'.$env{'request.course.id'}.'.domain'},
                      $ENV{'course.'.$ENV{'request.course.id'}.'.num'});                       $env{'course.'.$env{'request.course.id'}.'.num'});
                 if ($contrib{'version'}) {                  if ($contrib{'version'}) {
                     for (my $id=1;$id<=$contrib{'version'};$id++) {                      for (my $id=1;$id<=$contrib{'version'};$id++) {
                         unless (($contrib{'hidden'}=~/\.$id\./) || ($contrib{'deleted'}=~/\.$id\./)) {                           unless (($contrib{'hidden'}=~/\.$id\./) || ($contrib{'deleted'}=~/\.$id\./)) { 
Line 586  sub course_search { Line 566  sub course_search {
     }      }
     
 # =================================================== Done going through course  # =================================================== Done going through course
     $r->print('</body></html>');      $r->print(&Apache::loncommon::end_page());
 }  }
   
 # =============================== This pulls up a resource and its dependencies  # =============================== This pulls up a resource and its dependencies
Line 598  sub checkonthis { Line 578  sub checkonthis {
     $r->rflush();      $r->rflush();
           
     my $result=$title.' ';      my $result=$title.' ';
     if ($ENV{'request.role.adv'} || !$hash{'encrypted_'.$id}) {      if ($env{'request.role.adv'} || !$hash{'encrypted_'.$id}) {
  $result.=&Apache::lonnet::metadata($url,'title').' '.   $result.=&Apache::lonnet::metadata($url,'title').' '.
     &Apache::lonnet::metadata($url,'subject').' '.      &Apache::lonnet::metadata($url,'subject').' '.
     &Apache::lonnet::metadata($url,'abstract').' '.      &Apache::lonnet::metadata($url,'abstract').' '.
Line 619  sub checkonthis { Line 599  sub checkonthis {
            $r->print('&nbsp;');             $r->print('&nbsp;');
        }         }
        my $href=$url;         my $href=$url;
        if ($hash{'encrypted_'.$id} && !$ENV{'request.role.adv'}) {         if ($hash{'encrypted_'.$id} && !$env{'request.role.adv'}) {
    $href=&Apache::lonenc::encrypted($href)     $href=&Apache::lonenc::encrypted($href)
        .'?symb='.&Apache::lonenc::encrypted($symb);         .'?symb='.&Apache::lonenc::encrypted($symb);
        } else {         } else {
Line 662  sub untiehash { Line 642  sub untiehash {
   
 } # End of course search scoping  } # End of course search scoping
   
 sub search_html_header {  
     my $html=&Apache::lonxml::xmlbegin();  
     my $Str = <<ENDHEADER;  
 $html  
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 </head>  
 ENDHEADER  
     return $Str;  
 }  
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 688  Prints the form for the basic search.  S Line 658  Prints the form for the basic search.  S
 ######################################################################  ######################################################################
 sub print_basic_search_form {  sub print_basic_search_form {
     my ($r,$closebutton,$hidden_fields) = @_;      my ($r,$closebutton,$hidden_fields) = @_;
     my $result = ($ENV{'form.catalogmode'} ne 'groupsearch');      my $result = ($env{'form.catalogmode'} ne 'groupsearch');
     my $bodytag=&Apache::loncommon::bodytag('Search').      my $bread_crumb =
         &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching','Search_Basic',          &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching','Search_Basic',
                                    undef,undef,                                     undef,undef,
                                    $ENV{'form.catalogmode'} ne 'groupsearch');                                     $env{'form.catalogmode'} ne 'groupsearch');
     my $scrout = &search_html_header().$bodytag;      my $scrout = &Apache::loncommon::start_page('Search').$bread_crumb;
     if (&Apache::lonnet::allowed('bre',$ENV{'request.role.domain'})) {      if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {
         # Define interface components          # Define interface components
         my $userelatedwords= '<label>'.          my $userelatedwords= '<label>'.
             &mt('[_1] use related words',              &mt('[_1] use related words',
                 &Apache::lonhtmlcommon::checkbox                  &Apache::lonhtmlcommon::checkbox
                 ('related',$ENV{'form.related'},'related')).'</label>';                  ('related',$env{'form.related'},'related')).'</label>';
         my $onlysearchdomain='<label>'.          my $onlysearchdomain='<label>'.
             &mt('[_1] only search domain [_2]',              &mt('[_1] only search domain [_2]',
                 &Apache::lonhtmlcommon::checkbox('domains',                  &Apache::lonhtmlcommon::checkbox('domains',
                                                  $ENV{'form.domains'},                                                   $env{'form.domains'},
                                                  $r->dir_config('lonDefDomain')                                                   $r->dir_config('lonDefDomain')
                                                  ),                                                   ),
                 $r->dir_config('lonDefDomain')                  $r->dir_config('lonDefDomain')
                 ).'</label>';                  ).'</label>';
           my $inclext= '<label>'.
               &mt('[_1] include external resources',
                   &Apache::lonhtmlcommon::checkbox
                   ('inclext',$env{'form.inclext'})).'</label>';
         my $adv_search_link =           my $adv_search_link = 
             '<a href="/adm/searchcat?'.              '<a href="/adm/searchcat?'.
             'phase=disp_adv&'.              'phase=disp_adv&'.
             'catalogmode='.$ENV{'form.catalogmode'}.              'catalogmode='.$env{'form.catalogmode'}.
             '&launch='.$ENV{'form.launch'}.              '&launch='.$env{'form.launch'}.
             '&mode='.$ENV{'form.mode'}.              '&mode='.$env{'form.mode'}.
             '">'.&mt('Advanced Search').'</a>';              '">'.&mt('Advanced Search').'</a>';
         #          #
         $scrout.='<form name="loncapa_search" method="post" '.          $scrout.='<form name="loncapa_search" method="post" '.
Line 722  sub print_basic_search_form { Line 696  sub print_basic_search_form {
             $hidden_fields;              $hidden_fields;
         #          #
         $scrout .= '<center>'.$/;          $scrout .= '<center>'.$/;
         if ($ENV{'request.course.id'}) {          if ($env{'request.course.id'}) {
             $scrout .= '<h1>'.&mt('LON-CAPA Catalog Search').'</h1>';              $scrout .= '<h1>'.&mt('LON-CAPA Catalog Search').'</h1>';
         } else {          } else {
             # No need to tell them they are searching              # No need to tell them they are searching
Line 732  sub print_basic_search_form { Line 706  sub print_basic_search_form {
             '<tr><td align="center" valign="top">'.              '<tr><td align="center" valign="top">'.
             &Apache::lonhtmlcommon::textbox              &Apache::lonhtmlcommon::textbox
             ('basicexp',              ('basicexp',
              &HTML::Entities::encode($ENV{'form.basicexp'},'<>&"'),50               &HTML::Entities::encode($env{'form.basicexp'},'<>&"'),50
              ).               ).
              '<br />'.               '<br />'.
             '<font size="-1">'.&searchhelp().'</font>'.'</td>'.              '<font size="-1">'.&searchhelp().'</font>'.'</td>'.
Line 740  sub print_basic_search_form { Line 714  sub print_basic_search_form {
             '<nobr>'.('&nbsp;'x3).$adv_search_link.'</nobr>'.'<br />'.              '<nobr>'.('&nbsp;'x3).$adv_search_link.'</nobr>'.'<br />'.
             '<nobr>'.('&nbsp;'x1).$userelatedwords.'</nobr>'.'<br />'.              '<nobr>'.('&nbsp;'x1).$userelatedwords.'</nobr>'.'<br />'.
             '<nobr>'.('&nbsp;'x1).$onlysearchdomain.'</nobr>'.'<br />'.              '<nobr>'.('&nbsp;'x1).$onlysearchdomain.'</nobr>'.'<br />'.
             '</font></td>'.              '<nobr>'.('&nbsp;'x1).$inclext.'</nobr>'.'<br />'.
                '</font></td>'.
             '</tr>'.$/;              '</tr>'.$/;
         #          #
         $scrout .= '<tr><td align="center" colspan="2">'.          $scrout .= '<tr><td align="center" colspan="2">'.
Line 753  sub print_basic_search_form { Line 728  sub print_basic_search_form {
             '</td></tr>'.$/;              '</td></tr>'.$/;
         $scrout .= '</table>'.$/.'</center>'.'</form>';          $scrout .= '</table>'.$/.'</center>'.'</form>';
     }      }
     if ($ENV{'request.course.id'}) {      if ($env{'request.course.id'}) {
  my %lt=&Apache::lonlocal::texthash('srch' => 'Search',   my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
                                            'header' => 'Course Search',                                             'header' => 'Course Search',
  'note' => 'Enter terms or phrases, then press "Search" below',   'note' => 'Enter terms or phrases, then press "Search" below',
Line 777  $lt{'note'}. Line 752  $lt{'note'}.
 ENDCOURSESEARCH  ENDCOURSESEARCH
         $scrout.='&nbsp;'.          $scrout.='&nbsp;'.
             &Apache::lonhtmlcommon::textbox('courseexp',              &Apache::lonhtmlcommon::textbox('courseexp',
                                   $ENV{'form.courseexp'},40);                                    $env{'form.courseexp'},40);
         my $crscheckbox =           my $crscheckbox = 
             &Apache::lonhtmlcommon::checkbox('crsfulltext',              &Apache::lonhtmlcommon::checkbox('crsfulltext',
                                    $ENV{'form.crsfulltext'});                                     $env{'form.crsfulltext'});
         my $relcheckbox =           my $relcheckbox = 
             &Apache::lonhtmlcommon::checkbox('crsrelated',              &Apache::lonhtmlcommon::checkbox('crsrelated',
    $ENV{'form.crsrelated'});     $env{'form.crsrelated'});
         my $discheckbox =           my $discheckbox = 
             &Apache::lonhtmlcommon::checkbox('crsdiscuss',              &Apache::lonhtmlcommon::checkbox('crsdiscuss',
                                    $ENV{'form.crsrelated'});                                     $env{'form.crsrelated'});
         $scrout.=(<<ENDENDCOURSE);          $scrout.=(<<ENDENDCOURSE);
 </td></tr>  </td></tr>
 <tr><td><label>$relcheckbox $lt{'use'}</label></td><td></td></tr>  <tr><td><label>$relcheckbox $lt{'use'}</label></td><td></td></tr>
Line 799  ENDCOURSESEARCH Line 774  ENDCOURSESEARCH
 </form>  </form>
 ENDENDCOURSE  ENDENDCOURSE
     }      }
     $scrout.=(<<ENDDOCUMENT);      $scrout .= &Apache::loncommon::end_page();
 </body>  
 </html>  
 ENDDOCUMENT  
     $r->print($scrout);      $r->print($scrout);
     return;      return;
 }  }
Line 821  Prints the advanced search form. Line 793  Prints the advanced search form.
 ######################################################################  ######################################################################
 sub print_advanced_search_form{  sub print_advanced_search_form{
     my ($r,$closebutton,$hidden_fields) = @_;      my ($r,$closebutton,$hidden_fields) = @_;
     my $bodytag=&Apache::loncommon::bodytag('Advanced Catalog Search').      my $bread_crumb = 
         &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching',          &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching',
                                             'Search_Advanced',                                              'Search_Advanced',
                                             undef,undef,                                              undef,undef,
                                   $ENV{'form.catalogmode'} ne 'groupsearch');                                    $env{'form.catalogmode'} ne 'groupsearch');
     my %lt=&Apache::lonlocal::texthash('srch' => 'Search',      my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
        'reset' => 'Reset',         'reset' => 'Reset',
        'help' => 'Help');         'help' => 'Help');
Line 834  sub print_advanced_search_form{ Line 806  sub print_advanced_search_form{
 <input type="reset" name="reset" value='$lt{"reset"}' />  <input type="reset" name="reset" value='$lt{"reset"}' />
 $closebutton  $closebutton
 END  END
     my $scrout=&search_html_header();      my $scrout= &Apache::loncommon::start_page('Advanced Catalog Search');
     $scrout .= <<"ENDHEADER";      $scrout .= <<"ENDHEADER";
 $bodytag  $bread_crumb
 <form method="post" action="/adm/searchcat" name="advsearch">  <form method="post" action="/adm/searchcat" name="advsearch">
 <p>  <p>
 $advanced_buttons  $advanced_buttons
Line 860  ENDHEADER Line 832  ENDHEADER
          'abstract' => 1,           'abstract' => 1,
          'standards'=> 1,           'standards'=> 1,
          'mime'     => 1,           'mime'     => 1,
    'subject'  => 1,
          );           );
     #      #
     foreach my $field ('title','author','owner','authorspace','modifyinguser',      foreach my $field ('title','author','subject','owner','authorspace',
      'keywords','notes','abstract','standards','mime') {         'modifyinguser','keywords','notes','abstract',
          'standards','mime') {
  $scrout.='<tr><td align="right">'.&titlefield($fields{$field}).'</td><td>'.   $scrout.='<tr><td align="right">'.&titlefield($fields{$field}).'</td><td>'.
     &Apache::lonmeta::prettyinput($field,      &Apache::lonmeta::prettyinput($field,
                                           $ENV{'form.'.$field},                                            $env{'form.'.$field},
                                           $field,                                            $field,
                                           'advsearch',                                            'advsearch',
   $related_word_search{$field},    $related_word_search{$field},
                                           '</td><td align="left">',                                            '</td><td align="left">',
                                           $ENV{'form.'.$field.'_related'},                                            $env{'form.'.$field.'_related'},
                                           50);                                            50);
         if ($related_word_search{$field}) {          if ($related_word_search{$field}) {
             $scrout .= 'related words';              $scrout .= 'related words';
Line 885  ENDHEADER Line 859  ENDHEADER
             '<td align="right">'.&titlefield($fields{$field}).'</td>'.              '<td align="right">'.&titlefield($fields{$field}).'</td>'.
             '<td colspan="2">'.              '<td colspan="2">'.
     &Apache::lonmeta::prettyinput($field,      &Apache::lonmeta::prettyinput($field,
                                           $ENV{'form.'.$field},                                            $env{'form.'.$field},
                                           $field,                                            $field,
                                           'advsearch',                                            'advsearch',
   0).    0).
Line 894  ENDHEADER Line 868  ENDHEADER
     $scrout.='<tr><td align="right">'.      $scrout.='<tr><td align="right">'.
  &titlefield(&mt('MIME Type Category')).'</td><td colspan="2">'.    &titlefield(&mt('MIME Type Category')).'</td><td colspan="2">'. 
     &Apache::loncommon::filecategoryselect('category',      &Apache::loncommon::filecategoryselect('category',
    $ENV{'form.category'}).     $env{'form.category'}).
     '</td></tr>'.$/;      '</td></tr>'.$/;
     $scrout.='<tr><td align="right" valign="top">'.      $scrout.='<tr><td align="right" valign="top">'.
  &titlefield(&mt('Domains')).'</td><td colspan="2">'.    &titlefield(&mt('Domains')).'</td><td colspan="2">'. 
     &Apache::loncommon::domain_select('domains',      &Apache::loncommon::domain_select('domains',
    $ENV{'form.domains'},1).     $env{'form.domains'},1).
     '</td></tr>'.$/;     '<br /><label>'.
               &mt('[_1] include external resources',
                   &Apache::lonhtmlcommon::checkbox
                   ('inclext',$env{'form.inclext'})).'</label></td></tr>'.$/;
     #      #
     # Misc metadata      # Misc metadata
     $scrout.='<tr><td align="right" valign="top">'.      $scrout.='<tr><td align="right" valign="top">'.
  &titlefield(&mt('Copyright/Distribution')).'</td><td colspan="2">'.   &titlefield(&mt('Copyright/Distribution')).'</td><td colspan="2">'.
         &Apache::lonmeta::selectbox('copyright',          &Apache::lonmeta::selectbox('copyright',
                                     $ENV{'form.copyright'},                                      $env{'form.copyright'},
                                     \&Apache::loncommon::copyrightdescription,                                      \&Apache::loncommon::copyrightdescription,
                                     ( undef,                                      ( undef,
                                       &Apache::loncommon::copyrightids)                                        &Apache::loncommon::copyrightids)
Line 914  ENDHEADER Line 891  ENDHEADER
     $scrout.='<tr><td align="right" valign="top">'.      $scrout.='<tr><td align="right" valign="top">'.
  &titlefield(&mt('Language')).'</td><td colspan="2">'.   &titlefield(&mt('Language')).'</td><td colspan="2">'.
         &Apache::lonmeta::selectbox('language',          &Apache::lonmeta::selectbox('language',
                                     $ENV{'form.language'},                                      $env{'form.language'},
                                     \&Apache::loncommon::languagedescription,                                      \&Apache::loncommon::languagedescription,
                                     ('any',&Apache::loncommon::languageids)                                      ('any',&Apache::loncommon::languageids)
                                     ).'</td></tr>';                                      ).'</td></tr>';
Line 1026  ENDHEADER Line 1003  ENDHEADER
     $scrout.=<<ENDDOCUMENT;      $scrout.=<<ENDDOCUMENT;
 $advanced_buttons  $advanced_buttons
 </form>  </form>
 </body>  
 </html>  
 ENDDOCUMENT  ENDDOCUMENT
       $scrout .= &Apache::loncommon::end_page();
     $r->print($scrout);      $r->print($scrout);
     return;      return;
 }  }
Line 1075  sub viewoptiontext { Line 1051  sub viewoptiontext {
          'xml' => 'XML/SGML',           'xml' => 'XML/SGML',
          'compact' => 'Compact View',           'compact' => 'Compact View',
          'fielded' => 'Fielded Format',           'fielded' => 'Fielded Format',
          'summary' => 'Summary View');           'summary' => 'Summary View',
            'summarypreview' => 'Summary Preview',
            'detailedpreview' => 'Detailed Citation Preview');
     return $desc{$code};      return $desc{$code};
 }  }
   
Line 1096  Outputs: text for box with view options Line 1074  Outputs: text for box with view options
 ######################################################################  ######################################################################
 sub viewoptions {  sub viewoptions {
     my $scrout;      my $scrout;
     if (! defined($ENV{'form.viewselect'})) {       if (! defined($env{'form.viewselect'})) { 
         $ENV{'form.viewselect'}='detailed';           $env{'form.viewselect'}='detailed'; 
     }      }
     $scrout.=&Apache::lonmeta::selectbox('viewselect',      $scrout.=&Apache::lonmeta::selectbox('viewselect',
  $ENV{'form.viewselect'},   $env{'form.viewselect'},
  \&viewoptiontext,   \&viewoptiontext,
  sort(keys(%Views)));   sort(keys(%Views)));
     $scrout.= '&nbsp;&nbsp;';      $scrout.= '&nbsp;&nbsp;';
     my $countselect = &Apache::lonmeta::selectbox('show',      my $countselect = &Apache::lonmeta::selectbox('show',
                                                   $ENV{'form.show'},                                                    $env{'form.show'},
                                                   undef,                                                    undef,
                                                   (10,20,50,100,1000,10000));                                                    (10,20,50,100,1000,10000));
     $scrout .= ('&nbsp;'x2).&mt('[_1] Records per Page',$countselect).      $scrout .= ('&nbsp;'x2).&mt('[_1] Records per Page',$countselect).
Line 1145  Outputs: returns undef on database error Line 1123  Outputs: returns undef on database error
   
 This function is the reverse of &make_persistent() for form data.  This function is the reverse of &make_persistent() for form data.
 Retrieve persistent data from %persistent_db.  Retrieved items will have their  Retrieve persistent data from %persistent_db.  Retrieved items will have their
 values unescaped.  If a form value already exists in $ENV, it will not be  values unescaped.  If a form value already exists in $env, it will not be
 overwritten.  Form values that are array references may have values appended  overwritten.  Form values that are array references may have values appended
 to them.  to them.
   
Line 1167  sub get_persistent_form_data { Line 1145  sub get_persistent_form_data {
         next if ($name !~ /^form./);          next if ($name !~ /^form./);
         # Kludgification begins!          # Kludgification begins!
         if ($name eq 'form.domains' &&           if ($name eq 'form.domains' && 
             $ENV{'form.searchmode'} eq 'basic' &&              $env{'form.searchmode'} eq 'basic' &&
             $ENV{'form.phase'} ne 'disp_basic') {              $env{'form.phase'} ne 'disp_basic') {
             next;              next;
         }          }
         # End kludge (hopefully)          # End kludge (hopefully)
         next if (exists($ENV{$name}));          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 ($arrays_allowed{$name}) {          if ($arrays_allowed{$name}) {
             $ENV{$name} = [@values];              $env{$name} = [@values];
         } else {          } else {
             $ENV{$name} = $values[0] if ($values[0]);              $env{$name} = $values[0] if ($values[0]);
         }          }
     }      }
     untie (%persistent_db);      untie (%persistent_db);
Line 1285  sub make_form_data_persistent { Line 1263  sub make_form_data_persistent {
     my $r = shift;      my $r = shift;
     my $filename = shift;      my $filename = shift;
     my %save;      my %save;
     foreach (keys(%ENV)) {      foreach (keys(%env)) {
         next if (!/^form/ || /submit/);          next if (!/^form/ || /submit/);
         $save{$_} = $ENV{$_};          $save{$_} = $env{$_};
     }      }
     return &make_persistent(\%save,$filename);      return &make_persistent(\%save,$filename);
 }  }
Line 1335  sub parse_advanced_search { Line 1313  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') {
  $ENV{'form.'.$field}=~s/[^\w\/\s\(\)\=\-\"\']//g;   $env{'form.'.$field}=~s/[^\w\/\s\(\)\=\-\"\']//g;
     }      }
     foreach ('mode','form','element') {      foreach ('mode','form','element') {
  # is this required?  Hmmm.   # is this required?  Hmmm.
  next if (! exists($ENV{'form.'.$_}));   next if (! exists($env{'form.'.$_}));
  $ENV{'form.'.$_}=&Apache::lonnet::unescape($ENV{'form.'.$_});   $env{'form.'.$_}=&Apache::lonnet::unescape($env{'form.'.$_});
  $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 (! defined($ENV{'form.category'}) ||      $env{'form.category'} = 'any' if (! defined($env{'form.category'}) ||
                                       ref($ENV{'form.category'}));                                        ref($env{'form.category'}));
     #      #
     # Check to see if enough information was filled in      # Check to see if enough information was filled in
     foreach my $field (@BasicFields) {      foreach my $field (@BasicFields) {
  if (&filled($ENV{'form.'.$field})) {   if (&filled($env{'form.'.$field})) {
     $fillflag++;      $fillflag++;
  }   }
     }      }
     foreach my $field (@StatsFields,@EvalFields) {      foreach my $field (@StatsFields,@EvalFields) {
         if (&filled($ENV{'form.'.$field.'_max'})) {          if (&filled($env{'form.'.$field.'_max'})) {
             $fillflag++;              $fillflag++;
         }          }
         if (&filled($ENV{'form.'.$field.'_min'})) {          if (&filled($env{'form.'.$field.'_min'})) {
             $fillflag++;              $fillflag++;
         }          }
     }      }
   
     for my $field ('lowestgradelevel','highestgradelevel') {      for my $field ('lowestgradelevel','highestgradelevel') {
         if ( $ENV{'form.'.$field} =~ /^\d+$/ &&          if ( $env{'form.'.$field} =~ /^\d+$/ &&
              $ENV{'form.'.$field} > 0) {               $env{'form.'.$field} > 0) {
             $fillflag++;              $fillflag++;
         }          }
     }      }
Line 1379  sub parse_advanced_search { Line 1357  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 (@BasicFields) {      foreach my $field (@BasicFields) {
  next if (!defined($ENV{'form.'.$field}) || $ENV{'form.'.$field} eq '');   next if (!defined($env{'form.'.$field}) || $env{'form.'.$field} eq '');
         my ($error,$SQLQuery) =           my ($error,$SQLQuery) = 
             &process_phrase_input($ENV{'form.'.$field},              &process_phrase_input($env{'form.'.$field},
                                   $ENV{'form.'.$field.'_related'},$field);                                    $env{'form.'.$field.'_related'},$field);
         if (defined($error)) {          if (defined($error)) {
             &output_unparsed_phrase_error($r,$closebutton,'phase=disp_adv',              &output_unparsed_phrase_error($r,$closebutton,'phase=disp_adv',
                                          $hidden_fields,$field);                                           $hidden_fields,$field);
             return;              return;
         } else {          } else {
             $pretty_search_string .=               $pretty_search_string .= 
                 $font.$field.'</font>: '.$ENV{'form.'.$field};                  $font.$field.'</font>: '.$env{'form.'.$field};
             if ($ENV{'form.'.$field.'_related'}) {              if ($env{'form.'.$field.'_related'}) {
                 my @Words =                   my @Words = 
                     &Apache::loncommon::get_related_words                      &Apache::loncommon::get_related_words
                     ($ENV{'form.'.$field});                      ($env{'form.'.$field});
                 if (@Words) {                  if (@Words) {
                     $pretty_search_string.= ' with related words: '.                      $pretty_search_string.= ' with related words: '.
                         join(', ',@Words[0..4]);                          join(', ',@Words[0..4]);
Line 1409  sub parse_advanced_search { Line 1387  sub parse_advanced_search {
     # Make the 'mime' from 'form.category' and 'form.extension'      # Make the 'mime' from 'form.category' and 'form.extension'
     #      #
     my $searchphrase;      my $searchphrase;
     if (exists($ENV{'form.category'})    &&       if (exists($env{'form.category'})    && 
         $ENV{'form.category'} !~ /^\s*$/ &&          $env{'form.category'} !~ /^\s*$/ &&
         $ENV{'form.category'} ne 'any')     {          $env{'form.category'} ne 'any')     {
         my @extensions = &Apache::loncommon::filecategorytypes          my @extensions = &Apache::loncommon::filecategorytypes
                                                    ($ENV{'form.category'});                                                     ($env{'form.category'});
         if (scalar(@extensions) > 0) {          if (scalar(@extensions) > 0) {
             $searchphrase = join(' OR ',@extensions);              $searchphrase = join(' OR ',@extensions);
         }          }
Line 1426  sub parse_advanced_search { Line 1404  sub parse_advanced_search {
     }      }
     #      #
     # Evaluate option lists      # Evaluate option lists
     if ($ENV{'form.lowestgradelevel'}        &&      if ($env{'form.lowestgradelevel'}        &&
         $ENV{'form.lowestgradelevel'} ne '0' &&          $env{'form.lowestgradelevel'} ne '0' &&
         $ENV{'form.lowestgradelevel'} =~ /^\d+$/) {          $env{'form.lowestgradelevel'} =~ /^\d+$/) {
  push(@queries,   push(@queries,
              '(lowestgradelevel>='.$ENV{'form.lowestgradelevel'}.')');               '(lowestgradelevel>='.$env{'form.lowestgradelevel'}.')');
         $pretty_search_string.="lowestgradelevel>=".          $pretty_search_string.="lowestgradelevel>=".
             $ENV{'form.lowestgradelevel'}."<br />\n";              $env{'form.lowestgradelevel'}."<br />\n";
     }      }
     if ($ENV{'form.highestgradelevel'}        &&      if ($env{'form.highestgradelevel'}        &&
         $ENV{'form.highestgradelevel'} ne '0' &&          $env{'form.highestgradelevel'} ne '0' &&
         $ENV{'form.highestgradelevel'} =~ /^\d+$/) {          $env{'form.highestgradelevel'} =~ /^\d+$/) {
  push(@queries,   push(@queries,
              '(highestgradelevel<='.$ENV{'form.highestgradelevel'}.')');               '(highestgradelevel<='.$env{'form.highestgradelevel'}.')');
         $pretty_search_string.="highestgradelevel<=".          $pretty_search_string.="highestgradelevel<=".
             $ENV{'form.highestgradelevel'}."<br />\n";              $env{'form.highestgradelevel'}."<br />\n";
     }      }
     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'}\")";
         $pretty_search_string.=$font."language</font>= ".          $pretty_search_string.=$font."language</font>= ".
             &Apache::loncommon::languagedescription($ENV{'form.language'}).              &Apache::loncommon::languagedescription($env{'form.language'}).
                 "<br />\n";                  "<br />\n";
     }      }
     if ($ENV{'form.copyright'} and $ENV{'form.copyright'} ne 'any') {      if ($env{'form.copyright'} and $env{'form.copyright'} ne 'any') {
  push @queries,"(copyright like \"$ENV{'form.copyright'}\")";   push @queries,"(copyright like \"$env{'form.copyright'}\")";
         $pretty_search_string.=$font."copyright</font> = ".          $pretty_search_string.=$font."copyright</font> = ".
             &Apache::loncommon::copyrightdescription($ENV{'form.copyright'}).              &Apache::loncommon::copyrightdescription($env{'form.copyright'}).
                 "<br />\n";                  "<br />\n";
     }      }
     #      #
     # Statistics      # Statistics
     foreach my $field (@StatsFields,@EvalFields) {      foreach my $field (@StatsFields,@EvalFields) {
         my ($min,$max);          my ($min,$max);
         if (exists($ENV{'form.'.$field.'_min'}) &&           if (exists($env{'form.'.$field.'_min'}) && 
             $ENV{'form.'.$field.'_min'} ne '') {              $env{'form.'.$field.'_min'} ne '') {
             $min = $ENV{'form.'.$field.'_min'};              $min = $env{'form.'.$field.'_min'};
         }          }
         if (exists($ENV{'form.'.$field.'_max'}) &&          if (exists($env{'form.'.$field.'_max'}) &&
             $ENV{'form.'.$field.'_max'} ne '') {              $env{'form.'.$field.'_max'} ne '') {
             $max = $ENV{'form.'.$field.'_max'};              $max = $env{'form.'.$field.'_max'};
         }          }
         next if (! defined($max) && ! defined($min));          next if (! defined($max) && ! defined($min));
         if (defined($min) && defined($max)) {          if (defined($min) && defined($max)) {
Line 1517  sub parse_advanced_search { Line 1495  sub parse_advanced_search {
     ## because I was unable to figureout exactly how it worked and could      ## because I was unable to figureout exactly how it worked and could
     ## not imagine people actually using it.  MH      ## not imagine people actually using it.  MH
     ##      ##
     # 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);
Line 1535  sub parse_advanced_search { Line 1513  sub parse_advanced_search {
     ##      ##
     ## Deal with restrictions to given domains      ## Deal with restrictions to given domains
     ##       ## 
     my ($libraries_to_query,$pretty_domains_string,$domain_sql_restriction) =       my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();
         &parse_domain_restrictions();      if ($pretty_domains_string) {
     push(@queries,$domain_sql_restriction);         $pretty_search_string .= $pretty_domains_string."<br />\n";
     $pretty_search_string .= $pretty_domains_string."<br />\n";      }
     #      #
     if (@queries) {      if (@queries) {
  $query="SELECT * FROM metadata WHERE (".join(") AND (",@queries).')';   $query="SELECT * FROM metadata WHERE (".join(") AND (",@queries).')';
     } elsif ($customquery) {      } elsif ($customquery) {
         $query = '';          $query = '';
     }      }
     &Apache::lonnet::logthis('advanced query = '.$/.$query);      #&Apache::lonnet::logthis('advanced query = '.$/.$query);
     return ($query,$customquery,$customshow,$libraries_to_query,      return ($query,$customquery,$customshow,$libraries_to_query,
             $pretty_search_string);              $pretty_search_string);
 }  }
   
 sub parse_domain_restrictions {  sub parse_domain_restrictions {
     my $libraries_to_query = undef;      my $libraries_to_query = undef;
     # $ENV{'form.domains'} can be either a scalar or an array reference.      # $env{'form.domains'} can be either a scalar or an array reference.
     # We need an array.      # We need an array.
     if (! exists($ENV{'form.domains'}) || $ENV{'form.domains'} eq '') {      if (! exists($env{'form.domains'}) || $env{'form.domains'} eq '') {
         return (undef,'');          return (undef,'',undef);
     }  
     my @allowed_domains;  
     if (ref($ENV{'form.domains'})) {  
         @allowed_domains =  @{$ENV{'form.domains'}};  
     } else {  
         @allowed_domains = ($ENV{'form.domains'});  
     }      }
       my @allowed_domains = &Apache::loncommon::get_env_multiple('form.domains');
     #      #
     my %domain_hash = ();      my %domain_hash = ();
     my $pretty_domains_string;      my $pretty_domains_string;
     my $domain_sql_restriction;  
     foreach (@allowed_domains) {      foreach (@allowed_domains) {
         $domain_hash{$_}++;          $domain_hash{$_}++;
     }      }
     if ($domain_hash{'any'}) {      if ($domain_hash{'any'}) {
         $pretty_domains_string = "In all LON-CAPA domains.";          $pretty_domains_string = "In all LON-CAPA domains.";
         $domain_sql_restriction = undef;  
     } else {      } else {
         if (@allowed_domains > 1) {          if (@allowed_domains > 1) {
             $pretty_domains_string = "In LON-CAPA domains:";              $pretty_domains_string = "In LON-CAPA domains:";
         } else {          } else {
             $pretty_domains_string = "In LON-CAPA domain ";              $pretty_domains_string = "In LON-CAPA domain ";
         }          }
         $domain_sql_restriction =   
             '(domain="'.join('" OR domain="',@allowed_domains).'")';  
         foreach (sort @allowed_domains) {          foreach (sort @allowed_domains) {
             $pretty_domains_string .= "<b>".$_."</b> ";              $pretty_domains_string .= "<b>".$_."</b> ";
         }          }
Line 1591  sub parse_domain_restrictions { Line 1560  sub parse_domain_restrictions {
         }          }
     }      }
     return ($libraries_to_query,      return ($libraries_to_query,
             $pretty_domains_string,              $pretty_domains_string);
             $domain_sql_restriction);  
 }  }
   
 ######################################################################  ######################################################################
Line 1613  sub parse_basic_search { Line 1581  sub parse_basic_search {
     #      #
     # Clean up fields for safety      # Clean up fields for safety
     for my $field ('basicexp') {      for my $field ('basicexp') {
  $ENV{"form.$field"}=~s/[^\w\s\'\"\!\(\)\-]//g;   $env{"form.$field"}=~s/[^\w\s\'\"\!\(\)\-]//g;
     }      }
     foreach ('mode','form','element') {      foreach ('mode','form','element') {
  # is this required?  Hmmm.   # is this required?  Hmmm.
  next unless (exists($ENV{"form.$_"}));   next unless (exists($env{"form.$_"}));
  $ENV{"form.$_"}=&Apache::lonnet::unescape($ENV{"form.$_"});   $env{"form.$_"}=&Apache::lonnet::unescape($env{"form.$_"});
  $ENV{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;   $env{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
     }      }
     my ($libraries_to_query,$pretty_domains_string,$domain_sql_restriction) =       my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();
         &parse_domain_restrictions();  
     #      #
     # Check to see if enough of a query is filled in      # Check to see if enough of a query is filled in
     my $search_string = $ENV{'form.basicexp'};      my $search_string = $env{'form.basicexp'};
     if (! &filled($search_string)) {      if (! &filled($search_string)) {
  &output_blank_field_error($r,$closebutton,'phase=disp_basic');   &output_blank_field_error($r,$closebutton,'phase=disp_basic');
  return OK;   return OK;
Line 1637  sub parse_basic_search { Line 1604  sub parse_basic_search {
                                              'notes','abstract','keywords')                                               'notes','abstract','keywords')
                                             ).')';                                              ).')';
     my ($error,$SQLQuery) = &process_phrase_input($search_string,      my ($error,$SQLQuery) = &process_phrase_input($search_string,
                                                     $ENV{'form.related'},                                                      $env{'form.related'},
                                                     $searchfield);                                                      $searchfield);
     if ($error) {      if ($error) {
         &output_unparsed_phrase_error($r,$closebutton,'phase=disp_basic',          &output_unparsed_phrase_error($r,$closebutton,'phase=disp_basic',
Line 1645  sub parse_basic_search { Line 1612  sub parse_basic_search {
         return;          return;
     }      }
     push(@Queries,$SQLQuery);      push(@Queries,$SQLQuery);
     push(@Queries,$domain_sql_restriction);  
     #foreach my $q (@Queries) {      #foreach my $q (@Queries) {
     #    &Apache::lonnet::logthis('    '.$q);      #    &Apache::lonnet::logthis('    '.$q);
     #}      #}
Line 1656  sub parse_basic_search { Line 1622  sub parse_basic_search {
     }      }
     $pretty_search_string .= "<br />\n";      $pretty_search_string .= "<br />\n";
     $pretty_search_string =~ s:^<br /> and ::;      $pretty_search_string =~ s:^<br /> and ::;
     &Apache::lonnet::logthis('simple search final query = '.$/.$final_query);      #&Apache::lonnet::logthis('simple search final query = '.$/.$final_query);
     return ($final_query,$pretty_search_string,      return ($final_query,$pretty_search_string,
             $libraries_to_query);              $libraries_to_query);
 }  }
Line 2010  sub copyright_check { Line 1976  sub copyright_check {
                                               $Metadata->{'url'});                                                $Metadata->{'url'});
     # Check for priv      # Check for priv
     if (($Metadata->{'copyright'} eq 'priv') &&       if (($Metadata->{'copyright'} eq 'priv') && 
         (($ENV{'user.name'} ne $resname) &&          (($env{'user.name'} ne $resname) &&
          ($ENV{'user.domain'} ne $resdom))) {           ($env{'user.domain'} ne $resdom))) {
         return 0;          return 0;
     }      }
     # Check for domain      # Check for domain
     if (($Metadata->{'copyright'} eq 'domain') &&      if (($Metadata->{'copyright'} eq 'domain') &&
         ($ENV{'user.domain'} ne $resdom)) {          ($env{'user.domain'} ne $resdom)) {
         return 0;          return 0;
     }      }
     return 1;      return 1;
Line 2048  sub ensure_db_and_table { Line 2014  sub ensure_db_and_table {
     if (! defined($table) || $table eq '' || $table =~ /\D/ ) {      if (! defined($table) || $table eq '' || $table =~ /\D/ ) {
         $r->print("Unable to retrieve search results.  ".          $r->print("Unable to retrieve search results.  ".
                   "Unable to determine the table results were stored in.  ".                    "Unable to determine the table results were stored in.  ".
                   "</body></html>");    &Apache::loncommon::end_page());
         return undef;          return undef;
     }      }
     ##      ##
Line 2057  sub ensure_db_and_table { Line 2023  sub ensure_db_and_table {
     my $connection_result = &Apache::lonmysql::connect_to_db();      my $connection_result = &Apache::lonmysql::connect_to_db();
     if (!defined($connection_result)) {      if (!defined($connection_result)) {
         $r->print("Unable to connect to the MySQL database where your results".          $r->print("Unable to connect to the MySQL database where your results".
                   " are stored. </body></html>");                    " are stored.".
     &Apache::loncommon::end_page());
         &Apache::lonnet::logthis("lonsearchcat: unable to get lonmysql to".          &Apache::lonnet::logthis("lonsearchcat: unable to get lonmysql to".
                                  " connect to database.");                                   " connect to database.");
         &Apache::lonnet::logthis(&Apache::lonmysql::get_error());          &Apache::lonnet::logthis(&Apache::lonmysql::get_error());
Line 2065  sub ensure_db_and_table { Line 2032  sub ensure_db_and_table {
     }      }
     my $table_check = &Apache::lonmysql::check_table($table);      my $table_check = &Apache::lonmysql::check_table($table);
     if (! defined($table_check)) {      if (! defined($table_check)) {
         $r->print("A MySQL error has occurred.</form></body></html>");          $r->print("A MySQL error has occurred.</form>".
     &Apache::loncommon::end_page());
         &Apache::lonnet::logthis("lonmysql was unable to determine the status".          &Apache::lonnet::logthis("lonmysql was unable to determine the status".
                                  " of table ".$table);                                   " of table ".$table);
         return undef;          return undef;
Line 2094  a link to change the search query. Line 2062  a link to change the search query.
 ######################################################################  ######################################################################
 sub print_sort_form {  sub print_sort_form {
     my ($r,$pretty_query_string) = @_;      my ($r,$pretty_query_string) = @_;
     my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1).  
         &Apache::lonhtmlcommon::breadcrumbs  
         (undef,'Searching','Searching',undef,undef,  
          $ENV{'form.catalogmode'} ne 'groupsearch');  
   
     ##      ##
     my %SortableFields=&Apache::lonlocal::texthash(       my %SortableFields=&Apache::lonlocal::texthash( 
Line 2116  sub print_sort_form { Line 2080  sub print_sort_form {
          lastrevisiondate => 'Revision Date'           lastrevisiondate => 'Revision Date'
      );       );
     ##      ##
     my $table = $ENV{'form.table'};      my $table = $env{'form.table'};
     return if (! &ensure_db_and_table($r,$table));      return if (! &ensure_db_and_table($r,$table));
     ##      ##
     ## Get the number of results       ## Get the number of results 
     ##      ##
     my $total_results = &Apache::lonmysql::number_of_rows($table);      my $total_results = &Apache::lonmysql::number_of_rows($table);
     if (! defined($total_results)) {      if (! defined($total_results)) {
         $r->print("A MySQL error has occurred.</form></body></html>");          $r->print("A MySQL error has occurred.</form>".
     &Apache::loncommon::end_page());
         &Apache::lonnet::logthis("lonmysql was unable to determine the number".          &Apache::lonnet::logthis("lonmysql was unable to determine the number".
                                  " of rows in table ".$table);                                   " of rows in table ".$table);
         &Apache::lonnet::logthis(&Apache::lonmysql::get_error());          &Apache::lonnet::logthis(&Apache::lonmysql::get_error());
         return;          return;
     }      }
     my $result;      my $js =<<END;
     my $html=&Apache::lonxml::xmlbegin();  <script type="text/javascript">
     $result.=<<END;  
 $html  
 <head>  
 <script>  
     function change_sort() {      function change_sort() {
         var newloc = "/adm/searchcat?phase=results";          var newloc = "/adm/searchcat?phase=results";
         newloc += "&persistent_db_id=$ENV{'form.persistent_db_id'}";          newloc += "&persistent_db_id=$env{'form.persistent_db_id'}";
         newloc += "&sortby=";          newloc += "&sortby=";
         newloc += document.forms.statusform.elements.sortby.value;          newloc += document.forms.statusform.elements.sortby.value;
         parent.resultsframe.location= newloc;          parent.resultsframe.location= newloc;
     }      }
 </script>  </script>
 <title>Results</title>  END
 </head>  
 $bodytag      my $start_page = &Apache::loncommon::start_page('Results',$js,
 <form name="statusform" action="" method="post">      {'only_body' => 1});
       my $breadcrumbs=
           &Apache::lonhtmlcommon::breadcrumbs
           (undef,'Searching','Searching',undef,undef,
            $env{'form.catalogmode'} ne 'groupsearch');
   
       my $result = <<END;
   $start_page
   $breadcrumbs
   <form name="statusform" action="" method="POST">
 <input type="hidden" name="Queue" value="" />  <input type="hidden" name="Queue" value="" />
 END  END
   
 #<h2>Sort Results</h2>  #<h2>Sort Results</h2>
 #Sort by: <select size="1" name="sortby" onchange="javascript:change_sort();">  #Sort by: <select size="1" name="sortby" onchange="javascript:change_sort();">
 #    $ENV{'form.sortby'} = 'id' if (! defined($ENV{'form.sortby'}));  #    $env{'form.sortby'} = 'id' if (! defined($env{'form.sortby'}));
 #    foreach (keys(%SortableFields)) {  #    foreach (keys(%SortableFields)) {
 #        $result.="<option name=\"$_\"";  #        $result.="<option name=\"$_\"";
 #        if ($_ eq $ENV{'form.sortby'}) {  #        if ($_ eq $env{'form.sortby'}) {
 #            $result.=" selected ";  #            $result.=" selected ";
 #        }  #        }
 #        $result.=" >$SortableFields{$_}</option>\n";  #        $result.=" >$SortableFields{$_}</option>\n";
Line 2169  There are $total_results matches to your Line 2139  There are $total_results matches to your
 Search:$pretty_query_string  Search:$pretty_query_string
 </p>  </p>
 </form>  </form>
 </body>  
 </html>  
 END  END
     $r->print($result);      $r->print($result.&Apache::loncommon::end_page());
     return;      return;
 }  }
   
Line 2206  my @Fullindicies; Line 2174  my @Fullindicies;
 =item &create_results_table()  =item &create_results_table()
   
 Creates the table of search results by calling lonmysql.  Stores the  Creates the table of search results by calling lonmysql.  Stores the
 table id in $ENV{'form.table'}  table id in $env{'form.table'}
   
 Inputs: none.  Inputs: none.
   
Line 2237  sub create_results_table { Line 2205  sub create_results_table {
             FULLTEXT => [{'columns' => \@Fullindicies},],              FULLTEXT => [{'columns' => \@Fullindicies},],
         } );          } );
     if (defined($table)) {      if (defined($table)) {
         $ENV{'form.table'} = $table;          $env{'form.table'} = $table;
         return $table;          return $table;
     }       } 
     return undef; # Error...      return undef; # Error...
Line 2289  sub update_status { Line 2257  sub update_status {
 }  }
   
 {  {
     my $max_time  = 40;  # seconds for the search to complete      my $max_time  = 300;  # seconds for the search to complete
     my $start_time = 0;      my $start_time = 0;
     my $last_time = 0;      my $last_time = 0;
   
Line 2338  Returns: html string for a 'revise searc Line 2306  Returns: html string for a 'revise searc
 ######################################################################  ######################################################################
 sub revise_button {  sub revise_button {
     my $revise_phase = 'disp_basic';      my $revise_phase = 'disp_basic';
     $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'.              '&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"} .
Line 2364  results into MySQL. Line 2332  results into MySQL.
 ######################################################################  ######################################################################
 sub run_search {  sub run_search {
     my ($r,$query,$customquery,$customshow,$serverlist,$pretty_string) = @_;      my ($r,$query,$customquery,$customshow,$serverlist,$pretty_string) = @_;
     my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1);  
     $bodytag.=&Apache::lonhtmlcommon::breadcrumbs  
         (undef,'Searching','Searching',undef,undef,  
          $ENV{'form.catalogmode'} ne 'groupsearch');  
     my $connection = $r->connection;      my $connection = $r->connection;
     #      #
     # Print run_search header      # Print run_search header
     #      #
     my $html=&Apache::lonxml::xmlbegin();      my $start_page = &Apache::loncommon::start_page('Search Status',undef,
       {'only_body' => 1});
       my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs
           (undef,'Searching','Searching',undef,undef,
            $env{'form.catalogmode'} ne 'groupsearch');
     $r->print(<<END);      $r->print(<<END);
 $html  $start_page
 <head>  $breadcrumbs
 <title>Search Status</title></head>  
 $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 2409  END Line 2376  END
     my %Server_status;      my %Server_status;
     #      #
     # Check on the mysql table we will use to store results.      # Check on the mysql table we will use to store results.
     my $table =$ENV{'form.table'};      my $table =$env{'form.table'};
     if (! defined($table) || $table eq '' || $table =~ /\D/ ) {      if (! defined($table) || $table eq '' || $table =~ /\D/ ) {
         $r->print("Unable to determine table id to store search results in.".          $r->print("Unable to determine table id to store search results in.".
                   "The search has been aborted.</body></html>");                    "The search has been aborted.".
     &Apache::loncommon::end_page());
         return;          return;
     }      }
     my $table_status = &Apache::lonmysql::check_table($table);      my $table_status = &Apache::lonmysql::check_table($table);
     if (! defined($table_status)) {      if (! defined($table_status)) {
         $r->print("Unable to determine status of table.</body></html>");          $r->print("Unable to determine status of table.".
     &Apache::loncommon::end_page());
         &Apache::lonnet::logthis("Bogus table id of $table for ".          &Apache::lonnet::logthis("Bogus table id of $table for ".
                                  "$ENV{'user.name'} @ $ENV{'user.domain'}");                                   "$env{'user.name'} @ $env{'user.domain'}");
         &Apache::lonnet::logthis("lonmysql error = ".          &Apache::lonnet::logthis("lonmysql error = ".
                                  &Apache::lonmysql::get_error());                                   &Apache::lonmysql::get_error());
         return;          return;
Line 2431  END Line 2400  END
                                  &Apache::lonmysql::get_debug());                                   &Apache::lonmysql::get_debug());
         &Apache::lonnet::logthis('table status = "'.$table_status.'"');          &Apache::lonnet::logthis('table status = "'.$table_status.'"');
         $r->print("The table id,$table, we tried to use is invalid.".          $r->print("The table id,$table, we tried to use is invalid.".
                   "The search has been aborted.</body></html>");                    "The search has been aborted.".
     &Apache::loncommon::end_page());
         return;          return;
     }      }
     ##      ##
Line 2444  END Line 2414  END
 <table>  <table>
 <tr><th>Status</th><th>Total Matches</th><th>Time Remaining</th><th></th></tr>  <tr><th>Status</th><th>Total Matches</th><th>Time Remaining</th><th></th></tr>
 <tr>  <tr>
 <td><input type="text" name="status"  value="" size="30" /></td>  <td><input type="text" name="status"  value="" size="50" /></td>
 <td><input type="text" name="count"   value="" size="10" /></td>  <td><input type="text" name="count"   value="" size="10" /></td>
 <td><input type="text" name="seconds" value="" size="8" /></td>  <td><input type="text" name="seconds" value="" size="8" /></td>
 <td>$revise</td>  <td>$revise</td>
Line 2491  END Line 2461  END
                 delete ($Server_status{$server});                  delete ($Server_status{$server});
                 next;                  next;
             }              }
             $status=~/^([\.\w]+)$/;               $status=~s|/||g; 
            my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$1;             my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$status;
             if (-e $datafile && ! -e "$datafile.end") {              if (-e $datafile && ! -e "$datafile.end") {
                 &update_status($r,&mt('Receiving results from [_1]',$server));                  &update_status($r,&mt('Receiving results from [_1]',$server));
                 next;                  next;
Line 2523  END Line 2493  END
                     my %Fields = &parse_raw_result($result,$server);                      my %Fields = &parse_raw_result($result,$server);
                     $Fields{'hostname'} = $server;                      $Fields{'hostname'} = $server;
                     #                      #
                       # Skip if external and we did not want that
                       next if ((! $env{'form.inclext'}) && ($Fields{'url'}=~/^\/ext\//));
                     # Skip based on copyright                      # Skip based on copyright
                     next if (! &copyright_check(\%Fields));                      next if (! &copyright_check(\%Fields));
   
                     #                      #
                     # Store the result in the mysql database                      # Store the result in the mysql database
                     my $result = &Apache::lonmysql::store_row($table,\%Fields);                      my $result = &Apache::lonmysql::store_row($table,\%Fields);
Line 2557  END Line 2530  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, so let the client know the top frame needs to be      # results to get, so let the client know the top frame needs to be
     # loaded from /adm/searchcat      # loaded from /adm/searchcat
     $r->print("</body></html>");      $r->print(&Apache::loncommon::end_page());
 #    if ($ENV{'form.catalogmode'} ne 'groupsearch') {  #    if ($env{'form.catalogmode'} ne 'groupsearch') {
         $r->print("<script>".          $r->print("<script>".
                       "window.location='/adm/searchcat?".                        "window.location='/adm/searchcat?".
                       "phase=sort&".                        "phase=sort&".
                       "persistent_db_id=$ENV{'form.persistent_db_id'}';".                        "persistent_db_id=$env{'form.persistent_db_id'}';".
                   "</script>");                    "</script>");
 #    }  #    }
     return;      return;
Line 2617  sub display_results { Line 2590  sub display_results {
     ##      ##
     ## Set viewing function      ## Set viewing function
     ##      ##
     my $viewfunction = $Views{$ENV{'form.viewselect'}};      my $viewfunction = $Views{$env{'form.viewselect'}};
     if (!defined($viewfunction)) {      if (!defined($viewfunction)) {
         $r->print("Internal Error - Bad view selected.\n");          $r->print("Internal Error - Bad view selected.\n");
         $r->rflush();          $r->rflush();
Line 2633  sub display_results { Line 2606  sub display_results {
     my $action = "/adm/searchcat?phase=results";      my $action = "/adm/searchcat?phase=results";
     ##      ##
     ## Deal with groupsearch by opening the groupsearch db file.      ## Deal with groupsearch by opening the groupsearch db file.
     if ($ENV{'form.catalogmode'} eq 'groupsearch') {      if ($env{'form.catalogmode'} eq 'groupsearch') {
         if (! tie(%groupsearch_db,'GDBM_File',$diropendb,          if (! tie(%groupsearch_db,'GDBM_File',$diropendb,
                   &GDBM_WRCREAT(),0640)) {                    &GDBM_WRCREAT(),0640)) {
             $r->print('Unable to store import results.</form></body></html>');              $r->print('Unable to store import results.</form>'.
         &Apache::loncommon::end_page());
             $r->rflush();              $r->rflush();
             return;              return;
         }           } 
     }      }
     ##      ##
     ## Prepare the table for querying      ## Prepare the table for querying
     my $table = $ENV{'form.table'};      my $table = $env{'form.table'};
     return if (! &ensure_db_and_table($r,$table));      return if (! &ensure_db_and_table($r,$table));
     ##      ##
     ## Get the number of results       ## Get the number of results 
     my $total_results = &Apache::lonmysql::number_of_rows($table);      my $total_results = &Apache::lonmysql::number_of_rows($table);
     if (! defined($total_results)) {      if (! defined($total_results)) {
         $r->print("A MySQL error has occurred.</form></body></html>");          $r->print("A MySQL error has occurred.</form>".
     &Apache::loncommon::end_page());
         &Apache::lonnet::logthis("lonmysql was unable to determine the number".          &Apache::lonnet::logthis("lonmysql was unable to determine the number".
                                  " of rows in table ".$table);                                   " of rows in table ".$table);
         &Apache::lonnet::logthis(&Apache::lonmysql::get_error());          &Apache::lonnet::logthis(&Apache::lonmysql::get_error());
Line 2657  sub display_results { Line 2632  sub display_results {
     }      }
     ##      ##
     ## Determine how many results we need to get      ## Determine how many results we need to get
     $ENV{'form.start'} = 1  if (! exists($ENV{'form.start'}));      $env{'form.start'} = 1  if (! exists($env{'form.start'}));
     $ENV{'form.show'}  = 20 if (! exists($ENV{'form.show'}));      $env{'form.show'}  = 20 if (! exists($env{'form.show'}));
     if (exists($ENV{'form.prev'})) {      if (exists($env{'form.prev'})) {
         $ENV{'form.start'} -= $ENV{'form.show'};          $env{'form.start'} -= $env{'form.show'};
     } elsif (exists($ENV{'form.next'})) {      } elsif (exists($env{'form.next'})) {
         $ENV{'form.start'} += $ENV{'form.show'};          $env{'form.start'} += $env{'form.show'};
     }      }
     $ENV{'form.start'} = 1 if ($ENV{'form.start'}<1);      $env{'form.start'} = 1 if ($env{'form.start'}<1);
     $ENV{'form.start'} = $total_results if ($ENV{'form.start'}>$total_results);      $env{'form.start'} = $total_results if ($env{'form.start'}>$total_results);
     my $min = $ENV{'form.start'};      my $min = $env{'form.start'};
     my $max;      my $max;
     if ($ENV{'form.show'} eq 'all') {      if ($env{'form.show'} eq 'all') {
         $max = $total_results ;          $max = $total_results ;
     } else {      } else {
         $max = $min + $ENV{'form.show'} - 1;          $max = $min + $env{'form.show'} - 1;
         $max = $total_results if ($max > $total_results);          $max = $total_results if ($max > $total_results);
     }      }
     ##      ##
Line 2683  sub display_results { Line 2658  sub display_results {
               );                );
     #      #
     # Build sorting selector      # Build sorting selector
     my @field_order =  ('default',      my @fields = 
                         'title',          (
                         'author',           {key=>'default' },
                         'subject',           {key=>'title' },
                         'url',           {key =>'author' },
                         'keywords',           {key =>'subject'},
                         'version',           {key =>'url',desc=>'URL'},
                         'language',           {key =>'keywords'},
                         'creationdate'=>,           {key =>'language'},
                         'lastrevisiondate',           {key =>'creationdate'},
                         'owner',           {key =>'lastrevisiondate'},
                         'copyright',           {key =>'owner'},
                         'authorspace',           {key =>'copyright'},
                         'lowestgradeleve',           {key =>'authorspace'},
                         'highestgradelevel',           {key =>'lowestgradelevel'},
                         'standards',           {key =>'highestgradelevel'},
                         'count',           {key =>'standards',desc=>'Standards'},
                         'stdno',           {key =>'count',desc=>'Number of accesses'},
                         'avetries',           {key =>'stdno',desc=>'Students Attempting'},
                         'difficulty',           {key =>'avetries',desc=>'Average Number of Tries'},
                         'disc',           {key =>'difficulty',desc=>'Mean Degree of Difficulty'},
                         'clear',           {key =>'disc',desc=>'Mean Degree of Discrimination'},
                         'technical',           {key =>'clear',desc=>'Evaluation: Clear'},
                         'correct',           {key =>'technical',desc=>'Evaluation: Technically Correct'},
                         'helpful',           {key =>'correct',desc=>'Evaluation: Material is Correct'},
                         'depth',           {key =>'helpful',desc=>'Evaluation: Material is Helpful'},
                         );                                                         {key =>'depth',desc=>'Evaluation: Material has Depth'},
     my %sort_fields = ('default'     => 'Default',           );
                        'title'       => 'Title',      my %fieldnames = &Apache::lonmeta::fieldnames();
                        'author'      => 'Author',      my @field_order;
                        'subject'     => 'Subject',      foreach my $field_data (@fields) {
                        'url'         => 'URL',          push(@field_order,$field_data->{'key'});
                        'keywords'    => 'Keywords',          if (! exists($field_data->{'desc'})) {
                        'version'     => 'Version',              $field_data->{'desc'}=$fieldnames{$field_data->{'key'}};
                        'language'    => 'Language',          } else {
                        'creationdate'=> 'Creation Date',              if (! defined($field_data->{'desc'})) {
                        'lastrevisiondate' => 'Last Revision Date',                  $field_data->{'desc'} = ucfirst($field_data->{'key'});
                        'owner'       => 'Owner',              }
                        'copyright'   => 'Copyright',              $field_data->{'desc'} = &mt($field_data->{'desc'});
                        'authorspace' => 'Authorspace',          }
                        'lowestgradeleve' => 'Lowest Grade Level',      }
                        'highestgradelevel' => 'Highest Grade Level',      my %sort_fields = map {$_->{'key'},$_->{'desc'}} @fields;
                        'standards'   => 'Standards',      $sort_fields{'select_form_order'} = \@field_order;
                        'count'       => 'Number of Accesses',      $env{'form.sortorder'} = 'desc' if (! exists($env{'form.sortorder'}));
                        'stdno'       => 'Students Attempting',      $env{'form.sortfield'} = 'count' if (! exists($env{'form.sortfield'}));
                        'avetries'    => 'Average Number of Tries',      if (! exists($env{'form.sortorder'})) {
                        'difficulty'  => 'Mean Degree of Difficulty',   if ($env{'form.sortfield'}=~/^(count|stdno|disc|clear|technical|correct|helpful)$/) {
                        'disc'        => 'Mean Degree of Discrimination',      $env{'form.sortorder'}='desc';
                        'clear'       => 'Evaluation: Clear',   } else {
                        'technical'   => 'Evaluation: Technically Correct',      $env{'form.sortorder'}='asc';
                        'correct'     => 'Evaluation: Material is Correct',   }
                        'helpful'     => 'Evaluation: Material is Helpful',      }
                        'depth'       => 'Evaluation: Material has Depth',      my $sortform = &mt('Sort by [_1] [_2]',
                        'select_form_order' => \@field_order,                         &Apache::loncommon::select_form($env{'form.sortfield'},
                        );  
   
     my $sortform = &mt('Sort by [_1]',  
                        &Apache::loncommon::select_form($ENV{'form.sortfield'},  
                                                       'sortfield',                                                        'sortfield',
                                                       %sort_fields));                                                        %sort_fields),
                          &Apache::loncommon::select_form($env{'form.sortorder'},
                                                         'sortorder',
                                                         (asc =>&mt('Ascending'),
                                                          desc=>&mt('Descending')
                                                          ))
                          );
     ##      ##
     ## Output links (if necessary) for 'prev' and 'next' pages.      ## Output links (if necessary) for 'prev' and 'next' pages.
     $r->print      $r->print
         ('<table width="100%"><tr><td width="25%" align="right">'.          ('<table width="100%"><tr><td width="25%" align="right">'.
          $sortform.           '<nobr>'.$sortform.'</nobr>'.
          '</td><td width="25%" align="right">'.           '</td><td width="25%" align="right">'.
          &prev_next_buttons($min,$ENV{'form.show'},$total_results).           &prev_next_buttons($min,$env{'form.show'},$total_results).
          '</td><td align="right">'.           '</td><td align="right">'.
          &viewoptions().'</td></tr></table>'           &viewoptions().'</td></tr></table>'
          );           );
     if ($total_results == 0) {      if ($total_results == 0) {
         $r->print('<meta HTTP-EQUIV="Refresh" CONTENT="2">'.          $r->print('<meta HTTP-EQUIV="Refresh" CONTENT="2" />'.
                   '<h3>'.&mt('There are currently no results').'.</h3>'.                    '<h3>'.&mt('There are currently no results').'.</h3>'.
                   "</form></body></html>");                    "</form>".
     &Apache::loncommon::end_page());
         return;          return;
     } else {      } else {
         $r->print('<center>'.          $r->print('<center>'.
Line 2767  sub display_results { Line 2745  sub display_results {
     ##      ##
     ## Get results from MySQL table      ## Get results from MySQL table
     my $sort_command  = 'id>='.$min.' AND id<='.$max;      my $sort_command  = 'id>='.$min.' AND id<='.$max;
     if ($ENV{'form.sortfield'} ne 'default' &&       my $order;
         exists($sort_fields{$ENV{'form.sortfield'}})) {      if (exists($env{'form.sortorder'})) {
         $sort_command = $ENV{'form.sortfield'}.' IS NOT NULL '.          if ($env{'form.sortorder'} eq 'asc') {
             'ORDER BY '.$ENV{'form.sortfield'}.              $order = 'ASC';
             '  LIMIT '.($min-1).','.($max-$min);          } elsif ($env{'form.sortorder'} eq 'desc') {
               $order = 'DESC';
           } else {
               $order = '';
           }
       } else {
           $order = '';
       }
       if ($env{'form.sortfield'} ne 'default' && 
           exists($sort_fields{$env{'form.sortfield'}})) {
           $sort_command = $env{'form.sortfield'}.' IS NOT NULL '.
               'ORDER BY '.$env{'form.sortfield'}.' '.$order.
               '  LIMIT '.($min-1).','.($max-$min+1);
     }      }
     my @Results = &Apache::lonmysql::get_rows($table,$sort_command);      my @Results = &Apache::lonmysql::get_rows($table,$sort_command);
     ##      ##
Line 2799  sub display_results { Line 2789  sub display_results {
     } else {      } else {
         $r->print          $r->print
             ('<center>'.              ('<center>'.
              &prev_next_buttons($min,$ENV{'form.show'},$total_results,               &prev_next_buttons($min,$env{'form.show'},$total_results,
                                 "table=".$ENV{'form.table'}.                                  "table=".$env{'form.table'}.
                                 "&phase=results".                                  "&phase=results".
                                 "&persistent_db_id=".                                  "&persistent_db_id=".
                                 $ENV{'form.persistent_db_id'})                                  $env{'form.persistent_db_id'})
              ."</center>\n"               ."</center>\n"
              );               );
     }      }
     $r->print("</form></body></html>");      $r->print("</form>".&Apache::loncommon::end_page());
     $r->rflush();      $r->rflush();
     untie %groupsearch_db if (tied(%groupsearch_db));      untie %groupsearch_db if (tied(%groupsearch_db));
     return;      return;
Line 2821  sub display_results { Line 2811  sub display_results {
 =item &catalogmode_output($title,$url,$fnum,$checkbox_num)  =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.  $env{'form.catalogmode'}.  Stores data in %groupsearch_db.
   
 =cut  =cut
   
Line 2830  $ENV{'form.catalogmode'}.  Stores data i Line 2820  $ENV{'form.catalogmode'}.  Stores data i
 sub catalogmode_output {  sub catalogmode_output {
     my $output = '';      my $output = '';
     my ($title,$url,$fnum,$checkbox_num) = @_;      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') {
             $output.=<<END               $output.=<<END 
 <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>
 END  END
         }          }
     } elsif ($ENV{'form.catalogmode'} eq 'groupsearch') {      } elsif ($env{'form.catalogmode'} eq 'groupsearch') {
         $groupsearch_db{"pre_${fnum}_link"}=$url;          $groupsearch_db{"pre_${fnum}_link"}=$url;
         $groupsearch_db{"pre_${fnum}_title"}=$title;          $groupsearch_db{"pre_${fnum}_title"}=$title;
         $output.=<<END;          $output.=<<END;
Line 2929  sub handle_custom_fields { Line 2919  sub handle_custom_fields {
     my $customshow='';      my $customshow='';
     my $extrashow='';      my $extrashow='';
     my @customfields;      my @customfields;
     if ($ENV{'form.customshow'}) {      if ($env{'form.customshow'}) {
         $customshow=$ENV{'form.customshow'};          $customshow=$env{'form.customshow'};
         $customshow=~s/[^\w\s]//g;          $customshow=~s/[^\w\s]//g;
         my @fields=map {          my @fields=map {
             "<font color=\"#008000\">$_:</font><!-- $_ -->";              "<font color=\"#008000\">$_:</font><!-- $_ -->";
Line 2964  sub handle_custom_fields { Line 2954  sub handle_custom_fields {
 Output the proper html headers and javascript code to deal with different   Output the proper html headers and javascript code to deal with different 
 calling modes.  calling modes.
   
 Takes most inputs directly from %ENV, except $mode.    Takes most inputs directly from %env, except $mode.  
   
 =over 4  =over 4
   
Line 3004  the name of the input field to put the t Line 2994  the name of the input field to put the t
 ######################################################################  ######################################################################
 sub search_results_header {  sub search_results_header {
     my ($importbutton,$closebutton) = @_;      my ($importbutton,$closebutton) = @_;
     my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1);  
     my $result = '';      my $js;
     # output beginning of search page      # output beginning of search page
     # conditional output of script functions dependent on the mode in      # conditional output of script functions dependent on the mode in
     # which the search was invoked      # which the search was invoked
     if ($ENV{'form.catalogmode'} eq 'interactive'){      if ($env{'form.catalogmode'} eq 'interactive'){
  if (! exists($ENV{'form.mode'}) || $ENV{'form.mode'} ne 'edit') {   if (! exists($env{'form.mode'}) || $env{'form.mode'} ne 'edit') {
             $result.=<<SCRIPT;              $js.=<<SCRIPT;
 <script type="text/javascript">  <script type="text/javascript">
     function select_data(title,url) {      function select_data(title,url) {
  changeTitle(title);   changeTitle(title);
Line 3030  sub search_results_header { Line 3020  sub search_results_header {
     }      }
 </script>  </script>
 SCRIPT  SCRIPT
         } elsif ($ENV{'form.mode'} eq 'edit') {          } elsif ($env{'form.mode'} eq 'edit') {
             my $form = $ENV{'form.form'};              my $form = $env{'form.form'};
             my $element = $ENV{'form.element'};              my $element = $env{'form.element'};
             my $titleelement = $ENV{'form.titleelement'};              my $titleelement = $env{'form.titleelement'};
     my $changetitle;      my $changetitle;
     if (!$titleelement) {      if (!$titleelement) {
  $changetitle='function changeTitle(val) {}';   $changetitle='function changeTitle(val) {}';
Line 3050  function changeTitle(val) { Line 3040  function changeTitle(val) {
 END  END
             }              }
   
             $result.=<<SCRIPT;              $js.=<<SCRIPT;
 <script type="text/javascript">  <script type="text/javascript">
 function select_data(title,url) {  function select_data(title,url) {
     changeURL(url);      changeURL(url);
Line 3070  function changeURL(val) { Line 3060  function changeURL(val) {
 SCRIPT  SCRIPT
         }          }
     }      }
     $result.=<<SCRIPT if $ENV{'form.catalogmode'} eq 'groupsearch';      $js.=<<SCRIPT if $env{'form.catalogmode'} eq 'groupsearch';
 <script type="text/javascript">  <script type="text/javascript">
     function queue(checkbox_num,val) {      function queue(checkbox_num,val) {
         if (document.forms.results.returnvalues.length != "undefined" &&          if (document.forms.results.returnvalues.length != "undefined" &&
Line 3090  SCRIPT Line 3080  SCRIPT
     }      }
     function select_group() {      function select_group() {
  parent.window.location=   parent.window.location=
     "/adm/groupsort?mode=$ENV{'form.mode'}&catalogmode=groupsearch&acts="+      "/adm/groupsort?mode=$env{'form.mode'}&catalogmode=groupsearch&acts="+
     parent.statusframe.document.forms.statusform.elements.Queue.value;      parent.statusframe.document.forms.statusform.elements.Queue.value;
     }      }
 </script>  </script>
 SCRIPT  SCRIPT
     $result.=<<END;  
 </head>      my $start_page  = &Apache::loncommon::start_page(undef,$js,
 $bodytag       {'only_body' =>1});
       my $result=<<END;
   $start_page
 <form name="results" method="post" action="/adm/searchcat" >  <form name="results" method="post" action="/adm/searchcat" >
 <input type="hidden" name="Queue" value="" />  <input type="hidden" name="Queue" value="" />
 $importbutton  $importbutton
Line 3108  END Line 3100  END
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub search_status_header {  sub search_status_header {
     my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1);      my $start_page = &Apache::loncommon::start_page('Search Status',undef,
     my $html=&Apache::lonxml::xmlbegin();      {'only_body' => 1});
     return <<ENDSTATUS;      return <<ENDSTATUS;
 $html  $start_page
 <head>  
 <title>Search Status</title></head>  
 $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
 }  }
   
 sub results_link {  sub results_link {
     my $basic_link   = "/adm/searchcat?"."&table=".$ENV{'form.table'}.      my $basic_link   = "/adm/searchcat?"."&table=".$env{'form.table'}.
         "&persistent_db_id=".$ENV{'form.persistent_db_id'};          "&persistent_db_id=".$env{'form.persistent_db_id'};
     my $results_link = $basic_link."&phase=results".      my $results_link = $basic_link."&phase=results".
         "&pause=1"."&start=1";          "&pause=1"."&start=1";
     return $results_link;      return $results_link;
Line 3132  sub results_link { Line 3121  sub results_link {
 ######################################################################  ######################################################################
 sub print_frames_interface {  sub print_frames_interface {
     my $r = shift;      my $r = shift;
     my $basic_link = "/adm/searchcat?"."&table=".$ENV{'form.table'}.      my $basic_link = "/adm/searchcat?"."&table=".$env{'form.table'}.
         "&persistent_db_id=".$ENV{'form.persistent_db_id'};          "&persistent_db_id=".$env{'form.persistent_db_id'};
     my $run_search_link = $basic_link."&phase=run_search";      my $run_search_link = $basic_link."&phase=run_search";
     my $results_link = &results_link();      my $results_link = &results_link();
     my $html=&Apache::lonxml::xmlbegin();      my $js = <<JS;
     my $result = <<"ENDFRAMES";  <script type="text/javascript">
 $html  
 <head>  
 <script>  
 var targetwin = opener;  var targetwin = opener;
 var queue = '';  var queue = '';
 </script>  </script>
 <title>LON-CAPA Digital Library Search Results</title>  JS
 </head>  
 <frameset rows="150,*">      my $start_page =
           &Apache::loncommon::start_page('LON-CAPA Digital Library Search Results',
          $js,
          {'frameset'    => 1,
    'add_entries' => {
       'rows' => "150,*",},});
       my $end_page =
           &Apache::loncommon::end_page({'frameset' => 1});
   
       my $result = <<"ENDFRAMES";
   $start_page
     <frame name="statusframe"  src="$run_search_link">      <frame name="statusframe"  src="$run_search_link">
     <frame name="resultsframe" src="$results_link">      <frame name="resultsframe" src="$results_link">
 </frameset>  $end_page
 </html>  
 ENDFRAMES  ENDFRAMES
   
     $r->print($result);      $r->print($result);
Line 3217  extra custom metadata to show. Line 3212  extra custom metadata to show.
 sub detailed_citation_view {  sub detailed_citation_view {
     my ($prefix,%values) = @_;      my ($prefix,%values) = @_;
     my $result;      my $result;
       my $jumpurl=$values{'url'};
       $jumpurl=~s/^\/ext\//http\:\/\//;
     $result .= '<b>'.$prefix.      $result .= '<b>'.$prefix.
         '<img src="'.&Apache::loncommon::icon($values{'url'}).' " />'.'&nbsp;'.          '<img src="'.&Apache::loncommon::icon($values{'url'}).' " />'.'&nbsp;'.
         '<a href="http://'.$ENV{'HTTP_HOST'}.$values{'url'}.'" '.          '<a href="'.$jumpurl.'" '.
         'target="search_preview">'.$values{'title'}."</a></b>\n";          'target="search_preview">'.$values{'title'}."</a></b>\n";
     $result .= "<p>\n";      $result .= "<p>\n";
     $result .= '<b>'.$values{'author'}.'</b>,'.      $result .= '<b>'.$values{'author'}.'</b>,'.
Line 3288  sub detailed_citation_view { Line 3285  sub detailed_citation_view {
             foreach my $item (split(',',$values{$field->{'name'}})){              foreach my $item (split(',',$values{$field->{'name'}})){
                 $result .= '<li>'.                  $result .= '<li>'.
                     '<a target="search_preview" '.                      '<a target="search_preview" '.
                     'href="/res/'.$item.'">'.$item.'</a></li>';                      'href="'.$jumpurl.'">'.$item.'</a></li>';
             }              }
             $result .= '</ul>';              $result .= '</ul>';
         } elsif (exists($field->{'format'}) && $field->{'format'} ne ''){          } elsif (exists($field->{'format'}) && $field->{'format'} ne ''){
Line 3299  sub detailed_citation_view { Line 3296  sub detailed_citation_view {
             if ($field->{'special'} eq 'url link') {              if ($field->{'special'} eq 'url link') {
                 $result.=                   $result.= 
                      &mt($field->{'translate'},                       &mt($field->{'translate'},
                          '<a href="'.$values{'url'}.'" '.                           '<a href="'.$jumpurl.'" '.
                          'target="search_preview">'.                           'target="search_preview">'.
                          $values{$field->{'name'}}.                           $values{$field->{'name'}}.
                          '</a>');                           '</a>');
Line 3321  sub detailed_citation_view { Line 3318  sub detailed_citation_view {
     return $result;      return $result;
 }  }
   
   sub detailed_citation_preview {
       my ($prefix,%values)=@_;
       return '<table><tr><td>'.
              &detailed_citation_view($prefix,%values).
              '</td><td>'.
              &Apache::lonindexer::showpreview($values{'url'}).
              '</td></tr></table><hr />';
   }
   
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
Line 3334  sub detailed_citation_view { Line 3341  sub detailed_citation_view {
 sub summary_view {  sub summary_view {
     my ($prefix,%values) = @_;      my ($prefix,%values) = @_;
     my $icon=&Apache::loncommon::icon($values{'url'});      my $icon=&Apache::loncommon::icon($values{'url'});
     my $result=<<END;      my $result=qq{$prefix<img src="$icon" />};
 $prefix<img src="$icon" />&nbsp;      if (exists($env{'form.sortfield'}) && 
 <a href="http://$ENV{'HTTP_HOST'}$values{'url'}"           $env{'form.sortfield'} !~ /^(default|
    target='search_preview'>$values{'author'}</a><br />                                       author|
 $values{'title'}<br />                                       url|
 $values{'owner'} -- $values{'lastrevisiondate'}<br />                                       title|
                                        owner|
                                        lastrevisiondate|
                                        copyright)$/x) {
           my $tmp = $values{$env{'form.sortfield'}};
           if (! defined($tmp)) { $tmp = 'undefined'; }
           $result .= '&nbsp;'.$tmp.'&nbsp;';
       }
       my $jumpurl=$values{'url'};
       $jumpurl=~s/^\/ext\//http\:\/\//;
   
       $result.=<<END;
   <a href="$jumpurl" 
      target='search_preview'>$values{'title'}</a><br />
   $values{'author'}, $values{'owner'} -- $values{'lastrevisiondate'}<br />
 $values{'copyrighttag'}<br />  $values{'copyrighttag'}<br />
 $values{'extrashow'}  $values{'extrashow'}
 </p>  </p>
Line 3348  END Line 3369  END
     return $result;      return $result;
 }  }
   
   sub summary_preview {
       my ($prefix,%values)=@_;
       return '<table><tr><td>'.
              &summary_view($prefix,%values).
              '</td><td>'.
              &Apache::lonindexer::showpreview($values{'url'}).
              '</td></tr></table><hr />';
   }
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
Line 3361  END Line 3391  END
 ######################################################################  ######################################################################
 sub compact_view {  sub compact_view {
     my ($prefix,%values) = @_;      my ($prefix,%values) = @_;
       my $jumpurl=$values{'url'};
       $jumpurl=~s/^\/ext\//http\:\/\//;
   
     my $result =       my $result = 
         $prefix.'<img src="'.&Apache::loncommon::icon($values{'url'}).          $prefix.'<img src="'.&Apache::loncommon::icon($values{'url'}).'">';
         '">&nbsp;<a href="'.$values{'url'}.'" target="search_preview">'.      if (exists($env{'form.sortfield'}) && 
           $env{'form.sortfield'} !~ /^(default|author|url|title)$/) {
           my $tmp = $values{$env{'form.sortfield'}};
           if (! defined($tmp)) { $tmp = 'undefined'; }
           $result .= '&nbsp;'.$tmp.'&nbsp;';
       }
       $result.='&nbsp;<a href="'.$jumpurl.'" target="search_preview">'.
         $values{'title'}.'</a>'.('&nbsp;'x2).          $values{'title'}.'</a>'.('&nbsp;'x2).
         '<b>'.$values{'author'}.'</b><br />';          '<b>'.$values{'author'}.'</b> ('.$values{'domain'}.')<br />';
     return $result;      return $result;
 }  }
   
Line 3385  sub fielded_format_view { Line 3424  sub fielded_format_view {
     my ($prefix,%values) = @_;      my ($prefix,%values) = @_;
     my $icon=&Apache::loncommon::icon($values{'url'});      my $icon=&Apache::loncommon::icon($values{'url'});
     my %Translated = &Apache::lonmeta::fieldnames();      my %Translated = &Apache::lonmeta::fieldnames();
       my $jumpurl=$values{'url'};
       $jumpurl=~s/^\/ext\//http\:\/\//;
   
     my $result=<<END;      my $result=<<END;
 $prefix <img src="$icon" />  $prefix <img src="$icon" />
 <dl>  <dl>
 <dt>URL:</dt>  <dt>URL:</dt>
     <dd><a href="http://$ENV{'HTTP_HOST'}$values{'url'}"       <dd><a href="$jumpurl" 
          target='search_preview'>$values{'url'}</a></dd>           target='search_preview'>$values{'url'}</a></dd>
 END  END
     foreach my $field ('title','author','domain','subject','keywords','notes',      foreach my $field ('title','author','domain','subject','keywords','notes',
Line 3526  sub output_unparsed_phrase_error { Line 3568  sub output_unparsed_phrase_error {
     my ($r,$closebutton,$parms,$hidden_fields,$field)=@_;      my ($r,$closebutton,$parms,$hidden_fields,$field)=@_;
     my $errorstring;      my $errorstring;
     if ($field eq 'basicexp') {      if ($field eq 'basicexp') {
         $errorstring = &mt('Unable to understand the search phrase <i>[_1]</i>.  Please modify your search.',$ENV{'form.basicexp'});          $errorstring = &mt('Unable to understand the search phrase <i>[_1]</i>.  Please modify your search.',$env{'form.basicexp'});
     } else {      } else {
         $errorstring = &mt('Unable to understand the search phrase <b>[_1]</b>:<i>[_2]</i>.',$field,$ENV{'form.'.$field});          $errorstring = &mt('Unable to understand the search phrase <b>[_1]</b>:<i>[_2]</i>.',$field,$env{'form.'.$field});
     }      }
     my $bodytag = &Apache::loncommon::bodytag('Search');  
     my $heading = &mt('Unparsed Field');      my $heading = &mt('Unparsed Field');
     my $revise  = &mt('Revise search request');      my $revise  = &mt('Revise search request');
     # make query information persistent to allow for subsequent revision      # make query information persistent to allow for subsequent revision
     my $html=&Apache::lonxml::xmlbegin();      my $start_page = &Apache::loncommon::start_page('Search');
       my $end_page   = &Apache::loncommon::end_page();
     $r->print(<<ENDPAGE);      $r->print(<<ENDPAGE);
 $html  $start_page
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 </head>  
 $bodytag  
 <form method="post" action="/adm/searchcat">  <form method="post" action="/adm/searchcat">
 $hidden_fields  $hidden_fields
 $closebutton  $closebutton
Line 3550  $closebutton Line 3588  $closebutton
 $errorstring  $errorstring
 </p>  </p>
 <p>  <p>
 <a href="/adm/searchcat?$parms&persistent_db_id=$ENV{'form.persistent_db_id'}">$revise</a>  <a href="/adm/searchcat?$parms&persistent_db_id=$env{'form.persistent_db_id'}">$revise</a>
 </p>  </p>
 </body>  $end_page
 </html>  
 ENDPAGE  ENDPAGE
 }  }
   
Line 3579  $parms is extra information to include i Line 3616  $parms is extra information to include i
 ######################################################################  ######################################################################
 sub output_blank_field_error {  sub output_blank_field_error {
     my ($r,$closebutton,$parms,$hidden_fields)=@_;      my ($r,$closebutton,$parms,$hidden_fields)=@_;
     my $bodytag=&Apache::loncommon::bodytag('Search');  
     my $errormsg = &mt('You did not fill in enough information for the search to be started.  You need to fill in relevant fields on the search page in order for a query to be processed.');      my $errormsg = &mt('You did not fill in enough information for the search to be started.  You need to fill in relevant fields on the search page in order for a query to be processed.');
     my $revise = &mt('Revise Search Request');      my $revise = &mt('Revise Search Request');
     my $heading = &mt('Unactionable Search Queary');      my $heading = &mt('Unactionable Search Queary');
     my $html=&Apache::lonxml::xmlbegin();      my $start_page = &Apache::loncommon::start_page('Search');
       my $end_page   = &Apache::loncommon::end_page();
     $r->print(<<ENDPAGE);      $r->print(<<ENDPAGE);
 $html  $start_page
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 </head>  
 $bodytag  
 <form method="post" action="/adm/searchcat">  <form method="post" action="/adm/searchcat">
 $hidden_fields  $hidden_fields
 $closebutton  $closebutton
Line 3599  $closebutton Line 3632  $closebutton
 $errormsg  $errormsg
 </p>  </p>
 <p>  <p>
 <a href="/adm/searchcat?$parms&persistent_db_id=$ENV{'form.persistent_db_id'}">$revise</a>&nbsp;  <a href="/adm/searchcat?$parms&persistent_db_id=$env{'form.persistent_db_id'}">$revise</a>&nbsp;
 </p>  </p>
 </body>  $end_page
 </html>  
 ENDPAGE  ENDPAGE
     return;      return;
 }  }
Line 3629  Inputs: Line 3661  Inputs:
 sub output_date_error {  sub output_date_error {
     my ($r,$message,$closebutton,$hidden_fields)=@_;      my ($r,$message,$closebutton,$hidden_fields)=@_;
     # make query information persistent to allow for subsequent revision      # make query information persistent to allow for subsequent revision
     my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1);      my $start_page = &Apache::loncommon::start_page('Search');
     my $html=&Apache::lonxml::xmlbegin();      my $end_page   = &Apache::loncommon::end_page();
     $r->print(<<RESULTS);      $r->print(<<RESULTS);
 $html  $start_page
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 </head>  
 $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">
 $hidden_fields  $hidden_fields
 <input type='button' value='Revise search request'  <input type='button' value='Revise search request'
Line 3649  $closebutton Line 3675  $closebutton
 <p>  <p>
 $message  $message
 </p>  </p>
 </body>  $end_page
 </html>  
 RESULTS  RESULTS
 }  }
   
Line 3690  sub cleanup { Line 3715  sub cleanup {
     }      }
     &untiehash();      &untiehash();
     &Apache::lonmysql::disconnect_from_db();      &Apache::lonmysql::disconnect_from_db();
       return OK;
 }  }
   
 __END__  __END__

Removed from v.1.239  
changed lines
  Added in v.1.262


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