Diff for /loncom/interface/lonsearchcat.pm between versions 1.202 and 1.213

version 1.202, 2004/01/02 19:23:47 version 1.213, 2004/04/21 15:48:34
Line 48  described at http://www.lon-capa.org. Line 48  described at http://www.lon-capa.org.
 lonsearchcat presents the user with an interface to search the LON-CAPA  lonsearchcat presents the user with an interface to search the LON-CAPA
 digital library.  lonsearchcat also initiates the execution of a search  digital library.  lonsearchcat also initiates the execution of a search
 by sending the search parameters to LON-CAPA servers.  The progress of   by sending the search parameters to LON-CAPA servers.  The progress of 
 search (on a server basis) is displayed to the user in a seperate window.  search (on a server basis) is displayed to the user in a separate window.
   
 =head1 Internals  =head1 Internals
   
Line 73  use Apache::lonmysql(); Line 73  use Apache::lonmysql();
 use Apache::lonmeta;  use Apache::lonmeta;
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
 use Apache::lonlocal;  use Apache::lonlocal;
   use LONCAPA::lonmetadata();
   use HTML::Entities();
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 148  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 163  sub handler { Line 166  sub handler {
             '_'.&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();
       if (exists($ENV{'request.course.id'}) && $ENV{'request.course.id'} ne '') {
           &Apache::lonhtmlcommon::add_breadcrumb
                ({href=>'/adm/searchcat?'.
                      'catalogmode='.$ENV{'form.catalogmode'}.
                      '&launch='.$ENV{'form.launch'}.
                      '&mode='.$ENV{'form.mode'},
                 text=>"Course and Catalog Search",
                 bug=>'Searching',});
       } else {
           &Apache::lonhtmlcommon::add_breadcrumb
                ({href=>'/adm/searchcat?'.
                      'catalogmode='.$ENV{'form.catalogmode'}.
                      '&launch='.$ENV{'form.launch'}.
                      '&mode='.$ENV{'form.mode'},
                 text=>"Catalog Search",
                 bug=>'Searching',});
       }
       #
     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:Unable to recover data ".              &Apache::lonnet::logthis("lonsearchcat:Unable to recover data ".
Line 263  END Line 285  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';
       if ($ENV{'form.phase'} eq 'adv_search' ||
           $ENV{'form.phase'} eq 'disp_adv') {
           $ENV{'form.searchmode'} = 'advanced';
       } elsif ($ENV{'form.phase'} eq 'course_search') {
           $ENV{'form.searchmode'} = 'course_search';
       }
       #
       if ($ENV{'form.searchmode'} eq 'advanced') {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/searchcat?phase=disp_adv&'.
                     'catalogmode='.$ENV{'form.catalogmode'}.
                     '&launch='.$ENV{'form.launch'}.
                     '&mode='.$ENV{'form.mode'},
                     text=>"Advanced Search",
                     bug=>'Searching',});
       } elsif ($ENV{'form.searchmode'} eq 'course search') {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/searchcat?phase=disp_adv&'.
                     'catalogmode='.$ENV{'form.catalogmode'}.
                     '&launch='.$ENV{'form.launch'}.
                     '&mode='.$ENV{'form.mode'},
                     text=>"Course Search",
                     bug=>'Searching',});
       }
     ##      ##
     ## Switch on the phase      ## Switch on the phase
     ##      ##
Line 287  END Line 335  END
         &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')) {
         $ENV{'form.searchmode'} = 'basic';  
         if ($ENV{'form.phase'} eq 'adv_search') {  
             $ENV{'form.searchmode'} = 'advanced';  
         }  
         # 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 359  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 375  sub course_search { Line 422  sub course_search {
     my @allwords=($search_string,@New_Words);      my @allwords=($search_string,@New_Words);
     $totalfound=0;      $totalfound=0;
     $r->print('<html><head><title>LON-CAPA Course Search</title></head>'.      $r->print('<html><head><title>LON-CAPA Course Search</title></head>'.
       $bodytag.$pretty_search_string);        $bodytag.'<hr /><center><font size="+2" face="arial">'.$pretty_search_string.'</font></center><hr />');
     $r->rflush();      $r->rflush();
 # ======================================================= Go through the course  # ======================================================= Go through the course
     undef %alreadyseen;      undef %alreadyseen;
