Diff for /loncom/interface/lonsearchcat.pm between versions 1.331 and 1.364

version 1.331, 2011/12/09 01:04:27 version 1.364, 2025/03/19 15:44:44
Line 52  search (on a server basis) is displayed Line 52  search (on a server basis) is displayed
   
 =head1 Internals  =head1 Internals
   
 =over 4  
   
 =cut  =cut
   
 ###############################################################################  ###############################################################################
Line 80  use Apache::lonnavmaps; Line 78  use Apache::lonnavmaps;
 use Apache::lonindexer();  use Apache::lonindexer();
 use Apache::lonwishlist();  use Apache::lonwishlist();
 use LONCAPA;  use LONCAPA;
   use Time::HiRes qw(sleep);
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 145  sub handler { Line 144  sub handler {
     ##     this once, so the pause indicator is deleted      ##     this once, so the pause indicator is deleted
     ##      ##
     if (exists($env{'form.pause'})) {      if (exists($env{'form.pause'})) {
         sleep(1);          sleep(0.1);
         delete($env{'form.pause'});          delete($env{'form.pause'});
     }      }
     ##      ##
Line 171  sub handler { Line 170  sub handler {
     ##      ##
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
   
     my @allowed_searches = ('portfolio');      my $crumb_text;
     if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {      my @allowed_searches;
       if ($env{'form.catalogmode'} eq 'import') {
           $env{'form.area'} = 'res';
           $crumb_text = 'Content Library Search';
       } else {
           push(@allowed_searches,'portfolio');
       }
       if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'}) eq 'F') {
         push(@allowed_searches,'res');          push(@allowed_searches,'res');
     }       } else {
     my $crumb_text = 'Portfolio Search';          unless ($env{'form.catalogmode'} eq 'import') {
               $env{'form.area'} = 'portfolio';
               $crumb_text = 'Portfolio Search';
           }
       }
     if (@allowed_searches ==2) {      if (@allowed_searches ==2) {
        $crumb_text = 'Portfolio and Catalog Search';          unless (($env{'form.area'} eq 'portfolio') || ($env{'form.area'} eq 'res')) {
              delete($env{'form.area'});
          }
          $crumb_text = 'Portfolio and Content Library Search'; 
       }
       my $target = '_top';
       if ((($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) ||
           (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self'))) {
           if ($env{'form.phase'} =~ /^(sort|run_search)$/) {
               $target = '_parent';
           } else {
               $target = '_self';
           }
     }      }
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>'/adm/searchcat?'.         ({href=>'/adm/searchcat?'.
        &Apache::loncommon::inhibit_menu_check().         &Apache::loncommon::inhibit_menu_check().
                '&catalogmode='.$env{'form.catalogmode'}.                 '&catalogmode='.$env{'form.catalogmode'}.
                '&launch='.$env{'form.launch'}.                 '&launch='.$env{'form.launch'}.
                '&mode='.$env{'form.mode'},                 '&mode='.$env{'form.mode'}.
                  '&area='.$env{'form.area'},
               text=>"$crumb_text",                text=>"$crumb_text",
               target=>'_top',                target=>$target,
               bug=>'Searching',});                bug=>'Searching',});
     #      #
     if ($env{'form.phase'} !~ m/(basic|adv|course)_search/) {      if ($env{'form.phase'} !~ m/(basic|adv|course)_search/) {
Line 195  sub handler { Line 218  sub handler {
                 &Apache::lonnet::logthis('lonsearchcat:'.                  &Apache::lonnet::logthis('lonsearchcat:'.
                                          'Unable to recover data from '.                                           'Unable to recover data from '.
                                          $persistent_db_file);                                           $persistent_db_file);
  my $msg =                  my $msg =
     'We were unable to retrieve data describing your search. '.                      &mt('We were unable to retrieve data describing your search.').
     'This is a serious error and has been logged. '.                      ' '.&mt('This is a serious error and has been logged.').
     'Please alert your LON-CAPA administrator.';                      '<br />'.
  &Apache::loncommon::simple_error_page($r,'Search Error',                      &mt('Please alert your LON-CAPA administrator.');
       $msg);                  &Apache::loncommon::simple_error_page(
                       $r,'Search Error',
                       $msg,
                       {'no_auto_mt_msg' => 1});
  return OK;   return OK;
             }              }
         }          }
Line 297  END Line 323  END
     }      }
     #      #
     if ($env{'form.searchmode'} eq 'advanced') {      if ($env{'form.searchmode'} eq 'advanced') {
         my $srchtype = 'Catalog';          my $srchtype = 'Content Library';
         if ($env{'form.area'} eq 'portfolio') {          if ($env{'form.area'} eq 'portfolio') {
             $srchtype = 'Portfolio';              $srchtype = 'Portfolio';
         }          }
Line 306  END Line 332  END
                   '&amp;phase=disp_adv'.                    '&amp;phase=disp_adv'.
                   '&amp;catalogmode='.$env{'form.catalogmode'}.                    '&amp;catalogmode='.$env{'form.catalogmode'}.
                   '&amp;launch='.$env{'form.launch'}.                    '&amp;launch='.$env{'form.launch'}.
                   '&amp;mode='.$env{'form.mode'},                    '&amp;mode='.$env{'form.mode'}.
                     '&amp;area='.$env{'form.area'},
                   text=>"Advanced $srchtype Search",                    text=>"Advanced $srchtype Search",
                   bug=>'Searching',});                    bug=>'Searching',});
     }       } elsif (($env{'form.phase'} eq 'results') ||
                ($env{'form.phase'} =~ /^(sort|run_search)$/)) {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/searchcat?'.&Apache::loncommon::inhibit_menu_check().
                 '&amp;phase=disp_adv'.
                 '&amp;catalogmode='.$env{'form.catalogmode'}.
                 '&amp;launch='.$env{'form.launch'}.
                 '&amp;mode='.$env{'form.mode'}.
                 '&amp;area='.$env{'form.area'}.
                 '&amp;searchmode='.$env{'form.searchmode'},
                 text=>"Search Results",
                 bug=>'Searching',});
       }
     ##      ##
     ## Switch on the phase      ## Switch on the phase
     ##      ##
Line 321  END Line 360  END
         &display_results($r,$importbutton,$closebutton,$diropendb,          &display_results($r,$importbutton,$closebutton,$diropendb,
                          $env{'form.area'});                           $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,$domainsref) =
             &get_persistent_data($persistent_db_file,              &get_persistent_data($persistent_db_file,
                  ['query','customquery','customshow',                   ['query','customquery','customshow',
                   'libraries','pretty_string']);                    'libraries','pretty_string','domains']);
         if ($env{'form.phase'} eq 'sort') {          if ($env{'form.phase'} eq 'sort') {
             &print_sort_form($r,$pretty_string);              &print_sort_form($r,$pretty_string,$target);
         } 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,$env{'form.area'});                          $libraries,$pretty_string,$env{'form.area'},$domainsref,$target);
         }          }
     } elsif(($env{'form.phase'} eq 'basic_search') ||      } elsif(($env{'form.phase'} eq 'basic_search') ||
             ($env{'form.phase'} eq 'adv_search')) {              ($env{'form.phase'} eq 'adv_search')) {
         #          #
         # We are running a search, try to parse it          # We are running a search, try to parse it
         my ($query,$customquery,$customshow,$libraries) =           my ($query,$customquery,$customshow,$libraries,$domains) = 
             (undef,undef,undef,undef);              (undef,undef,undef,undef,undef);
         my $pretty_string;          my $pretty_string;
         if ($env{'form.phase'} eq 'basic_search') {          if ($env{'form.phase'} eq 'basic_search') {
             ($query,$pretty_string,$libraries) =               ($query,$pretty_string,$libraries,$domains) = 
                 &parse_basic_search($r,$closebutton,$hidden_fields);                  &parse_basic_search($r,$closebutton,$hidden_fields);
             return OK if (! defined($query));              return OK if (! defined($query));
             &make_persistent({ basicexp => $env{'form.basicexp'}},              &make_persistent({ basicexp => $env{'form.basicexp'}},
                              $persistent_db_file);                               $persistent_db_file);
         } else {                      # Advanced search          } else {                      # Advanced search
             ($query,$customquery,$customshow,$libraries,$pretty_string)               ($query,$customquery,$customshow,$libraries,$pretty_string,$domains) 
                 = &parse_advanced_search($r,$closebutton,$hidden_fields);                  = &parse_advanced_search($r,$closebutton,$hidden_fields);
             return OK if (! defined($query));              return OK if (! defined($query));
         }          }
Line 353  END Line 392  END
                            customquery => $customquery,                             customquery => $customquery,
                            customshow => $customshow,                             customshow => $customshow,
                            libraries => $libraries,                             libraries => $libraries,
                            pretty_string => $pretty_string },                             pretty_string => $pretty_string,
                              domains => $domains },
                          $persistent_db_file);                           $persistent_db_file);
         #          #
         # Set up table          # Set up table
Line 387  END Line 427  END
         }          }
     }      }
     return OK;      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
Line 425  sub hidden_field { Line 465  sub hidden_field {
     return '<input type="hidden" name="'.$name.'" value="'.$value.'" />'.$/;      return '<input type="hidden" name="'.$name.'" value="'.$value.'" />'.$/;
 }  }
   
   sub start_search_tabs {
       my $area;
       my %lt = &Apache::lonlocal::texthash (
                                 res => 'Content Library Search',
                                 portfolio => 'Portfolio Search',
       );
       my $output = '<ul class="LC_TabContentBigger" id="main">';
       if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'}) eq 'F') {
           unless ($env{'form.area'} eq 'portfolio') {
               $area = 'res';
           }
           $output .= "\n".'<li'.($area eq 'res'?' class="active"':'').
                      '><a href="/adm/searchcat?area=res&amp;catalogmode='.$env{'form.catalogmode'}.'">'.
                      '<b>&nbsp;&nbsp;&nbsp;&nbsp;'.$lt{'res'}.
                      '&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>';
           unless ($env{'form.catalogmode'}) {
               $output .= '<li'.($area ne 'res'?' class="active"':'').
                          '><a href="/adm/searchcat?area=portfolio"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.$lt{'portfolio'}.
                          '&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li></ul>';
           }
       } else {
           $area = 'portfolio';
           $output .= "\n".'<li class="active">'.
                      '<a href="/adm/searchcat?area=portfolio"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.$lt{'portfolio'}.
                      '&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li></ul>';
       }
       $output .= '<div class="LC_Box" style="clear:both;margin:0;">'.
                  '<div id="maincoursedoc" style="margin:0 0;padding:0 0;">'.
                  '<div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">';
       return $output;
   }
   
   sub end_search_tabs {
       return '</div></div></div>';
   }
   
 ######################################################################  ######################################################################
   
 =pod   =pod
   
   =over 4
    
 =item &print_basic_search_form()   =item &print_basic_search_form() 
   
 Prints the form for the basic search.  Sorry the name is so cryptic.  Prints the form for the basic search.  Sorry the name is so cryptic.
