Diff for /loncom/interface/lonsearchcat.pm between versions 1.209 and 1.219

version 1.209, 2004/04/19 16:53:27 version 1.219, 2004/04/30 21:28:07
Line 74  use Apache::lonmeta; Line 74  use Apache::lonmeta;
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use LONCAPA::lonmetadata();  use LONCAPA::lonmetadata();
   use HTML::Entities();
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 149  sub handler { Line 150  sub handler {
     ## Initialize global variables      ## Initialize global variables
     ##      ##
     my $domain  = $r->dir_config('lonDefDomain');      my $domain  = $r->dir_config('lonDefDomain');
     $diropendb= "/home/httpd/perl/tmp/$ENV{'user.domain'}_$ENV{'user.name'}_searchcat.db";      $diropendb= "/home/httpd/perl/tmp/".
           "$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.
Line 284  END Line 286  END
     $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';      $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';
Line 336  END Line 338  END
         # Set up table          # Set up table
         if (! defined(&create_results_table())) {          if (! defined(&create_results_table())) {
     my $errorstring=&Apache::lonmysql::get_error();      my $errorstring=&Apache::lonmysql::get_error();
               &Apache::lonnet::logthis('lonsearchcat.pm: Unable to create '.
                                        'needed table.  lonmysql error:'.
                                        $errorstring);
             $r->print(<<END);              $r->print(<<END);
 <html><head><title>Search Error</title></head>  <html><head><title>Search Error</title></head>
 $bodytag  $bodytag
 Unable to create table in which to store search results.    Unable to create table in which to store search results.  
 The search has been aborted.  The search has been aborted.
 <br />$errorstring  
 </body>  </body>
 </html>  </html>
 END  END
Line 401  my $totalfound; Line 405  my $totalfound;
   
 sub course_search {  sub course_search {
     my $r=shift;      my $r=shift;
     my $bodytag=&Apache::loncommon::bodytag('Course Search').      my $bodytag=&Apache::loncommon::bodytag('Course Search');
  &Apache::loncommon::help_open_bug('Searching');  
     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;
Line 500  sub search_html_header { Line 503  sub search_html_header {
 <html>  <html>
 <head>  <head>
 <title>The LearningOnline Network with CAPA</title>  <title>The LearningOnline Network with CAPA</title>
 <script type="text/javascript">  
     function openhelp(val) {  
  openhelpwin=open('/adm/help/searchcat.html','helpscreen',  
      'scrollbars=1,width=600,height=300');  
  openhelpwin.focus();  
     }  
 </script>  
 </head>  </head>
 ENDHEADER  ENDHEADER
     return $Str;      return $Str;
Line 528  Prints the form for the basic search.  S Line 524  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 $bodytag=&Apache::loncommon::bodytag('Search').      my $bodytag=&Apache::loncommon::bodytag('Search').
         &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching','Finding_Resources',          &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching','Searching',
                                             undef,undef,! $ENV{'form.launch'});                                              undef,undef,! $ENV{'form.launch'});
     my $scrout = &search_html_header().$bodytag;      my $scrout = &search_html_header().$bodytag;
     if (&Apache::lonnet::allowed('bre',$ENV{'request.role.domain'})) {      if (&Apache::lonnet::allowed('bre',$ENV{'request.role.domain'})) {
         my $Statement=&searchhelp();          # Define interface components
         $scrout.=(<<ENDDOCUMENT);          my $userelatedwords=
 <form name="loncapa_search" method="post" action="/adm/searchcat">              &mt('[_1] use related words',
 <input type="hidden" name="phase" value="basic_search" />                  &Apache::lonhtmlcommon::checkbox
 $hidden_fields                  ('related',$ENV{'form.related'}));
 <p>          my $onlysearchdomain=
 $Statement.              &mt('[_1] only search domain [_2]',
 </p>                  &Apache::lonhtmlcommon::checkbox
 <p>                  ('domains',$ENV{'form.domains'}),
 <table>                  $r->dir_config('lonDefDomain'));
 <tr><td>          my $adv_search_link = 
 ENDDOCUMENT              '<a href="/adm/searchcat?'.
         $scrout.='&nbsp;'.              'phase=disp_adv&'.
               'catalogmode='.$ENV{'form.catalogmode'}.
               '&launch='.$ENV{'form.launch'}.
               '&mode='.$ENV{'form.mode'}.
               '">'.&mt('Advanced Search').'</a>';
           #
           $scrout.='<form name="loncapa_search" method="post" '.
               'action="/adm/searchcat">'.
               '<input type="hidden" name="phase" value="basic_search" />'.
               $hidden_fields;
           #
           $scrout .= '<center>'.$/;
           if ($ENV{'request.course.id'}) {
               $scrout .= '<h1>'.&mt('LON-CAPA Catalog Search').'</h1>';
           } else {
               # No need to tell them they are searching
               $scrout.= ('<br />'x2);
           }
           $scrout.='<table>'.
               '<tr><td align="center" valign="top">'.
             &Apache::lonhtmlcommon::textbox('basicexp',              &Apache::lonhtmlcommon::textbox('basicexp',
                                         $ENV{'form.basicexp'},40).                                              $ENV{'form.basicexp'},50).'<br />'.
                                         '&nbsp;';              '<font size="-1">'.&searchhelp().'</font>'.'</td>'.
         my $relatedcheckbox =               '<td><font size="-1">'.
             &Apache::lonhtmlcommon::checkbox('related',              '<nobr>'.('&nbsp;'x3).$adv_search_link.'</nobr>'.'<br />'.
                                              $ENV{'form.related'});              '<nobr>'.('&nbsp;'x1).$userelatedwords.'</nobr>'.'<br />'.
         my $domain = $r->dir_config('lonDefDomain');              '<nobr>'.('&nbsp;'x1).$onlysearchdomain.'</nobr>'.'<br />'.
         my $domaincheckbox =               '</font></td>'.
             &Apache::lonhtmlcommon::checkbox('domains',              '</tr>'.$/;
                                              $ENV{'form.domains'});          #
         my $srch=&mt('Search');  #        $scrout .= '<tr><td align="center">'.
         my $header=&mt('Advanced Search');  #            '<font size="-1">'.
         my $userelatedwords=&mt('use related words');  #            $userelatedwords.('&nbsp;'x3).
         my $onlysearchdomain=&mt('only search domain');  #            $onlysearchdomain.('&nbsp;'x2).$adv_search_link.
         my $view=&viewoptions();  #            '</font>'.
         $scrout.=<<END;  #            '</td></tr>'.$/;
 </td><td><a          $scrout .= '<tr><td align="center" colspan="2">'.
 href="/adm/searchcat?phase=disp_adv&catalogmode=$ENV{'form.catalogmode'}&launch=$ENV{'form.launch'}&mode=$ENV{'form.mode'}"              '<font size="-1">'.
 >$header</a></td></tr>              '<input type="submit" name="basicsubmit" '.
 <tr><td>$relatedcheckbox $userelatedwords</td>              'value="'.&mt('Search').'" />'.
     <td>$domaincheckbox $onlysearchdomain <b>$domain</b></td></tr>              ('&nbsp;'x2).$closebutton.('&nbsp;'x2).&viewoptions().
 </table>              '</font>'.
 </p>              '</td></tr>'.$/;
 $view          $scrout .= '</table>'.$/.'</center>'.'</form>';
 <p>  
 &nbsp;<input type="submit" name="basicsubmit" value='$srch' />&nbsp;  
 $closebutton  
 END  
     $scrout.=<<ENDDOCUMENT;  
 </p>  
 </form>  
 ENDDOCUMENT  
     }      }
     if ($ENV{'request.course.id'}) {      if ($ENV{'request.course.id'}) {
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
    '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',
  'use' => 'use related words',   'use' => 'use related words',
  'full' =>'fulltext search (time consuming)'   'full' =>'fulltext search (time consuming)'
    );     );
         $scrout.=(<<ENDCOURSESEARCH);          $scrout.=(<<ENDCOURSESEARCH);
   <form name="loncapa_search" method="post" action="/adm/searchcat">
   <center>
 <hr />  <hr />
 <h1>$lt{'header'}</h1>      <h1>$lt{'header'}</h1>    
 <form name="course_search" method="post" action="/adm/searchcat">  
 <input type="hidden" name="phase" value="course_search" />  <input type="hidden" name="phase" value="course_search" />
 $hidden_fields  $hidden_fields
 <p>  <p>
Line 615  ENDCOURSESEARCH Line 622  ENDCOURSESEARCH
 </table><p>  </table><p>
 &nbsp;<input type="submit" name="coursesubmit" value='$lt{'srch'}' />  &nbsp;<input type="submit" name="coursesubmit" value='$lt{'srch'}' />
 </p>  </p>
   </center>
   </form>
 ENDENDCOURSE  ENDENDCOURSE
     }      }
     $scrout.=(<<ENDDOCUMENT);      $scrout.=(<<ENDDOCUMENT);
Line 639  Prints the advanced search form. Line 648  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').
           &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching',
                                               'Searching',
                                               undef,undef,
                                               ! $ENV{'form.launch'});
   
     my %lt=&Apache::lonlocal::texthash('srch' => 'Search',      my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
        'reset' => 'Reset',         'reset' => 'Reset',
        'help' => 'Help');         'help' => 'Help');
     my $advanced_buttons = <<"END";      my $advanced_buttons=<<"END";
 <p>  
 <input type="submit" name="advancedsubmit" value='$lt{"srch"}' />  <input type="submit" name="advancedsubmit" value='$lt{"srch"}' />
 <input type="reset" name="reset" value='$lt{"reset"}' />  <input type="reset" name="reset" value='$lt{"reset"}' />
 $closebutton  $closebutton
 <input type="button" value="$lt{'help'}" onClick="openhelp()" />  
 END  END
     my $bodytag=&Apache::loncommon::bodytag('Advanced Catalog Search').  
         &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching',  
                                             'Finding_Resources',  
                                             undef,undef,  
                                             ! $ENV{'form.launch'});  
     my $searchhelp=&searchhelp();  
     my $scrout=&search_html_header();      my $scrout=&search_html_header();
     $scrout .= <<"ENDHEADER";      $scrout .= <<"ENDHEADER";
 $bodytag  $bodytag
 <form method="post" action="/adm/searchcat" name="advsearch">  <form method="post" action="/adm/searchcat" name="advsearch">
   <p>
 $advanced_buttons  $advanced_buttons
 ENDHEADER  ENDHEADER
     $scrout.=('&nbsp;'x2).&viewoptions().'</p>'.$hidden_fields.       $scrout.=('&nbsp;'x2).&viewoptions().'</p>'.$hidden_fields. 
         '<input type="hidden" name="phase" value="adv_search" />';          '<input type="hidden" name="phase" value="adv_search" />';
     my %fields=&Apache::lonmeta::fieldnames();      my %fields=&Apache::lonmeta::fieldnames();
     #      #
     $scrout.= '<p>'.$searchhelp.'</p>'.      $scrout .= '<h3>'.&mt('Standard Metadata').'</h3>';
         "<table>\n";      $scrout .= "<table>\n";
       $scrout .= '<tr><td>&nbsp;</td><td colspan="2"><font size="-1">'.
           ('&nbsp;'x2).&searchhelp()."</font></td></tr>\n";
     my %related_word_search =       my %related_word_search = 
         ('title'=>1,          ('title'    => 1,
          'author'=>0,           'author'   => 0,
          'owner'=>0,           'owner'    => 0,
          'authorspace'=>0,           'authorspace'  => 0,
          'modifyinguser'=>0,           'modifyinguser'=> 0,
          'keywords'=>1,           'keywords' => 1,
          'notes'=>1,           'notes'    => 1,
          'abstract'=>1,           'abstract' => 1,
          'standards'=>1,           'standards'=> 1,
          'mime'=>1,           'mime'     => 1,
          );           );
     #      #
     foreach my $field ('title','author','owner','authorspace','modifyinguser',      foreach my $field ('title','author','owner','authorspace','modifyinguser',
Line 719  ENDHEADER Line 729  ENDHEADER
     &Apache::loncommon::domain_select('domains',      &Apache::loncommon::domain_select('domains',
    $ENV{'form.domains'},1).     $ENV{'form.domains'},1).
     '</td></tr>'.$/;      '</td></tr>'.$/;
     $scrout .= "</table>\n<br />\n<table>\n";      #
     my %dates=&Apache::lonlocal::texthash      # Misc metadata
         ('creationdatestart'     => 'Creation Date After',      $scrout.='<tr><td align="right" valign="top">'.
          'creationdateend'       => 'Creation Date Before',   &titlefield(&mt('Copyright/Distribution')).'</td><td colspan="2">'.
          'lastrevisiondatestart' => 'Last Revision Date After',          &Apache::lonmeta::selectbox('copyright',
          'lastrevisiondateend'   => 'Last Revision Date Before');                                      '',,
     foreach my $field (sort keys %dates) {                                      \&Apache::loncommon::copyrightdescription,
  $scrout.='<tr>'.                                      ( undef,
             '<td align="right">'.&titlefield($dates{$field}).'</td><td>'.                                         &Apache::loncommon::copyrightids)
     &Apache::lonhtmlcommon::date_setter('advsearch',$field,0,'',1).                                      ).'</td></tr>'.$/;
     '</td></tr>'.$/;      $scrout.='<tr><td align="right" valign="top">'.
     }   &titlefield(&mt('Language')).'</td><td colspan="2">'.
           &Apache::lonmeta::selectbox('language',
                                       'notset',,
                                       \&Apache::loncommon::languagedescription,
                                       ('any',&Apache::loncommon::languageids)
                                       ).'</td></tr>';
       $scrout .= "</table>\n";    
       #
       # Dynamic metadata
       $scrout .= '<h3>'.&mt('Problem Statistics').'</h3>';
       $scrout .= "<table>\n";
       $scrout .= '<tr><td>&nbsp;</td><td align="center">'.&mt('Minimum').'</td>'.
           '<td align="center">'.&mt('Maximum').'</td></tr>'."\n";
       foreach my $statistic 
           ({ name=>'stdno',
              description=>'Number of Students',},
            { name => 'avetries',
              description=>'Average tries to answer correctly',},
            { name => 'difficulty',
              description=>'Degree of difficulty',},
            { name => 'disc',
              description=>'Degree of discrimination'}) {
           $scrout .= '<tr><td align="right">'.
               &titlefield(&mt($statistic->{'description'})).
               '</td><td align="center">'.
               '<input type="text" name="'.$statistic->{'name'}.'_min" '.
               'value="" size="6" />'.
               '</td><td align="center">'.
               '<input type="text" name="'.$statistic->{'name'}.'_max" '.
               'value="" size="6" />'.
               '</td></tr>'.$/;
       }
       $scrout .= "</table>\n";
       $scrout .= '<h3>'.&mt('Evaluation Data').'</h3>';
       $scrout .= "<table>\n";
       $scrout .= '<tr><td>&nbsp;</td><td align="center">'.&mt('Minimum').'</td>'.
           '<td align="center">'.&mt('Maximum').'</td></tr>'."\n";
       foreach my $evaluation
           ( { name => 'clear',
               description => 'Material presented in clear way'},
             { name =>'depth',
               description => 'Material covered with sufficient depth'},
             { name => 'helpful',
               description => 'Material is helpful'},
             { name => 'correct',
               description => 'Material appears to be correct'},
             { name => 'technical',
               description => 'Resource is technically correct'}){
           $scrout .= '<tr><td align="right">'.
               &titlefield(&mt($evaluation->{'description'})).
               '</td><td align="center">'.
               '<input type="text" name="'.$evaluation->{'name'}.'_min" '.
               'value="" size="6" />'.
               '</td><td align="center">'.
               '<input type="text" name="'.$evaluation->{'name'}.'_max" '.
               'value="" size="6" />'.
               '</td></tr>'.$/;
       }
       $scrout .= "</table>\n";
       #
       # Creation/Modification date limits
       $scrout .= '<h3>'.&mt('Creation and Modification dates').'</h3>';
       $scrout .= "\n<table>\n";
       my $cafter = 
           &Apache::lonhtmlcommon::date_setter('advsearch',         # formname
                                               'creationdate1', # fieldname
                                               0,           # current value
                                               '',          # special 
                                               1,           # includeempty
                                               '',          # state
                                               1,           # no_hh_mm_ss
                                               );
       my $cbefore = 
           &Apache::lonhtmlcommon::date_setter('advsearch',         # formname
                                               'creationdate2', # fieldname
                                               0,           # current value
                                               '',          # special 
                                               1,           # includeempty
                                               '',          # state
                                               1,           # no_hh_mm_ss
                                               );
       $scrout .= &mt('<tr><td align="right">Created between</td>'.
                      '<td>[_1]</td></tr>'.
                      '<tr><td align="right">and </td>'.
                      '<td>[_2]</td></tr>',$cafter,$cbefore);
       my $lafter = 
           &Apache::lonhtmlcommon::date_setter('advsearch',
                                               'revisiondate1', 
                                               0,           # current value
                                               '',          # special 
                                               1,           # includeempty
                                               '',          # state
                                               1,           # no_hh_mm_ss
                                               );
       my $lbefore = 
           &Apache::lonhtmlcommon::date_setter('advsearch',
                                               'revisiondate2',
                                               0,           # current value
                                               '',          # special 
                                               1,           # includeempty
                                               '',          # state
                                               1,           # no_hh_mm_ss
                                               );
       $scrout .= &mt('<tr><td align="right">Last modified between </td>'.
                      '<td>[_1]</td></tr>'.
                      '<tr><td align="right">and</td>'.
                      '<td>[_2]</td></tr>',$lafter,$lbefore);
     $scrout.="</table>\n";      $scrout.="</table>\n";
     $scrout.=<<ENDDOCUMENT;      $scrout.=<<ENDDOCUMENT;
 $advanced_buttons  $advanced_buttons
Line 813  sub viewoptions { Line 929  sub viewoptions {
  \&viewoptiontext,   \&viewoptiontext,
  sort(keys(%Views)));   sort(keys(%Views)));
     $scrout.= '&nbsp;&nbsp;';      $scrout.= '&nbsp;&nbsp;';
     $scrout.=&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('Records per Page').'</nobr>'.$/;      $scrout .= ('&nbsp;'x2).&mt('[_1] Records per Page',$countselect).
           '</nobr>'.$/;
     return $scrout;      return $scrout;
 }  }
   
Line 1027  Parse advanced search form and return th Line 1144  Parse advanced search form and return th
 ######################################################################  ######################################################################
 sub parse_advanced_search {  sub parse_advanced_search {
     my ($r,$closebutton,$hidden_fields)=@_;      my ($r,$closebutton,$hidden_fields)=@_;
       my @BasicFields = ('title','author','subject','keywords','url','version',
                          'notes','abstract','extension','owner',
   #                       'custommetadata','customshow',
                          'modifyinguser','standards','mime');
       my @StatsFields = ('stdno','avetries','difficulty','disc');
       my @EvalFields = ('clear','depth','helpful','correct','technical');
     my $fillflag=0;      my $fillflag=0;
     my $pretty_search_string = "<br />\n";      my $pretty_search_string = "<br />\n";
     # Clean up fields for safety      # Clean up fields for safety
     for my $field ('title','author','subject','keywords','url','version',      for my $field (@BasicFields,
    'creationdatestart_month','creationdatestart_day',                     'creationdatestart_month','creationdatestart_day',
    'creationdatestart_year','creationdateend_month',     'creationdatestart_year','creationdateend_month',
    'creationdateend_day','creationdateend_year',     'creationdateend_day','creationdateend_year',
    'lastrevisiondatestart_month','lastrevisiondatestart_day',     'lastrevisiondatestart_month','lastrevisiondatestart_day',
    'lastrevisiondatestart_year','lastrevisiondateend_month',     'lastrevisiondatestart_year','lastrevisiondateend_month',
    'lastrevisiondateend_day','lastrevisiondateend_year',     'lastrevisiondateend_day','lastrevisiondateend_year') {
    'notes','abstract','extension','language','owner',   $ENV{'form.'.$field}=~s/[^\w\/\s\(\)\=\-\"\']//g;
    'custommetadata','customshow','category') {  
  $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 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
     for my $field ('title','author','subject','keywords','url','version',      for my $field (@BasicFields) {
    'notes','abstract','category','extension','language',   if (&filled($ENV{'form.'.$field})) {
                    'owner','custommetadata') {  
  if (&filled($ENV{"form.$field"})) {  
     $fillflag++;      $fillflag++;
  }   }
     }      }
     unless ($fillflag) {      for my $field ('lowestgradelevel','highestgradelevel') {
           if ( $ENV{'form.'.$field} =~ /^\d+$/ &&
                $ENV{'form.'.$field} > 0) {
               $fillflag++;
           }
       }
       if (! $fillflag) {
  &output_blank_field_error($r,$closebutton,   &output_blank_field_error($r,$closebutton,
                                   'phase=disp_adv',$hidden_fields);                                    'phase=disp_adv',$hidden_fields);
  return ;   return ;
Line 1069  sub parse_advanced_search { Line 1194  sub parse_advanced_search {
     my @queries;      my @queries;
     my $font = '<font color="#800000" face="helvetica">';      my $font = '<font color="#800000" face="helvetica">';
     # Evaluate logical expression AND/OR/NOT phrase fields.      # Evaluate logical expression AND/OR/NOT phrase fields.
     foreach my $field ('title','author','subject','notes','abstract','url',      foreach my $field (@BasicFields) {
        'keywords','version','owner','standards') {  
  if ($ENV{'form.'.$field}) {   if ($ENV{'form.'.$field}) {
             my $searchphrase = $ENV{'form.'.$field};              my $searchphrase = $ENV{'form.'.$field};
             $pretty_search_string .= $font."$field</font> contains <b>".              $pretty_search_string .= $font."$field</font> contains <b>".
Line 1102  sub parse_advanced_search { Line 1226  sub parse_advanced_search {
             $searchphrase = join(' OR ',@extensions);              $searchphrase = join(' OR ',@extensions);
         }          }
     }      }
     if (exists($ENV{'form.extension'}) && $ENV{'form.extension'} !~ /^\s*$/) {  
         $searchphrase .= ' OR ' if (defined($searchphrase));  
         my @extensions = split(/,/,$ENV{'form.extension'});  
         $searchphrase .= join(' OR ',@extensions);  
     }  
     if (defined($searchphrase)) {      if (defined($searchphrase)) {
         push @queries,&build_SQL_query('mime',$searchphrase);          push @queries,&build_SQL_query('mime',$searchphrase);
         $pretty_search_string .=$font.'mime</font> contains <b>'.          $pretty_search_string .=$font.'mime</font> contains <b>'.
Line 1114  sub parse_advanced_search { Line 1233  sub parse_advanced_search {
     }      }
     #      #
     # Evaluate option lists      # Evaluate option lists
       if ($ENV{'form.lowestgradelevel'}        &&
           $ENV{'form.lowestgradelevel'} ne '0' &&
           $ENV{'form.lowestgradelevel'} =~ /^\d+$/) {
    push(@queries,
                '(lowestgradelevel>='.$ENV{'form.lowestgradelevel'}.')');
           $pretty_search_string.="lowestgradelevel>=".
               $ENV{'form.lowestgradelevel'}."<br />\n";
       }
       if ($ENV{'form.highestgradelevel'}        &&
           $ENV{'form.highestgradelevel'} ne '0' &&
           $ENV{'form.highestgradelevel'} =~ /^\d+$/) {
    push(@queries,
                '(highestgradelevel<='.$ENV{'form.highestgradelevel'}.')');
           $pretty_search_string.="highestgradelevel<=".
               $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>= ".
Line 1127  sub parse_advanced_search { Line 1262  sub parse_advanced_search {
                 "<br \>\n";                  "<br \>\n";
     }      }
     #      #
       # Statistics
       foreach my $field (@StatsFields,@EvalFields) {
           my ($min,$max);
           if (exists($ENV{'form.'.$field.'_min'}) && 
               $ENV{'form.'.$field.'_min'} ne '') {
               $min = $ENV{'form.'.$field.'_min'};
           }
           if (exists($ENV{'form.'.$field.'_max'}) &&
               $ENV{'form.'.$field.'_max'} ne '') {
               $max = $ENV{'form.'.$field.'_max'};
           }
           next if (! defined($max) && ! defined($min));
           if (defined($min) && defined($max)) {
               ($min,$max) = sort {$a <=>$b} ($min,$max);
           }
           if (defined($min) && $min =~ /^(\d+\.\d+|\d+|\.\d+)$/) {
               push(@queries,'('.$field.'>'.$min.')');
               $pretty_search_string.=$font.$field.'</font>&gt;'.$min.'<br />';
           }
           if (defined($max) && $max =~ /^(\d+\.\d+|\d+|\.\d+)$/) {
               push(@queries,'('.$field.'<'.$max.')');
               $pretty_search_string.=$font.$field.'</font>&lt;'.$max.'<br />';
           }
       }
       #
     # Evaluate date windows      # Evaluate date windows
     my $datequery=&build_date_queries(      my $cafter =
  $ENV{'form.creationdatestart_month'},          &Apache::lonhtmlcommon::get_date_from_form('creationdate1');
  $ENV{'form.creationdatestart_day'},      my $cbefore = 
  $ENV{'form.creationdatestart_year'},          &Apache::lonhtmlcommon::get_date_from_form('creationdate2');
  $ENV{'form.creationdateend_month'},      if ($cafter > $cbefore) {
  $ENV{'form.creationdateend_day'},          my $tmp = $cafter;
  $ENV{'form.creationdateend_year'},          $cafter = $cbefore;
  $ENV{'form.lastrevisiondatestart_month'},          $cbefore = $tmp;
  $ENV{'form.lastrevisiondatestart_day'},      }
  $ENV{'form.lastrevisiondatestart_year'},      my $mafter = 
  $ENV{'form.lastrevisiondateend_month'},          &Apache::lonhtmlcommon::get_date_from_form('revisiondate1');
  $ENV{'form.lastrevisiondateend_day'},      my $mbefore =
  $ENV{'form.lastrevisiondateend_year'},          &Apache::lonhtmlcommon::get_date_from_form('revisiondate2');
  );      if ($mafter > $mbefore) {
     # Test to see if date windows are legitimate          my $tmp = $mafter;
     if ($datequery=~/^Incorrect/) {          $mafter = $mbefore;
  &output_date_error($r,$datequery,$closebutton,$hidden_fields);          $mbefore = $tmp;
  return ;      }
     } elsif ($datequery) {      my ($datequery,$error,$prettydate)=&build_date_queries($cafter,$cbefore,
                                                              $mafter,$mbefore);
       if (defined($error)) {
           &output_date_error($r,$error,$closebutton,$hidden_fields);
       } elsif (defined($datequery)) {
         # Here is where you would set up pretty_search_string to output          # Here is where you would set up pretty_search_string to output
         # date query information.          # date query information.
           $pretty_search_string .= '<br />'.$prettydate.'<br />';
  push @queries,$datequery;   push @queries,$datequery;
     }      }
     #      #
Line 1182  sub parse_advanced_search { Line 1347  sub parse_advanced_search {
     $pretty_search_string .= $pretty_domains_string."<br />\n";      $pretty_search_string .= $pretty_domains_string."<br />\n";
     #      #
     if (@queries) {      if (@queries) {
  $query=join(" AND ",@queries);   $query="select * from metadata where ".join(" AND ",@queries);
  $query="select * from metadata where $query";  
     } elsif ($customquery) {      } elsif ($customquery) {
         $query = '';          $query = '';
     }      }
   #    &Apache::lonnet::logthis('query = '.$/.$query);
     return ($query,$customquery,$customshow,$libraries_to_query,      return ($query,$customquery,$customshow,$libraries_to_query,
             $pretty_search_string);              $pretty_search_string);
 }  }
Line 1441  Also reports errors (check for /^Incorre Line 1606  Also reports errors (check for /^Incorre
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub build_date_queries {  sub build_date_queries {
     my ($cmonth1,$cday1,$cyear1,$cmonth2,$cday2,$cyear2,      my ($cafter,$cbefore,$mafter,$mbefore) = @_;
  $lmonth1,$lday1,$lyear1,$lmonth2,$lday2,$lyear2)=@_;      my ($result,$error,$pretty_string);
     my @queries;      #
     if ($cmonth1 or $cday1 or $cyear1 or $cmonth2 or $cday2 or $cyear2) {      # Verify the input
  unless ($cmonth1 and $cday1 and $cyear1 and      if (! defined($cafter) && ! defined($cbefore) &&
  $cmonth2 and $cday2 and $cyear2) {          ! defined($mafter) && ! defined($mbefore)) {
     return "Incorrect entry for the creation date.  You must specify ".          # This is an okay situation, so return undef for the error
    "a starting month, day, and year and an ending month, ".          return (undef,undef,undef);
    "day, and year.";      }
  }      if ((defined($cafter)  && ! defined($cbefore)) ||
  my $cnumeric1=sprintf("%d%2d%2d",$cyear1,$cmonth1,$cday1);          (defined($cbefore) && ! defined($cafter))) {
  $cnumeric1+=0;          # This is bad, so let them know
  my $cnumeric2=sprintf("%d%2d%2d",$cyear2,$cmonth2,$cday2);          $error = &mt('Incorrect entry for the creation date.  '.
  $cnumeric2+=0;                      'You must specify both the beginning and ending dates.');
  if ($cnumeric1>$cnumeric2) {      }
     return "Incorrect entry for the creation date.  The starting ".      if (! defined($error) && 
    "date must occur before the ending date.";          ((defined($mafter)  && ! defined($mbefore)) ||
  }          (defined($mbefore) && ! defined($mafter)))) {
  my $cquery="(creationdate BETWEEN '$cyear1-$cmonth1-$cday1' AND '".          # This is also bad, so let them know
            "$cyear2-$cmonth2-$cday2 23:59:59')";          $error = &mt('Incorrect entry for the last revision date.  '.
  push @queries,$cquery;                       'You must specify both the beginning and ending dates.');
     }  
     if ($lmonth1 or $lday1 or $lyear1 or $lmonth2 or $lday2 or $lyear2) {  
  unless ($lmonth1 and $lday1 and $lyear1 and  
  $lmonth2 and $lday2 and $lyear2) {  
     return "Incorrect entry for the last revision date.  You must ".  
    "specify a starting month, day, and year and an ending ".  
    "month, day, and year.";  
  }  
  my $lnumeric1=sprintf("%d%2d%2d",$lyear1,$lmonth1,$lday1);  
  $lnumeric1+=0;  
  my $lnumeric2=sprintf("%d%2d%2d",$lyear2,$lmonth2,$lday2);  
  $lnumeric2+=0;  
  if ($lnumeric1>$lnumeric2) {  
     return "Incorrect entry for the last revision date.  The ".  
    "starting date must occur before the ending date.";  
  }  
  my $lquery="(lastrevisiondate BETWEEN '$lyear1-$lmonth1-$lday1' AND '".  
            "$lyear2-$lmonth2-$lday2 23:59:59')";  
  push @queries,$lquery;  
     }      }
     if (@queries) {      if (! defined($error)) {
  return join(" AND ",@queries);          #
           # Build the queries
           my @queries;
           if (defined($cbefore) && defined($cafter)) {
               my (undef,undef,undef,$caday,$camon,$cayear) = localtime($cafter);
               my (undef,undef,undef,$cbday,$cbmon,$cbyear) = localtime($cbefore);
               # Correct for year being relative to 1900
               $cayear+=1900; $cbyear+=1900;
               my $cquery=
                   '(creationdate BETWEEN '.
                   "'".$cayear.'-'.$camon.'-'.$caday."'".
                   ' AND '.
                   "'".$cbyear.'-'.$cbmon.'-'.$cbday." 23:59:59')";
               $pretty_string .= '<br />' if (defined($pretty_string));
               $pretty_string .= 
                   &mt('created between [_1] and [_2]',
                       &Apache::lonlocal::locallocaltime($cafter),
                       &Apache::lonlocal::locallocaltime($cbefore+24*60*60-1));
               push(@queries,$cquery);
               $pretty_string =~ s/ 00:00:00//g;
           }
           if (defined($mbefore) && defined($mafter)) {
               my (undef,undef,undef,$maday,$mamon,$mayear) = localtime($mafter);
               my (undef,undef,undef,$mbday,$mbmon,$mbyear) = localtime($mbefore);
               # Correct for year being relative to 1900
               $mayear+=1900; $mbyear+=1900;
               my $mquery=
                   '(lastrevisiondate BETWEEN '.
                   "'".$mayear.'-'.$mamon.'-'.$maday."'".
                   ' AND '.
                   "'".$mbyear.'-'.$mbmon.'-'.$mbday." 23:59:59')";
               push(@queries,$mquery);
               $pretty_string .= '<br />' if (defined($pretty_string));
               $pretty_string .= 
                   &mt('last revised between [_1] and [_2]',
                       &Apache::lonlocal::locallocaltime($mafter),
                       &Apache::lonlocal::locallocaltime($mbefore+24*60*60-1));
               $pretty_string =~ s/ 00:00:00//g;
           }
           if (@queries) {
               $result .= join(" AND ",@queries);
           }
     }      }
     return '';      return ($result,$error,$pretty_string);
 }  }
   
 ######################################################################  ######################################################################
Line 1715  Returns: the identifier of the table on Line 1902  Returns: the identifier of the table on
 sub set_up_table_structure {  sub set_up_table_structure {
     my ($datatypes,$fullindicies) =       my ($datatypes,$fullindicies) = 
         &LONCAPA::lonmetadata::describe_metadata_storage();          &LONCAPA::lonmetadata::describe_metadata_storage();
     unshift(@$datatypes,{name => 'id',       # Copy the table description before modifying it...
       @Datatypes = @{$datatypes};
       unshift(@Datatypes,{name => 'id',  
         type => 'MEDIUMINT',          type => 'MEDIUMINT',
         restrictions => 'UNSIGNED NOT NULL',          restrictions => 'UNSIGNED NOT NULL',
         primary_key  => 'yes',          primary_key  => 'yes',
         auto_inc     => 'yes' });          auto_inc     => 'yes' });
     @Datatypes = @{$datatypes};  
     @Fullindicies = @{$fullindicies};      @Fullindicies = @{$fullindicies};
     return;      return;
 }  }
Line 1783  sub update_status { Line 1971  sub update_status {
     $r->rflush();      $r->rflush();
 }  }
   
   {
       my $max_time  = 40;  # seconds for the search to complete
       my $start_time = 0;
       my $last_time = 0;
   
   sub reset_timing {
       $start_time = 0;
       $last_time = 0;
   }
   
   sub time_left {
       if ($start_time == 0) {
           $start_time = time;
       }
       my $time_left = $max_time - (time - $start_time);
       $time_left = 0 if ($time_left < 0);
       return $time_left;
   }
   
 sub update_seconds {  sub update_seconds {
     my ($r,$text) = @_;      my ($r) = @_;
     $text =~ s/\'/\\\'/g;      my $time = &time_left();
     $r->print      if (($last_time-$time) > 0) {
         ("<script>document.statusform.seconds.value = ' $text'</script>\n");          $r->print("<script>".
     $r->rflush();                    "document.statusform.seconds.value = '$time'".
                     "</script>\n");
           $r->rflush();
       }
       $last_time = $time;
   }
   
 }  }
   
 ######################################################################  ######################################################################
Line 1837  sub run_search { Line 2050  sub run_search {
     my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1);      my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1);
     my $connection = $r->connection;      my $connection = $r->connection;
     #      #
     # Timing variables  
     #  
     my $starttime = time;  
     my $max_time  = 30;  # seconds for the search to complete  
     #  
     # Print run_search header      # Print run_search header
     #      #
     $r->print(<<END);      $r->print(<<END);
Line 1858  END Line 2066  END
     if (@Lines > 2) {      if (@Lines > 2) {
         $pretty_string = join '<br \>',(@Lines[0..2],'....<br />');          $pretty_string = join '<br \>',(@Lines[0..2],'....<br />');
     }      }
     $r->print(&mt("Search").": ".$pretty_string);      $r->print(&mt("Search: [_1]",$pretty_string));
     $r->rflush();      $r->rflush();
     #      #
     # Determine the servers we need to contact.      # Determine the servers we need to contact.
Line 1873  END Line 2081  END
         @Servers_to_contact = sort(keys(%Apache::lonnet::libserv));          @Servers_to_contact = sort(keys(%Apache::lonnet::libserv));
     }      }
     my %Server_status;      my %Server_status;
       #
       # 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.".
Line 1917  END Line 2127  END
 </form>  </form>
 END  END
     $r->rflush();      $r->rflush();
     my $time_remaining = $max_time - (time - $starttime) ;      &reset_timing();
     my $last_time = $time_remaining;      &update_seconds($r);
     &update_seconds($r,$time_remaining);      &update_status($r,&mt('contacting [_1]',$Servers_to_contact[0]));
     &update_status($r,'contacting '.$Servers_to_contact[0]);      while (&time_left() &&
     while (($time_remaining > 0) &&  
            ((@Servers_to_contact) || keys(%Server_status))) {             ((@Servers_to_contact) || keys(%Server_status))) {
         # Send out a search request if it needs to be done.          &update_seconds($r);
           #
           # Send out a search request
         if (@Servers_to_contact) {          if (@Servers_to_contact) {
             # Contact one server              # Contact one server
             my $server = shift(@Servers_to_contact);              my $server = shift(@Servers_to_contact);
             &update_status($r,&mt('contacting').' '.$server);              &update_status($r,&mt('contacting [_1]',$server));
             my $reply=&Apache::lonnet::metadata_query($query,$customquery,              my $reply=&Apache::lonnet::metadata_query($query,$customquery,
                                                       $customshow,[$server]);                                                        $customshow,[$server]);
             ($server) = keys(%$reply);              ($server) = keys(%$reply);
Line 1939  END Line 2150  END
             # left to contact.                # left to contact.  
             if (scalar (keys(%Server_status))) {              if (scalar (keys(%Server_status))) {
                 &update_status($r,                  &update_status($r,
                        &mt('waiting on').' '.(join(' ',keys(%Server_status))));                         &mt('waiting on [_1]',join(' ',keys(%Server_status))));
             }              }
             sleep(1)              sleep(1)
         }          }
Line 1948  END Line 2159  END
         # have results from yet, looking for results.          # have results from yet, looking for results.
         while (my ($server,$status) = each(%Server_status)) {          while (my ($server,$status) = each(%Server_status)) {
             last if ($connection->aborted());              last if ($connection->aborted());
               &update_seconds($r);
             if ($status eq 'con_lost') {              if ($status eq 'con_lost') {
                 delete ($Server_status{$server});                  delete ($Server_status{$server});
                 next;                  next;
Line 1955  END Line 2167  END
             $status=~/^([\.\w]+)$/;               $status=~/^([\.\w]+)$/; 
            my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$1;             my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$1;
             if (-e $datafile && ! -e "$datafile.end") {              if (-e $datafile && ! -e "$datafile.end") {
                 &update_status($r,&mt('Receiving results from').' '.$server);                  &update_status($r,&mt('Receiving results from [_1]',$server));
                 next;                  next;
             }              }
             last if ($connection->aborted());              last if ($connection->aborted());
             if (-e "$datafile.end") {              if (-e "$datafile.end") {
                 &update_status($r,&mt('Reading results from').' '.$server);                  &update_status($r,&mt('Reading results from [_1]',$server));
                 if (-z "$datafile") {                  if (-z "$datafile") {
                     delete($Server_status{$server});                      delete($Server_status{$server});
                     next;                      next;
Line 1975  END Line 2187  END
                 # Read in the whole file.                  # Read in the whole file.
                 while (my $result = <$fh>) {                  while (my $result = <$fh>) {
                     last if ($connection->aborted());                      last if ($connection->aborted());
                     # handle custom fields?  Someday we will!                      #
                       # Records are stored one per line
                     chomp($result);                      chomp($result);
                     next unless $result;                      next if (! $result);
                       #
                     # Parse the result.                      # Parse the result.
                     my %Fields = &parse_raw_result($result,$server);                      my %Fields = &parse_raw_result($result,$server);
                     $Fields{'hostname'} = $server;                      $Fields{'hostname'} = $server;
                       #
                       # 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);
                     if (! defined($result)) {                      if (! defined($result)) {
                         $r->print(&Apache::lonmysql::get_error());                          $r->print(&Apache::lonmysql::get_error());
                     }                      }
                     # $r->print(&Apache::lonmysql::get_debug());                      #
                     $hitcountsum ++;                      $hitcountsum ++;
                     $time_remaining = $max_time - (time - $starttime) ;                      &update_seconds($r);
                     if ($last_time - $time_remaining > 0) {  
                         &update_seconds($r,$time_remaining);  
                         $last_time = $time_remaining;  
                     }  
                     if ($hitcountsum % 50 == 0) {                      if ($hitcountsum % 50 == 0) {
                         &update_count_status($r,$hitcountsum);                          &update_count_status($r,$hitcountsum);
                     }                      }
                 } # End of foreach (@results)                  }
                 $fh->close();                  $fh->close();
                 # $server is only deleted if the results file has been                   # $server is only deleted if the results file has been 
                 # found and (successfully) opened.  This may be a bad idea.                  # found and (successfully) opened.  This may be a bad idea.
Line 2007  END Line 2220  END
             &update_count_status($r,$hitcountsum);              &update_count_status($r,$hitcountsum);
         }          }
         last if ($connection->aborted());          last if ($connection->aborted());
         # Finished looping through the servers          &update_seconds($r);
         $starttime = time if (@Servers_to_contact);  
         $time_remaining = $max_time - (time - $starttime) ;  
         if ($last_time - $time_remaining > 0) {  
             $last_time = $time_remaining;  
             &update_seconds($r,$time_remaining);  
         }  
     }      }
     &update_status($r,&mt('Search Complete').$server);      &update_status($r,&mt('Search Complete [_1]',$server));
     &update_seconds($r,0);      &update_seconds($r);
     #      #
     &Apache::lonmysql::disconnect_from_db();      &Apache::lonmysql::disconnect_from_db(); # This is unneccessary
     #      #
     # We have run out of time or run out of servers to talk to and      # We have run out of time or run out of servers to talk to and
     # results to get.        # results to get, so let the client know the top frame needs to be
       # loaded from /adm/searchcat
     $r->print("</body></html>");      $r->print("</body></html>");
     if ($ENV{'form.catalogmode'} ne 'groupsearch') {      if ($ENV{'form.catalogmode'} ne 'groupsearch') {
         $r->print("<script>".          $r->print("<script>".
Line 2049  Returns html for the previous and next b Line 2257  Returns html for the previous and next b
 sub prev_next_buttons {  sub prev_next_buttons {
     my ($current_min,$show,$total,$parms) = @_;      my ($current_min,$show,$total,$parms) = @_;
     return '' if ($show eq 'all'); # No links if you get them all at once.      return '' if ($show eq 'all'); # No links if you get them all at once.
     my $links;      #
     ##      # Create links
     ## Prev  
     my $prev_min = $current_min - $show;      my $prev_min = $current_min - $show;
     $prev_min = 1 if $prev_min < 1;      $prev_min = 1 if $prev_min < 1;
     if ($prev_min < $current_min) {      my $prevlink = 
         $links .=           qq{<a href="/adm/searchcat?$parms&start=$prev_min&show=$show">};
             qq{<a href="/adm/searchcat?$parms&start=$prev_min&show=$show">}.      #
             &mt('prev').'</a>';  
     } else {  
         $links .= &mt('prev');  
     }  
     ##  
     ## Pages.... Someday.  
     ##  
     $links .=   
         qq{&nbsp;  
            <a href="/adm/searchcat?$parms&start=$current_min&$show=$show">}.  
                 &mt('reload').'</a>';  
     ##  
     ## Next  
     my $next_min = $current_min + $show;      my $next_min = $current_min + $show;
     $next_min = $current_min if ($next_min > $total);      $next_min = $current_min if ($next_min > $total);
     if ($next_min != $current_min) {      my $nextlink =
         $links .=           qq{<a href="/adm/searchcat?$parms&start=$next_min&show=$show">};
             qq{&nbsp;      my $reloadlink = 
                <a href="/adm/searchcat?$parms&start=$next_min&show=$show">}.          qq{<a href="/adm/searchcat?$parms&start=$current_min&$show=$show">};
                     &mt('next').'</a>';      #
     } else {      # Determine which parameters to pass
         $links .= '&nbsp;'.&mt('next');      my $String = '[_1]prev[_2] &nbsp; [_3]reload[_4] &nbsp; [_5]next[_6]';
     }      if ($prev_min == $current_min) {
           $String =~ s:\[_[12]\]::g;
       }
       if ($next_min == $current_min) {
           $String =~ s:\[_[56]\]::g;
       }
       my $links = &mt($String,
                       $prevlink,  '</a>',
                       $reloadlink,'</a>',
                       $nextlink,  '</a>');
     return $links;      return $links;
 }  }
   
Line 2164  sub display_results { Line 2367  sub display_results {
          ."</center>\n"           ."</center>\n"
          );           );
     if ($total_results == 0) {      if ($total_results == 0) {
         $r->print('<meta HTTP-EQUIV="Refresh" CONTENT="1">'.          $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></body></html>");
         return;          return;
Line 2185  sub display_results { Line 2388  sub display_results {
         }          }
         my %Fields = %{&parse_row(@$row)};          my %Fields = %{&parse_row(@$row)};
         my $output="<p>\n";          my $output="<p>\n";
           if (! defined($Fields{'title'}) || $Fields{'title'} eq '') {
               $Fields{'title'} = 'Untitled';
           }
         my $prefix=&catalogmode_output($Fields{'title'},$Fields{'url'},          my $prefix=&catalogmode_output($Fields{'title'},$Fields{'url'},
                                        $Fields{'id'},$checkbox_num++);                                         $Fields{'id'},$checkbox_num++);
         # Render the result into html          # Render the result into html
Line 2576  extra custom metadata to show. Line 2782  extra custom metadata to show.
 ######################################################################  ######################################################################
 sub detailed_citation_view {  sub detailed_citation_view {
     my ($prefix,%values) = @_;      my ($prefix,%values) = @_;
     my $icon=&Apache::loncommon::icon($values{'url'});      my $icon=
     my $result=<<END;      my $result;
 <b>$prefix<img src="$icon" /><a href="http://$ENV{'HTTP_HOST'}$values{'url'}"       $result .= '<b>'.$prefix.
     target='search_preview'>$values{'title'}</a></b>          '<img src="'.&Apache::loncommon::icon($values{'url'}).' " />'.
 <p>          '<a href="http://'.$ENV{'HTTP_HOST'}.$values{'url'}.'" '.
 <b>$values{'author'}</b>, <i>$values{'owner'}</i><br />          'target="search_preview">'.$values{'title'}."</a></b>\n";
       $result .= "<p>\n";
 <b>Subject:       </b> $values{'subject'}<br />      $result .= '<b>'.$values{'author'}.'</b>,'.
 <b>Keyword(s):    </b> $values{'keywords'}<br />          ' <i>'.$values{'owner'}.'</i><br />';
 <b>Notes:         </b> $values{'notes'}<br />      foreach my $field 
 <b>MIME Type:     </b> $values{'mimetag'}<br />          (
 <b>Language:      </b> $values{'language'}<br />           { name=>'subject',
 <b>Copyright/Distribution:</b> $values{'copyrighttag'}<br />             translate => '<b>Subject:</b>&nbsp;[_1]',},
 </p>           { name=>'keywords',
 $values{'extrashow'}             translate => '<b>Keywords:</b>&nbsp;[_1]',},
 <p>           { name=>'notes',
 $values{'shortabstract'}             translate => '<b>Notes:</b>&nbsp;[_1]',},
 </p>           { name=>'mimetag',
 <hr align='left' width='200' noshade />             translate => '<b>MIME Type:</b>&nbsp;[_1]',},
 END           { name=>'standards',
              translate => '<b>Standards:</b>[_1]',},
            { name=>'copyrighttag',
              translate => '<b>Copyright/Distribution:</b>&nbsp;[_1]',},
            { name=>'stdno',
              translate => '<b>Number of Students:</b>&nbsp;[_1]',},
            { name=>'avetries',
              translate => '<b>Average Tries:</b>&nbsp;[_1]',},
            { name=>'disc',
              translate => '<b>Degree of Discrimination:</b>&nbsp;[_1]',},
            { name=>'difficulty',
              translate => '<b>Degree of Difficulty:</b>&nbsp;[_1]',},
            { name=>'clear',
              translate => '<b>Clear:</b>&nbsp;[_1]',},
            { name=>'depth',
              translate => '<b>Depth:</b>&nbsp;[_1]',},
            { name=>'helpful',
              translate => '<b>Helpful:</b>&nbsp;[_1]',},
            { name=>'correct',
              translate => '<b>Correcy:</b>&nbsp;[_1]',},
            { name=>'technical',
              translate => '<b>Technical:</b>&nbsp;[_1]',},
            ) {
           $result.= &mt($field->{'translate'},$values{$field->{'name'}}).
               "<br />\n";
       }
       $result .= "</p>".$values{'extrashow'}.
           '<p>'.$values{'shortabstract'}.'</p>';
       $result .= '<hr align="left" width="200" noshade />'."\n";
     return $result;      return $result;
 }  }
   
Line 2702  END Line 2936  END
 ######################################################################  ######################################################################
 sub xml_sgml_view {  sub xml_sgml_view {
     my ($prefix,%values) = @_;      my ($prefix,%values) = @_;
       my $xml = <<END;
   <LonCapaResource>
   <url>$values{'url'}</url>
   <title>$values{'title'}</title>
   <author>$values{'author'}</author>
   <subject>$values{'subject'}</subject>
   <keywords>$values{'keywords'}</keywords>
   <notes>$values{'notes'}</notes>
   <mimeInfo>
   <mime>$values{'mime'}</mime>
   <mimetag>$values{'mimetag'}</mimetag>
   </mimeInfo>
   <languageInfo>
   <language>$values{'language'}</language>
   <languagetag>$values{'languagetag'}</languagetag>
   </languageInfo>
   <creationdate>$values{'creationdate'}</creationdate>
   <lastrevisiondate>$values{'lastrevisiondate'}</lastrevisiondate>
   <owner>$values{'owner'}</owner>
   <copyrightInfo>
   <copyright>$values{'copyright'}</copyright>
   <copyrighttag>$values{'copyrighttag'}</copyrighttag>
   </copyrightInfo>
   <repositoryLocation>$values{'hostname'}</repositoryLocation>
   <shortabstract>$values{'shortabstract'}</shortabstract>
   </LonCapaResource>
   END
       $xml = &HTML::Entities::encode($xml,'<>&');
     my $result=<<END;      my $result=<<END;
 $prefix  $prefix
 <pre>  <pre>
 &lt;LonCapaResource&gt;  $xml
 &lt;url&gt;$values{'url'}&lt;/url&gt;  
 &lt;title&gt;$values{'title'}&lt;/title&gt;  
 &lt;author&gt;$values{'author'}&lt;/author&gt;  
 &lt;subject&gt;$values{'subject'}&lt;/subject&gt;  
 &lt;keywords&gt;$values{'keywords'}&lt;/keywords&gt;  
 &lt;notes&gt;$values{'notes'}&lt;/notes&gt;  
 &lt;mimeInfo&gt;  
 &lt;mime&gt;$values{'mime'}&lt;/mime&gt;  
 &lt;mimetag&gt;$values{'mimetag'}&lt;/mimetag&gt;  
 &lt;/mimeInfo&gt;  
 &lt;languageInfo&gt;  
 &lt;language&gt;$values{'language'}&lt;/language&gt;  
 &lt;languagetag&gt;$values{'languagetag'}&lt;/languagetag&gt;  
 &lt;/languageInfo&gt;  
 &lt;creationdate&gt;$values{'creationdate'}&lt;/creationdate&gt;  
 &lt;lastrevisiondate&gt;$values{'lastrevisiondate'}&lt;/lastrevisiondate&gt;  
 &lt;owner&gt;$values{'owner'}&lt;/owner&gt;  
 &lt;copyrightInfo&gt;  
 &lt;copyright&gt;$values{'copyright'}&lt;/copyright&gt;  
 &lt;copyrighttag&gt;$values{'copyrighttag'}&lt;/copyrighttag&gt;  
 &lt;/copyrightInfo&gt;  
 &lt;repositoryLocation&gt;$values{'hostname'}&lt;/repositoryLocation&gt;  
 &lt;shortabstract&gt;$values{'shortabstract'}&lt;/shortabstract&gt;  
 &lt;/LonCapaResource&gt;  
 </pre>  </pre>
 $values{'extrashow'}  $values{'extrashow'}
 <hr align='left' width='200' noshade />  <hr align='left' width='200' noshade />

Removed from v.1.209  
changed lines
  Added in v.1.219


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