Diff for /loncom/interface/lonsearchcat.pm between versions 1.317 and 1.363

version 1.317, 2009/10/22 13:48:55 version 1.363, 2025/03/19 15:30:29
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 78  use HTML::Entities(); Line 76  use HTML::Entities();
 use Parse::RecDescent;  use Parse::RecDescent;
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
 use Apache::lonindexer();  use Apache::lonindexer();
   use Apache::lonwishlist();
 use LONCAPA;  use LONCAPA;
   use Time::HiRes qw(sleep);
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 118  sub handler { Line 118  sub handler {
                       # This is set and used in &handler() and is also used in                         # This is set and used in &handler() and is also used in 
                       # &output_results().                        # &output_results().
   
     my $loaderror=&Apache::lonnet::overloaderror($r);  
     if ($loaderror) { return $loaderror; }  
     #      #
     my $closebutton;  # button that closes the search window       my $closebutton;  # button that closes the search window 
                       # This button is different for the RAT compared to                        # This button is different for the RAT compared to
Line 146  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'});
     }      }
     ##      ##
     ## Initialize global variables      ## Initialize global variables
     ##      ##
     my $domain  = $r->dir_config('lonDefDomain');      my $domain  = $r->dir_config('lonDefDomain');
     $diropendb= "/home/httpd/perl/tmp/".      my $temp_file_dir = LONCAPA::tempdir();
       $diropendb= $temp_file_dir .
         "$env{'user.domain'}_$env{'user.name'}_sel_res.db";          "$env{'user.domain'}_$env{'user.name'}_sel_res.db";
     #      #
     # set the name of the persistent database      # set the name of the persistent database
Line 164  sub handler { Line 163  sub handler {
         $env{'form.persistent_db_id'} = time;          $env{'form.persistent_db_id'} = time;
     }      }
   
     my $persistent_db_file = "/home/httpd/perl/tmp/".      my $persistent_db_file = $temp_file_dir .
         &escape($domain).          &escape($domain).
             '_'.&escape($env{'user.name'}).              '_'.&escape($env{'user.name'}).
                 '_'.$env{'form.persistent_db_id'}.'_persistent_search.db';                  '_'.$env{'form.persistent_db_id'}.'_persistent_search.db';
     ##      ##
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
   
     my @allowed_searches = ('portfolio');      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 {
     if (exists($env{'request.course.id'}) && $env{'request.course.id'} ne '') {          unless ($env{'form.catalogmode'} eq 'import') {
         push(@allowed_searches,'course');              $env{'form.area'} = 'portfolio';
               $crumb_text = 'Portfolio Search';
           }
       }
       if (@allowed_searches ==2) {
          unless (($env{'form.area'} eq 'portfolio') || ($env{'form.area'} eq 'res')) {
              delete($env{'form.area'});
          }
          $crumb_text = 'Portfolio and Content Library Search'; 
     }      }
     my $crumb_text = 'Portfolio Search';      my $target = '_top';
     if (@allowed_searches == 3) {      if ((($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) ||
         $crumb_text = 'Course, Portfolio and Catalog Search';          (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self'))) {
     } elsif (@allowed_searches ==2) {          if ($env{'form.phase'} =~ /^(sort|run_search)$/) {
         if (grep(/^res$/,@allowed_searches)) {              $target = '_parent';
             $crumb_text = 'Portfolio and Catalog Search';           } else {
         } elsif (grep(/^course$/,@allowed_searches)) {              $target = '_self';
             $crumb_text = 'Portfolio and Course Search';  
         }          }
     }      }
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
Line 193  sub handler { Line 206  sub handler {
        &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 204  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 303  END Line 320  END
     if ($env{'form.phase'} eq 'adv_search' ||      if ($env{'form.phase'} eq 'adv_search' ||
         $env{'form.phase'} eq 'disp_adv') {          $env{'form.phase'} eq 'disp_adv') {
         $env{'form.searchmode'} = 'advanced';          $env{'form.searchmode'} = 'advanced';
     } elsif ($env{'form.phase'} eq 'course_search') {  
         $env{'form.searchmode'} = 'course_search';  
     }      }
     #      #
     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 317  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.searchmode'} eq 'course search') {      } elsif (($env{'form.phase'} eq 'results') ||
                ($env{'form.phase'} =~ /^(sort|run_search)$/)) {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/searchcat?'.&Apache::loncommon::inhibit_menu_check().              ({href=>'/adm/searchcat?'.&Apache::loncommon::inhibit_menu_check().
                   '&amp;phase=disp_adv'.                '&amp;phase=disp_adv'.
                   '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'}.
                   text=>"Course Search",                '&amp;area='.$env{'form.area'}.
                   bug=>'Searching',});                '&amp;searchmode='.$env{'form.searchmode'},
                 text=>"Search Results",
                 bug=>'Searching',});
     }      }
     ##      ##
     ## Switch on the phase      ## Switch on the phase