Line 439  Prints the form for the basic search.  S Line 517  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 %lt = &Apache::lonlocal::texthash (
                                 res => 'Content Library Search',
                                 portfolio => 'Portfolio Search',
       );
     my $result = ($env{'form.catalogmode'} ne 'import');      my $result = ($env{'form.catalogmode'} ne 'import');
       my $area;
     my $bread_crumb =      my $bread_crumb =
         &Apache::lonhtmlcommon::breadcrumbs('Searching','Search_Basic',          &Apache::lonhtmlcommon::breadcrumbs('Searching','Search_Basic',
     $env{'form.catalogmode'} ne 'import');      $env{'form.catalogmode'} ne 'import');
     my $scrout = &Apache::loncommon::start_page('Content Library').$bread_crumb;      my $scrout = &Apache::loncommon::start_page('Content Library').$bread_crumb.
 # Search form for resource space                    '<div class="LC_landmark" role="main">'."\n".
     if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {                   &start_search_tabs();
         $scrout .= &setup_basic_search($r,'res',$hidden_fields,$closebutton);      if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'}) eq 'F') {
         $scrout .= '<hr /><br />';          if ($env{'form.area'} eq 'portfolio') {
     }  # Search form for accessible portfolio files
               $scrout .= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);
           } else {
   # Search form for resource space
               $scrout .= &setup_basic_search($r,'res',$hidden_fields,$closebutton);
           }
       } else {
 # Search form for accessible portfolio files  # Search form for accessible portfolio files
     $scrout.= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);          $scrout .= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);
     $scrout .= &Apache::loncommon::end_page();      }
       $scrout .= &end_search_tabs().&Apache::loncommon::end_page();
     $r->print($scrout);      $r->print($scrout);
     return;      return;
 }  }
Line 460  sub setup_basic_search { Line 550  sub setup_basic_search {
     my ($r,$area,$hidden_fields,$closebutton) = @_;      my ($r,$area,$hidden_fields,$closebutton) = @_;
     # Define interface components      # Define interface components
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                               res => 'LON-CAPA Catalog Search',                                res => 'Content Library Search',
                               portfolio => 'Portfolio Search',                                portfolio => 'Portfolio Search',
     );      );
     my ($userelatedwords,$onlysearchdomain,$inclext,$adv_search_link,$scrout);      my ($userelatedwords,$onlysearchdomain,$inclext,$adv_search_link,$scrout);
