Diff for /loncom/interface/lonsearchcat.pm between versions 1.258 and 1.290

version 1.258, 2006/03/19 22:08:38 version 1.290, 2008/02/13 11:20:24
Line 78  use HTML::Entities(); Line 78  use HTML::Entities();
 use Parse::RecDescent;  use Parse::RecDescent;
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
 use Apache::lonindexer();  use Apache::lonindexer();
   use LONCAPA;
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 137  sub handler { Line 138  sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
              ['catalogmode','launch','acts','mode','form','element','pause',               ['catalogmode','launch','acts','mode','form','element','pause',
               'phase','persistent_db_id','table','start','show',                'phase','persistent_db_id','table','start','show',
               'cleargroupsort','titleelement']);                'cleargroupsort','titleelement','area','inhibitmenu']);
     ##      ##
     ## The following is a trick - we wait a few seconds if asked to so      ## The following is a trick - we wait a few seconds if asked to so
     ##     the daemon running the search can get ahead of the daemon      ##     the daemon running the search can get ahead of the daemon
Line 153  sub handler { Line 154  sub handler {
     ##      ##
     my $domain  = $r->dir_config('lonDefDomain');      my $domain  = $r->dir_config('lonDefDomain');
     $diropendb= "/home/httpd/perl/tmp/".      $diropendb= "/home/httpd/perl/tmp/".
         "$env{'user.domain'}_$env{'user.name'}_searchcat.db";          "$env{'user.domain'}_$env{'user.name'}_sel_res.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 164  sub handler { Line 165  sub handler {
     }      }
   
     my $persistent_db_file = "/home/httpd/perl/tmp/".      my $persistent_db_file = "/home/httpd/perl/tmp/".
         &Apache::lonnet::escape($domain).          &escape($domain).
             '_'.&Apache::lonnet::escape($env{'user.name'}).              '_'.&escape($env{'user.name'}).
                 '_'.$env{'form.persistent_db_id'}.'_persistent_search.db';                  '_'.$env{'form.persistent_db_id'}.'_persistent_search.db';
     ##      ##
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
   
       my @allowed_searches = ('portfolio');
       if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {
           push(@allowed_searches,'res');
       } 
     if (exists($env{'request.course.id'}) && $env{'request.course.id'} ne '') {      if (exists($env{'request.course.id'}) && $env{'request.course.id'} ne '') {
         &Apache::lonhtmlcommon::add_breadcrumb          push(@allowed_searches,'course');
              ({href=>'/adm/searchcat?'.      }
                    'catalogmode='.$env{'form.catalogmode'}.      my $crumb_text = 'Portfolio Search';
                    '&launch='.$env{'form.launch'}.      if (@allowed_searches == 3) {
                    '&mode='.$env{'form.mode'},          $crumb_text = 'Course, Portfolio and Catalog Search';
               text=>"Course and Catalog Search",      } elsif (@allowed_searches ==2) {
               target=>'_top',          if (grep(/^res$/,@allowed_searches)) {
               bug=>'Searching',});              $crumb_text = 'Portfolio and Catalog Search'; 
     } else {          } elsif (grep(/^course$/,@allowed_searches)) {
         &Apache::lonhtmlcommon::add_breadcrumb              $crumb_text = 'Portfolio and Course Search';
              ({href=>'/adm/searchcat?'.          }
                    'catalogmode='.$env{'form.catalogmode'}.      }
                    '&launch='.$env{'form.launch'}.      &Apache::lonhtmlcommon::add_breadcrumb
                    '&mode='.$env{'form.mode'},         ({href=>'/adm/searchcat?'.
               text=>"Catalog Search",         &Apache::loncommon::inhibit_menu_check().
                  '&catalogmode='.$env{'form.catalogmode'}.
                  '&launch='.$env{'form.launch'}.
                  '&mode='.$env{'form.mode'},
                 text=>"$crumb_text",
               target=>'_top',                target=>'_top',
               bug=>'Searching',});                bug=>'Searching',});
     }  
     #      #
     if ($env{'form.phase'} !~ m/(basic|adv|course)_search/) {      if ($env{'form.phase'} !~ m/(basic|adv|course)_search/) {
         if (! &get_persistent_form_data($persistent_db_file)) {          if (! &get_persistent_form_data($persistent_db_file)) {
Line 199  sub handler { Line 208  sub handler {
     'We were unable to retrieve data describing your search. '.      'We were unable to retrieve data describing your search. '.
     'This is a serious error and has been logged. '.      'This is a serious error and has been logged. '.
     'Please alert your LON-CAPA administrator.';      'Please alert your LON-CAPA administrator.';
  return &error_page($r,$msg);   &Apache::loncommon::simple_error_page($r,'Search Error',
         $msg);
    return OK;
             }              }
         }          }
     } else {      } else {
Line 211  sub handler { Line 222  sub handler {
     untie %groupsearch_db if (tied(%groupsearch_db));      untie %groupsearch_db if (tied(%groupsearch_db));
     if (($env{'form.cleargroupsort'} eq '1') ||       if (($env{'form.cleargroupsort'} eq '1') || 
         (($env{'form.launch'} eq '1') &&           (($env{'form.launch'} eq '1') && 
          ($env{'form.catalogmode'} eq 'groupsearch'))) {           ($env{'form.catalogmode'} eq 'import'))) {
  if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) {   if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) {
     &start_fresh_session();      &start_fresh_session();
     untie %groupsearch_db;      untie %groupsearch_db;
Line 220  sub handler { Line 231  sub handler {
             # This is a stupid error to give to the user.                # This is a stupid error to give to the user.  
             # It really tells them nothing.              # It really tells them nothing.
     my $msg = 'Unable to tie hash to db file.';      my $msg = 'Unable to tie hash to db file.';
     return &error_page($r,$msg);      &Apache::loncommon::simple_error_page($r,'Search Error',
     $msg);
       return OK;
  }   }
     }      }
     ##      ##
Line 243  sub handler { Line 256  sub handler {
     if (exists($env{'form.mode'})) {      if (exists($env{'form.mode'})) {
         $hidden_fields .= &hidden_field('mode');          $hidden_fields .= &hidden_field('mode');
     }      }
       if (exists($env{'form.area'})) {
           $hidden_fields .= &hidden_field('area');
       }
       if (exists($env{'form.inhibitmenu'})) {
           $hidden_fields .= &hidden_field('inhibitmenu');
       }
     ##      ##
     ## Configure dynamic components of interface      ## Configure dynamic components of interface
     ##      ##
Line 254  sub handler { Line 273  sub handler {
             $closebutton .="onClick='self.close()'";              $closebutton .="onClick='self.close()'";
         }          }
         $closebutton .=">\n";          $closebutton .=">\n";
     } elsif ($env{'form.catalogmode'} eq 'groupsearch') {      } elsif ($env{'form.catalogmode'} eq 'import') {
         $closebutton="<input type='button' name='close' value='CLOSE' ";          $closebutton="<input type='button' name='close' value='CLOSE' ";
         if ($env{'form.phase'} =~ /(results|run_search)/) {          if ($env{'form.phase'} =~ /(results|run_search)/) {
     $closebutton .="onClick='parent.close()'";      $closebutton .="onClick='parent.close()'";
Line 288  END Line 307  END
     }      }
     #      #
     if ($env{'form.searchmode'} eq 'advanced') {      if ($env{'form.searchmode'} eq 'advanced') {
           my $srchtype = 'Catalog';
           if ($env{'form.area'} eq 'portfolio') {
               $srchtype = 'Portfolio';
           }
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/searchcat?phase=disp_adv&'.              ({href=>'/adm/searchcat?'.&Apache::loncommon::inhibit_menu_check().
                   'catalogmode='.$env{'form.catalogmode'}.    '&phase=disp_adv'.
                     '&catalogmode='.$env{'form.catalogmode'}.
                   '&launch='.$env{'form.launch'}.                    '&launch='.$env{'form.launch'}.
                   '&mode='.$env{'form.mode'},                    '&mode='.$env{'form.mode'},
                   text=>"Advanced Search",                    text=>"Advanced $srchtype Search",
                   bug=>'Searching',});                    bug=>'Searching',});
     } elsif ($env{'form.searchmode'} eq 'course search') {      } elsif ($env{'form.searchmode'} eq 'course search') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/searchcat?phase=disp_adv&'.              ({href=>'/adm/searchcat?'.&Apache::loncommon::inhibit_menu_check().
     '&phase=disp_adv'.
                   'catalogmode='.$env{'form.catalogmode'}.                    'catalogmode='.$env{'form.catalogmode'}.
                   '&launch='.$env{'form.launch'}.                    '&launch='.$env{'form.launch'}.
                   '&mode='.$env{'form.mode'},                    '&mode='.$env{'form.mode'},
Line 312  END Line 337  END
     } elsif ($env{'form.phase'} eq 'disp_adv') {      } elsif ($env{'form.phase'} eq 'disp_adv') {
         &print_advanced_search_form($r,$closebutton,$hidden_fields);          &print_advanced_search_form($r,$closebutton,$hidden_fields);
     } elsif ($env{'form.phase'} eq 'results') {      } elsif ($env{'form.phase'} eq 'results') {
         &display_results($r,$importbutton,$closebutton,$diropendb);          &display_results($r,$importbutton,$closebutton,$diropendb,
                            $env{'form.area'});
     } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {      } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {
         my ($query,$customquery,$customshow,$libraries,$pretty_string) =          my ($query,$customquery,$customshow,$libraries,$pretty_string) =
             &get_persistent_data($persistent_db_file,              &get_persistent_data($persistent_db_file,
Line 322  END Line 348  END
             &print_sort_form($r,$pretty_string);              &print_sort_form($r,$pretty_string);
         } elsif ($env{'form.phase'} eq 'run_search') {          } elsif ($env{'form.phase'} eq 'run_search') {
             &run_search($r,$query,$customquery,$customshow,              &run_search($r,$query,$customquery,$customshow,
                         $libraries,$pretty_string);                          $libraries,$pretty_string,$env{'form.area'});
         }          }
     } elsif ($env{'form.phase'} eq 'course_search') {      } elsif ($env{'form.phase'} eq 'course_search') {
         &course_search($r);          &course_search($r);
Line 352  END Line 378  END
                          $persistent_db_file);                           $persistent_db_file);
         #          #
         # Set up table          # Set up table
         if (! defined(&create_results_table())) {          if (! defined(&create_results_table($env{'form.area'}))) {
     my $errorstring=&Apache::lonmysql::get_error();      my $errorstring=&Apache::lonmysql::get_error();
             &Apache::lonnet::logthis('lonsearchcat.pm: Unable to create '.              &Apache::lonnet::logthis('lonsearchcat.pm: Unable to create '.
                                      'needed table.  lonmysql error:'.                                       'needed table.  lonmysql error:'.
                                      $errorstring);                                       $errorstring);
   
     my $msg =       my $msg = 
  'Unable to create table in which to store search results. '.   'Unable to create table in which to save search results. '.
  'The search has been aborted.';   'The search has been aborted.';
     return &error_page($r,$msg);      &Apache::loncommon::simple_error_page($r,'Search Error',
     $msg);
       return OK;
         }          }
         delete($env{'form.launch'});          delete($env{'form.launch'});
         if (! &make_form_data_persistent($r,$persistent_db_file)) {          if (! &make_form_data_persistent($r,$persistent_db_file)) {
     my $msg=      my $msg=
  'Unable to properly store search information. '.   'Unable to properly save search information. '.
  'The search has been aborted.';   'The search has been aborted.';
             return &error_page($r,$msg);      &Apache::loncommon::simple_error_page($r,'Search Error',
     $msg);
       return OK;
  }   }
         ##          ##
         ## Print out the frames interface          ## Print out the frames interface
Line 380  END Line 410  END
     return OK;      return OK;
 }   } 
   
 sub error_page {  
     my ($r,$msg) = @_;  
     $r->print(&Apache::loncommon::start_page('Search Error').  
       &mt($msg).  
       &Apache::loncommon::end_page());  
     return OK;  
 }  
   
 #  #
 # The mechanism used to store values away and retrieve them does not  # The mechanism used to store values away and retrieve them does not
 # handle the case of missing environment variables being significant.  # handle the case of missing environment variables being significant.