Line 341  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 'course_search') {  
         &course_search($r);  
     } elsif(($env{'form.phase'} eq 'basic_search') ||      } elsif(($env{'form.phase'} eq 'basic_search') ||
             ($env{'form.phase'} eq 'adv_search')) {              ($env{'form.phase'} eq 'adv_search')) {
         #          #
         # We are running a search, try to parse it          # We are running a search, try to parse it
         my ($query,$customquery,$customshow,$libraries) =           my ($query,$customquery,$customshow,$libraries,$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 375  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 409  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 447  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 (
 ##   Course Search                                res => 'Content Library Search',
 ##                                portfolio => 'Portfolio Search',
 ######################################################################      );
 ######################################################################      my $output = '<ul class="LC_TabContentBigger" id="main">';
 {   # Scope the course search to avoid global variables      if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'}) eq 'F') {
 #          unless ($env{'form.area'} eq 'portfolio') {
 # Variables For course search              $area = 'res';
 my %alreadyseen;          }
 my %hash;          $output .= "\n".'<li'.($area eq 'res'?' class="active"':'').
 my $totalfound;                     '><a href="/adm/searchcat?area=res&amp;catalogmode='.$env{'form.catalogmode'}.'">'.
                      '<b>&nbsp;&nbsp;&nbsp;&nbsp;'.$lt{'res'}.
 sub make_symb {                     '&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>';
     my ($id)=@_;          unless ($env{'form.catalogmode'}) {
     my ($mapid,$resid)=split(/\./,$id);              $output .= '<li'.($area ne 'res'?' class="active"':'').
     my $map=$hash{'map_id_'.$mapid};                         '><a href="/adm/searchcat?area=portfolio"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.$lt{'portfolio'}.
     my $res=$hash{'src_'.$id};                         '&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li></ul>';
     my $symb=&Apache::lonnet::encode_symb($map,$resid,$res);  
     return $symb;  
 }  
   
 sub course_search {  
     my $r=shift;  
     my $pretty_search_string = '<b>'.$env{'form.courseexp'}.'</b>';  
     my $search_string = $env{'form.courseexp'};  
     my @New_Words;  
     undef(%alreadyseen);  
     if ($env{'form.crsrelated'}) {  
         ($search_string,@New_Words) = &related_version($env{'form.courseexp'});  
         if (@New_Words) {  
             $pretty_search_string .= ' '.&mt("with related words").": <b>@New_Words</b>.";  
         } else {  
             $pretty_search_string .= ' '.&mt('with no related words').".";  
         }  
     }  
     my $fulltext=$env{'form.crsfulltext'};  
     my $discuss=$env{'form.crsdiscuss'};  
     my @allwords=($search_string,@New_Words);  
     $totalfound=0;  
   
     &Apache::lonhtmlcommon::add_breadcrumb  
         ({href=>'/adm/searchcat?'.&Apache::loncommon::inhibit_menu_check().  
               '&amp;phase=disp_adv'.  
               'catalogmode='.$env{'form.catalogmode'}.  
               '&amp;launch='.$env{'form.launch'}.  
               '&amp;mode='.$env{'form.mode'},  
               text=>"Course Search",  
               bug=>'Searching',});  
     $r->print(&Apache::loncommon::start_page('Course Search'));  
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',  
                         $env{'form.catalogmode'} ne 'import'));  
   
     $r->print(  
       '<hr /><center><font size="+2" face="arial">'.  
       $pretty_search_string.'</font></center>'.  
       '<hr /><b>'.&mt('Course content').':</b><br />');  
     $r->rflush();  
 # ======================================================= Go through the course  
     my $c=$r->connection;  
     if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",  
             &GDBM_READER(),0640)) {  
         foreach (sort(keys(%hash))) {  
             if ($c->aborted()) { last; }  
             if (($_=~/^src\_(.+)$/)) {  
  if ($hash{'randomout_'.$1} & !$env{'request.role.adv'}) {  
     next;   
  }  
  my $symb=&make_symb($1);  
                 &checkonthis($r,$1,$hash{$_},0,&Apache::lonnet::gettitle($symb),  
      $fulltext,$symb,@allwords);  
             }  
         }  
         untie(%hash);  
     }  
     unless ($totalfound) {  
  $r->print('<p class="LC_info">'.&mt('No matches found in resources.').'</p>');  
     }  
   
 # Check discussions if requested  
     if ($discuss) {  
         my $totaldiscussions = 0;  
         $r->print('<br /><br /><b>'.&mt('Discussion postings').':</b><br />');   
         my $navmap = Apache::lonnavmaps::navmap->new();  
         if (defined($navmap)) {  
             my @allres=$navmap->retrieveResources();  
             my %discussiontime = &Apache::lonnet::dump('discussiontimes',  
                                    $env{'course.'.$env{'request.course.id'}.'.domain'},  
                                    $env{'course.'.$env{'request.course.id'}.'.num'});  
             foreach my $resource (@allres) {  
                 my $result = '';  
                 my $applies = 0;  
                 my $symb = $resource->symb();  
                 my $ressymb = $symb;  
                 if ($symb =~ m#(___adm/$LONCAPA::domain_re/$LONCAPA::username_re)/(\d+)/bulletinboard$#) {  
                     $ressymb = 'bulletin___'.$2.$1.'/'.$2.'/bulletinboard';  
                     unless ($ressymb =~ m#bulletin___\d+___adm/wrapper#) {  
                         $ressymb=~s#(bulletin___\d+___)#$1adm/wrapper/#;  
                     }  
                 }  
                 if (defined($discussiontime{$ressymb})) {   
                     my %contrib = &Apache::lonnet::restore($ressymb,$env{'request.course.id'},  
                          $env{'course.'.$env{'request.course.id'}.'.domain'},  
                          $env{'course.'.$env{'request.course.id'}.'.num'});  
                     if ($contrib{'version'}) {  
                         for (my $id=1;$id<=$contrib{'version'};$id++) {  
                             unless (($contrib{'hidden'}=~/\.$id\./) || ($contrib{'deleted'}=~/\.$id\./)) {   
                                 if ($contrib{$id.':subject'}) {  
                                     $result .= $contrib{$id.':subject'};  
                                 }  
                                 if ($contrib{$id.':message'}) {  
                                     $result .= $contrib{$id.':message'};  
                                 }  
                                 if ($contrib{$id,':attachmenturl'}) {  
                                     if ($contrib{$id,':attachmenturl'} =~ m-/([^/]+)$-) {  
                                         $result .= $1;  
                                     }  
                                 }  
                                 $applies = &checkwords($result,$applies,@allwords);  
                             }  
                         }  
                     }  
                 }  
 # Does this discussion apply?  
                 if ($applies) {  
                     my ($map,$ind,$url)=&Apache::lonnet::decode_symb($ressymb);  
                     my $disctype = &mt('resource');  
                     if ($url =~ m#/bulletinboard$#) {  
                         if ($url =~m#^adm/wrapper/adm/.*/bulletinboard$#) {  
                             $url =~s#^adm/wrapper##;  
                         }  
                         $disctype = &mt('discussion board');  
                     } else {  
                         $url = '/res/'.$url;  
                     }  
                     if ($url =~ /\?/) {  
                         $url .= '&amp;symb=';  
                     } else {  
                         $url .= '?symb=';  
                     }  
                     $url .= &escape($resource->symb());  
                     my $title = $resource->compTitle();  
                     $r->print('<br /><a href="'.$url.'" target="cat">'.  
                          ($title?$title:$url).'</a>&nbsp;&nbsp;-&nbsp;'.  
                          $disctype.'<br />');  
                     $totaldiscussions++;  
                 } else {  
                     $r->print(' .');  
                 }  
             }  
             unless ($totaldiscussions) {  
                 $r->print('<p class="LC_info">'.&mt('No matches found in postings.').'</p>');  
             }  
         } else {  
             $r->print('<div class="LC_error">'.&mt('An error occurred retrieving information about resources in the course.').'<br />'.&mt('It is recommended that you [_1]re-initialize the course[_2] and then try your search again.','<a href="/adm/roles">','</a>').'</div>');  
         }  
     }  
    
 # =================================================== Done going through course  
     $r->print(&Apache::loncommon::end_page());  
 }  
   
 # =============================== This pulls up a resource and its dependencies  
   
 sub checkonthis {  
     my ($r,$id,$url,$level,$title,$fulltext,$symb,@allwords)=@_;  
     $alreadyseen{$id}=1;  
     if (&Apache::loncommon::connection_aborted($r)) { return; }  
     $r->rflush();  
       
     my $result=$title.' ';  
     if ($env{'request.role.adv'} || !$hash{'encrypted_'.$id}) {  
  $result.=&Apache::lonnet::metadata($url,'title').' '.  
     &Apache::lonnet::metadata($url,'subject').' '.  
     &Apache::lonnet::metadata($url,'abstract').' '.  
     &Apache::lonnet::metadata($url,'keywords');  
     }  
     my ($extension)=($url=~/\.(\w+)$/);  
     if (&Apache::loncommon::fileembstyle($extension) eq 'ssi' &&  
  ($url) && ($fulltext)) {  
  $result.=&Apache::lonnet::ssi_body($url.'?symb='.&escape($symb));  
     }  
     $result=~s/\s+/ /gs;  
     my $applies = 0;  
     $applies = &checkwords($result,$applies,@allwords);  
 # Does this resource apply?  
     if ($applies) {  
        $r->print('<br />');  
        for (my $i=0;$i<=$level*5;$i++) {  
            $r->print('&nbsp;');  
        }  
        my $href=$url;  
        if ($hash{'encrypted_'.$id} && !$env{'request.role.adv'}) {  
    $href=&Apache::lonenc::encrypted($href)  
        .'?symb='.&Apache::lonenc::encrypted($symb);  
        } else {  
    $href.='?symb='.&escape($symb);  
        }  
        $r->print('<a href="'.$href.'" target="cat">'.($title?$title:$url).  
  '</a><br />');  
        $totalfound++;  
     } elsif ($fulltext) {  
        $r->print(' .');  
     }  
     $r->rflush();  
 # Check also the dependencies of this one  
     my $dependencies=  
                 &Apache::lonnet::metadata($url,'dependencies');  
     foreach (split(/\,/,$dependencies)) {  
        if (($_=~/^\/res\//) && (!$alreadyseen{$id})) {   
           &checkonthis($r,$id,$_,$level+1,'',$fulltext,undef,@allwords);  
        }  
     }  
 }  
   
 sub checkwords {  
     my ($result,$applies,@allwords) = @_;  
     foreach (@allwords) {  
         if ($_=~/\w/) {  
             if ($result=~/$_/si) {  
                 $applies++;  
             }  
         }          }
     }      } else {
     return $applies;          $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 untiehash {  sub end_search_tabs {
     if (tied(%hash)) {      return '</div></div></div>';
         untie(%hash);  
     }  
 }  }
   
 } # End of course search scoping  
   
   
 ######################################################################  
 ######################################################################  ######################################################################
   
 =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 699  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  # Search form for accessible portfolio files
     $scrout.= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);              $scrout .= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);
     if ($env{'request.course.id'}) {          } else {
  my %lt=&Apache::lonlocal::texthash('srch' => 'Search',  # Search form for resource space
                                            'header' => 'Course Search',              $scrout .= &setup_basic_search($r,'res',$hidden_fields,$closebutton);
  'note' => 'Enter terms or phrases, then press "Search" below',          }
  'use' => 'use related words',      } else {
  'full' =>'fulltext search (time consuming)',  # Search form for accessible portfolio files
          'disc' => 'search discussion postings (resources and discussion boards)',          $scrout .= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);
    );  
         $scrout.=(<<ENDCOURSESEARCH);  
 <form name="loncapa_search" method="post" action="/adm/searchcat">  
 <center>  
 <hr />  
 <h1>$lt{'header'}</h1>      
 <input type="hidden" name="phase" value="course_search" />  
 $hidden_fields  
 <p>  
 $lt{'note'}.  
 </p>  
 <table>  
 <tr><td>  
 ENDCOURSESEARCH  
         $scrout.='&nbsp;'.  
             &Apache::lonhtmlcommon::textbox('courseexp',  
                                   $env{'form.courseexp'},40);  
         my $crscheckbox =   
             &Apache::lonhtmlcommon::checkbox('crsfulltext',  
                                    $env{'form.crsfulltext'});  
         my $relcheckbox =   
             &Apache::lonhtmlcommon::checkbox('crsrelated',  
    $env{'form.crsrelated'});  
         my $discheckbox =   
             &Apache::lonhtmlcommon::checkbox('crsdiscuss',  
                                    $env{'form.crsrelated'});  
         $scrout.=(<<ENDENDCOURSE);  
 </td></tr>  
 <tr><td><label>$relcheckbox $lt{'use'}</label></td><td></td></tr>  
 <tr><td><label>$crscheckbox $lt{'full'}</label></td><td></td></tr>  
 <tr><td><label>$discheckbox $lt{'disc'}</label></td><td></td></tr>  
 </table>  
 <p>  
 <input type="submit" name="coursesubmit" value='$lt{'srch'}' />  
 </p>  
 </center>  
 </form>  
 ENDENDCOURSE  
     }      }
     $scrout .= &Apache::loncommon::end_page();      $scrout .= &end_search_tabs().&Apache::loncommon::end_page();
     $r->print($scrout);      $r->print($scrout);
     return;      return;
 }  }