Line 474  sub setup_basic_search { Line 564  sub setup_basic_search {
                      .&mt('use related words')                       .&mt('use related words')
                      .'</label>';                       .'</label>';
   
       my $anydom = 1;
       if ($area eq 'res') {
           unless (&Apache::lonnet::allowed('bre','/res/') eq 'F') {
               $anydom = 0;
           }
       }
       my $singledom;
       my ($disabled,$checked);
       if ($anydom) {
          $singledom = $r->dir_config('lonDefDomain');
          if ($env{'form.domains'} eq $singledom) {
              $checked = 1;
          }
       } else {
          $singledom = $env{'user.domain'};
          $disabled = ' disabled="disabled"';
          $checked = 1; 
       }
     $onlysearchdomain = '<label>'      $onlysearchdomain = '<label>'
                        .&Apache::lonhtmlcommon::checkbox(                         .&Apache::lonhtmlcommon::checkbox(
                            'domains',                             'domains',$checked,
                            $env{'form.domains'},                             $singledom,$disabled)
                            $r->dir_config('lonDefDomain'))  
                        .' '                         .' '
                        .&mt('only search domain [_1]'                         .&mt('only search domain [_1]'
                                ,'<b>'.$r->dir_config('lonDefDomain').'</b>')                                 ,'<b>'.$singledom.'</b>')
                        .'</label>';                         .'</label>';
   
     $adv_search_link = '<a href="/adm/searchcat?'.      $adv_search_link = '<a href="/adm/searchcat?'.
Line 504  sub setup_basic_search { Line 611  sub setup_basic_search {
                  $scrout .= '<input type="hidden" name="area" value="'.$area.'" />';                   $scrout .= '<input type="hidden" name="area" value="'.$area.'" />';
              }               }
     #      #
     $scrout .= '<div align="center">'.$/;      $scrout .= '<div class="LC_floatleft">'.
 #    if ($env{'request.course.id'}) {                 '<label>'.
         $scrout .= '<h1>'.$lt{$area}.'</h1>';                 &Apache::lonhtmlcommon::textbox('basicexp',
 #    } else {                                                 $env{'form.basicexp'},50).
         # No need to tell them they are searching                 '<br />'.
 #        $scrout.= ('<br />'x2);                 '<span class="LC_fontsize_medium">'.&searchhelp().'</span></label></div>'.
 #    }                 '<div class="LC_floatleft" style="text-align: left;">'.
     $scrout.='<table>'.                 '<span class="LC_nobreak">'.('&nbsp;'x3).$adv_search_link.'</span>'.'<br />'.
              '<tr><td align="center" valign="top">'.                 '<span class="LC_nobreak">'.('&nbsp;'x1).$userelatedwords.'</span>'.'<br />'.
              &Apache::lonhtmlcommon::textbox('basicexp',                 '<span class="LC_nobreak">'.('&nbsp;'x1).$onlysearchdomain.'</span>'.'<br />'.
                                              $env{'form.basicexp'},50).                 '<span class="LC_nobreak">'.('&nbsp;'x1).$inclext.'</span>'.'<br />'.
              '<br />'.                 '</div><br clear="both" />'.$/;
             '<span class="LC_fontsize_small">'.&searchhelp().'</span>'.'</td>'.  
             '<td>'.  
             '<span class="LC_nobreak">'.('&nbsp;'x3).$adv_search_link.'</span>'.'<br />'.  
             '<span class="LC_nobreak">'.('&nbsp;'x1).$userelatedwords.'</span>'.'<br />'.  
             '<span class="LC_nobreak">'.('&nbsp;'x1).$onlysearchdomain.'</span>'.'<br />'.  
             '<span class="LC_nobreak">'.('&nbsp;'x1).$inclext.'</span>'.'<br />'.  
              '</td>'.  
             '</tr>'.  
             '</table>'.$/;  
     #      #
     $scrout .= '<p>'      $scrout .= '<div><p>'
               .&viewoptions()                .&viewoptions()
               .'</p>'                .'</p>'
               .'<p>'                .'<p>'
Line 534  sub setup_basic_search { Line 632  sub setup_basic_search {
               .'value="'.&mt('Search').'" />'                .'value="'.&mt('Search').'" />'
               .' '                .' '
               .$closebutton                .$closebutton
               .'</p>';                .'</p></div>';
     #      #
     $scrout .= '</div>'.'</form>';      $scrout .= '</form>';
     return $scrout;      return $scrout;
 }   } 
   
Line 568  sub print_advanced_search_form{ Line 666  sub print_advanced_search_form{
 $closebutton  $closebutton
 </p>  </p>
 END  END
     my $srchtype = 'Catalog';      my $srchtype = 'Content Library';
     my $jscript;      my $jscript;
     if ($env{'form.area'} eq 'portfolio') {      if ($env{'form.area'} eq 'portfolio') {
         $srchtype = 'Portfolio';          $srchtype = 'Portfolio';
Line 586  function additional_metadata() { Line 684  function additional_metadata() {
     }      }
     my $scrout= &Apache::loncommon::start_page("Advanced $srchtype Search",      my $scrout= &Apache::loncommon::start_page("Advanced $srchtype Search",
                                                $jscript);                                                 $jscript);
     $scrout .= $bread_crumb;      $scrout .= $bread_crumb.'<div class="LC_landmark" role="main">'."\n".
                  &start_search_tabs();
   
     $scrout .= '<form method="post" action="/adm/searchcat" name="advsearch">'      $scrout .= '<form method="post" action="/adm/searchcat" name="advsearch">'
               .$hidden_fields                 .$hidden_fields 
Line 605  function additional_metadata() { Line 704  function additional_metadata() {
   
     # Standard Metadata      # Standard Metadata
     $scrout .= &Apache::lonhtmlcommon::row_headline()      $scrout .= &Apache::lonhtmlcommon::row_headline()
               .'<h3>'.&mt("Standard $srchtype Metadata").'</h3>'                .'<h2 class="LC_heading_2">'.&mt("Standard $srchtype Metadata").'</h2>'
               .&searchhelp()                .&searchhelp()
               .&Apache::lonhtmlcommon::row_closure();                .&Apache::lonhtmlcommon::row_closure();
     my %related_word_search =       my %related_word_search = 
Line 625  function additional_metadata() { Line 724  function additional_metadata() {
     foreach my $field ('title','author','subject','owner','authorspace',      foreach my $field ('title','author','subject','owner','authorspace',
                        'modifyinguser','keywords','notes','abstract',                         'modifyinguser','keywords','notes','abstract',
                        'standards','mime') {                         'standards','mime') {
         $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield($fields{$field}))          $scrout .= &Apache::lonhtmlcommon::row_title('<label for="'.$field.'">'.
                                                        &titlefield($fields{$field}).'</label>')
                   .&Apache::lonmeta::prettyinput($field,                    .&Apache::lonmeta::prettyinput($field,
                                           $env{'form.'.$field},                                            $env{'form.'.$field},'',
                                           $field,                                            $field,
                                           'advsearch',                                            'advsearch',
                                           $related_word_search{$field},                                            $related_word_search{$field},
                                           '',                                            '&nbsp;&nbsp;',
                                           $env{'form.'.$field.'_related'},                                            $env{'form.'.$field.'_related'},
                                           50);                                            50);
         if ($related_word_search{$field}) {          if ($related_word_search{$field}) {
             $scrout .= &mt('related words');              $scrout .= '<label for="'.$field.'_related">'.&mt('related words').'</label>';
         } else {          } else {
             $scrout .= '';              $scrout .= '';
         }          }
         $scrout .= &Apache::lonhtmlcommon::row_closure();          $scrout .= &Apache::lonhtmlcommon::row_closure();
     }      }
     foreach my $field ('lowestgradelevel','highestgradelevel') {      foreach my $field ('lowestgradelevel','highestgradelevel') {
         $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield($fields{$field}))          $scrout .= &Apache::lonhtmlcommon::row_title('<label for="'.$field.'">'.
                                                        &titlefield($fields{$field}).'</label>')
                   .&Apache::lonmeta::prettyinput($field,                    .&Apache::lonmeta::prettyinput($field,
                                           $env{'form.'.$field},                                            $env{'form.'.$field},'',
                                           $field,                                            $field,
                                           'advsearch',                                            'advsearch',
                                           0)                                            0)
                   .&Apache::lonhtmlcommon::row_closure();                    .&Apache::lonhtmlcommon::row_closure();
     }      }
   
     $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield(&mt('MIME Type Category')))      $scrout .= &Apache::lonhtmlcommon::row_title('<label for="category">'.
                                                    &titlefield(&mt('MIME Type Category')).'</label>')
               .&Apache::loncommon::filecategoryselect('category',                .&Apache::loncommon::filecategoryselect('category',
                    $env{'form.category'})                     $env{'form.category'},'category')
               .&Apache::lonhtmlcommon::row_closure();                .&Apache::lonhtmlcommon::row_closure();
   
     $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield(&mt('Domains')))      my $anydomain = 1;
               .&Apache::loncommon::domain_select('domains',      if ($env{'form.area'} ne 'portfolio') {
                    $env{'form.domains'},1)          unless (&Apache::lonnet::allowed('bre','/res/')) {
               .&Apache::lonhtmlcommon::row_closure();              $anydomain = 0; 
           }
       }
   
       $scrout .= &Apache::lonhtmlcommon::row_title('<label for="domains">'.
                                                    &titlefield(&mt('Domains')).'</label>');
       if ($anydomain) {
           my $defdom = &Apache::lonnet::default_login_domain();
           my ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('shared',$defdom);
           $scrout .= &Apache::loncommon::domain_select('domains',
                      $env{'form.domains'},1,$trusted,$untrusted,'domains');
       } else {
           $scrout .= &Apache::loncommon::select_dom_form($env{'user.domain'},
                                                          'domains','','','',
                                                          [$env{'user.domain'}],'',1,'domains');
       }
       $scrout .= &Apache::lonhtmlcommon::row_closure();
   
     # Misc metadata      # Misc metadata
     if ($env{'form.area'} ne 'portfolio') {      if ($env{'form.area'} ne 'portfolio') {
         $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield(&mt('Copyright/Distribution')))          $scrout .= &Apache::lonhtmlcommon::row_title('<label for="copyright">'.
                                                        &titlefield(&mt('Copyright/Distribution')).'</label>')
                   .&Apache::lonmeta::selectbox('copyright',                    .&Apache::lonmeta::selectbox('copyright',
                                              $env{'form.copyright'},                                               $env{'form.copyright'},'',
                                                'copyright',
                                 \&Apache::loncommon::copyrightdescription,                                  \&Apache::loncommon::copyrightdescription,
                                        ( undef,                                         ( undef,
                                         &Apache::loncommon::copyrightids)                                          &Apache::loncommon::copyrightids)
Line 673  function additional_metadata() { Line 793  function additional_metadata() {
                   .&Apache::lonhtmlcommon::row_closure();                    .&Apache::lonhtmlcommon::row_closure();
     }      }
   
     $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield(&mt('Language')))      $scrout .= &Apache::lonhtmlcommon::row_title('<label for="language">'.
                                                    &titlefield(&mt('Language')).'</label>')
               .&Apache::lonmeta::selectbox('language',                .&Apache::lonmeta::selectbox('language',
                                     $env{'form.language'},                                      $env{'form.language'},'','language',
                                     \&Apache::loncommon::languagedescription,                                      \&Apache::loncommon::languagedescription,
                                     ('any',&Apache::loncommon::languageids)                                      ('any',&Apache::loncommon::languageids)
                                     )                                      )
Line 688  function additional_metadata() { Line 809  function additional_metadata() {
         if ($curnumadd eq '') {          if ($curnumadd eq '') {
             $curnumadd = 1;              $curnumadd = 1;
         }          }
           my $customlabel = &mt('Text box description');
         $scrout .= &Apache::lonhtmlcommon::row_headline()          $scrout .= &Apache::lonhtmlcommon::row_headline()
                   .'<h3>'.&mt('Custom Metadata fields').'</h3>'                    .'<h3>'.&mt('Custom Metadata fields').'</h3>'
                   .&Apache::lonhtmlcommon::row_closure()                    .&Apache::lonhtmlcommon::row_closure()
                   .&Apache::lonhtmlcommon::row_title('')                    .&Apache::lonhtmlcommon::row_title('<span class="LC_visually_hidden">'.$customlabel.'</span>',
                                                        '','','',1)
                   .&mt('Field Name').' | '.&mt('Field Value(s)')                    .&mt('Field Name').' | '.&mt('Field Value(s)')
                   .&Apache::lonhtmlcommon::row_closure();                    .&Apache::lonhtmlcommon::row_closure();
   
         for (my $j=0; $j<$curnumadd; $j++) {          for (my $j=0; $j<$curnumadd; $j++) {
             my $num = $j+1;              my $num = $j+1;
               my $namelabel = &mt('name of custom metadata field [_1]',$num);
               my $valuelabel = &mt('value of custom metadata field [_1]',$num);
             $scrout .= &Apache::lonhtmlcommon::row_title(&mt('Custom metadata [_1]',$num))              $scrout .= &Apache::lonhtmlcommon::row_title(&mt('Custom metadata [_1]',$num))
                       .'<input type="text"'                        .'<input type="text" id="addedfield_'.$j.'"'
                       .' name="addedfield_'.$j.'" size="10"'                        .' name="addedfield_'.$j.'" size="10"'
                       .' value="'.$env{'form.addedfield_'.$j}.'" />'                        .' value="'.$env{'form.addedfield_'.$j}.'" aria-label="'.$namelabel.'" />'
                       .' '                        .' '
                       .'<input type="text" '                        .'<input type="text" '
                       .'name="addedvalues_'.$j.'" size="15"'                        .'name="addedvalues_'.$j.'" size="15"'
                       .' value="'.$env{'form.addedvalues_'.$j}.'" />'                        .' value="'.$env{'form.addedvalues_'.$j}.'" aria-label="'.$valuelabel.'" />'
                       .&Apache::lonhtmlcommon::row_closure();                        .&Apache::lonhtmlcommon::row_closure();
         }          }
         $scrout .= &Apache::lonhtmlcommon::row_title('')          my $addcustomlabel = &mt('Add metadata field option');
           $scrout .= &Apache::lonhtmlcommon::row_title('<span class="LC_visually_hidden">'.$addcustomlabel.'</span>',
                                                        '','','',1)
                   .'<label>'                    .'<label>'
                   .'<input type="checkbox" name="newfield"'                    .'<input type="checkbox" name="newfield"'
                   .' value="1" onclick="javascript:additional_metadata()" />'                    .' value="1" onclick="javascript:additional_metadata()" />'
Line 718  function additional_metadata() { Line 845  function additional_metadata() {
 } else {  } else {
         #          #
         # Dynamic metadata          # Dynamic metadata
           my $statslabel = &mt('Text box description');
         $scrout .= &Apache::lonhtmlcommon::row_headline()          $scrout .= &Apache::lonhtmlcommon::row_headline()
                   .'<h3>'.&mt('Problem Statistics').'</h3>'                    .'<h3>'.&mt('Problem Statistics').'</h3>'
                   .&Apache::lonhtmlcommon::row_closure();                    .&Apache::lonhtmlcommon::row_closure();
         $scrout .= &Apache::lonhtmlcommon::row_title('')          $scrout .= &Apache::lonhtmlcommon::row_title('<span class="LC_visually_hidden">'.$statslabel.'</span>',
                                                        '','','',1)
                   .&mt('Minimum').' | '.&mt('Maximum')                    .&mt('Minimum').' | '.&mt('Maximum')
                   .&Apache::lonhtmlcommon::row_closure();                    .&Apache::lonhtmlcommon::row_closure();
         foreach my $statistic           foreach my $statistic 
             ({ name=>'count',              ({ name=>'count',
                description=>'Network-wide number of accesses (hits)',},                 description=>'Network-wide number of accesses (hits)',
                  minlabel => 'minimum hit count',
                  maxlabel => 'maximum hit count'},
              { name=>'stdno',               { name=>'stdno',
                description=>                 description=>
                'Statistics calculated for number of students',},                 'Statistics calculated for number of students',
                  minlabel => 'minimum number of students in calculation',
                  maxlabel => 'maximum number of students in calculation'},
              { name => 'avetries',               { name => 'avetries',
                description=>'Average number of tries till solved',},                 description=>'Average number of tries till solved',
                  minlabel => 'minimum average tries till solved',
                  maxlabel => 'maximum average tries till solved'},
              { name => 'difficulty',               { name => 'difficulty',
                description=>'Degree of difficulty',},                 description=>'Degree of difficulty',
                  minlabel => 'minimum degree of difficulty',
                  maxlabel => 'maximum degree of difficulty'},
              { name => 'disc',               { name => 'disc',
                description=>'Degree of discrimination'}) {                 description=>'Degree of discrimination',
                  minlabel => 'minimum degree of discrimination',
                  maxlabel => 'maximum degree of discrimination'}) {
               $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield(&mt($statistic->{'description'})))                $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield(&mt($statistic->{'description'})))
                         .'<input type="text" name="'.$statistic->{'name'}                          .'<input type="text" name="'.$statistic->{'name'}
                         .'_min" value="" size="6" />'                          .'_min" value="" size="6" aria-label="'.&mt($statistic->{'minlabel'}).'" />'
                         .' '                          .' '
                         .'<input type="text" name="'.$statistic->{'name'}                          .'<input type="text" name="'.$statistic->{'name'}
                         .'_max" value="" size="6" />'                          .'_max" value="" size="6" aria-label="'.&mt($statistic->{'maxlabel'}).'" />'
                         .&Apache::lonhtmlcommon::row_closure();                          .&Apache::lonhtmlcommon::row_closure();
         }          }
           my $evallabel = &mt('Text box description');
         $scrout .= &Apache::lonhtmlcommon::row_headline()          $scrout .= &Apache::lonhtmlcommon::row_headline()
                   .'<h3>'.&mt('Evaluation Data').'</h3>'                    .'<h3>'.&mt('Evaluation Data').'</h3>'
                   .&Apache::lonhtmlcommon::row_closure();                    .&Apache::lonhtmlcommon::row_closure();
         $scrout .= &Apache::lonhtmlcommon::row_title('')          $scrout .= &Apache::lonhtmlcommon::row_title('<span class="LC_visually_hidden">'.$evallabel.'</span>',
                                                        '','','',1)
                   .&mt('Minimum').' | '.&mt('Maximum')                    .&mt('Minimum').' | '.&mt('Maximum')
                   .&Apache::lonhtmlcommon::row_closure();                    .&Apache::lonhtmlcommon::row_closure();
         foreach my $evaluation          foreach my $evaluation
             ( { name => 'clear',              ( { name => 'clear',
                 description => 'Material presented in clear way'},                  description => 'Material presented in clear way',
                   minlabel => 'minimum score: clarity',
                   maxlabel => 'maximum score: clarity'},
               { name =>'depth',                { name =>'depth',
                 description => 'Material covered with sufficient depth'},                  description => 'Material covered with sufficient depth',
                   minlabel => 'minimum score: coverage depth',
                   maxlabel => 'maximum score: coverage depth'},
               { name => 'helpful',                { name => 'helpful',
                 description => 'Material is helpful'},                  description => 'Material is helpful',
                   minlabel => 'minimum score: content helpful',
                   maxlabel => 'maximum score: content helpful'},
               { name => 'correct',                { name => 'correct',
                 description => 'Material appears to be correct'},                  description => 'Material appears to be correct',
                   minlabel => 'minimum score: correctness',
                   maxlabel => 'maximum score: correctness'},
               { name => 'technical',                { name => 'technical',
                 description => 'Resource is technically correct'}){                  description => 'Resource is technically correct',
                   minlabel => 'minimum score: technical correctness',
                   maxlabel => 'maximum score: technical correctness'}) {
             $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield(&mt($evaluation->{'description'})))              $scrout .= &Apache::lonhtmlcommon::row_title(&titlefield(&mt($evaluation->{'description'})))
                       .'<input type="text" name="'                        .'<input type="text" name="'
                       .$evaluation->{'name'}.'_min" value="" size="6" />'                        .$evaluation->{'name'}.'_min" value="" size="6" aria-label="'.&mt($evaluation->{'minlabel'}).'" />'
                       .' '                        .' '
                       .'<input type="text" name="'                        .'<input type="text" name="'
                       .$evaluation->{'name'}.'_max" value="" size="6" />'                        .$evaluation->{'name'}.'_max" value="" size="6" aria-label="'.&mt($evaluation->{'maxlabel'}).'" />'
                       .&Apache::lonhtmlcommon::row_closure();                        .&Apache::lonhtmlcommon::row_closure();
         }          }
     }      }
     #      #
     # Creation/Modification date limits      # Creation/Modification date limits
       my $dateslabel = &mt('Text box description');
     $scrout .= &Apache::lonhtmlcommon::row_headline()      $scrout .= &Apache::lonhtmlcommon::row_headline()
               .'<h3>'.&mt('Creation and Modification dates').'</h3>'                .'<h3>'.&mt('Creation and Modification dates').'</h3>'
               .&Apache::lonhtmlcommon::row_closure();                .&Apache::lonhtmlcommon::row_closure();
     $scrout .= &Apache::lonhtmlcommon::row_title('')      $scrout .= &Apache::lonhtmlcommon::row_title('<span class="LC_visually_hidden">'.$dateslabel.'</span>',
                                                    '','','',1)
               .&mt('Month[_1]Day[_2]Year','&nbsp;'x14,'&nbsp;'x6)                .&mt('Month[_1]Day[_2]Year','&nbsp;'x14,'&nbsp;'x6)
               .&Apache::lonhtmlcommon::row_closure();                .&Apache::lonhtmlcommon::row_closure();
   
Line 835  function additional_metadata() { Line 987  function additional_metadata() {
     $scrout .= $advanced_buttons      $scrout .= $advanced_buttons
               .'</form>';                .'</form>';
   
     $scrout .= &Apache::loncommon::end_page();      $scrout .= &end_search_tabs().'</div>'.&Apache::loncommon::end_page();
     $r->print($scrout);      $r->print($scrout);
     return;      return;
 }  }
Line 908  sub viewoptions { Line 1060  sub viewoptions {
     if (! defined($env{'form.viewselect'})) {       if (! defined($env{'form.viewselect'})) { 
         $env{'form.viewselect'}='detailed';           $env{'form.viewselect'}='detailed'; 
     }      }
     $scrout .= '<span class="LC_nobreak">'      $scrout .= '<span class="LC_nobreak"><label>'
               .&mt('Type:').' '                .&mt('Type:').' '
               .&Apache::lonmeta::selectbox('viewselect',                .&Apache::lonmeta::selectbox('viewselect',
                    $env{'form.viewselect'},                     $env{'form.viewselect'},'','',
                    \&viewoptiontext,                     \&viewoptiontext,
                    sort(keys(%Views)))                     sort(keys(%Views)))
               .'</span>';                .'</label></span>';
     my $countselect = &Apache::lonmeta::selectbox('show',      my $countselect = &Apache::lonmeta::selectbox('show',
                                                   $env{'form.show'},                                                    $env{'form.show'},'','',
                                                   undef,                                                    undef,
                                                   (10,20,50,100,1000,10000));                                                    (10,20,50,100,1000,10000));
     $scrout .= ' <span class="LC_nobreak">'      $scrout .= ' <span class="LC_nobreak"><label>'
               .&mt('Records per Page:').' '.$countselect                .&mt('Records per Page:').' '.$countselect
               .'</span>'.$/;                .'</label></span>'.$/;
     return $scrout;      return $scrout;
 }  }
   
Line 1012  Outputs: array of values.  Returns undef Line 1164  Outputs: array of values.  Returns undef
   
 This function is the reverse of &make_persistent();  This function is the reverse of &make_persistent();
 Retrieve persistent data from %persistent_db.  Retrieved items will have their  Retrieve persistent data from %persistent_db.  Retrieved items will have their
 values unescaped.  If the item contains commas (before unescaping), the  values unescaped.  If the item is 'domains; then the returned
 returned value will be an array pointer.   value will be a hash pointer.  Otherwise, if the item contains
   commas (before unescaping), the returned value will be an array pointer.
   
 =cut  =cut
   
Line 1031  sub get_persistent_data { Line 1184  sub get_persistent_data {
             push @Values, undef;              push @Values, undef;
             next;              next;
         }          }
         my @values = map {           if ($name eq 'domains') {
             &unescape($_);              my %valueshash;
         } split(',',$persistent_db{$name});              my @items= map { &unescape($_); } split(',',$persistent_db{$name});
         if (@values <= 1) {              foreach my $item (@items) {
             push @Values,$values[0];                  if ($item =~ /=/) {
                       my ($key,$val) = map { &unescape($_); } split(/=/,$item);
                       $valueshash{$key} = $val;
                   }
               }
               push(@Values,\%valueshash);
         } else {          } else {
             push @Values,\@values;              my @values = map { 
                   &unescape($_);
               } split(',',$persistent_db{$name});
               if (@values <= 1) {
                   push @Values,$values[0];
               } else {
                   push @Values,\@values;
               }
         }          }
     }      }
     untie (%persistent_db);      untie (%persistent_db);
Line 1055  Inputs: Hash of values to save, filename Line 1220  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 separated string.    elements escaped and concatenated in a comma separated string. Values 
   that are hash pointers will have their keys and values escaped and 
   concatenated in a comma separated string.
   
 =cut  =cut
   
Line 1067  sub make_persistent { Line 1234  sub make_persistent {
     return undef if (! tie(%persistent_db,'GDBM_File',      return undef if (! tie(%persistent_db,'GDBM_File',
                            $filename,&GDBM_WRCREAT(),0640));                             $filename,&GDBM_WRCREAT(),0640));
     foreach my $name (keys(%save)) {      foreach my $name (keys(%save)) {
         my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));          my @values=();
         # We handle array references, but not recursively.          if (ref($save{$name}) eq 'ARRAY') {
               @values = @{$save{$name}};
           } elsif (ref($save{$name}) eq 'HASH') {
               foreach my $key (%{$save{$name}}) {
                   push(@values,&escape($key).'='.&escape($save{$name}{$key}));
               }
           } else {
               @values = $save{$name};
           }
           # We handle array and hash references, but not recursively.
         my $store = join(',', map { &escape($_); } @values );          my $store = join(',', map { &escape($_); } @values );
         $persistent_db{$name} = $store;          $persistent_db{$name} = $store;
     }      }
Line 1193  sub parse_advanced_search { Line 1369  sub parse_advanced_search {
     }      }
     if (! $fillflag) {      if (! $fillflag) {
  &output_blank_field_error($r,$closebutton,   &output_blank_field_error($r,$closebutton,
                                   'phase=disp_adv',$hidden_fields);                                    'phase=disp_adv&amp;area='.$env{'form.area'}.
  return ;                                    '&amp;catalogmode='.$env{'form.catalogmode'},
                                     $hidden_fields);
    return;
     }      }
     # Turn the form input into a SQL-based query      # Turn the form input into a SQL-based query
     my $query='';      my $query='';
Line 1207  sub parse_advanced_search { Line 1385  sub parse_advanced_search {
             &process_phrase_input($env{'form.'.$field},              &process_phrase_input($env{'form.'.$field},
                                   $env{'form.'.$field.'_related'},$field);                                    $env{'form.'.$field.'_related'},$field);
         if (defined($error)) {          if (defined($error)) {
             &output_unparsed_phrase_error($r,$closebutton,'phase=disp_adv',              &output_unparsed_phrase_error($r,$closebutton,
                                            'phase=disp_adv&amp;area='.$env{'form.area'}.
                                            '&amp;catalogmode='.$env{'form.catalogmode'}.
                                          $hidden_fields,$field);                                           $hidden_fields,$field);
             return;              return;
         } else {          } else {
Line 1385  sub parse_advanced_search { Line 1565  sub parse_advanced_search {
     ##      ##
     ## Deal with restrictions to given domains      ## Deal with restrictions to given domains
     ##       ## 
     my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();      my ($libraries_to_query,$pretty_domains_string,$domains_to_query) = 
           &parse_domain_restrictions();
     if ($pretty_domains_string) {      if ($pretty_domains_string) {
        $pretty_search_string .= $pretty_domains_string."<br />\n";         $pretty_search_string .= $pretty_domains_string."<br />\n";
     }      }
Line 1401  sub parse_advanced_search { Line 1582  sub parse_advanced_search {
     }      }
     #&Apache::lonnet::logthis('advanced query = '.$/.$query);      #&Apache::lonnet::logthis('advanced query = '.$/.$query);
     return ($query,$customquery,$customshow,$libraries_to_query,      return ($query,$customquery,$customshow,$libraries_to_query,
             $pretty_search_string);              $pretty_search_string,$domains_to_query);
 }  }
   
 sub parse_domain_restrictions {  sub parse_domain_restrictions {
     my $libraries_to_query = undef;      my $libraries_to_query = undef;
       my $domains_to_query = undef;
     # $env{'form.domains'} can be either a scalar or an array reference.      # $env{'form.domains'} can be either a scalar or an array reference.
     # We need an array.      # We need an array.
     if (! exists($env{'form.domains'}) || $env{'form.domains'} eq '') {      if (! exists($env{'form.domains'}) || $env{'form.domains'} eq '') {
Line 1429  sub parse_domain_restrictions { Line 1611  sub parse_domain_restrictions {
         foreach (sort @allowed_domains) {          foreach (sort @allowed_domains) {
             $pretty_domains_string .= "<b>".$_."</b> ";              $pretty_domains_string .= "<b>".$_."</b> ";
         }          }
  my %servers = &Apache::lonnet::get_unique_servers(\@allowed_domains,   my %library_servers = &Apache::lonnet::get_unique_servers(\@allowed_domains,
    'library');                    'library');
           my (%older_library_servers,%okdoms,%domains_for_id);
           map { $okdoms{$_} = 1; } @allowed_domains;
           foreach my $key (keys(%library_servers)) {
               if (&Apache::lonnet::get_server_loncaparev('',$key) =~ /^\'?(\d+)\.(\d+)/) {
                   my $major = $1;
                   my $minor = $2;
                   if (($major < 2) || (($major == 2) && ($minor < 11))) {
                       map { $older_library_servers{$_} = 1; }
                           &Apache::lonnet::machine_ids($library_servers{$key});
                   } else {
                       my %possdoms;
                       map { $possdoms{$_}=1 if ($okdoms{$_}); }
                           &Apache::lonnet::machine_domains($library_servers{$key});
                       $domains_for_id{$key} = join(',',sort(keys(%possdoms)));
                   }
               }
           }
           my %servers = (%library_servers,%older_library_servers);
  $libraries_to_query = [keys(%servers)];   $libraries_to_query = [keys(%servers)];
           $domains_to_query = \%domains_for_id;
     }      }
     return ($libraries_to_query,      return ($libraries_to_query,
             $pretty_domains_string);              $pretty_domains_string,
               $domains_to_query);
 }  }
   
 ######################################################################  ######################################################################
Line 1463  sub parse_basic_search { Line 1665  sub parse_basic_search {
  $env{"form.$_"}=&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,$domains_to_query) = 
           &parse_domain_restrictions();
     #      #
     # Check to see if enough of a query is filled in      # Check to see if enough of a query is filled in
     my $search_string = $env{'form.basicexp'};      my $search_string = $env{'form.basicexp'};
     if (! &filled($search_string)) {      if (! &filled($search_string)) {
  &output_blank_field_error($r,$closebutton,'phase=disp_basic');   &output_blank_field_error($r,$closebutton,'phase=disp_basic'.
                                     '&amp;area='.$env{'form.area'}.
                                     '&amp;catalogmode='.$env{'form.catalogmode'});
  return OK;   return OK;
     }      }
     my $pretty_search_string=$search_string;      my $pretty_search_string=$search_string;
Line 1484  sub parse_basic_search { Line 1689  sub parse_basic_search {
                                                     $env{'form.related'},                                                      $env{'form.related'},
                                                     $searchfield);                                                      $searchfield);
     if ($error) {      if ($error) {
         &output_unparsed_phrase_error($r,$closebutton,'phase=disp_basic',          &output_unparsed_phrase_error($r,$closebutton,'phase=disp_basic'.
                                         '&amp;area='.$env{'form.area'}.
                                         '&amp;catalogmode='.$env{'form.catalogmode'},
                                       '','basicexp');                                        '','basicexp');
         return;          return;
     }      }
Line 1509  sub parse_basic_search { Line 1716  sub parse_basic_search {
     $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,$domains_to_query);
 }  }
   
   
Line 1781  sub build_date_queries { Line 1988  sub build_date_queries {
     if ((defined($cafter)  && ! defined($cbefore)) ||      if ((defined($cafter)  && ! defined($cbefore)) ||
         (defined($cbefore) && ! defined($cafter))) {          (defined($cbefore) && ! defined($cafter))) {
         # This is bad, so let them know          # This is bad, so let them know
         $error = &mt('Incorrect entry for the creation date.  '.          $error = &mt('Incorrect entry for the creation date. '.
                     'You must specify both the beginning and ending dates.');                      'You must specify both the beginning and ending dates.');
     }      }
     if (! defined($error) &&       if (! defined($error) && 
         ((defined($mafter)  && ! defined($mbefore)) ||          ((defined($mafter)  && ! defined($mbefore)) ||
         (defined($mbefore) && ! defined($mafter)))) {          (defined($mbefore) && ! defined($mafter)))) {
         # This is also bad, so let them know          # This is also bad, so let them know
         $error = &mt('Incorrect entry for the last revision date.  '.          $error = &mt('Incorrect entry for the last revision date. '.
                      'You must specify both the beginning and ending dates.');                       'You must specify both the beginning and ending dates.');
     }      }
     if (! defined($error)) {      if (! defined($error)) {
Line 1800  sub build_date_queries { Line 2007  sub build_date_queries {
             my (undef,undef,undef,$cbday,$cbmon,$cbyear) = localtime($cbefore);              my (undef,undef,undef,$cbday,$cbmon,$cbyear) = localtime($cbefore);
             # Correct for year being relative to 1900              # Correct for year being relative to 1900
             $cayear+=1900; $cbyear+=1900;              $cayear+=1900; $cbyear+=1900;
               # Correct month; localtime gives month 0..11 but MySQL expects 1..12
               $camon++; $cbmon++;
             my $cquery=              my $cquery=
                 '(creationdate BETWEEN '.                  '(creationdate BETWEEN '.
                 "'".$cayear.'-'.$camon.'-'.$caday."'".                  "'".$cayear.'-'.$camon.'-'.$caday."'".
Line 1818  sub build_date_queries { Line 2027  sub build_date_queries {
             my (undef,undef,undef,$mbday,$mbmon,$mbyear) = localtime($mbefore);              my (undef,undef,undef,$mbday,$mbmon,$mbyear) = localtime($mbefore);
             # Correct for year being relative to 1900              # Correct for year being relative to 1900
             $mayear+=1900; $mbyear+=1900;              $mayear+=1900; $mbyear+=1900;
               # Correct month; localtime gives month 0..11 but MySQL expects 1..12
               $mamon++; $mbmon++;
             my $mquery=              my $mquery=
                 '(lastrevisiondate BETWEEN '.                  '(lastrevisiondate BETWEEN '.
                 "'".$mayear.'-'.$mamon.'-'.$maday."'".                  "'".$mayear.'-'.$mamon.'-'.$maday."'".
Line 1860  sub copyright_check { Line 2071  sub copyright_check {
     my (undef,undef,$resdom,$resname) = split('/',      my (undef,undef,$resdom,$resname) = split('/',
                                               $Metadata->{'url'});                                                $Metadata->{'url'});
     # Check for priv      # Check for priv
     if (($Metadata->{'copyright'} eq 'priv') &&       if ($Metadata->{'copyright'} eq 'priv') {
         (($env{'user.name'} ne $resname) &&          unless (($env{'user.name'} eq $resname) &&
          ($env{'user.domain'} ne $resdom))) {                  ($env{'user.domain'} eq $resdom)) {
         return 0;              return 0;
           }
     }      }
     # Check for domain      # Check for domain
     if (($Metadata->{'copyright'} eq 'domain') &&      if (($Metadata->{'copyright'} eq 'domain') &&
Line 1901  sub ensure_db_and_table { Line 2113  sub ensure_db_and_table {
     ## Sanity check the table id.      ## Sanity check the table id.
     ##      ##
     if (! defined($table) || $table eq '' || $table =~ /\D/ ) {      if (! defined($table) || $table eq '' || $table =~ /\D/ ) {
         $r->print(&Apache::loncommon::start_page(&mt('Error'))          $r->print(&Apache::loncommon::start_page('Error')
 . '<p>table: |'.$table.'|</p>' # SB  
                  .'<p class="LC_error">'                   .'<p class="LC_error">'
                  .&mt('Unable to retrieve search results. '                   .&mt('Unable to retrieve search results. '
                      .'Unable to determine the table results were saved in.')                       .'Unable to determine the table results were saved in.')
                    .'</p>'
                    . '<p>'.&mt('Internal info:').'</p>'
                    .'<pre>'.$table.'</pre>'
                  .&Apache::loncommon::end_page()                   .&Apache::loncommon::end_page()
         );          );
         return undef;          return undef;
Line 1915  sub ensure_db_and_table { Line 2129  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(
                   " are saved.".              '<p class="LC_error">'
   &Apache::loncommon::end_page());             .&mt('Unable to connect to the MySQL database where your results are saved.')
              .'</p>'
              .&Apache::loncommon::end_page()
           );
         &Apache::lonnet::logthis("lonsearchcat: unable to get lonmysql to".          &Apache::lonnet::logthis("lonsearchcat: unable to get lonmysql to".
                                  " connect to database.");                                   " connect to database.");
         &Apache::lonnet::logthis(&Apache::lonmysql::get_error());          &Apache::lonnet::logthis(&Apache::lonmysql::get_error());
Line 1925  sub ensure_db_and_table { Line 2142  sub ensure_db_and_table {
     }      }
     my $table_check = &Apache::lonmysql::check_table($table);      my $table_check = &Apache::lonmysql::check_table($table);
     if (! defined($table_check)) {      if (! defined($table_check)) {
         $r->print("A MySQL error has occurred.</form>".          $r->print(
   &Apache::loncommon::end_page());              '<p class="LC_error">'
              .&mt('A MySQL error has occurred.')
              .'</p></form>'
              .&Apache::loncommon::end_page());
         &Apache::lonnet::logthis("lonmysql was unable to determine the status".          &Apache::lonnet::logthis("lonmysql was unable to determine the status".
                                  " of table ".$table);                                   " of table ".$table);
         return undef;          return undef;
     } elsif (! $table_check) {      } elsif (! $table_check) {
         $r->print("The table of results could not be found.");          $r->print(
               '<p class="LC_error">'
              .&mt('The table of results could not be found.')
              .'</p>'
           );
         &Apache::lonnet::logthis("The user requested a table, ".$table.          &Apache::lonnet::logthis("The user requested a table, ".$table.
                                  ", that could not be found.");                                   ", that could not be found.");
         return undef;          return undef;
Line 1954  a link to change the search query. Line 2178  a link to change the search query.
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub print_sort_form {  sub print_sort_form {
     my ($r,$pretty_query_string) = @_;      my ($r,$pretty_query_string,$target) = @_;
   
     ##      ##
     my %SortableFields=&Apache::lonlocal::texthash(       my %SortableFields=&Apache::lonlocal::texthash( 
Line 1987  sub print_sort_form { Line 2211  sub print_sort_form {
         &Apache::lonnet::logthis(&Apache::lonmysql::get_error());          &Apache::lonnet::logthis(&Apache::lonmysql::get_error());
         return;          return;
     }      }
     my $js =<<END;      my $args;
 <script type="text/javascript">      if ($target eq '_parent') {
 // <![CDATA[          $args = {'links_target' => $target};
     function change_sort() {  
         var newloc = "/adm/searchcat?phase=results";  
         newloc += "&persistent_db_id=$env{'form.persistent_db_id'}";  
         newloc += "&sortby=";  
         newloc += document.forms.statusform.elements.sortby.value;  
         parent.resultsframe.location= newloc;  
     }      }
 // ]]>      my $start_page = &Apache::loncommon::start_page('Results',undef,$args);
 </script>  
 END  
   
     my $start_page = &Apache::loncommon::start_page('Results',$js);  
     my $breadcrumbs=      my $breadcrumbs=
         &Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',          &Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',
     $env{'form.catalogmode'} ne 'import');      $env{'form.catalogmode'} ne 'import',
                                               '','','','','','',$target);
     my $result = <<END;      my $result = <<END;
 $start_page  $start_page
 $breadcrumbs  $breadcrumbs
 <form name="statusform" action="" method="post" target="_top">  <div class="LC_landmark" role="main">
   <form name="statusform" action="" method="post" target="$target">
 <input type="hidden" name="catalogmode" value="import" />  <input type="hidden" name="catalogmode" value="import" />
 <input type="hidden" name="acts" value="" />  <input type="hidden" name="acts" value="" />
 END  END
Line 2027  END Line 2242  END
 #    $result.="</select>\n";  #    $result.="</select>\n";
     my $revise = &revise_button();      my $revise = &revise_button();
     $result.='<p>'      $result.='<p>'
             .&mt('There are [_1] matches to your query.',$total_results)              .&mt('Total of [quant,_1,match,matches] to your query.',$total_results)
             .' '.$revise.'</p>'              .' '.$revise.'</p>'
             .'<p>'.&mt('Search: ').$pretty_query_string              .'<p>'.&mt('Search: ').$pretty_query_string
             .'</p></form>';              .'</p></form>';
     $r->print($result.&Apache::loncommon::end_page());      $r->print($result.'</div>'.&Apache::loncommon::end_page());
     return;      return;
 }  }
   
Line 2165  SCRIPT Line 2380  SCRIPT
     $r->rflush();      $r->rflush();
 }  }
   
   sub reload_result_frame {
       my ($r) = @_;
       my $newloc = '/adm/searchcat?phase=results&persistent_db_id='.
           $env{'form.persistent_db_id'}.'&area='.$env{'form.area'}.
           '&catalogmode='.$env{'form.catalogmode'};
       $r->print(<<SCRIPT);
   <script type="text/javascript">
       parent.update_results("$newloc");
   </script>
   SCRIPT
   
       $r->rflush();
   }
   
 {  {
     my $max_time  = 300;  # seconds for the search to complete      my $max_time  = 60;  # seconds for the search to complete
     my $start_time = 0;      my $start_time = 0;
     my $last_time = 0;      my $last_time = 0;
   
Line 2225  sub revise_button { Line 2454  sub revise_button {
     my $newloc = '/adm/searchcat'.      my $newloc = '/adm/searchcat'.
         '?persistent_db_id='.$env{'form.persistent_db_id'}.          '?persistent_db_id='.$env{'form.persistent_db_id'}.
             '&amp;cleargroupsort=1'.              '&amp;cleargroupsort=1'.
             '&amp;phase='.$revise_phase;              '&amp;phase='.$revise_phase.
               '&amp;area='.$env{'form.area'}.
               '&amp;catalogmode='.$env{'form.catalogmode'};
     my $result = qq{<input type="button" value="$revisetext" 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 2247  results into MySQL. Line 2478  results into MySQL.
 ######################################################################  ######################################################################
 sub run_search {  sub run_search {
     my ($r,$query,$customquery,$customshow,$serverlist,      my ($r,$query,$customquery,$customshow,$serverlist,
         $pretty_string,$area) = @_;          $pretty_string,$area,$domainsref,$target) = @_;
     my $tabletype = 'metadata';      my $tabletype = 'metadata';
     if ($area eq 'portfolio') {      if ($area eq 'portfolio') {
         $tabletype = 'portfolio_search';          $tabletype = 'portfolio_search';
Line 2256  sub run_search { Line 2487  sub run_search {
     #      #
     # Print run_search header      # Print run_search header
     #      #
     my $start_page = &Apache::loncommon::start_page('Search Status',undef);      my $args;
       if ($target eq '_parent') {
           $args = {'links_target' => $target};
       }
       my $start_page = &Apache::loncommon::start_page('Search Status',undef,$args);
     my $breadcrumbs =      my $breadcrumbs =
  &Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',   &Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',
     $env{'form.catalogmode'} ne 'import');      $env{'form.catalogmode'} ne 'import',
                                               '','','','','','',$target);
     $r->print(<<END);      $r->print(<<END);
 $start_page  $start_page
 $breadcrumbs  $breadcrumbs
   <div class="LC_landmark" role="main">
 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 2279  END Line 2516  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,%domains_by_server);
     if (defined($serverlist)) {      if (defined($serverlist)) {
         if (ref($serverlist) eq 'ARRAY') {          if (ref($serverlist) eq 'ARRAY') {
             @Servers_to_contact = @$serverlist;              @Servers_to_contact = @$serverlist;
         } else {          } else {
             @Servers_to_contact = ($serverlist);              @Servers_to_contact = ($serverlist);
         }          }
           if (ref($domainsref) eq 'HASH') {
               foreach my $server (@Servers_to_contact) {
                   $domains_by_server{$server} = $domainsref->{$server};
               }
           }
     } else {      } else {
  my %all_library_servers = &Apache::lonnet::unique_library();   my %library_servers = &Apache::lonnet::unique_library();
           my (%all_library_servers, %older_library_servers);
           foreach my $key (keys(%library_servers)) {
               if (&Apache::lonnet::get_server_loncaparev('',$key) =~ /^\'?(\d+)\.(\d+)/) {
                   my $major = $1;
                   my $minor = $2;
                   if (($major < 2) || (($major == 2) && ($minor < 11))) {
                       map { $older_library_servers{$_} = 1; }
                           &Apache::lonnet::machine_ids($library_servers{$key});
                   }
               }
           }
           %all_library_servers = (%library_servers,%older_library_servers);
         @Servers_to_contact = sort(keys(%all_library_servers));          @Servers_to_contact = sort(keys(%all_library_servers));
           foreach my $server (@Servers_to_contact) {
               $domains_by_server{$server} =
                   join(',',sort(&Apache::lonnet::machine_domains($all_library_servers{$server})));
           }
     }      }
     my %Server_status;      my %Server_status;
     #      #
Line 2324  END Line 2582  END
     ##      ##
     ## Prepare for the big loop.      ## Prepare for the big loop.
     my $hitcountsum;      my $hitcountsum;
       my $oldhitcountsum;
       my $displaycount;
     my %matches;      my %matches;
     my $server;       my $server; 
     my $status;      my $status;
Line 2358  END Line 2618  END
             my $server = shift(@Servers_to_contact);              my $server = shift(@Servers_to_contact);
             &update_status($r,&mt('contacting [_1]',$server));              &update_status($r,&mt('contacting [_1]',$server));
             my $reply=&Apache::lonnet::metadata_query($query,$customquery,              my $reply=&Apache::lonnet::metadata_query($query,$customquery,
                                                       $customshow,[$server]);                                                        $customshow,[$server],\%domains_by_server);
             ($server) = keys(%$reply);              ($server) = keys(%$reply);
             $Server_status{$server} = $reply->{$server};              $Server_status{$server} = $reply->{$server};
         } else {          } else {
Line 2370  END Line 2630  END
                 &update_status($r,                  &update_status($r,
                        &mt('waiting on [_1]',join(' ',keys(%Server_status))));                         &mt('waiting on [_1]',join(' ',keys(%Server_status))));
             }              }
             sleep(1)              sleep(0.1);
         }          }
         #          #
         # Loop through the servers we have contacted but do not          # Loop through the servers we have contacted but do not
Line 2423  END Line 2683  END
   
                     if ($area eq 'portfolio') {                      if ($area eq 'portfolio') {
                         next if (defined($matches{$Fields{'url'}}));                          next if (defined($matches{$Fields{'url'}}));
                         # Skip if inaccessible                          # Skip unless access control set to public or passphrase-protected
                         next if (!&Apache::lonnet::portfolio_access($Fields{'url'}));                          next unless (($Fields{'scope'} eq 'public') || ($Fields{'scope'} eq 'guest'));
                         $matches{$Fields{'url'}} = 1;                           $matches{$Fields{'url'}} = 1; 
                     }                      }
                     #                      #
Line 2446  END Line 2706  END
                 delete($Server_status{$server});                  delete($Server_status{$server});
             }              }
             last if ($connection->aborted());              last if ($connection->aborted());
             &update_count_status($r,$hitcountsum);              if ($oldhitcountsum < $hitcountsum) {
                   &update_count_status($r,$hitcountsum);
                   if (($hitcountsum <= $env{'form.show'}) ||
                       (!$displaycount && $hitcountsum)) {
                       reload_result_frame($r);
                       $displaycount = $hitcountsum;
                   }
                   $oldhitcountsum = $hitcountsum;
               }
         }          }
         last if ($connection->aborted());          last if ($connection->aborted());
         &update_seconds($r);          &update_seconds($r);
Line 2459  END Line 2727  END
     # We have run out of time or run out of servers to talk to and      # We have run out of time or run out of servers to talk to and
     # results to get, so let the client know the top frame needs to be      # results to get, so let the client know the top frame needs to be
     # loaded from /adm/searchcat      # loaded from /adm/searchcat
     $r->print(&Apache::loncommon::end_page());      $r->print('</div>'.&Apache::loncommon::end_page());
 #    if ($env{'form.catalogmode'} ne 'import') {  #    if ($env{'form.catalogmode'} ne 'import') {
          $r->print(<<SCRIPT);           $r->print(<<SCRIPT);
 <script>  <script>
 window.location='/adm/searchcat?phase=sort&persistent_db_id=$env{'form.persistent_db_id'}';  window.location='/adm/searchcat?phase=sort&area=$env{"form.area"}&catalogmode=$env{"form.catalogmode"}&persistent_db_id=$env{"form.persistent_db_id"}';
 </script>  </script>
 SCRIPT  SCRIPT
 #    }  #    }
Line 2523  sub display_results { Line 2791  sub display_results {
     if (!defined($viewfunction)) {      if (!defined($viewfunction)) {
         $r->print('<p class="LC_error">'          $r->print('<p class="LC_error">'
                  .&mt('Internal Error - Bad view selected.')                   .&mt('Internal Error - Bad view selected.')
                  .'</p>'."\n");                   .'</p>'."\n"
                    .'</form></div>'.&Apache::loncommon::end_page());
         $r->rflush();          $r->rflush();
         return;          return;
     }      }
Line 2534  sub display_results { Line 2803  sub display_results {
     ##      ##
     ## Get the catalog controls setup      ## Get the catalog controls setup
     ##      ##
     my $action = "/adm/searchcat?phase=results";      my $action = '/adm/searchcat?phase=results&amp;area='.$env{'form.area'}.
                    '&amp;catalogmode='.$env{'form.catalogmode'};
     ##      ##
     ## Deal with import by opening the import db file.      ## Deal with import by opening the import db file.
     if ($env{'form.catalogmode'} eq 'import') {      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)) {
               # NOTE: this can happen when a previous request to searchcat?phase=results gets interrupted
               # (%groupsearch_db is not untied)
             $r->print('<p class="LC_error">'.              $r->print('<p class="LC_error">'.
               &mt('Unable to save import results.').                &mt('Unable to save import results.').
               '</p>'.                '</p>'.
               '</form>'.                '</form></div>'.
       &Apache::loncommon::end_page());        &Apache::loncommon::end_page());
             $r->rflush();              $r->rflush();
             return;              return;
         }           } 
           # untie %groupsearch_db if the connection gets aborted before the end
           $r->register_cleanup(sub {
               untie %groupsearch_db if (tied(%groupsearch_db));
           });
     }      }
     ##      ##
     ## Prepare the table for querying      ## Prepare the table for querying
Line 2560  sub display_results { Line 2836  sub display_results {
         $r->print('<p class="LC_error">'.          $r->print('<p class="LC_error">'.
           &mt('A MySQL error has occurred.').            &mt('A MySQL error has occurred.').
           '</p>'.            '</p>'.
           '</form>'.            '</form></div>'.
   &Apache::loncommon::end_page());    &Apache::loncommon::end_page());
         &Apache::lonnet::logthis("lonmysql was unable to determine the number".          &Apache::lonnet::logthis("lonmysql was unable to determine the number".
                                  " of rows in table ".$table);                                   " of rows in table ".$table);
Line 2665  sub display_results { Line 2941  sub display_results {
     $env{'form.sortorder'}='asc';      $env{'form.sortorder'}='asc';
  }   }
     }      }
     my $sortform = '<span class="LC_nobreak">'      my $sortform = '<span class="LC_nobreak"><span id="LC_sortby">'
                   .&mt('Sort by:').' '                    .&mt('Sort by:').'</span> '
                   .&Apache::loncommon::select_form($env{'form.sortfield'},                    .&Apache::loncommon::select_form($env{'form.sortfield'},
                                                       'sortfield',                                                     'sortfield',
                                                       \%sort_fields)                                                     \%sort_fields,'','','',
                                                      'LC_sortby')
                   .' '                    .' '
                   .&Apache::loncommon::select_form($env{'form.sortorder'},                    .&Apache::loncommon::select_form($env{'form.sortorder'},
                                                       'sortorder',                                                     'sortorder',
                                                       {asc =>&mt('Ascending'),                                                     {asc =>&mt('Ascending'),
                                                        desc=>&mt('Descending')                                                      desc=>&mt('Descending')
                                                        })                                                     },'','','','LC_sortby')
                   .'</span>';                    .'</span>';
     ##      ##
     ## Display links for 'prev' and 'next' pages (if necessary) and Display Options      ## Display links for 'prev' and 'next' pages (if necessary) and Display Options
Line 2689  sub display_results { Line 2966  sub display_results {
     );      );
   
     if ($total_results == 0) {      if ($total_results == 0) {
         $r->print('<meta HTTP-EQUIV="Refresh" CONTENT="2" />'.          $r->print('<h1 class="LC_search_results">'.&mt('There are currently no results.').'</h1>'.
                   '<p class="LC_info">'.&mt('There are currently no results.').'</p>'.                    '</form></div>'.
                   "</form>".  
   &Apache::loncommon::end_page());    &Apache::loncommon::end_page());
         return;          return;
     } else {      } else {
         $r->print('<div>'.          $r->print('<h1 class="LC_search_results">'.
                   mt('Results [_1] to [_2] out of [_3]',                    mt('Results [_1] to [_2] out of [_3]',
                      $min,$max,$total_results).                       $min,$max,$total_results).
                   "</div>\n");                    "</h1>\n");
     }      }
     ##      ##
     ## Get results from MySQL table      ## Get results from MySQL table
Line 2728  sub display_results { Line 3004  sub display_results {
     if ($area eq 'portfolio') {      if ($area eq 'portfolio') {
         $tabletype = 'portfolio_search';          $tabletype = 'portfolio_search';
     }      }
     $r->print(&Apache::loncommon::start_data_table());      $r->print(&Apache::loncommon::start_data_table().
                 &Apache::loncommon::start_data_table_header_row().
                 '<th>'.&mt('Data').'</th>');
       if (($env{'form.viewselect'} eq 'detailedpreview') ||
           ($env{'form.viewselect'} eq 'summarypreview')) {
           $r->print('<th>'.&mt('Preview').'</th>');
       }
       $r->print(&Apache::loncommon::end_data_table_header_row());
     foreach my $row (@Results) {      foreach my $row (@Results) {
         if ($connection->aborted()) {          if ($connection->aborted()) {
             &cleanup();              &cleanup();
Line 2766  sub display_results { Line 3049  sub display_results {
                                 $env{'form.persistent_db_id'})                                  $env{'form.persistent_db_id'})
         );          );
     }      }
     $r->print("</form>".&Apache::loncommon::end_page());      $r->print('</form></div>'.&Apache::loncommon::end_page());
     $r->rflush();      $r->rflush();
     untie %groupsearch_db if (tied(%groupsearch_db));      untie %groupsearch_db if (tied(%groupsearch_db));
     return;      return;
Line 3063  SCRIPT Line 3346  SCRIPT
 </script>  </script>
 SCRIPT  SCRIPT
   
       $js.=<<SCRIPT;
   <script type="text/javascript">
       \$(document).ready(function() {
           parent.done_loading_results();
       });
   </script>
   SCRIPT
   
     my $start_page  = &Apache::loncommon::start_page(undef,$js,      my $start_page  = &Apache::loncommon::start_page(undef,$js,
      {'only_body' =>1,       {'only_body' =>1,
                                                       'add_wishlist' =>1});                                                        'add_wishlist' =>1,
                                                         'add_modal' =>1});
     my $result=<<END;      my $result=<<END;
 $start_page  $start_page
   <div class="LC_landmark" role="main">
 <form name="results" method="post" action="/adm/searchcat">  <form name="results" method="post" action="/adm/searchcat">
 $importbutton  $importbutton
 END  END
Line 3076  END Line 3369  END
   
 sub results_link {  sub results_link {
     my $basic_link   = "/adm/searchcat?"."&amp;table=".$env{'form.table'}.      my $basic_link   = "/adm/searchcat?"."&amp;table=".$env{'form.table'}.
           "&amp;area=".$env{'form.area'}.
           "&amp;catalogmode=".$env{'form.catalogmode'}.
         "&amp;persistent_db_id=".$env{'form.persistent_db_id'};          "&amp;persistent_db_id=".$env{'form.persistent_db_id'};
     my $results_link = $basic_link."&amp;phase=results".      my $results_link = $basic_link."&amp;phase=results".
         "&amp;pause=1"."&amp;start=1";          "&amp;pause=1"."&amp;start=1";
Line 3086  sub results_link { Line 3381  sub results_link {
 ######################################################################  ######################################################################
 sub print_frames_interface {  sub print_frames_interface {
     my $r = shift;      my $r = shift;
     my $basic_link = "/adm/searchcat?"."&amp;table=".$env{'form.table'}.      my $basic_link = "/adm/searchcat?table=".$env{'form.table'}.
           "&amp;area=".$env{'form.area'}.
           "&amp;catalogmode=".$env{'form.catalogmode'}.
         "&amp;persistent_db_id=".$env{'form.persistent_db_id'};          "&amp;persistent_db_id=".$env{'form.persistent_db_id'};
     my $run_search_link = $basic_link."&amp;phase=run_search";      my $run_search_link = $basic_link."&amp;phase=run_search";
     my $results_link = &results_link();      my $results_link = &results_link();
Line 3095  sub print_frames_interface { Line 3392  sub print_frames_interface {
 // <![CDATA[  // <![CDATA[
 var targetwin = opener;  var targetwin = opener;
 var queue = '';  var queue = '';
   
   var loading_results = true;
   var need_reloading = false;
   var new_location;
   function update_results(newloc) {
       if (loading_results) {
           need_reloading = true;
           new_location = newloc;
       } else {
           loading_results = true;
           resultsframe.location = newloc;
       }
   }
   function done_loading_results() {
       loading_results = false;
       if (need_reloading) {
           need_reloading = false;
           update_results(new_location);
       }
   }
 // ]]>  // ]]>
 </script>  </script>
 JS  JS
Line 3157  sub evalfields { Line 3474  sub evalfields {
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
   sub display_tools {
       my ($title, $jumpurl) = @_;
       my $result;
       # Metadata
       $result.=
           &Apache::loncommon::modal_link(
               $jumpurl.'.meta?inhibitmenu=yes',
               '<img class="LC_icon" src="/res/adm/pages/catalog.png" alt="Info" />',
               500,500,'_blank',undef,&mt('Metadata'));
       # Stored Links
       $result.=
           ' <a href="javascript:;"'.
           ' onclick="set_wishlistlink('."'$title','$jumpurl'".')" '.
           'title="'.&mt('Save a link for this resource in your personal Stored Links repository').'">'.
           '<img class="LC_icon" src="/res/adm/pages/wishlist.png" '.
           'alt="Stored Links" style="width:22px;"/></a>';
       return $result;
   }
   
   ######################################################################
   ######################################################################
   
 =pod   =pod 
   
 =item Metadata Viewing Functions  =item Metadata Viewing Functions
Line 3181  sub detailed_citation_view { Line 3520  sub detailed_citation_view {
     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'}).'" alt="" />'.'&nbsp;'.          '<img src="'.&Apache::loncommon::icon($values{'url'}).'" alt="" />'.'&nbsp;'.
         '<a href="'.$jumpurl.'?inhibitmenu=yes" '.          '<a href="'.$jumpurl.'?inhibitmenu=yes" '.
         'target="preview">'.$values{'title'}."</a></b>\n".          'target="preview" onclick="openMyModal(this.href, 500, 500, \'yes\');return false;">'.$values{'title'}."</a></b>\n".
         '<a href="javascript:;" onclick="set_wishlistlink('."'$values{'title'}','$jumpurl'".')" '.          &display_tools($values{'title'}, $jumpurl).
         'title="'.&mt('Set link to wishlist').'">'.          "<p>\n".
         '<img class="LC_icon" src="/res/adm/pages/wishlist.png" '.          '<b>'.$values{'author'}.'</b>,'.
         'alt="set wishlistlink" style="width:22px;"/></a>';  
     $result .= "<p>\n";  
     $result .= '<b>'.$values{'author'}.'</b>,'.  
         ' <i>'.$values{'owner'}.'</i><br />';          ' <i>'.$values{'owner'}.'</i><br />';
     foreach my $field       foreach my $field 
         (          (
Line 3318  sub summary_view { Line 3655  sub summary_view {
     my $jumpurl=$values{'url'};      my $jumpurl=$values{'url'};
     $jumpurl=~s|^/ext/|http://|;      $jumpurl=~s|^/ext/|http://|;
     my $link = '<br />'.&display_url($jumpurl,1).'<br />';      my $link = '<br />'.&display_url($jumpurl,1).'<br />';
       $result .=
     my $titleWL = &mt('Set link to wishlist');          '<a href="'.$jumpurl.'?inhibitmenu=yes"'.
     $result.=<<END;          ' target="preview" onclick="openMyModal(this.href, 500, 500, \'yes\');return false;">'.$values{'title'}.'</a>'.
 <a href="$jumpurl?inhibitmenu=yes"           &display_tools($values{'title'}, $jumpurl).<<END;
    target="preview">$values{'title'}</a>  
 <a href="javascript:;" onclick="set_wishlistlink('$values{'title'}','$jumpurl')"   
    title="$titleWL">  
    <img class="LC_icon" src="/res/adm/pages/wishlist.png"  
         alt="set wishlistlink" style="width:22px;"/>  
 </a>  
 <br />  <br />
 $link<br />  $link<br />
 $values{'author'}, $values{'owner'} -- $values{'lastrevisiondate'}<br />  $values{'author'}, $values{'owner'} -- $values{'lastrevisiondate'}<br />
Line 3372  sub compact_view { Line 3703  sub compact_view {
     }      }
     $jumpurl = &HTML::Entities::encode($jumpurl,'<>&"');      $jumpurl = &HTML::Entities::encode($jumpurl,'<>&"');
     $result.=' <span class="LC_nobreak">'.      $result.=' <span class="LC_nobreak">'.
  '<a href="'.$jumpurl.'?inhibitmenu=yes" target="preview">'.   '<a href="'.$jumpurl.'?inhibitmenu=yes" target="preview" onclick="openMyModal(this.href, 500, 500, \'yes\');return false;">'.
         &HTML::Entities::encode($values{'title'},'<>&"').'</a></span> '.          &HTML::Entities::encode($values{'title'},'<>&"').'</a></span> '.
         '<a href="javascript:;" onclick="set_wishlistlink('."'$values{'title'}','$jumpurl'".')" '.          &display_tools($values{'title'}, $jumpurl).
         'title="'.&mt('Set link to wishlist').'">'.  
         '<img class="LC_icon" src="/res/adm/pages/wishlist.png" '.  
         'alt="set wishlistlink" style="width:22px;"/>'.  
         '</a>'.  
  $link.' <b>'.$values{'author'}.'</b> ('.$values{'domain'}.')';   $link.' <b>'.$values{'author'}.'</b> ('.$values{'domain'}.')';
     return $result;      return $result;
 }  }
Line 3392  sub display_url { Line 3719  sub display_url {
     } elsif ($url=~m{^(http://|/uploaded/)}) {      } elsif ($url=~m{^(http://|/uploaded/)}) {
  $link='<span class="LC_filename">'.$url.'</span>';   $link='<span class="LC_filename">'.$url.'</span>';
     } else {      } else {
           # replace the links to open in a new window
           # (because the search opens in a new window, it gets
           # confusing when the links open a tab in the
           # parent window; ideally we should not force windows)
           my $onclick = " onclick=\"window.open(this.href, '_blank', 'toolbar=1,location=1,menubar=0');return false;\""; 
         $link=&Apache::lonhtmlcommon::crumbs(          $link=&Apache::lonhtmlcommon::crumbs(
                   $url,                    $url,
                   'preview',                    'preview',
                   '',                    '',
                   (($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),                    '',
                   $skiplast).' ';                    $skiplast,$onclick).' ';
     }      }
     return $link;      return $link;
 }  }
Line 3420  sub fielded_format_view { Line 3752  sub fielded_format_view {
     my $jumpurl=$values{'url'};      my $jumpurl=$values{'url'};
     $jumpurl=~s|^/ext/|http://|;      $jumpurl=~s|^/ext/|http://|;
   
     my $titleWL = ('Set link to wishlist');  
     my $result=<<END;      my $result=<<END;
 $prefix <img src="$icon" alt="" />  $prefix <img src="$icon" alt="" />
 <dl>  <dl>
 <dt>URL:</dt>  <dt>URL:</dt>
     <dd><a href="$jumpurl?inhibitmenu=yes"       <dd><a href="$jumpurl?inhibitmenu=yes" 
          target='preview'>$values{'url'}</a>           target='preview'>$values{'url'}</a>
          <a href="javascript:;" onclick="set_wishlistlink('$values{'title'}','$jumpurl')"  
             title="$titleWL">  
             <img class="LC_icon" src="/res/adm/pages/wishlist.png"  
             alt="set wishlistlink" style="width:22px;"/>  
          </a>  
     </dd>  
 END  END
       $result .=
           &display_tools($values{'title'}, $jumpurl).'
       </dd>';
     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',
                        'owner','copyrighttag','hostname','abstract') {                         'owner','copyrighttag','hostname','abstract') {
Line 3707  Cleans the global %groupsearch_db by rem Line 4035  Cleans the global %groupsearch_db by rem
 ######################################################################  ######################################################################
 sub start_fresh_session {  sub start_fresh_session {
     delete $groupsearch_db{'mode_catalog'};      delete $groupsearch_db{'mode_catalog'};
     foreach (keys %groupsearch_db) {      foreach (keys(%groupsearch_db)) {
         if ($_ =~ /^pre_/) {          if ($_ =~ /^pre_/) {
             delete $groupsearch_db{$_};              delete $groupsearch_db{$_};
         }          }
Line 3725  sub cleanup { Line 4053  sub cleanup {
   &Apache::lonnet::logthis('Failed cleanup searchcat: groupsearch_db');    &Apache::lonnet::logthis('Failed cleanup searchcat: groupsearch_db');
         }          }
     }      }
     &untiehash();  
     &Apache::lonmysql::disconnect_from_db();      &Apache::lonmysql::disconnect_from_db();
     return OK;      return OK;
 }  }

Removed from v.1.331  
changed lines
  Added in v.1.364


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