Line 505  sub course_search { Line 527  sub course_search {
             my $applies = 0;              my $applies = 0;
             my $symb = $resource->symb();              my $symb = $resource->symb();
             my $ressymb = $symb;              my $ressymb = $symb;
             if ($symb =~ m#(___adm/\w+/\w+)/(\d+)/bulletinboard$#) {              if ($symb =~ m#(___adm/$LONCAPA::domain_re/$LONCAPA::username_re)/(\d+)/bulletinboard$#) {
                 $ressymb = 'bulletin___'.$2.$1.'/'.$2.'/bulletinboard';                  $ressymb = 'bulletin___'.$2.$1.'/'.$2.'/bulletinboard';
                 unless ($ressymb =~ m#bulletin___\d+___adm/wrapper#) {                  unless ($ressymb =~ m#bulletin___\d+___adm/wrapper#) {
                     $ressymb=~s#(bulletin___\d+___)#$1adm/wrapper/#;                      $ressymb=~s#(bulletin___\d+___)#$1adm/wrapper/#;
Line 551  sub course_search { Line 573  sub course_search {
                 } else {                  } else {
                     $url .= '?symb=';                      $url .= '?symb=';
                 }                  }
                 $url .= &Apache::lonnet::escape($resource->symb());                  $url .= &escape($resource->symb());
                 my $title = $resource->compTitle();                  my $title = $resource->compTitle();
                 $r->print('<br /><a href="'.$url.'" target="cat">'.                  $r->print('<br /><a href="'.$url.'" target="cat">'.
                      ($title?$title:$url).'</a>&nbsp;&nbsp;-&nbsp;'.$disctype.'<br />');                       ($title?$title:$url).'</a>&nbsp;&nbsp;-&nbsp;'.$disctype.'<br />');
Line 587  sub checkonthis { Line 609  sub checkonthis {
     my ($extension)=($url=~/\.(\w+)$/);      my ($extension)=($url=~/\.(\w+)$/);
     if (&Apache::loncommon::fileembstyle($extension) eq 'ssi' &&      if (&Apache::loncommon::fileembstyle($extension) eq 'ssi' &&
  ($url) && ($fulltext)) {   ($url) && ($fulltext)) {
  $result.=&Apache::lonnet::ssi_body($url.'?symb='.&Apache::lonnet::escape($symb));   $result.=&Apache::lonnet::ssi_body($url.'?symb='.&escape($symb));
     }      }
     $result=~s/\s+/ /gs;      $result=~s/\s+/ /gs;
     my $applies = 0;      my $applies = 0;
Line 603  sub checkonthis { Line 625  sub checkonthis {
    $href=&Apache::lonenc::encrypted($href)     $href=&Apache::lonenc::encrypted($href)
        .'?symb='.&Apache::lonenc::encrypted($symb);         .'?symb='.&Apache::lonenc::encrypted($symb);
        } else {         } else {
    $href.='?symb='.&Apache::lonnet::escape($symb);     $href.='?symb='.&escape($symb);
        }         }
        $r->print('<a href="'.$href.'" target="cat">'.($title?$title:$url).         $r->print('<a href="'.$href.'" target="cat">'.($title?$title:$url).
  '</a><br />');   '</a><br />');
Line 658  Prints the form for the basic search.  S Line 680  Prints the form for the basic search.  S
 ######################################################################  ######################################################################
 sub print_basic_search_form {  sub print_basic_search_form {
     my ($r,$closebutton,$hidden_fields) = @_;      my ($r,$closebutton,$hidden_fields) = @_;
     my $result = ($env{'form.catalogmode'} ne 'groupsearch');      my $result = ($env{'form.catalogmode'} ne 'import');
     my $bread_crumb =      my $bread_crumb =
         &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching','Search_Basic',          &Apache::lonhtmlcommon::breadcrumbs('Searching','Search_Basic',
                                    undef,undef,      $env{'form.catalogmode'} ne 'import');
                                    $env{'form.catalogmode'} ne 'groupsearch');  
     my $scrout = &Apache::loncommon::start_page('Search').$bread_crumb;      my $scrout = &Apache::loncommon::start_page('Search').$bread_crumb;
   # Search form for resource space 
     if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {      if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {
         # Define interface components          $scrout .= &setup_basic_search($r,'res',$hidden_fields,$closebutton);
         my $userelatedwords= '<label>'.          $scrout .= '<hr /><br />';
             &mt('[_1] use related words',  
                 &Apache::lonhtmlcommon::checkbox  
                 ('related',$env{'form.related'},'related')).'</label>';  
         my $onlysearchdomain='<label>'.  
             &mt('[_1] only search domain [_2]',  
                 &Apache::lonhtmlcommon::checkbox('domains',  
                                                  $env{'form.domains'},  
                                                  $r->dir_config('lonDefDomain')  
                                                  ),  
                 $r->dir_config('lonDefDomain')  
                 ).'</label>';  
         my $inclext= '<label>'.  
             &mt('[_1] include external resources',  
                 &Apache::lonhtmlcommon::checkbox  
                 ('inclext',$env{'form.inclext'})).'</label>';  
         my $adv_search_link =   
             '<a href="/adm/searchcat?'.  
             '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',  
              &HTML::Entities::encode($env{'form.basicexp'},'<>&"'),50  
              ).  
              '<br />'.  
             '<font size="-1">'.&searchhelp().'</font>'.'</td>'.  
             '<td><font size="-1">'.  
             '<nobr>'.('&nbsp;'x3).$adv_search_link.'</nobr>'.'<br />'.  
             '<nobr>'.('&nbsp;'x1).$userelatedwords.'</nobr>'.'<br />'.  
             '<nobr>'.('&nbsp;'x1).$onlysearchdomain.'</nobr>'.'<br />'.  
             '<nobr>'.('&nbsp;'x1).$inclext.'</nobr>'.'<br />'.  
              '</font></td>'.  
             '</tr>'.$/;  
         #  
         $scrout .= '<tr><td align="center" colspan="2">'.  
             '<font size="-1">'.  
             '<input type="submit" name="basicsubmit" '.  
             'value="'.&mt('Search').'" />'.  
             ('&nbsp;'x2).$closebutton.('&nbsp;'x2).  
             &viewoptions().  
             '</font>'.  
             '</td></tr>'.$/;  
         $scrout .= '</table>'.$/.'</center>'.'</form>';  
     }      }
   # Search form for accessible portfolio files
       $scrout.= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
  my %lt=&Apache::lonlocal::texthash('srch' => 'Search',   my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
                                            'header' => 'Course Search',                                             'header' => 'Course Search',
Line 778  ENDENDCOURSE Line 742  ENDENDCOURSE
     $r->print($scrout);      $r->print($scrout);
     return;      return;
 }  }
   
   sub setup_basic_search {
       my ($r,$area,$hidden_fields,$closebutton) = @_;
       # Define interface components
       my %lt = &Apache::lonlocal::texthash (
                                 res => 'LON-CAPA Catalog Search',
                                 portfolio => 'Portfolio Search',
       );
       my ($userelatedwords,$onlysearchdomain,$inclext,$adv_search_link,$scrout);
       $userelatedwords = '<label>'.&mt('[_1] use related words',
         &Apache::lonhtmlcommon::checkbox('related',$env{'form.related'},'related')).
                          '</label>';
       $onlysearchdomain = '<label>'.&mt('[_1] only search domain [_2]',
         &Apache::lonhtmlcommon::checkbox('domains',$env{'form.domains'},
                                          $r->dir_config('lonDefDomain')),
         $r->dir_config('lonDefDomain')).
                           '</label>';
       if ($area eq 'res') {
           $inclext= '<label>'.&mt('[_1] include external resources',
                &Apache::lonhtmlcommon::checkbox('inclext',$env{'form.inclext'})).
                     '</label>';
       }
       $adv_search_link = '<a href="/adm/searchcat?'.
                  &Apache::loncommon::inhibit_menu_check().
          '&phase=disp_adv'.
                          '&catalogmode='.$env{'form.catalogmode'}.
                          '&launch='.$env{'form.launch'}.
                          '&mode='.$env{'form.mode'}.
                          '&area='.$area.
                          '&form='.$env{'form.form'}.
                          '&titleelement='.$env{'form.titleelement'}.
                          '&element='.$env{'form.element'}.
                          '">'.&mt('Advanced Search').'</a>';
       #
       $scrout.='<form name="loncapa_search" method="post" '.
                'action="/adm/searchcat">'.
                '<input type="hidden" name="phase" value="basic_search" />'.
                $hidden_fields;
                if (!exists($env{'form.area'})) {
                    $scrout .= '<input type="hidden" name="area" value="'.$area.'" />';
                }
       #
       $scrout .= '<center>'.$/;
   #    if ($env{'request.course.id'}) {
           $scrout .= '<h1>'.$lt{$area}.'</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',
                                                $env{'form.basicexp'},50).
                '<br />'.
               '<font size="-1">'.&searchhelp().'</font>'.'</td>'.
               '<td><font size="-1">'.
               '<nobr>'.('&nbsp;'x3).$adv_search_link.'</nobr>'.'<br />'.
               '<nobr>'.('&nbsp;'x1).$userelatedwords.'</nobr>'.'<br />'.
               '<nobr>'.('&nbsp;'x1).$onlysearchdomain.'</nobr>'.'<br />'.
               '<nobr>'.('&nbsp;'x1).$inclext.'</nobr>'.'<br />'.
                '</font></td>'.
               '</tr>'.$/;
       #
       $scrout .= '<tr><td align="center" colspan="2">'.
                  '<font size="-1">'.
                  '<input type="submit" name="basicsubmit" '.
                  'value="'.&mt('Search').'" />'.
                  ('&nbsp;'x2).$closebutton.('&nbsp;'x2). &viewoptions().
                  '</font>'.
                  '</td></tr>'.$/;
       $scrout .= '</table>'.$/.'</center>'.'</form>';
       return $scrout;
   } 
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
Line 794  Prints the advanced search form. Line 832  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 $bread_crumb =       my $bread_crumb = 
         &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching',          &Apache::lonhtmlcommon::breadcrumbs('Searching','Search_Advanced',
                                             'Search_Advanced',      $env{'form.catalogmode'} ne 'import');
                                             undef,undef,  
                                   $env{'form.catalogmode'} ne 'groupsearch');  
     my %lt=&Apache::lonlocal::texthash('srch' => 'Search',      my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
        'reset' => 'Reset',         'reset' => 'Reset',
        'help' => 'Help');         'help' => 'Help');