Line 766  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);
     $userelatedwords = '<label>'.&mt('[_1] use related words',  
       &Apache::lonhtmlcommon::checkbox('related',$env{'form.related'},'related')).      $userelatedwords = '<label>'
                        '</label>';                        .&Apache::lonhtmlcommon::checkbox(
     $onlysearchdomain = '<label>'.&mt('[_1] only search domain [_2]',                             'related',
       &Apache::lonhtmlcommon::checkbox('domains',$env{'form.domains'},                             $env{'form.related'},
                                        $r->dir_config('lonDefDomain')),                             'related')
       $r->dir_config('lonDefDomain')).                        .' '
                         '</label>';                       .&mt('use related words')
                        .'</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>'
                          .&Apache::lonhtmlcommon::checkbox(
                              'domains',$checked,
                              $singledom,$disabled)
                          .' '
                          .&mt('only search domain [_1]'
                                  ,'<b>'.$singledom.'</b>')
                          .'</label>';
   
     $adv_search_link = '<a href="/adm/searchcat?'.      $adv_search_link = '<a href="/adm/searchcat?'.
                &Apache::loncommon::inhibit_menu_check().                 &Apache::loncommon::inhibit_menu_check().
        '&amp;phase=disp_adv'.         '&amp;phase=disp_adv'.