Line 452  sub untiehash { Line 499  sub untiehash {
   
 } # End of course search scoping  } # End of course search scoping
   
   sub search_html_header {
       my $Str = <<ENDHEADER;
   <html>
   <head>
   <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>
   ENDHEADER
       return $Str;
   }
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
Line 459  sub untiehash { Line 523  sub untiehash {
   
 =item &print_basic_search_form()   =item &print_basic_search_form() 
   
 Returns a scalar which holds html for the basic search form.  Prints the form for the basic search.  Sorry the name is so cryptic.
   
 =cut  =cut
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   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').
     my $scrout=<<"ENDDOCUMENT";          &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching','Finding_Resources',
 <html>                                              undef,undef,! $ENV{'form.launch'});
 <head>      my $scrout = &search_html_header().$bodytag;
 <title>The LearningOnline Network with CAPA</title>      if (&Apache::lonnet::allowed('bre',$ENV{'request.role.domain'})) {
 <script type="text/javascript">          # Define interface components
     function openhelp(val) {          my $userelatedwords=
  openhelpwin=open('/adm/help/searchcat.html','helpscreen',              &mt('[_1] use related words',
      'scrollbars=1,width=600,height=300');                  &Apache::lonhtmlcommon::checkbox
  openhelpwin.focus();                  ('related',$ENV{'form.related'}));
     }          my $onlysearchdomain=
 </script>              &mt('[_1] only search domain [_2]',
 </head>                  &Apache::lonhtmlcommon::checkbox
 $bodytag                  ('domains',$ENV{'form.domains'}),
 ENDDOCUMENT                  $r->dir_config('lonDefDomain'));
 if (&Apache::lonnet::allowed('bre',$ENV{'request.role.domain'})) {          my $adv_search_link = 
     my $CatalogSearch=&mt('Catalog Search');              '<a href="/adm/searchcat?'.
     my $Statement=&searchhelp();              'phase=disp_adv&'.
     $scrout.=(<<ENDDOCUMENT);              'catalogmode='.$ENV{'form.catalogmode'}.
 <h1>$CatalogSearch</h1>              '&launch='.$ENV{'form.launch'}.
 <form name="loncapa_search" method="post" action="/adm/searchcat">              '&mode='.$ENV{'form.mode'}.
 <input type="hidden" name="phase" value="basic_search" />              '">'.&mt('Advanced Search').'</a>';
 $hidden_fields          #
 <p>          $scrout.='<form name="loncapa_search" method="post" '.
 $Statement.              'action="/adm/searchcat">'.
 </p>              '<input type="hidden" name="phase" value="basic_search" />'.
 <p>              $hidden_fields;
 <table>          #
 <tr><td>          $scrout .= '<center>'.$/;
 ENDDOCUMENT          if ($ENV{'request.course.id'}) {
     $scrout.='&nbsp;'.&Apache::lonhtmlcommon::textbox('basicexp',              $scrout .= '<h1>'.&mt('LON-CAPA Catalog Search').'</h1>';
                                             $ENV{'form.basicexp'},40).          } else {
         '&nbsp;';              # No need to tell them they are searching
     my $relatedcheckbox = &Apache::lonhtmlcommon::checkbox('related',              $scrout.= ('<br />'x2);
  $ENV{'form.related'});          }
     my $domain = $r->dir_config('lonDefDomain');          $scrout.='<table>'.
     my $domaincheckbox = &Apache::lonhtmlcommon::checkbox('domains',              '<tr><td align="center" valign="top">'.
  $ENV{'form.domains'});              &Apache::lonhtmlcommon::textbox('basicexp',
     my $srch=&mt('Search');                                              $ENV{'form.basicexp'},50).'<br />'.
     my $header=&mt('Advanced Search');              '<font size="-1">'.&searchhelp().'</font>'.'</td>'.
     my $userelatedwords=&mt('use related words');              '<td><font size="-1">'.
     my $onlysearchdomain=&mt('only search domain');              '<nobr>'.('&nbsp;'x3).$adv_search_link.'</nobr>'.'<br />'.
     my $view=&viewoptions();              '<nobr>'.('&nbsp;'x1).$userelatedwords.'</nobr>'.'<br />'.
     $scrout.=<<END;              '<nobr>'.('&nbsp;'x1).$onlysearchdomain.'</nobr>'.'<br />'.
 </td><td><a              '</font></td>'.
 href="/adm/searchcat?phase=disp_adv&catalogmode=$ENV{'form.catalogmode'}&launch=$ENV{'form.launch'}&mode=$ENV{'form.mode'}"              '</tr>'.$/;
 >$header</a></td></tr>          #
 <tr><td>$relatedcheckbox $userelatedwords</td>  #        $scrout .= '<tr><td align="center">'.
     <td>$domaincheckbox $onlysearchdomain <b>$domain</b></td></tr>  #            '<font size="-1">'.
 </table>  #            $userelatedwords.('&nbsp;'x3).
 </p>  #            $onlysearchdomain.('&nbsp;'x2).$adv_search_link.
 $view  #            '</font>'.
 <p>  #            '</td></tr>'.$/;
 &nbsp;<input type="submit" name="basicsubmit" value='$srch' />&nbsp;          $scrout .= '<tr><td align="center" colspan="2">'.
 $closebutton              '<font size="-1">'.
 END              '<input type="submit" name="basicsubmit" '.
     $scrout.=<<ENDDOCUMENT;              'value="'.&mt('Search').'" />'.
 </p>              ('&nbsp;'x2).$closebutton.('&nbsp;'x2).&viewoptions().
 </form>              '</font>'.
 ENDDOCUMENT              '</td></tr>'.$/;
           $scrout .= '</table>'.$/.'</center>'.'</form>';
     }      }
     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 566  ENDCOURSESEARCH Line 630  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 582  ENDDOCUMENT Line 648  ENDDOCUMENT
   
 =item &advanced_search_form()   =item &advanced_search_form() 
   
 Returns a scalar which holds html for the advanced search form.  Prints the advanced search form.
   
 =cut  =cut
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
 sub print_advanced_search_form{  sub print_advanced_search_form{
     my ($r,$closebutton,$hidden_fields) = @_;      my ($r,$closebutton,$hidden_fields) = @_;
     my %lt=&Apache::lonlocal::texthash('srch' => 'Search',      my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
Line 600  sub print_advanced_search_form{ Line 665  sub print_advanced_search_form{
 <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()" />  <input type="button" value="$lt{'help'}" onClick="openhelp()" />
 </p>  
 END  END
     my $bodytag=&Apache::loncommon::bodytag('Advanced Catalog Search');      my $bodytag=&Apache::loncommon::bodytag('Advanced Catalog Search').
           &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching',
                                               'Finding_Resources',
                                               undef,undef,
                                               ! $ENV{'form.launch'});
     my $searchhelp=&searchhelp();      my $searchhelp=&searchhelp();
     my $scrout=<<"ENDHEADER";      my $scrout=&search_html_header();
 <html>      $scrout .= <<"ENDHEADER";
 <head>  
 <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>  
 $bodytag  $bodytag
 $searchhelp  
 <form method="post" action="/adm/searchcat" name="advsearch">  <form method="post" action="/adm/searchcat" name="advsearch">
 $advanced_buttons  $advanced_buttons
 $hidden_fields  
 <input type="hidden" name="phase" value="adv_search" />  
 ENDHEADER  ENDHEADER
     $scrout.=&viewoptions();      $scrout.=('&nbsp;'x2).&viewoptions().'</p>'.$hidden_fields. 
           '<input type="hidden" name="phase" value="adv_search" />';
     my %fields=&Apache::lonmeta::fieldnames();      my %fields=&Apache::lonmeta::fieldnames();
       #
     $scrout.='<table>';      $scrout.= '<p>'.$searchhelp.'</p>'.
     $scrout.="<tr><th>".&mt('Field').'</th><th>'.&mt('Value').'</th><th>'          "<table>\n";
  .&mt('Related').'<br />'.&mt('Words')."</td></tr>\n";      my %related_word_search = 
     foreach ('title','author','owner','authorspace','modifyinguser',          ('title'=>1,
      'keywords','notes','abstract','standards',           'author'=>0,
      'lowestgradelevel','highestgradelevel','mime') {           'owner'=>0,
  $scrout.='<tr bgcolor="#FFFFBB"><td>'.&titlefield($fields{$_}).'</td><td>'.           'authorspace'=>0,
     &Apache::lonmeta::prettyinput($_,$ENV{'form.'.$_},$_,'advsearch',           'modifyinguser'=>0,
   1,'</td><td>',$ENV{'form.'.$_.'_related'}).           'keywords'=>1,
     '</td></tr>';           'notes'=>1,
            'abstract'=>1,
            'standards'=>1,
            'mime'=>1,
            );
       #
       foreach my $field ('title','author','owner','authorspace','modifyinguser',
        'keywords','notes','abstract','standards','mime') {
    $scrout.='<tr><td align="right">'.&titlefield($fields{$field}).'</td><td>'.
       &Apache::lonmeta::prettyinput($field,
                                             $ENV{'form.'.$field},
                                             $field,
                                             'advsearch',
     $related_word_search{$field},
                                             '</td><td align="left">',
                                             $ENV{'form.'.$field.'_related'},
                                             50);
           if ($related_word_search{$field}) {
               $scrout .= 'related words';
           } else {
               $scrout .= '</td><td>&nbsp;';
           }
           $scrout .= '</td></tr>'.$/;
       }
       foreach my $field ('lowestgradelevel','highestgradelevel') {
    $scrout.='<tr>'.
               '<td align="right">'.&titlefield($fields{$field}).'</td>'.
               '<td colspan="2">'.
       &Apache::lonmeta::prettyinput($field,
                                             $ENV{'form.'.$field},
                                             $field,
                                             'advsearch',
     0).
                                             '</td></tr>'.$/;
     }      }
     $scrout.='<tr bgcolor="#FFFFBB"><td>'.      $scrout.='<tr><td align="right">'.
  &titlefield(&mt('MIME Type Category')).'</td><td>'.    &titlefield(&mt('MIME Type Category')).'</td><td colspan="2">'. 
     &Apache::loncommon::filecategoryselect('category',      &Apache::loncommon::filecategoryselect('category',
    $ENV{'form.category'}).     $ENV{'form.category'}).
     '</td><td>&nbsp;</td></td></tr>';      '</td></tr>'.$/;
     $scrout.='<tr bgcolor="#FFFFBB"><td>'.      $scrout.='<tr><td align="right" valign="top">'.
  &titlefield(&mt('Limit Search to Domains')).'</td><td>'.    &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><td>&nbsp;</td></td></tr>';      '</td></tr>'.$/;
     my %dates=&Apache::lonlocal::texthash('creationdatestart'     => 'Creation Date After',      $scrout .= "</table>\n<br />\n<table>\n";
     'creationdateend'       => 'Creation Date Before',      my %dates=&Apache::lonlocal::texthash
   'lastrevisiondatestart' => 'Last Revision Date After',          ('creationdatestart'     => 'Creation Date After',
   'lastrevisiondateend'   => 'Last Revision Date Before');           'creationdateend'       => 'Creation Date Before',
     foreach (sort keys %dates) {           'lastrevisiondatestart' => 'Last Revision Date After',
  $scrout.='<tr bgcolor="#FFFFBB"><td>'.&titlefield($dates{$_}).'</td><td>'.            'lastrevisiondateend'   => 'Last Revision Date Before');
     &Apache::lonhtmlcommon::date_setter('advsearch',$_,0,'',1).      foreach my $field (sort keys %dates) {
     '</td><td>&nbsp;</td></td></tr>';   $scrout.='<tr>'.
               '<td align="right">'.&titlefield($dates{$field}).'</td><td>'. 
       &Apache::lonhtmlcommon::date_setter('advsearch',$field,0,'',1).
       '</td></tr>'.$/;
     }      }
   
     $scrout.="</table>\n";      $scrout.="</table>\n";
   
     $scrout.=<<ENDDOCUMENT;      $scrout.=<<ENDDOCUMENT;
 $advanced_buttons  $advanced_buttons
 </form>  </form>
Line 668  ENDDOCUMENT Line 758  ENDDOCUMENT
     $r->print($scrout);      $r->print($scrout);
     return;      return;
 }  }
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
 =pod   =pod 
   
 =item &titlefield  =item &titlefield()
   
 Inputs: title text  Inputs: title text
   
Line 683  Outputs: titletext with font wrapper Line 774  Outputs: titletext with font wrapper
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
 sub titlefield {  sub titlefield {
     my $title=shift;      my $title=shift;
     return '<font face="arial" color="#800000">'.$title.'</font>';      return $title;
 }  }
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
 =pod   =pod 
   
 =item viewoptiontext  =item viewoptiontext()
   
 Inputs: codename for view option  Inputs: codename for view option
   
Line 703  Outputs: displayed text Line 794  Outputs: displayed text
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
 sub viewoptiontext {  sub viewoptiontext {
     my $code=shift;      my $code=shift;
     my %desc=&Apache::lonlocal::texthash('detailed' => "Detailed Citation View",      my %desc=&Apache::lonlocal::texthash
  'xml' => 'XML/SGML',          ('detailed' => "Detailed Citation View",
  'compact' => 'Compact View',           'xml' => 'XML/SGML',
  'fielded' => 'Fielded Format',           'compact' => 'Compact View',
  'summary' => 'Summary View');           'fielded' => 'Fielded Format',
            'summary' => 'Summary View');
     return $desc{$code};      return $desc{$code};
 }  }
   
   ######################################################################
 ######################################################################  ######################################################################
   
 =pod   =pod 
   
 =item viewoptions  =item viewoptions()
   
 Inputs: none  Inputs: none
   
Line 727  Outputs: text for box with view options Line 820  Outputs: text for box with view options
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
 sub viewoptions {  sub viewoptions {
     my $scrout="\n\n".'<table bgcolor="#FFFFBB"><tr><th>'.&mt('View Options').'</th><th>'.      my $scrout="\n".'<nobr>';
  &mt('Records per Page').'</th></tr><tr><td>';      if (! defined($ENV{'form.viewselect'})) { 
     unless ($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.='</td><td>';      $scrout.= '&nbsp;&nbsp;';
     $scrout.=&Apache::lonmeta::selectbox('show',      $scrout.=&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.="</td></tr></table>\n\n";      $scrout .= ('&nbsp;'x2).&mt('Records per Page').'</nobr>'.$/;
     return $scrout;      return $scrout;
 }  }
   
 ######################################################################  ######################################################################
   ######################################################################
   
 =pod   =pod 
   
 =item searchhelp  =item searchhelp()
   
 Inputs: none  Inputs: none
   
Line 759  Outputs: return little blurb on how to e Line 853  Outputs: return little blurb on how to e
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
 sub searchhelp {  sub searchhelp {
     return &mt('Enter terms or phrases separated by AND, OR, or NOT');      return &mt('Enter terms or phrases separated by AND, OR, or NOT');
 }  }
Line 769  sub searchhelp { Line 862  sub searchhelp {
   
 =pod   =pod 
   
 =item &get_persistent_form_data  =item &get_persistent_form_data()
   
 Inputs: filename of database  Inputs: filename of database
   
Line 824  sub get_persistent_form_data { Line 917  sub get_persistent_form_data {
   
 =pod   =pod 
   
 =item &get_persistent_data  =item &get_persistent_data()
   
 Inputs: filename of database, ref to array of values to recover.  Inputs: filename of database, ref to array of values to recover.
   
Line 875  Inputs: Hash of values to save, filename Line 968  Inputs: Hash of values to save, filename
   
 Store variables away to the %persistent_db.  Store variables away to the %persistent_db.
 Values will be escaped.  Values that are array pointers will have their  Values will be escaped.  Values that are array pointers will have their
 elements escaped and concatenated in a comma seperated string.    elements escaped and concatenated in a comma separated string.  
   
 =cut  =cut
   
Line 907  Inputs: filename of persistent database. Line 1000  Inputs: filename of persistent database.
   
 Store most form variables away to the %persistent_db.  Store most form variables away to the %persistent_db.
 Values will be escaped.  Values that are array pointers will have their  Values will be escaped.  Values that are array pointers will have their
 elements escaped and concatenated in a comma seperated string.    elements escaped and concatenated in a comma separated string.  
   
 =cut  =cut
   
Line 983  sub parse_advanced_search { Line 1076  sub parse_advanced_search {
     $fillflag++;      $fillflag++;
  }   }
     }      }
     unless ($fillflag) {      if (! $fillflag) {
  &output_blank_field_error($r,$closebutton,'phase=disp_adv',$hidden_fields);   &output_blank_field_error($r,$closebutton,
                                     'phase=disp_adv',$hidden_fields);
  return ;   return ;
     }      }
     # Turn the form input into a SQL-based query      # Turn the form input into a SQL-based query
Line 1035  sub parse_advanced_search { Line 1129  sub parse_advanced_search {
         $pretty_search_string .=$font.'mime</font> contains <b>'.          $pretty_search_string .=$font.'mime</font> contains <b>'.
             $searchphrase.'</b><br />';              $searchphrase.'</b><br />';
     }      }
     #####      #
     # Evaluate option lists      # Evaluate option lists
     if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {      if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {
  push @queries,"(language like \"$ENV{'form.language'}\")";   push @queries,"(language like \"$ENV{'form.language'}\")";
Line 1074  sub parse_advanced_search { Line 1168  sub parse_advanced_search {
         # date query information.          # date query information.
  push @queries,$datequery;   push @queries,$datequery;
     }      }
       #
     # Process form information for custom metadata querying      # Process form information for custom metadata querying
     my $customquery=undef;      my $customquery=undef;
 #    if ($ENV{'form.custommetadata'}) {      ##
 #        $pretty_search_string .=$font."Custom Metadata Search</font>: <b>".      ## The custom metadata search was removed q long time ago mostly 
 #            $ENV{'form.custommetadata'}."</b><br />\n";      ## because I was unable to figureout exactly how it worked and could
 # $customquery=&build_custommetadata_query('custommetadata',      ## not imagine people actually using it.  MH
 #      $ENV{'form.custommetadata'});      ##
 #    }      # if ($ENV{'form.custommetadata'}) {
       #    $pretty_search_string .=$font."Custom Metadata Search</font>: <b>".
       #    $ENV{'form.custommetadata'}."</b><br />\n";
       #    $customquery=&build_custommetadata_query('custommetadata',
       #                                             $ENV{'form.custommetadata'});
       # }
     my $customshow=undef;      my $customshow=undef;
 #    if ($ENV{'form.customshow'}) {      # if ($ENV{'form.customshow'}) {
 #        $pretty_search_string .=$font."Custom Metadata Display</font>: <b>".      # $pretty_search_string .=$font."Custom Metadata Display</font>: <b>".
 #            $ENV{'form.customshow'}."</b><br />\n";      #                         $ENV{'form.customshow'}."</b><br />\n";
 # $customshow=$ENV{'form.customshow'};      #    $customshow=$ENV{'form.customshow'};
 # $customshow=~s/[^\w\s]//g;      #    $customshow=~s/[^\w\s]//g;
 # my @fields=split(/\s+/,$customshow);      #    my @fields=split(/\s+/,$customshow);
 # $customshow=join(" ",@fields);      #    $customshow=join(" ",@fields);
 #    }      # }
     ## ---------------------------------------------------------------      ##
     ## Deal with restrictions to given domains      ## Deal with restrictions to given domains
     ##       ## 
     my ($libraries_to_query,$pretty_domains_string) =       my ($libraries_to_query,$pretty_domains_string) = 
Line 1121  sub parse_domain_restrictions { Line 1221  sub parse_domain_restrictions {
     } else {      } else {
         @allowed_domains = ($ENV{'form.domains'});          @allowed_domains = ($ENV{'form.domains'});
     }      }
       #
     my %domain_hash = ();      my %domain_hash = ();
     my $pretty_domains_string;      my $pretty_domains_string;
     foreach (@allowed_domains) {      foreach (@allowed_domains) {
Line 1161  Parse the basic search form and return a Line 1262  Parse the basic search form and return a
 ######################################################################  ######################################################################
 sub parse_basic_search {  sub parse_basic_search {
     my ($r,$closebutton)=@_;      my ($r,$closebutton)=@_;
       #
     # 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;
Line 1173  sub parse_basic_search { Line 1275  sub parse_basic_search {
     }      }
     my ($libraries_to_query,$pretty_domains_string) =       my ($libraries_to_query,$pretty_domains_string) = 
         &parse_domain_restrictions();          &parse_domain_restrictions();
     # Check to see if enough is filled in      #
       # Check to see if enough of a query is filled in
     unless (&filled($ENV{'form.basicexp'})) {      unless (&filled($ENV{'form.basicexp'})) {
  &output_blank_field_error($r,$closebutton,'phase=disp_basic');   &output_blank_field_error($r,$closebutton,'phase=disp_basic');
  return OK;   return OK;
Line 1189  sub parse_basic_search { Line 1292  sub parse_basic_search {
             $pretty_search_string .= " with no related words.";              $pretty_search_string .= " with no related words.";
         }          }
     }      }
       #
     # Build SQL query string based on form page      # Build SQL query string based on form page
     my $query='';      my $query='';
     my $concatarg=join(',',      my $concatarg=join(',',
Line 1201  sub parse_basic_search { Line 1305  sub parse_basic_search {
     }      }
     $pretty_search_string .= "<br />\n";      $pretty_search_string .= "<br />\n";
     my $final_query = 'SELECT * FROM metadata WHERE '.$query;      my $final_query = 'SELECT * FROM metadata WHERE '.$query;
 #    &Apache::lonnet::logthis($final_query);      # &Apache::lonnet::logthis($final_query);
     return ($final_query,$pretty_search_string,      return ($final_query,$pretty_search_string,
             $libraries_to_query);              $libraries_to_query);
 }  }
   
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
 =pod   =pod 
   
 =item &related_version  =item &related_version()
   
 Modifies an input string to include related words.  Words in the string  Modifies an input string to include related words.  Words in the string
 are replaced with parenthesized lists of 'OR'd words.  For example  are replaced with parenthesized lists of 'OR'd words.  For example
Line 1409  sub build_date_queries { Line 1512  sub build_date_queries {
   
 =item &copyright_check()  =item &copyright_check()
   
   Inputs: $Metadata, a hash pointer of metadata for a resource.
   
   Returns: 1 if the resource is available to the user making the query, 
            0 otherwise.
   
 =cut  =cut
   
 ######################################################################  ######################################################################
Line 1432  sub copyright_check { Line 1540  sub copyright_check {
     return 1;      return 1;
 }  }
   
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
 =pod  =pod
   
 =item &ensure_db_and_table  =item &ensure_db_and_table()
   
 Ensure we can get lonmysql to connect to the database and the table we  Ensure we can get lonmysql to connect to the database and the table we
 need exists.  need exists.
Line 1494  sub ensure_db_and_table { Line 1601  sub ensure_db_and_table {
   
 =pod  =pod
   
 =item &print_sort_form  =item &print_sort_form()
   
   The sort feature is not implemented at this time.  This form just prints 
   a link to change the search query.
   
 =cut  =cut
   
Line 1595  the following format: Line 1705  the following format:
   
 #####################################################################  #####################################################################
 #####################################################################  #####################################################################
   #
 my @Datatypes =   # These should probably be scoped but I don't have time right now...
     ( { name => 'id',   #
         type => 'MEDIUMINT',  my @Datatypes;
         restrictions => 'UNSIGNED NOT NULL',  my @Fullindicies;
         primary_key  => 'yes',  
         auto_inc     => 'yes' },  
       { name => 'title',     type=>'TEXT'},  
       { name => 'author',    type=>'TEXT'},  
       { name => 'subject',   type=>'TEXT'},  
       { name => 'url',       type=>'TEXT', restrictions => 'NOT NULL' },  
       { name => 'keywords',  type=>'TEXT'},  
       { name => 'version',   type=>'TEXT'},  
       { name => 'notes',     type=>'TEXT'},  
       { name => 'abstract',  type=>'TEXT'},  
       { name => 'mime',      type=>'TEXT'},  
       { name => 'language',  type=>'TEXT'},  
       { name => 'owner',     type=>'TEXT'},  
       { name => 'copyright', type=>'TEXT'},  
       { name => 'dependencies',     type=>'TEXT'},  
       { name => 'modifyinguser', type=>'TEXT'},  
       { name => 'authorspace', type=>'TEXT'},  
       { name => 'lowestgradelevel',  type=>'INT'},  
       { name => 'highestgradelevel', type=>'INT'},  
       { name => 'standards', type=>'TEXT'},  
       { name => 'count',     type=>'INT'},  
       { name => 'course', type=>'INT'},  
       { name => 'course_list',  type=>'TEXT'},  
       { name => 'goto', type=>'INT'},  
       { name => 'goto_list',  type=>'TEXT'},  
       { name => 'comefrom', type=>'INT'},  
       { name => 'comefrom_list',  type=>'TEXT'},  
       { name => 'sequsage', type=>'INT'},  
       { name => 'sequsage_list',  type=>'TEXT'},  
       { name => 'stdno', type=>'INT'},  
       { name => 'stdno_list',  type=>'TEXT'},  
       { name => 'avetries', type=>'FLOAT'},  
       { name => 'avetries_list',  type=>'TEXT'},  
       { name => 'difficulty', type=>'FLOAT'},  
       { name => 'difficulty_list',  type=>'TEXT'},  
       { name => 'clear',  type=>'FLOAT'},  
       { name => 'technical',  type=>'FLOAT'},  
       { name => 'correct',  type=>'FLOAT'},  
       { name => 'helpful',  type=>'FLOAT'},  
       { name => 'depth',  type=>'FLOAT'},  
       { name => 'hostname', type=> 'TEXT'},  
       #--------------------------------------------------  
       { name => 'creationdate',     type=>'DATETIME'},  
       { name => 'lastrevisiondate', type=>'DATETIME'},  
       #--------------------------------------------------  
       );  
   
 my @Fullindicies =   
     qw/title/;  
 #    qw/title author subject abstract mime language owner copyright/;  
           
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 1669  Returns: the identifier of the table on Line 1729  Returns: the identifier of the table on
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   sub set_up_table_structure {
       my ($datatypes,$fullindicies) = 
           &LONCAPA::lonmetadata::describe_metadata_storage();
       # Copy the table description before modifying it...
       @Datatypes = @{$datatypes};
       unshift(@Datatypes,{name => 'id',  
           type => 'MEDIUMINT',
           restrictions => 'UNSIGNED NOT NULL',
           primary_key  => 'yes',
           auto_inc     => 'yes' });
       @Fullindicies = @{$fullindicies};
       return;
   }
   
 sub create_results_table {  sub create_results_table {
       &set_up_table_structure();
     my $table = &Apache::lonmysql::create_table      my $table = &Apache::lonmysql::create_table
         ( { columns => \@Datatypes,          ( { columns => \@Datatypes,
             FULLTEXT => [{'columns' => \@Fullindicies},],              FULLTEXT => [{'columns' => \@Fullindicies},],
Line 1739  sub update_seconds { Line 1814  sub update_seconds {
   
 =pod  =pod
   
 =item &revise_button  =item &revise_button()
   
 Inputs: None  Inputs: None
   
Line 1766  sub revise_button { Line 1841  sub revise_button {
   
 =pod  =pod
   
 =item &run_search   =item &run_search()
   
   Executes a search query by sending it the the other servers and putting the
   results into MySQL.
   
 =cut  =cut
   
Line 1802  END Line 1880  END
     $r->rflush();      $r->rflush();
     #      #
     # Determine the servers we need to contact.      # Determine the servers we need to contact.
     #  
     my @Servers_to_contact;      my @Servers_to_contact;
     if (defined($serverlist)) {      if (defined($serverlist)) {
         if (ref($serverlist) eq 'ARRAY') {          if (ref($serverlist) eq 'ARRAY') {
Line 1830  END Line 1907  END
         return;          return;
     }      }
     if (! $table_status) {      if (! $table_status) {
           &Apache::lonnet::logthis("lonmysql error = ".
                                    &Apache::lonmysql::get_error());
           &Apache::lonnet::logthis("lonmysql debug = ".
                                    &Apache::lonmysql::get_debug());
           &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.</body></html>");
         return;          return;
     }      }
     ##      ##
     ## Prepare for the big loop.      ## Prepare for the big loop.
     ##  
     my $hitcountsum;      my $hitcountsum;
     my $server;       my $server; 
     my $status;      my $status;
Line 1855  END Line 1936  END
 END  END
     $r->rflush();      $r->rflush();
     my $time_remaining = $max_time - (time - $starttime) ;      my $time_remaining = $max_time - (time - $starttime) ;
       $time_remaining = 0 if ($time_remaining <0);
     my $last_time = $time_remaining;      my $last_time = $time_remaining;
     &update_seconds($r,$time_remaining);      &update_seconds($r,$time_remaining);
     &update_status($r,'contacting '.$Servers_to_contact[0]);      &update_status($r,'contacting '.$Servers_to_contact[0]);
     while (($time_remaining > 0) &&      while (($time_remaining > 0) &&
            ((@Servers_to_contact) || keys(%Server_status))) {             ((@Servers_to_contact) || keys(%Server_status))) {
           $time_remaining = $max_time - (time - $starttime) ;
           &update_seconds($r,$time_remaining);
         # Send out a search request if it needs to be done.          # Send out a search request if it needs to be done.
         if (@Servers_to_contact) {          if (@Servers_to_contact) {
             # Contact one server              # Contact one server
Line 1881  END Line 1965  END
             sleep(1)              sleep(1)
         }          }
         #          #
         #  
         # Loop through the servers we have contacted but do not          # Loop through the servers we have contacted but do not
         # 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());
               $time_remaining = $max_time - (time - $starttime) ;
               $time_remaining = 0 if ($time_remaining < 0);
               if ($last_time - $time_remaining > 0) {
                   $last_time = $time_remaining;
                   &update_seconds($r,$time_remaining);
               }
             if ($status eq 'con_lost') {              if ($status eq 'con_lost') {
                 delete ($Server_status{$server});                  delete ($Server_status{$server});
                 next;                  next;
Line 1928  END Line 2017  END
                     # $r->print(&Apache::lonmysql::get_debug());                      # $r->print(&Apache::lonmysql::get_debug());
                     $hitcountsum ++;                      $hitcountsum ++;
                     $time_remaining = $max_time - (time - $starttime) ;                      $time_remaining = $max_time - (time - $starttime) ;
                       $time_remaining = 0 if ($time_remaining < 0);
                     if ($last_time - $time_remaining > 0) {                      if ($last_time - $time_remaining > 0) {
                         &update_seconds($r,$time_remaining);                          &update_seconds($r,$time_remaining);
                         $last_time = $time_remaining;                          $last_time = $time_remaining;
Line 1955  END Line 2045  END
     }      }
     &update_status($r,&mt('Search Complete').$server);      &update_status($r,&mt('Search Complete').$server);
     &update_seconds($r,0);      &update_seconds($r,0);
       #
     &Apache::lonmysql::disconnect_from_db();      &Apache::lonmysql::disconnect_from_db();
       #
     # We have run out of time or run out of servers to talk to and      # We have run out of time or run out of servers to talk to and
     # results to get.        # results to get.  
     $r->print("</body></html>");      $r->print("</body></html>");
Line 1971  END Line 2063  END
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
 =pod  =pod
   
 =item &prev_next_buttons  =item &prev_next_buttons()
   
   Returns html for the previous and next buttons on the search results page.
   
 =cut  =cut
   
Line 1988  sub prev_next_buttons { Line 2083  sub prev_next_buttons {
     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) {      if ($prev_min < $current_min) {
         $links .= qq{          $links .= 
 <a href="/adm/searchcat?$parms&start=$prev_min&show=$show">prev</a>              qq{<a href="/adm/searchcat?$parms&start=$prev_min&show=$show">}.
 };                  &mt('prev').'</a>';
     } else {      } else {
         $links .= 'prev';          $links .= &mt('prev');
     }      }
     ##      ##
     ## Pages.... Someday.      ## Pages.... Someday.
     ##      ##
     $links .= qq{ &nbsp;      $links .= 
 <a href="/adm/searchcat?$parms&start=$current_min&$show=$show">reload</a>          qq{&nbsp;
 };             <a href="/adm/searchcat?$parms&start=$current_min&$show=$show">}.
                   &mt('reload').'</a>';
     ##      ##
     ## Next      ## 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) {      if ($next_min != $current_min) {
         $links .= qq{ &nbsp;          $links .= 
 <a href="/adm/searchcat?$parms&start=$next_min&show=$show">next</a>              qq{&nbsp;
 };                     <a href="/adm/searchcat?$parms&start=$next_min&show=$show">}.
                       &mt('next').'</a>';
     } else {      } else {
         $links .= '&nbsp;next';          $links .= '&nbsp;'.&mt('next');
     }      }
     return $links;      return $links;
 }  }
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
 =pod  =pod
   
 =item &display_results  =item &display_results()
   
   Prints the results out for selection and perusal.
   
 =cut  =cut
   
Line 2046  sub display_results { Line 2146  sub display_results {
     ##      ##
     my $action = "/adm/searchcat?phase=results";      my $action = "/adm/searchcat?phase=results";
     ##      ##
     ## Deal with groupsearch      ## 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)) {
Line 2058  sub display_results { Line 2157  sub display_results {
     }      }
     ##      ##
     ## 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></body></html>");
Line 2074  sub display_results { Line 2171  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'}  = 'all'  if (! exists($ENV{'form.show'}));      $ENV{'form.show'}  = 'all'  if (! exists($ENV{'form.show'}));
     my $min = $ENV{'form.start'};      my $min = $ENV{'form.start'};
Line 2087  sub display_results { Line 2183  sub display_results {
     }      }
     ##      ##
     ## Output links (if necessary) for 'prev' and 'next' pages.      ## Output links (if necessary) for 'prev' and 'next' pages.
     ##  
     $r->print      $r->print
         ('<center>'.          ('<center>'.
          &prev_next_buttons($min,$ENV{'form.show'},$total_results,           &prev_next_buttons($min,$ENV{'form.show'},$total_results,
Line 2107  sub display_results { Line 2202  sub display_results {
     }      }
     ##      ##
     ## Get results from MySQL table      ## Get results from MySQL table
     ##  
     my @Results = &Apache::lonmysql::get_rows($table,      my @Results = &Apache::lonmysql::get_rows($table,
                                               'id>='.$min.' AND id<='.$max);                                                'id>='.$min.' AND id<='.$max);
     ##      ##
     ## Loop through the results and output them.      ## Loop through the results and output them.
     ##  
     foreach my $row (@Results) {      foreach my $row (@Results) {
         if ($connection->aborted()) {          if ($connection->aborted()) {
             &cleanup();              &cleanup();
Line 2120  sub display_results { Line 2213  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
         $output.= &$viewfunction($prefix,%Fields);          $output.= &$viewfunction($prefix,%Fields);
         # Print them out as they come in.          # Print them out as they come in.
Line 2190  END Line 2287  END
   
 =pod  =pod
   
 =item &parse_row  =item &parse_row()
   
 Parse a row returned from the database.  Parse a row returned from the database.
   
Line 2201  Parse a row returned from the database. Line 2298  Parse a row returned from the database.
 sub parse_row {  sub parse_row {
     my @Row = @_;      my @Row = @_;
     my %Fields;      my %Fields;
       if (! scalar(@Datatypes)) {
           &set_up_table_structure();
       }
     for (my $i=0;$i<=$#Row;$i++) {      for (my $i=0;$i<=$#Row;$i++) {
         $Fields{$Datatypes[$i]->{'name'}}=&Apache::lonnet::unescape($Row[$i]);          $Fields{$Datatypes[$i]->{'name'}}=&Apache::lonnet::unescape($Row[$i]);
     }      }
Line 2236  The 'title' field is set to "Untitled" i Line 2336  The 'title' field is set to "Untitled" i
 ###########################################################  ###########################################################
 sub parse_raw_result {  sub parse_raw_result {
     my ($result,$hostname) = @_;      my ($result,$hostname) = @_;
 # conclude from self to others regarding fields      # conclude from self to others regarding fields
     my %Fields=&Apache::lonmeta::metadata_col_to_hash(      my %Fields=&LONCAPA::lonmetadata::metadata_col_to_hash
  map {          (map {
  &Apache::lonnet::unescape($_);              &Apache::lonnet::unescape($_);
  } (split(/\,/,$result))          } (split(/\,/,$result)) );
       );  
     return %Fields;      return %Fields;
 }  }
   
Line 2291  sub handle_custom_fields { Line 2390  sub handle_custom_fields {
   
 =pod  =pod
   
 =item &search_results_header  =item &search_results_header()
   
 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.
Line 2493  ENDFRAMES Line 2592  ENDFRAMES
 =item Metadata Viewing Functions  =item Metadata Viewing Functions
   
 Output is a HTML-ified string.  Output is a HTML-ified string.
   
 Input arguments are title, author, subject, url, keywords, version,  Input arguments are title, author, subject, url, keywords, version,
 notes, short abstract, mime, language, creation date,  notes, short abstract, mime, language, creation date,
 last revision date, owner, copyright, hostname, and  last revision date, owner, copyright, hostname, and
Line 2634  END Line 2734  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 />
Line 2683  END Line 2787  END
 sub filled {  sub filled {
     my ($field)=@_;      my ($field)=@_;
     if ($field=~/\S/ && $field ne 'any') {      if ($field=~/\S/ && $field ne 'any') {
  return 1;          return 1;
     }      } else {
     else {          return 0;
  return 0;  
     }      }
 }  }
   

Removed from v.1.202  
changed lines
  Added in v.1.213


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