Line 806  sub print_advanced_search_form{ Line 842  sub print_advanced_search_form{
 <input type="reset" name="reset" value='$lt{"reset"}' />  <input type="reset" name="reset" value='$lt{"reset"}' />
 $closebutton  $closebutton
 END  END
     my $scrout= &Apache::loncommon::start_page('Advanced Catalog Search');      my $srchtype = 'Catalog';
       my $jscript;
       if ($env{'form.area'} eq 'portfolio') {
           $srchtype = 'Portfolio';
           $jscript = '<script type="text/javascript">
   function additional_metadata() {
       if (document.advsearch.newfield.checked) {
           document.advsearch.phase.value = "disp_adv";
           document.advsearch.numaddedfields.value = parseInt(document.advsearch.numaddedfields.value) +1;
           document.advsearch.submit();
       }
   }
   </script>';
       }
       my $scrout= &Apache::loncommon::start_page("Advanced $srchtype Search",
                                                  $jscript);
     $scrout .= <<"ENDHEADER";      $scrout .= <<"ENDHEADER";
 $bread_crumb  $bread_crumb
 <form method="post" action="/adm/searchcat" name="advsearch">  <form method="post" action="/adm/searchcat" name="advsearch">
Line 817  ENDHEADER Line 868  ENDHEADER
         '<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 .= '<h3>'.&mt('Standard Metadata').'</h3>';      $scrout .= '<h3>'.&mt("Standard $srchtype Metadata").'</h3>';
     $scrout .= "<table>\n";      $scrout .= "<table>\n";
     $scrout .= '<tr><td>&nbsp;</td><td colspan="2"><font size="-1">'.      $scrout .= '<tr><td>&nbsp;</td><td colspan="2"><font size="-1">'.
         ('&nbsp;'x2).&searchhelp()."</font></td></tr>\n";          ('&nbsp;'x2).&searchhelp()."</font></td></tr>\n";
Line 848  ENDHEADER Line 899  ENDHEADER
                                           $env{'form.'.$field.'_related'},                                            $env{'form.'.$field.'_related'},
                                           50);                                            50);
         if ($related_word_search{$field}) {          if ($related_word_search{$field}) {
             $scrout .= 'related words';              $scrout .= &mt('related words');
         } else {          } else {
             $scrout .= '</td><td>&nbsp;';              $scrout .= '</td><td>&nbsp;';
         }          }
Line 874  ENDHEADER Line 925  ENDHEADER
  &titlefield(&mt('Domains')).'</td><td colspan="2">'.    &titlefield(&mt('Domains')).'</td><td colspan="2">'. 
     &Apache::loncommon::domain_select('domains',      &Apache::loncommon::domain_select('domains',
    $env{'form.domains'},1).     $env{'form.domains'},1).
    '<br /><label>'.     '<br /><label>';
             &mt('[_1] include external resources',              if ($env{'form.area'} ne 'portfolio') {
                 &Apache::lonhtmlcommon::checkbox                  $scrout .= &mt('[_1] include external resources',
                 ('inclext',$env{'form.inclext'})).'</label></td></tr>'.$/;                             &Apache::lonhtmlcommon::checkbox
                              ('inclext',$env{'form.inclext'})).'</label>'
               }
        $scrout .= '</td></tr>'.$/;
     #      #
     # Misc metadata      # Misc metadata
     $scrout.='<tr><td align="right" valign="top">'.      if ($env{'form.area'} ne 'portfolio') {
  &titlefield(&mt('Copyright/Distribution')).'</td><td colspan="2">'.          $scrout.='<tr><td align="right" valign="top">'.
         &Apache::lonmeta::selectbox('copyright',           &titlefield(&mt('Copyright/Distribution')).
                                     $env{'form.copyright'},                   '</td><td colspan="2">'.
                                     \&Apache::loncommon::copyrightdescription,                   &Apache::lonmeta::selectbox('copyright',
                                     ( undef,                                               $env{'form.copyright'},
                                       &Apache::loncommon::copyrightids)                                  \&Apache::loncommon::copyrightdescription,
                                     ).'</td></tr>'.$/;                                         ( undef,
                                           &Apache::loncommon::copyrightids)
                                   ).'</td></tr>'.$/;
       }
     $scrout.='<tr><td align="right" valign="top">'.      $scrout.='<tr><td align="right" valign="top">'.
  &titlefield(&mt('Language')).'</td><td colspan="2">'.   &titlefield(&mt('Language')).'</td><td colspan="2">'.
         &Apache::lonmeta::selectbox('language',          &Apache::lonmeta::selectbox('language',
Line 895  ENDHEADER Line 952  ENDHEADER
                                     \&Apache::loncommon::languagedescription,                                      \&Apache::loncommon::languagedescription,
                                     ('any',&Apache::loncommon::languageids)                                      ('any',&Apache::loncommon::languageids)
                                     ).'</td></tr>';                                      ).'</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=>'count',  
            description=>'Network-wide number of accesses (hits)',},  
          { name=>'stdno',  
            description=>  
                'Total number of students who have worked on this problem',},  
          { name => 'avetries',  
            description=>'Average number of tries till solved',},  
          { 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 .= "</table>\n";
     $scrout .= '<h3>'.&mt('Evaluation Data').'</h3>';  
     $scrout .= "<table>\n";      
     $scrout .= '<tr><td>&nbsp;</td><td align="center">'.&mt('Minimum').'</td>'.      if ($env{'form.area'} eq 'portfolio') {
         '<td align="center">'.&mt('Maximum').'</td></tr>'."\n";          # Added fields
     foreach my $evaluation          my $curnumadd = $env{'form.numaddedfields'};
         ( { name => 'clear',          if ($curnumadd eq '') {
             description => 'Material presented in clear way'},              $curnumadd = 1;
           { name =>'depth',          }
             description => 'Material covered with sufficient depth'},          $scrout .= '<h3>'.&mt('Custom Metadata fields').'</h3>';
           { name => 'helpful',          $scrout .= "<table>\n";
             description => 'Material is helpful'},          $scrout .= '<tr><td>&nbsp;</td><td align="center">'.
           { name => 'correct',                     &mt('Field Name').'</td>'.'<td align="center">'.
             description => 'Material appears to be correct'},                     &mt('Field Value(s)').'</td></tr>';
           { name => 'technical',  
             description => 'Resource is technically correct'}){          for (my $j=0; $j<$curnumadd; $j++) {
         $scrout .= '<tr><td align="right">'.              my $num = $j+1;
             &titlefield(&mt($evaluation->{'description'})).              $scrout .= '<tr><td>'.&mt('Custom metadata [_1]: ',$num).
             '</td><td align="center">'.                         '</td><td align="center">'.
             '<input type="text" name="'.$evaluation->{'name'}.'_min" '.                         '<input type="text" name="addedfield_'.$j.
             'value="" size="6" />'.                         '" size="10" value="'.$env{'form.addedfield_'.$j}.
             '</td><td align="center">'.                         '" /></td>'.
             '<input type="text" name="'.$evaluation->{'name'}.'_max" '.                         '<td align="center"><input type="text" '.
             'value="" size="6" />'.                         'name="addedvalues_'.$j.'" size="15" value="'.
             '</td></tr>'.$/;                         $env{'form.addedvalues_'.$j}.'" /></td></tr>';
           }
           $scrout .= '<tr><td align="left" colspan="3"><label>'.
                      '<input type="checkbox" name="newfield" '.
                      'value="1" onclick="javascript:additional_metadata()" />'.
                      &mt('Another custom field/value pair?').'</label>'.
                      '<input type="hidden" name="numaddedfields" value="'.
                      $curnumadd.'" /></td></tr></table>';
       } else {
           #
           # 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=>'count',
                  description=>'Network-wide number of accesses (hits)',},
                { name=>'stdno',
                  description=>
                  'Statistics calculated for number of students',},
                { name => 'avetries',
                  description=>'Average number of tries till solved',},
                { 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";
     }      }
     $scrout .= "</table>\n";  
     #      #
     # Creation/Modification date limits      # Creation/Modification date limits
     $scrout .= '<h3>'.&mt('Creation and Modification dates').'</h3>';      $scrout .= '<h3>'.&mt('Creation and Modification dates').'</h3>';
     $scrout .= "\n<table>\n";      $scrout .= "\n<table>\n";
       $scrout .= "<tr><td>&nbsp;</td><td>".&mt('(Month - Day - Year)')."</td></tr>\n";
     my $cafter =       my $cafter = 
         &Apache::lonhtmlcommon::date_setter('advsearch',         # formname          &Apache::lonhtmlcommon::date_setter('advsearch',         # formname
                                             'creationdate1', # fieldname                                              'creationdate1', # fieldname
Line 973  ENDHEADER Line 1063  ENDHEADER
                                             '',          # state                                              '',          # state
                                             1,           # no_hh_mm_ss                                              1,           # no_hh_mm_ss
                                             );                                              );
     $scrout .= &mt('<tr><td align="right">Created between</td>'.      $scrout .= '<tr><td align="right">'.&mt('Created between').'</td>'
                    '<td>[_1]</td></tr>'.                .'<td>'.$cafter.'</td></tr>'
                    '<tr><td align="right">and </td>'.                .'<tr><td align="right">'.&mt('and').'</td>'
                    '<td>[_2]</td></tr>',$cafter,$cbefore);                .'<td>'.$cbefore.'</td></tr>';
     my $lafter =       my $lafter = 
         &Apache::lonhtmlcommon::date_setter('advsearch',          &Apache::lonhtmlcommon::date_setter('advsearch',
                                             'revisiondate1',                                               'revisiondate1', 
Line 995  ENDHEADER Line 1085  ENDHEADER
                                             '',          # state                                              '',          # state
                                             1,           # no_hh_mm_ss                                              1,           # no_hh_mm_ss
                                             );                                              );
     $scrout .= &mt('<tr><td align="right">Last modified between </td>'.      $scrout .= '<tr><td align="right">'.&mt('Last modified between').'</td>'
                    '<td>[_1]</td></tr>'.                .'<td>'.$lafter.'</td></tr>'
                    '<tr><td align="right">and</td>'.                .'<tr><td align="right">'.&mt('and').'</td>'
                    '<td>[_2]</td></tr>',$lafter,$lbefore);                .'<td>'.$lbefore.'</td></tr>';
     $scrout.="</table>\n";      $scrout.="</table>\n";
     $scrout.=<<ENDDOCUMENT;      $scrout.=<<ENDDOCUMENT;
 $advanced_buttons  $advanced_buttons