Line 798  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 828  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 862  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 880  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 899  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 919  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 967  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 982  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 1012  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 1129  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 1202  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 1306  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 1325  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 1349  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 1361  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 1487  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 1501  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 1679  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 1695  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 1723  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_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 1757  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 1778  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 1803  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 2075  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 2094  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 2112  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 2154  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 2195  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 2209  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 2219  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 2248  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 2281  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 += "&amp;persistent_db_id=$env{'form.persistent_db_id'}";  
         newloc += "&amp;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 2321  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 2459  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 2519  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 2541  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 2550  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 2573  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::all_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 2618  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 2652  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 2664  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 2678  END Line 2644  END
                 next;                  next;
             }              }
             $status=~s|/||g;              $status=~s|/||g;
            my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$status;  
   
   
              my $datafile=LONCAPA::tempdir().$status;
             if (-e $datafile && ! -e "$datafile.end") {              if (-e $datafile && ! -e "$datafile.end") {
                 &update_status($r,&mt('Receiving results from [_1]',$server));                  &update_status($r,&mt('Receiving results from [_1]',$server));
                 next;                  next;
Line 2714  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 2737  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 2750  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 2814  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 2825  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 2851  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 2956  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 2980  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 3019  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 3057  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 3347  SCRIPT Line 3339  SCRIPT
     }      }
     function select_group() {      function select_group() {
  parent.window.location=   parent.window.location=
     "/adm/groupsort?mode=$env{'form.mode'}&amp;catalogmode=import$inhibit_menu&amp;acts="+      "/adm/groupsort?mode=$env{'form.mode'}&catalogmode=import$inhibit_menu&acts="+
     parent.statusframe.document.forms.statusform.elements.acts.value;      parent.statusframe.document.forms.statusform.elements.acts.value;
     }      }
 // ]]>  // ]]>
 </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_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 3366  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 3376  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 3385  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 3447  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 3471  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".
     $result .= "<p>\n";          &display_tools($values{'title'}, $jumpurl).
     $result .= '<b>'.$values{'author'}.'</b>,'.          "<p>\n".
           '<b>'.$values{'author'}.'</b>,'.
         ' <i>'.$values{'owner'}.'</i><br />';          ' <i>'.$values{'owner'}.'</i><br />';
     foreach my $field       foreach my $field 
         (          (
Line 3541  sub detailed_citation_view { Line 3592  sub detailed_citation_view {
             $result .= '<b>'.&mt($field->{'translate'}).'</b>';              $result .= '<b>'.&mt($field->{'translate'}).'</b>';
             foreach my $item (split(',',$values{$field->{'name'}})){              foreach my $item (split(',',$values{$field->{'name'}})){
                 $item = &Apache::lonnet::clutter($item);                  $item = &Apache::lonnet::clutter($item);
                 $result .= &display_url($item,[2,0,1]);                  $result .= '<br />'.&display_url($item,1).'<br />';
             }              }
         } elsif (exists($field->{'format'}) && $field->{'format'} ne ''){          } elsif (exists($field->{'format'}) && $field->{'format'} ne ''){
             $result.= &mt($field->{'translate'},              $result.= &mt($field->{'translate'},
Line 3549  sub detailed_citation_view { Line 3600  sub detailed_citation_view {
                                   $values{$field->{'name'}}))."<br />\n";                                    $values{$field->{'name'}}))."<br />\n";
         } else {          } else {
             if ($field->{'special'} eq 'url link') {              if ($field->{'special'} eq 'url link') {
                 $result .= &display_url($jumpurl,[3,0,1]);                  $result .= '<br />'.&display_url($jumpurl,1).'<br />';
             } else {              } else {
                 $result.= &mt($field->{'translate'},                  $result.= &mt($field->{'translate'},
                               $values{$field->{'name'}});                                $values{$field->{'name'}});
Line 3603  sub summary_view { Line 3654  sub summary_view {
     }      }
     my $jumpurl=$values{'url'};      my $jumpurl=$values{'url'};
     $jumpurl=~s|^/ext/|http://|;      $jumpurl=~s|^/ext/|http://|;
     my $link = &display_url($jumpurl,[2,0,1]);      my $link = '<br />'.&display_url($jumpurl,1).'<br />';
       $result .=
     $result.=<<END;          '<a href="'.$jumpurl.'?inhibitmenu=yes"'.
 <a href="$jumpurl?inhibitmenu=yes"           ' target="preview" onclick="openMyModal(this.href, 500, 500, \'yes\');return false;">'.$values{'title'}.'</a>'.
    target="preview">$values{'title'}</a><br />          &display_tools($values{'title'}, $jumpurl).<<END;
   <br />
 $link<br />  $link<br />
 $values{'author'}, $values{'owner'} -- $values{'lastrevisiondate'}<br />  $values{'author'}, $values{'owner'} -- $values{'lastrevisiondate'}<br />
 $values{'copyrighttag'}<br />  $values{'copyrighttag'}<br />
Line 3639  sub compact_view { Line 3691  sub compact_view {
     my $jumpurl=$values{'url'};      my $jumpurl=$values{'url'};
     $jumpurl=~s|^/ext/|http://|;      $jumpurl=~s|^/ext/|http://|;
   
     my $link = &display_url($jumpurl,[1,1,1]);      my $link = &display_url($jumpurl,1);
           
     my $result =       my $result = 
         $prefix.'<img src="'.&Apache::loncommon::icon($values{'url'}).'" alt="" />';          $prefix.'<img src="'.&Apache::loncommon::icon($values{'url'}).'" alt="" />';
Line 3651  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> '.
           &display_tools($values{'title'}, $jumpurl).
  $link.' <b>'.$values{'author'}.'</b> ('.$values{'domain'}.')';   $link.' <b>'.$values{'author'}.'</b> ('.$values{'domain'}.')';
     return $result;      return $result;
 }  }
   
 sub display_url {  sub display_url {
     my ($url,$crumb_args) = @_;      my ($url,$skiplast) = @_;
     my $link;      my $link;
     if ($url=~m|^/ext/|) {      if ($url=~m|^/ext/|) {
  $url=~s|^/ext/|http://|;   $url=~s|^/ext/|http://|;
Line 3666  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 {
         $link=&Apache::lonhtmlcommon::crumbs($url,          # replace the links to open in a new window
   'preview',          # (because the search opens in a new window, it gets
   '',          # confusing when the links open a tab in the
   (($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),@{$crumb_args}).' ';          # 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(
                     $url,
                     'preview',
                     '',
                     '',
                     $skiplast,$onclick).' ';
     }      }
     return $link;      return $link;
 }  }
Line 3697  $prefix <img src="$icon" alt="" /> Line 3757  $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></dd>           target='preview'>$values{'url'}</a>
 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 3972  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 3990  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.317  
changed lines
  Added in v.1.363


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