Line 1152  sub get_persistent_form_data { Line 1242  sub get_persistent_form_data {
         # End kludge (hopefully)          # End kludge (hopefully)
         next if (exists($env{$name}));          next if (exists($env{$name}));
         my @values = map {           my @values = map { 
             &Apache::lonnet::unescape($_);              &unescape($_);
         } split(',',$persistent_db{$name});          } split(',',$persistent_db{$name});
         next if (@values <1);          next if (@values <1);
         if ($arrays_allowed{$name}) {          if ($arrays_allowed{$name}) {
Line 1198  sub get_persistent_data { Line 1288  sub get_persistent_data {
             next;              next;
         }          }
         my @values = map {           my @values = map { 
             &Apache::lonnet::unescape($_);              &unescape($_);
         } split(',',$persistent_db{$name});          } split(',',$persistent_db{$name});
         if (@values <= 1) {          if (@values <= 1) {
             push @Values,$values[0];              push @Values,$values[0];
Line 1235  sub make_persistent { Line 1325  sub make_persistent {
     foreach my $name (keys(%save)) {      foreach my $name (keys(%save)) {
         my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));          my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));
         # We handle array references, but not recursively.          # We handle array references, but not recursively.
         my $store = join(',', map { &Apache::lonnet::escape($_); } @values );          my $store = join(',', map { &escape($_); } @values );
         $persistent_db{$name} = $store;          $persistent_db{$name} = $store;
     }      }
     untie(%persistent_db);      untie(%persistent_db);
Line 1313  sub parse_advanced_search { Line 1403  sub parse_advanced_search {
    'lastrevisiondatestart_month','lastrevisiondatestart_day',     'lastrevisiondatestart_month','lastrevisiondatestart_day',
    'lastrevisiondatestart_year','lastrevisiondateend_month',     'lastrevisiondatestart_year','lastrevisiondateend_month',
    'lastrevisiondateend_day','lastrevisiondateend_year') {     'lastrevisiondateend_day','lastrevisiondateend_year') {
  $env{'form.'.$field}=~s/[^\w\/\s\(\)\=\-\"\']//g;   $env{'form.'.$field}=~s/[^\w\/\s\(\)\=\-\"\'.]//g;
     }      }
     foreach ('mode','form','element') {      foreach ('mode','form','element') {
  # is this required?  Hmmm.   # is this required?  Hmmm.
  next if (! exists($env{'form.'.$_}));   next if (! exists($env{'form.'.$_}));
  $env{'form.'.$_}=&Apache::lonnet::unescape($env{'form.'.$_});   $env{'form.'.$_}=&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.
Line 1346  sub parse_advanced_search { Line 1436  sub parse_advanced_search {
             $fillflag++;              $fillflag++;
         }          }
     }      }
       if ($env{'form.area'} eq 'portfolio') {
           # Added metadata fields
           for (my $i=0; $i<$env{'form.numaddedfields'} ; $i++) {
               my $field = $env{'form.addedfield_'.$i};
               $field =~ s/^\s*(\S*)\s*$/$1/;
               $field =~ s/\W/_/g;
               if ($field ne '') {
                   $fillflag++;
               }
           }
       }
     if (! $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);
Line 1432  sub parse_advanced_search { Line 1533  sub parse_advanced_search {
             &Apache::loncommon::copyrightdescription($env{'form.copyright'}).              &Apache::loncommon::copyrightdescription($env{'form.copyright'}).
                 "<br />\n";                  "<br />\n";
     }      }
     #      if ($env{'form.area'} eq 'portfolio') {
     # Statistics          #
     foreach my $field (@StatsFields,@EvalFields) {          # Added metadata fields
         my ($min,$max);          for (my $i=0; $i<$env{'form.numaddedfields'} ; $i++) {
         if (exists($env{'form.'.$field.'_min'}) &&               my $field = $env{'form.addedfield_'.$i};
             $env{'form.'.$field.'_min'} ne '') {              $field =~ s/^\s*(\S*)\s*$/$1/;
             $min = $env{'form.'.$field.'_min'};              $field =~ s/\W/_/g;
         }              $field =~ tr/A-Z/a-z/; 
         if (exists($env{'form.'.$field.'_max'}) &&              if ($field ne '') {
             $env{'form.'.$field.'_max'} ne '') {                  my $value = $env{'form.addedvalues_'.$i};
             $max = $env{'form.'.$field.'_max'};                  if ($value ne '') {
         }                      $value =~ s/'/''/g; #' stupid emacs
         next if (! defined($max) && ! defined($min));                      my ($error,$query) = 
         if (defined($min) && defined($max)) {                          &process_phrase_input($value,0,'pf.value');
             ($min,$max) = sort {$a <=>$b} ($min,$max);                      if (!defined($error)) {
         }                          push(@queries,"pf.field = '$field' AND $query");
         if (defined($min) && $min =~ /^(\d+\.\d+|\d+|\.\d+)$/) {                          $pretty_search_string .=
             push(@queries,'('.$field.'>'.$min.')');                              $font.$field.'</font>: '.
             $pretty_search_string.=$font.$field.'</font>&gt;'.$min.'<br />';                              $env{'form.addedvalues_'.$i}.'<br />';
         }                      }
         if (defined($max) && $max =~ /^(\d+\.\d+|\d+|\.\d+)$/) {                  } else {
             push(@queries,'('.$field.'<'.$max.')');                      push(@queries,"pf.field = '$field' AND pf.value IS NULL");
             $pretty_search_string.=$font.$field.'</font>&lt;'.$max.'<br />';                  }
               }
           }
       } else {
           #
           # 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 />';
               }
         }          }
     }      }
     #      #
Line 1519  sub parse_advanced_search { Line 1647  sub parse_advanced_search {
     }      }
     #      #
     if (@queries) {      if (@queries) {
  $query="SELECT * FROM metadata WHERE (".join(") AND (",@queries).')';          if ($env{'form.area'} eq 'portfolio') {
               $query ="SELECT pm.*,pa.keynum,pa.scope FROM portfolio_metadata pm, portfolio_access pa, portfolio_addedfields pf WHERE (pm.url = pa.url AND pf.url = pm.url AND (pa.start < NOW() AND (pa.end IS NULL OR pa.end > NOW())) AND (".join(') AND (',@queries).'))';
           } else {
       $query="SELECT * FROM metadata WHERE (".join(") AND (",@queries).')';
           }
     } elsif ($customquery) {      } elsif ($customquery) {
         $query = '';          $query = '';
     }      }
Line 1543  sub parse_domain_restrictions { Line 1675  sub parse_domain_restrictions {
         $domain_hash{$_}++;          $domain_hash{$_}++;
     }      }
     if ($domain_hash{'any'}) {      if ($domain_hash{'any'}) {
         $pretty_domains_string = "In all LON-CAPA domains.";          $pretty_domains_string = &mt("in all LON-CAPA domains.");
     } else {      } else {
         if (@allowed_domains > 1) {          if (@allowed_domains > 1) {
             $pretty_domains_string = "In LON-CAPA domains:";              $pretty_domains_string = &mt("in LON-CAPA domains:");
         } else {          } else {
             $pretty_domains_string = "In LON-CAPA domain ";              $pretty_domains_string = &mt("in LON-CAPA domain ");
         }          }
         foreach (sort @allowed_domains) {          foreach (sort @allowed_domains) {
             $pretty_domains_string .= "<b>".$_."</b> ";              $pretty_domains_string .= "<b>".$_."</b> ";
         }          }
         foreach (keys(%Apache::lonnet::libserv)) {   my %servers = &Apache::lonnet::get_servers(\@allowed_domains,
             if (exists($domain_hash{$Apache::lonnet::hostdom{$_}})) {     'library');
                 push @$libraries_to_query,$_;   $libraries_to_query = [keys(%servers)];
             }  
         }  
     }      }
     return ($libraries_to_query,      return ($libraries_to_query,
             $pretty_domains_string);              $pretty_domains_string);
Line 1586  sub parse_basic_search { Line 1716  sub parse_basic_search {
     foreach ('mode','form','element') {      foreach ('mode','form','element') {
  # is this required?  Hmmm.   # is this required?  Hmmm.
  next unless (exists($env{"form.$_"}));   next unless (exists($env{"form.$_"}));
  $env{"form.$_"}=&Apache::lonnet::unescape($env{"form.$_"});   $env{"form.$_"}=&unescape($env{"form.$_"});
  $env{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;   $env{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
     }      }
     my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();      my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();
Line 1599  sub parse_basic_search { Line 1729  sub parse_basic_search {
     }      }
     my $pretty_search_string=$search_string;      my $pretty_search_string=$search_string;
     my @Queries;      my @Queries;
     my $searchfield = 'concat_ws(" ",'.join(',',      my @fields = ('title','author','subject','notes','abstract','keywords');
                                             ('title','author','subject',      my $searchfield;
                                              'notes','abstract','keywords')      if ($env{'form.area'} eq 'portfolio') {
                                             ).')';          $searchfield = 'concat_ws(" ",pm.'.join(',pm.',@fields).')';
       } else {
           $searchfield = 'concat_ws(" ",'.join(',',@fields).')';
       }
     my ($error,$SQLQuery) = &process_phrase_input($search_string,      my ($error,$SQLQuery) = &process_phrase_input($search_string,
                                                     $env{'form.related'},                                                      $env{'form.related'},
                                                     $searchfield);                                                      $searchfield);
Line 1615  sub parse_basic_search { Line 1748  sub parse_basic_search {
     #foreach my $q (@Queries) {      #foreach my $q (@Queries) {
     #    &Apache::lonnet::logthis('    '.$q);      #    &Apache::lonnet::logthis('    '.$q);
     #}      #}
     my $final_query = 'SELECT * FROM metadata WHERE '.join(" AND ",@Queries);      my $final_query;
       if ($env{'form.area'} eq 'portfolio') {
           $final_query = 'SELECT pm.*,pa.keynum,pa.scope FROM portfolio_metadata pm, portfolio_access pa  WHERE (pm.url = pa.url AND (pa.start < NOW() AND (pa.end IS NULL OR pa.end > NOW())) AND '.join(" AND ",@Queries).')';
       } else {
           $final_query = 'SELECT * FROM metadata WHERE '.join(" AND ",@Queries);
       }
     #      #
       if ($env{'form.related'}) {
    $pretty_search_string.=' '.&mt('(including related words)');
       }
     if (defined($pretty_domains_string) && $pretty_domains_string ne '') {      if (defined($pretty_domains_string) && $pretty_domains_string ne '') {
         $pretty_search_string .= ' '.$pretty_domains_string;          $pretty_search_string .= ' '.$pretty_domains_string;
     }      }
     $pretty_search_string .= "<br />\n";      $pretty_search_string .= "<br />\n";
     $pretty_search_string =~ s:^<br /> and ::;      $pretty_search_string =~ s:^<br /> and ::;
     #&Apache::lonnet::logthis('simple search final query = '.$/.$final_query);      &Apache::lonnet::logthis('simple search final query = '.$/.$final_query);
     return ($final_query,$pretty_search_string,      return ($final_query,$pretty_search_string,
             $libraries_to_query);              $libraries_to_query);
 }  }
Line 1725  sub process_phrase_input { Line 1866  sub process_phrase_input {
             $item[1];              $item[1];
         }          }
     term:      term:
         /[\w\Q:!@#$%^&*()+_=|{}<>,.;\\\/?\E]+/ {          /[\w\Q:!@#$%^&*()+_=|{}<>,.;\\\/?\E\-]+/ {
             $item[1];              $item[1];
         }          }
 ENDGRAMMAR  ENDGRAMMAR
Line 2013  sub ensure_db_and_table { Line 2154  sub ensure_db_and_table {
     ##      ##
     if (! defined($table) || $table eq '' || $table =~ /\D/ ) {      if (! defined($table) || $table eq '' || $table =~ /\D/ ) {
         $r->print("Unable to retrieve search results.  ".          $r->print("Unable to retrieve search results.  ".
                   "Unable to determine the table results were stored in.  ".                    "Unable to determine the table results were saved in.  ".
   &Apache::loncommon::end_page());    &Apache::loncommon::end_page());
         return undef;          return undef;
     }      }
Line 2023  sub ensure_db_and_table { Line 2164  sub ensure_db_and_table {
     my $connection_result = &Apache::lonmysql::connect_to_db();      my $connection_result = &Apache::lonmysql::connect_to_db();
     if (!defined($connection_result)) {      if (!defined($connection_result)) {
         $r->print("Unable to connect to the MySQL database where your results".          $r->print("Unable to connect to the MySQL database where your results".
                   " are stored.".                    " are saved.".
   &Apache::loncommon::end_page());    &Apache::loncommon::end_page());
         &Apache::lonnet::logthis("lonsearchcat: unable to get lonmysql to".          &Apache::lonnet::logthis("lonsearchcat: unable to get lonmysql to".
                                  " connect to database.");                                   " connect to database.");
Line 2107  sub print_sort_form { Line 2248  sub print_sort_form {
 END  END
   
     my $start_page = &Apache::loncommon::start_page('Results',$js,      my $start_page = &Apache::loncommon::start_page('Results',$js,
     {'only_body' => 1});      {'no_title' => 1});
     my $breadcrumbs=      my $breadcrumbs=
         &Apache::lonhtmlcommon::breadcrumbs          &Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',
         (undef,'Searching','Searching',undef,undef,      $env{'form.catalogmode'} ne 'import');
          $env{'form.catalogmode'} ne 'groupsearch');  
   
     my $result = <<END;      my $result = <<END;
 $start_page  $start_page
 $breadcrumbs  $breadcrumbs
 <form name="statusform" action="" method="POST">  <form name="statusform" action="" method="post" target="_top">
 <input type="hidden" name="Queue" value="" />  <input type="hidden" name="catalogmode" value="import" />
   <input type="hidden" name="acts" value="" />
 END  END
   
 #<h2>Sort Results</h2>  #<h2>Sort Results</h2>
Line 2132  END Line 2273  END
 #    }  #    }
 #    $result.="</select>\n";  #    $result.="</select>\n";
     my $revise = &revise_button();      my $revise = &revise_button();
     $result.=<<END;      $result.='<p>'
 <p>              .&mt('There are [_1] matches to your query.',$total_results)
 There are $total_results matches to your query. $revise              .' '.$revise.'</p>'
 </p><p>              .'<p>'.&mt('Search: ').$pretty_query_string
 Search:$pretty_query_string              .'</p></form>';
 </p>  
 </form>  
 END  
     $r->print($result.&Apache::loncommon::end_page());      $r->print($result.&Apache::loncommon::end_page());
     return;      return;
 }  }
Line 2176  my @Fullindicies; Line 2314  my @Fullindicies;
 Creates the table of search results by calling lonmysql.  Stores the  Creates the table of search results by calling lonmysql.  Stores the
 table id in $env{'form.table'}  table id in $env{'form.table'}
   
 Inputs: none.  Inputs: search area - either res or portfolio 
   
 Returns: the identifier of the table on success, undef on error.  Returns: the identifier of the table on success, undef on error.
   
Line 2185  Returns: the identifier of the table on Line 2323  Returns: the identifier of the table on
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub set_up_table_structure {  sub set_up_table_structure {
       my ($tabletype) = @_;
     my ($datatypes,$fullindicies) =       my ($datatypes,$fullindicies) = 
         &LONCAPA::lonmetadata::describe_metadata_storage();          &LONCAPA::lonmetadata::describe_metadata_storage($tabletype);
     # Copy the table description before modifying it...      # Copy the table description before modifying it...
     @Datatypes = @{$datatypes};      @Datatypes = @{$datatypes};
     unshift(@Datatypes,{name => 'id',        unshift(@Datatypes,{name => 'id',  
Line 2199  sub set_up_table_structure { Line 2338  sub set_up_table_structure {
 }  }
   
 sub create_results_table {  sub create_results_table {
     &set_up_table_structure();      my ($area) = @_;
       if ($area eq 'portfolio') {
           &set_up_table_structure('portfolio_search');
       } else {
           &set_up_table_structure('metadata');
       }
     my $table = &Apache::lonmysql::create_table      my $table = &Apache::lonmysql::create_table
         ( { columns => \@Datatypes,          ( { columns => \@Datatypes,
             FULLTEXT => [{'columns' => \@Fullindicies},],              FULLTEXT => [{'columns' => \@Fullindicies},],
Line 2305  Returns: html string for a 'revise searc Line 2449  Returns: html string for a 'revise searc
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub revise_button {  sub revise_button {
       my $revisetext = &mt('Revise search');
     my $revise_phase = 'disp_basic';      my $revise_phase = 'disp_basic';
     $revise_phase = 'disp_adv' if ($env{'form.searchmode'} eq 'advanced');      $revise_phase = 'disp_adv' if ($env{'form.searchmode'} eq 'advanced');
     my $newloc = '/adm/searchcat'.      my $newloc = '/adm/searchcat'.
         '?persistent_db_id='.$env{'form.persistent_db_id'}.          '?persistent_db_id='.$env{'form.persistent_db_id'}.
             '&cleargroupsort=1'.              '&cleargroupsort=1'.
             '&phase='.$revise_phase;              '&phase='.$revise_phase;
     my $result = qq{<input type="button" value="Revise search" name="revise"} .      my $result = qq{<input type="button" value="$revisetext" name="revise"} .
         qq{ onClick="parent.location='$newloc';" /> };          qq{ onClick="parent.location='$newloc';" /> };
     return $result;      return $result;
 }  }
Line 2331  results into MySQL. Line 2476  results into MySQL.
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub run_search {  sub run_search {
     my ($r,$query,$customquery,$customshow,$serverlist,$pretty_string) = @_;      my ($r,$query,$customquery,$customshow,$serverlist,
           $pretty_string,$area) = @_;
       my $tabletype = 'metadata';
       if ($area eq 'portfolio') {
           $tabletype = 'portfolio_search';
       }
     my $connection = $r->connection;      my $connection = $r->connection;
     #      #
     # Print run_search header      # Print run_search header
     #      #
     my $start_page = &Apache::loncommon::start_page('Search Status',undef,      my $start_page = &Apache::loncommon::start_page('Search Status',undef,
     {'only_body' => 1});      {'no_title' => 1});
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs      my $breadcrumbs =
         (undef,'Searching','Searching',undef,undef,   &Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',
          $env{'form.catalogmode'} ne 'groupsearch');      $env{'form.catalogmode'} ne 'import');
     $r->print(<<END);      $r->print(<<END);
 $start_page  $start_page
 $breadcrumbs  $breadcrumbs
 <form name="statusform" action="" method="post">  <form name="statusform" action="" method="post">
 <input type="hidden" name="Queue" value="" />  <input type="hidden" name="acts" value="" />
 END  END
     # Remove leading and trailing <br />      # Remove leading and trailing <br />
     $pretty_string =~ s:^\s*<br />::i;      $pretty_string =~ s:^\s*<br />::i;
Line 2371  END Line 2520  END
             @Servers_to_contact = ($serverlist);              @Servers_to_contact = ($serverlist);
         }          }
     } else {      } else {
         @Servers_to_contact = sort(keys(%Apache::lonnet::libserv));   my %all_library_servers = &Apache::lonnet::all_library();
           @Servers_to_contact = sort(keys(%all_library_servers));
     }      }
     my %Server_status;      my %Server_status;
     #      #
     # Check on the mysql table we will use to store results.      # Check on the mysql table we will use to store results.
     my $table =$env{'form.table'};      my $table =$env{'form.table'};
     if (! defined($table) || $table eq '' || $table =~ /\D/ ) {      if (! defined($table) || $table eq '' || $table =~ /\D/ ) {
         $r->print("Unable to determine table id to store search results in.".          $r->print("Unable to determine table id to save search results in.".
                   "The search has been aborted.".                    "The search has been aborted.".
   &Apache::loncommon::end_page());    &Apache::loncommon::end_page());
         return;          return;
Line 2407  END Line 2557  END
     ##      ##
     ## Prepare for the big loop.      ## Prepare for the big loop.
     my $hitcountsum;      my $hitcountsum;
       my %matches;
     my $server;       my $server; 
     my $status;      my $status;
     my $revise = &revise_button();      my $revise = &revise_button();
Line 2461  END Line 2612  END
                 delete ($Server_status{$server});                  delete ($Server_status{$server});
                 next;                  next;
             }              }
             $status=~s|/||g;               $status=~s|/||g;
            my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$status;             my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$status;
             if (-e $datafile && ! -e "$datafile.end") {              if (-e $datafile && ! -e "$datafile.end") {
                 &update_status($r,&mt('Receiving results from [_1]',$server));                  &update_status($r,&mt('Receiving results from [_1]',$server));
Line 2490  END Line 2641  END
                     next if (! $result);                      next if (! $result);
                     #                      #
                     # Parse the result.                      # Parse the result.
                     my %Fields = &parse_raw_result($result,$server);                      my %Fields = &parse_raw_result($result,$server,$tabletype);
                     $Fields{'hostname'} = $server;                      $Fields{'hostname'} = $server;
                     #                      #
                     # Skip if external and we did not want that                      # Skip if external and we did not want that
Line 2498  END Line 2649  END
                     # Skip based on copyright                      # Skip based on copyright
                     next if (! &copyright_check(\%Fields));                      next if (! &copyright_check(\%Fields));
   
                       if ($area eq 'portfolio') {
                           next if (defined($matches{$Fields{'url'}}));
                           # Skip if inaccessible
                           next if (!&Apache::lonnet::portfolio_access($Fields{'url'}));
                           $matches{$Fields{'url'}} = 1; 
                       }
                     #                      #
                     # Store the result in the mysql database                      # Store the result in the mysql database
                     my $result = &Apache::lonmysql::store_row($table,\%Fields);                      my $result = &Apache::lonmysql::store_row($table,\%Fields);
Line 2531  END Line 2688  END
     # results to get, so let the client know the top frame needs to be      # results to get, so let the client know the top frame needs to be
     # loaded from /adm/searchcat      # loaded from /adm/searchcat
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 #    if ($env{'form.catalogmode'} ne 'groupsearch') {  #    if ($env{'form.catalogmode'} ne 'import') {
         $r->print("<script>".          $r->print("<script>".
                       "window.location='/adm/searchcat?".                        "window.location='/adm/searchcat?".
                       "phase=sort&".                        "phase=sort&".
Line 2584  Prints the results out for selection and Line 2741  Prints the results out for selection and
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub display_results {  sub display_results {
     my ($r,$importbutton,$closebutton,$diropendb) = @_;      my ($r,$importbutton,$closebutton,$diropendb,$area) = @_;
     my $connection = $r->connection;      my $connection = $r->connection;
     $r->print(&search_results_header($importbutton,$closebutton));      $r->print(&search_results_header($importbutton,$closebutton));
     ##      ##
Line 2598  sub display_results { Line 2755  sub display_results {
     }      }
     ##      ##
     ## $checkbox_num is a count of the number of checkboxes output on the       ## $checkbox_num is a count of the number of checkboxes output on the 
     ## page this is used only during catalogmode=groupsearch.      ## page this is used only during catalogmode=import.
     my $checkbox_num = 0;      my $checkbox_num = 0;
     ##      ##
     ## Get the catalog controls setup      ## Get the catalog controls setup
     ##      ##
     my $action = "/adm/searchcat?phase=results";      my $action = "/adm/searchcat?phase=results";
     ##      ##
     ## Deal with groupsearch by opening the groupsearch db file.      ## Deal with import by opening the import db file.
     if ($env{'form.catalogmode'} eq 'groupsearch') {      if ($env{'form.catalogmode'} eq 'import') {
         if (! tie(%groupsearch_db,'GDBM_File',$diropendb,          if (! tie(%groupsearch_db,'GDBM_File',$diropendb,
                   &GDBM_WRCREAT(),0640)) {                    &GDBM_WRCREAT(),0640)) {
             $r->print('Unable to store import results.</form>'.              $r->print('Unable to save import results.</form>'.
       &Apache::loncommon::end_page());        &Apache::loncommon::end_page());
             $r->rflush();              $r->rflush();
             return;              return;
Line 2654  sub display_results { Line 2811  sub display_results {
     $r->print(&hidden_field('table').      $r->print(&hidden_field('table').
               &hidden_field('phase').                &hidden_field('phase').
               &hidden_field('persistent_db_id').                &hidden_field('persistent_db_id').
               &hidden_field('start')                &hidden_field('start').
                 &hidden_field('area')
               );                );
     #      #
     # Build sorting selector      # Build sorting selector
Line 2675  sub display_results { Line 2833  sub display_results {
          {key =>'lowestgradelevel'},           {key =>'lowestgradelevel'},
          {key =>'highestgradelevel'},           {key =>'highestgradelevel'},
          {key =>'standards',desc=>'Standards'},           {key =>'standards',desc=>'Standards'},
           );
       if ($area eq 'portfolio') {
           push(@fields,
          (
            {key => 'scope'},
            {key => 'keynum'},
          ));
       } else {
           push(@fields,
          (
          {key =>'count',desc=>'Number of accesses'},           {key =>'count',desc=>'Number of accesses'},
          {key =>'stdno',desc=>'Students Attempting'},           {key =>'stdno',desc=>'Students Attempting'},
          {key =>'avetries',desc=>'Average Number of Tries'},           {key =>'avetries',desc=>'Average Number of Tries'},
Line 2685  sub display_results { Line 2853  sub display_results {
          {key =>'correct',desc=>'Evaluation: Material is Correct'},           {key =>'correct',desc=>'Evaluation: Material is Correct'},
          {key =>'helpful',desc=>'Evaluation: Material is Helpful'},           {key =>'helpful',desc=>'Evaluation: Material is Helpful'},
          {key =>'depth',desc=>'Evaluation: Material has Depth'},           {key =>'depth',desc=>'Evaluation: Material has Depth'},
          );         ));
       }
     my %fieldnames = &Apache::lonmeta::fieldnames();      my %fieldnames = &Apache::lonmeta::fieldnames();
     my @field_order;      my @field_order;
     foreach my $field_data (@fields) {      foreach my $field_data (@fields) {
Line 2702  sub display_results { Line 2871  sub display_results {
     my %sort_fields = map {$_->{'key'},$_->{'desc'}} @fields;      my %sort_fields = map {$_->{'key'},$_->{'desc'}} @fields;
     $sort_fields{'select_form_order'} = \@field_order;      $sort_fields{'select_form_order'} = \@field_order;
     $env{'form.sortorder'} = 'desc' if (! exists($env{'form.sortorder'}));      $env{'form.sortorder'} = 'desc' if (! exists($env{'form.sortorder'}));
     $env{'form.sortfield'} = 'count' if (! exists($env{'form.sortfield'}));      if (! exists($env{'form.sortfield'})) {
           if ($area eq 'portfolio') {
               $env{'form.sortfield'} = 'owner';
           } else {
               $env{'form.sortfield'} = 'count';
           }
       }
     if (! exists($env{'form.sortorder'})) {      if (! exists($env{'form.sortorder'})) {
  if ($env{'form.sortfield'}=~/^(count|stdno|disc|clear|technical|correct|helpful)$/) {   if ($env{'form.sortfield'}=~/^(count|stdno|disc|clear|technical|correct|helpful)$/) {
     $env{'form.sortorder'}='desc';      $env{'form.sortorder'}='desc';
Line 2766  sub display_results { Line 2941  sub display_results {
     my @Results = &Apache::lonmysql::get_rows($table,$sort_command);      my @Results = &Apache::lonmysql::get_rows($table,$sort_command);
     ##      ##
     ## Loop through the results and output them.      ## Loop through the results and output them.
       my $tabletype = 'metadata';
       if ($area eq 'portfolio') {
           $tabletype = 'portfolio_search';
       }
     foreach my $row (@Results) {      foreach my $row (@Results) {
         if ($connection->aborted()) {          if ($connection->aborted()) {
             &cleanup();              &cleanup();
             return;              return;
         }          }
         my %Fields = %{&parse_row(@$row)};          my %Fields = %{&parse_row($tabletype,@$row)};
         my $output="<p>\n";          my $output="<p>\n";
         if (! defined($Fields{'title'}) || $Fields{'title'} eq '') {          if (! defined($Fields{'title'}) || $Fields{'title'} eq '') {
             $Fields{'title'} = 'Untitled';              $Fields{'title'} = 'Untitled';
Line 2824  sub catalogmode_output { Line 3003  sub catalogmode_output {
         $title=~ s/\'/\\\'/g;          $title=~ s/\'/\\\'/g;
         if ($env{'form.catalogmode'} eq 'interactive') {          if ($env{'form.catalogmode'} eq 'interactive') {
             $output.=<<END               $output.=<<END 
 <font size='-1'><INPUT TYPE="button" NAME="returnvalues" VALUE="SELECT"  <font size='-1'><input type="button" name="returnvalues" value="select"
 onClick="javascript:select_data('$title','$url')">  onClick="javascript:select_data('$title','$url')" />
 </font>  </font>
 END  END
         }          }
     } elsif ($env{'form.catalogmode'} eq 'groupsearch') {      } elsif ($env{'form.catalogmode'} eq 'import') {
         $groupsearch_db{"pre_${fnum}_link"}=$url;          $groupsearch_db{"pre_${fnum}_link"}=$url;
         $groupsearch_db{"pre_${fnum}_title"}=$title;          $groupsearch_db{"pre_${fnum}_title"}=$title;
         $output.=<<END;          $output.=<<END;
 <font size='-1'>  <font size='-1'>
 <input type="checkbox" name="returnvalues" value="SELECT"  <input type="checkbox" name="returnvalues" value="select"
 onClick="javascript:queue($checkbox_num,$fnum)" />  onClick="javascript:queue($checkbox_num,$fnum)" />
 </font>  </font>
 END  END
Line 2855  Parse a row returned from the database. Line 3034  Parse a row returned from the database.
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub parse_row {  sub parse_row {
     my @Row = @_;      my ($tabletype,@Row) = @_;
     my %Fields;      my %Fields;
     if (! scalar(@Datatypes)) {      if (! scalar(@Datatypes)) {
         &set_up_table_structure();          &set_up_table_structure($tabletype);
     }      }
     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'}}=&unescape($Row[$i]);
     }      }
     $Fields{'language'} =       $Fields{'language'} = 
         &Apache::loncommon::languagedescription($Fields{'language'});          &Apache::loncommon::languagedescription($Fields{'language'});
Line 2894  The 'title' field is set to "Untitled" i Line 3073  The 'title' field is set to "Untitled" i
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
 sub parse_raw_result {  sub parse_raw_result {
     my ($result,$hostname) = @_;      my ($result,$hostname,$tabletype) = @_;
     # conclude from self to others regarding fields      # conclude from self to others regarding fields
     my %Fields=&LONCAPA::lonmetadata::metadata_col_to_hash      my %Fields=&LONCAPA::lonmetadata::metadata_col_to_hash
         (map {          ($tabletype,
             &Apache::lonnet::unescape($_);           map {
         } (split(/\,/,$result)) );              &unescape($_);
            } (split(/\,/,$result)) );
     return %Fields;      return %Fields;
 }  }
   
Line 2936  sub handle_custom_fields { Line 3116  sub handle_custom_fields {
         if ($result=~/^(custom\=.*)$/) { # grab all custom metadata          if ($result=~/^(custom\=.*)$/) { # grab all custom metadata
             my $tmp=$result;              my $tmp=$result;
             $tmp=~s/^custom\=//;              $tmp=~s/^custom\=//;
             my ($k,$v)=map {&Apache::lonnet::unescape($_);              my ($k,$v)=map {&unescape($_);
                         } split(/\,/,$tmp);                          } split(/\,/,$tmp);
             $customhash{$k}=$v;              $customhash{$k}=$v;
         }          }
Line 2968  The following environment variables are Line 3148  The following environment variables are
   
 =item 'form.catalogmode'   =item 'form.catalogmode' 
   
 Checked for 'interactive' and 'groupsearch'.  Checked for 'interactive' and 'import'.
   
 =item 'form.mode'  =item 'form.mode'
   
Line 3060  function changeURL(val) { Line 3240  function changeURL(val) {
 SCRIPT  SCRIPT
         }          }
     }      }
     $js.=<<SCRIPT if $env{'form.catalogmode'} eq 'groupsearch';      my $inhibit_menu = "&".&Apache::loncommon::inhibit_menu_check();
       $js.=<<SCRIPT if $env{'form.catalogmode'} eq 'import';
 <script type="text/javascript">  <script type="text/javascript">
     function queue(checkbox_num,val) {      function queue(checkbox_num,val) {
         if (document.forms.results.returnvalues.length != "undefined" &&          if (document.forms.results.returnvalues.length != "undefined" &&
             typeof(document.forms.results.returnvalues.length) == "number") {              typeof(document.forms.results.returnvalues.length) == "number") {
             if (document.forms.results.returnvalues[checkbox_num].checked) {              if (document.forms.results.returnvalues[checkbox_num].checked) {
                 parent.statusframe.document.forms.statusform.elements.Queue.value +='1a'+val+'b';                  parent.statusframe.document.forms.statusform.elements.acts.value +='1a'+val+'b';
             } else {              } else {
                 parent.statusframe.document.forms.statusform.elements.Queue.value +='0a'+val+'b';                  parent.statusframe.document.forms.statusform.elements.acts.value +='0a'+val+'b';
             }              }
         } else {          } else {
             if (document.forms.results.returnvalues.checked) {              if (document.forms.results.returnvalues.checked) {
                 parent.statusframe.document.forms.statusform.elements.Queue.value +='1a'+val+'b';                  parent.statusframe.document.forms.statusform.elements.acts.value +='1a'+val+'b';
             } else {              } else {
                 parent.statusframe.document.forms.statusform.elements.Queue.value +='0a'+val+'b';                  parent.statusframe.document.forms.statusform.elements.acts.value +='0a'+val+'b';
             }              }
         }          }
     }      }
     function select_group() {      function select_group() {
  parent.window.location=   parent.window.location=
     "/adm/groupsort?mode=$env{'form.mode'}&catalogmode=groupsearch&acts="+      "/adm/groupsort?mode=$env{'form.mode'}&catalogmode=import$inhibit_menu&acts="+
     parent.statusframe.document.forms.statusform.elements.Queue.value;      parent.statusframe.document.forms.statusform.elements.acts.value;
     }      }
 </script>  </script>
 SCRIPT  SCRIPT
Line 3090  SCRIPT Line 3271  SCRIPT
      {'only_body' =>1});       {'only_body' =>1});
     my $result=<<END;      my $result=<<END;
 $start_page  $start_page
 <form name="results" method="post" action="/adm/searchcat" >  <form name="results" method="post" action="/adm/searchcat">
 <input type="hidden" name="Queue" value="" />  
 $importbutton  $importbutton
 END  END
     return $result;      return $result;
 }  }
   
 ######################################################################  
 ######################################################################  
 sub search_status_header {  
     my $start_page = &Apache::loncommon::start_page('Search Status',undef,  
     {'only_body' => 1});  
     return <<ENDSTATUS;  
 $start_page  
 <h3>Search Status</h3>  
 Sending search request to LON-CAPA servers.<br />  
 ENDSTATUS  
 }  
   
 sub results_link {  sub results_link {
     my $basic_link   = "/adm/searchcat?"."&table=".$env{'form.table'}.      my $basic_link   = "/adm/searchcat?"."&table=".$env{'form.table'}.
         "&persistent_db_id=".$env{'form.persistent_db_id'};          "&persistent_db_id=".$env{'form.persistent_db_id'};
Line 3125  sub print_frames_interface { Line 3293  sub print_frames_interface {
         "&persistent_db_id=".$env{'form.persistent_db_id'};          "&persistent_db_id=".$env{'form.persistent_db_id'};
     my $run_search_link = $basic_link."&phase=run_search";      my $run_search_link = $basic_link."&phase=run_search";
     my $results_link = &results_link();      my $results_link = &results_link();
     my $html     = &Apache::lonxml::xmlbegin();      my $js = <<JS;
     my $head     = &Apache::loncommon::headtag('LON-CAPA Digital Library Search Results');  <script type="text/javascript">
     my $end_head = &Apache::loncommon::endheadtag();  
     my $result = <<"ENDFRAMES";  
 $html  
 $head  
 <script>  
 var targetwin = opener;  var targetwin = opener;
 var queue = '';  var queue = '';
 </script>  </script>
 $end_head  JS
 <frameset rows="150,*">  
       my $start_page =
           &Apache::loncommon::start_page('LON-CAPA Digital Library Search Results',
          $js,
          {'frameset'    => 1,
    'add_entries' => {
       'rows' => "150,*",},});
       my $end_page =
           &Apache::loncommon::end_page({'frameset' => 1});
   
       my $result = <<"ENDFRAMES";
   $start_page
     <frame name="statusframe"  src="$run_search_link">      <frame name="statusframe"  src="$run_search_link">
     <frame name="resultsframe" src="$results_link">      <frame name="resultsframe" src="$results_link">
 </frameset>  $end_page
 </html>  
 ENDFRAMES  ENDFRAMES
   
     $r->print($result);      $r->print($result);
Line 3208  sub detailed_citation_view { Line 3381  sub detailed_citation_view {
     my ($prefix,%values) = @_;      my ($prefix,%values) = @_;
     my $result;      my $result;
     my $jumpurl=$values{'url'};      my $jumpurl=$values{'url'};
     $jumpurl=~s/^\/ext\//http\:\/\//;      $jumpurl=~s|^/ext/|http://|;
     $result .= '<b>'.$prefix.      $result .= '<b>'.$prefix.
         '<img src="'.&Apache::loncommon::icon($values{'url'}).' " />'.'&nbsp;'.          '<img src="'.&Apache::loncommon::icon($values{'url'}).'" />'.'&nbsp;'.
         '<a href="'.$jumpurl.'" '.          '<a href="'.$jumpurl.'?inhibitmenu=yes" '.
         'target="search_preview">'.$values{'title'}."</a></b>\n";          'target="preview">'.$values{'title'}."</a></b>\n";
     $result .= "<p>\n";      $result .= "<p>\n";
     $result .= '<b>'.$values{'author'}.'</b>,'.      $result .= '<b>'.$values{'author'}.'</b>,'.
         ' <i>'.$values{'owner'}.'</i><br />';          ' <i>'.$values{'owner'}.'</i><br />';
Line 3276  sub detailed_citation_view { Line 3449  sub detailed_citation_view {
         next if (! exists($values{$field->{'name'}}) ||          next if (! exists($values{$field->{'name'}}) ||
                  $values{$field->{'name'}} eq '');                   $values{$field->{'name'}} eq '');
         if (exists($field->{'type'}) && $field->{'type'} eq 'list') {          if (exists($field->{'type'}) && $field->{'type'} eq 'list') {
             $result .= '<b>'.&mt($field->{'translate'}).'</b><ul>';              $result .= '<b>'.&mt($field->{'translate'}).'</b>';
             foreach my $item (split(',',$values{$field->{'name'}})){              foreach my $item (split(',',$values{$field->{'name'}})){
                 $result .= '<li>'.                  $item = &Apache::lonnet::clutter($item);
                     '<a target="search_preview" '.                  $result .= &display_url($item,[2,0,1]);
                     'href="'.$jumpurl.'">'.$item.'</a></li>';  
             }              }
             $result .= '</ul>';  
         } elsif (exists($field->{'format'}) && $field->{'format'} ne ''){          } elsif (exists($field->{'format'}) && $field->{'format'} ne ''){
             $result.= &mt($field->{'translate'},              $result.= &mt($field->{'translate'},
                           sprintf($field->{'format'},                            sprintf($field->{'format'},
                                   $values{$field->{'name'}}))."<br />\n";                                    $values{$field->{'name'}}))."<br />\n";
         } else {          } else {
             if ($field->{'special'} eq 'url link') {              if ($field->{'special'} eq 'url link') {
                 $result.=                   $result .= &display_url($jumpurl,[3,0,1]);
                      &mt($field->{'translate'},  
                          '<a href="'.$jumpurl.'" '.  
                          'target="search_preview">'.  
                          $values{$field->{'name'}}.  
                          '</a>');  
             } else {              } else {
                 $result.= &mt($field->{'translate'},                  $result.= &mt($field->{'translate'},
                               $values{$field->{'name'}});                                $values{$field->{'name'}});
Line 3350  sub summary_view { Line 3516  sub summary_view {
         $result .= '&nbsp;'.$tmp.'&nbsp;';          $result .= '&nbsp;'.$tmp.'&nbsp;';
     }      }
     my $jumpurl=$values{'url'};      my $jumpurl=$values{'url'};
     $jumpurl=~s/^\/ext\//http\:\/\//;      $jumpurl=~s|^/ext/|http://|;
       my $link = &display_url($jumpurl,[2,0,1]);
   
     $result.=<<END;      $result.=<<END;
 <a href="$jumpurl"   <a href="$jumpurl?inhibitmenu=yes" 
    target='search_preview'>$values{'title'}</a><br />     target='preview'>$values{'title'}</a> <br />
   $link <br />
 $values{'author'}, $values{'owner'} -- $values{'lastrevisiondate'}<br />  $values{'author'}, $values{'owner'} -- $values{'lastrevisiondate'}<br />
 $values{'copyrighttag'}<br />  $values{'copyrighttag'}<br />
 $values{'extrashow'}  $values{'extrashow'}
Line 3387  sub summary_preview { Line 3555  sub summary_preview {
 sub compact_view {  sub compact_view {
     my ($prefix,%values) = @_;      my ($prefix,%values) = @_;
     my $jumpurl=$values{'url'};      my $jumpurl=$values{'url'};
     $jumpurl=~s/^\/ext\//http\:\/\//;      $jumpurl=~s|^/ext/|http://|;
   
       my $link = &display_url($jumpurl,[1,1,1]);
       
     my $result =       my $result = 
         $prefix.'<img src="'.&Apache::loncommon::icon($values{'url'}).'">';          $prefix.'<img src="'.&Apache::loncommon::icon($values{'url'}).'">';
     if (exists($env{'form.sortfield'}) &&       if (exists($env{'form.sortfield'}) && 
Line 3397  sub compact_view { Line 3567  sub compact_view {
         if (! defined($tmp)) { $tmp = 'undefined'; }          if (! defined($tmp)) { $tmp = 'undefined'; }
         $result .= '&nbsp;'.$tmp.'&nbsp;';          $result .= '&nbsp;'.$tmp.'&nbsp;';
     }      }
     $result.='&nbsp;<a href="'.$jumpurl.'" target="search_preview">'.      $jumpurl = &HTML::Entities::encode($jumpurl,'<>&"');
         $values{'title'}.'</a>'.('&nbsp;'x2).      $result.=' <span class="LC_nobreak">'.
         '<b>'.$values{'author'}.'</b> ('.$values{'domain'}.')<br />';   '<a href="'.$jumpurl.'?inhibitmenu=yes" target="preview">'.
           &HTML::Entities::encode($values{'title'},'<>&"').'</a></span> '.
    $link.' <b>'.$values{'author'}.'</b> ('.$values{'domain'}.')<br />';
     return $result;      return $result;
 }  }
   
   sub display_url {
       my ($url,$crumb_args) = @_;
       my $link;
       if ($url=~m|^/ext/|) {
    $url=~s|^/ext/|http://|;
    $link='<span class="LC_filename">'.$url.'</span>';
       } elsif ($url=~m{^(http://|/uploaded/)}) {
    $link='<span class="LC_filename">'.$url.'</span>';
       } else {
           $link=&Apache::lonhtmlcommon::crumbs($url,
     'preview',
     '',
     (($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),@{$crumb_args}).' ';
       }
       return $link;
   }
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 3420  sub fielded_format_view { Line 3608  sub fielded_format_view {
     my $icon=&Apache::loncommon::icon($values{'url'});      my $icon=&Apache::loncommon::icon($values{'url'});
     my %Translated = &Apache::lonmeta::fieldnames();      my %Translated = &Apache::lonmeta::fieldnames();
     my $jumpurl=$values{'url'};      my $jumpurl=$values{'url'};
     $jumpurl=~s/^\/ext\//http\:\/\//;      $jumpurl=~s|^/ext/|http://|;
   
     my $result=<<END;      my $result=<<END;
 $prefix <img src="$icon" />  $prefix <img src="$icon" />
 <dl>  <dl>
 <dt>URL:</dt>  <dt>URL:</dt>
     <dd><a href="$jumpurl"       <dd><a href="$jumpurl?inhibitmenu=yes" 
          target='search_preview'>$values{'url'}</a></dd>           target='preview'>$values{'url'}</a></dd>
 END  END
     foreach my $field ('title','author','domain','subject','keywords','notes',      foreach my $field ('title','author','domain','subject','keywords','notes',
                        'mimetag','language','creationdate','lastrevisiondate',                         'mimetag','language','creationdate','lastrevisiondate',

Removed from v.1.258  
changed lines
  Added in v.1.290


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