[LON-CAPA-cvs] cvs: loncom / loncapa_apache.conf /interface londocs.pm lonsearchcat.pm lonsearchcourse.pm doc/loncapafiles loncapafiles.lpml

www www@source.lon-capa.org
Mon, 17 Jan 2011 20:18:02 -0000


This is a MIME encoded message

--www1295295482
Content-Type: text/plain

www		Mon Jan 17 20:18:02 2011 EDT

  Added files:                 
    /loncom/interface	lonsearchcourse.pm 

  Modified files:              
    /doc/loncapafiles	loncapafiles.lpml 
    /loncom	loncapa_apache.conf 
    /loncom/interface	londocs.pm lonsearchcat.pm 
  Log:
  "Search Course" was only inside of searchcat because the Remote did not
  have enough buttons.
  
  Separate the two, incorporate content search under "Content"
  
  Declutter lonsearchcat a little bit before necessary major cleanup.
  
  
--www1295295482
Content-Type: text/plain
Content-Disposition: attachment; filename="www-20110117201802.txt"

Index: doc/loncapafiles/loncapafiles.lpml
diff -u doc/loncapafiles/loncapafiles.lpml:1.723 doc/loncapafiles/loncapafiles.lpml:1.724
--- doc/loncapafiles/loncapafiles.lpml:1.723	Sun Jan 16 22:44:59 2011
+++ doc/loncapafiles/loncapafiles.lpml	Mon Jan 17 20:17:55 2011
@@ -2,7 +2,7 @@
  "http://lpml.sourceforge.net/DTD/lpml.dtd">
 <!-- loncapafiles.lpml -->
 
-<!-- $Id: loncapafiles.lpml,v 1.723 2011/01/16 22:44:59 www Exp $ -->
+<!-- $Id: loncapafiles.lpml,v 1.724 2011/01/17 20:17:55 www Exp $ -->
 
 <!--
 
@@ -4643,6 +4643,15 @@
 <status>works/unverified</status>
 </file>
 <file>
+<source>loncom/interface/lonsearchcourse.pm</source>
+<target dist='default'>home/httpd/lib/perl/Apache/lonsearchcourse.pm</target>
+<categoryname>handler</categoryname>
+<description>
+Handles a searches inside courses/communities.
+</description>
+<status>works/unverified</status>
+</file>
+<file>
 <source>loncom/interface/lonmysql.pm</source>
 <target dist='default'>home/httpd/lib/perl/Apache/lonmysql.pm</target>
 <categoryname>handler</categoryname>
Index: loncom/loncapa_apache.conf
diff -u loncom/loncapa_apache.conf:1.199 loncom/loncapa_apache.conf:1.200
--- loncom/loncapa_apache.conf:1.199	Tue Aug 31 15:07:16 2010
+++ loncom/loncapa_apache.conf	Mon Jan 17 20:17:58 2011
@@ -1,7 +1,7 @@
 ##
 ## loncapa_apache.conf -- Apache HTTP LON-CAPA configuration file
 ##
-## $Id: loncapa_apache.conf,v 1.199 2010/08/31 15:07:16 raeburn Exp $
+## $Id: loncapa_apache.conf,v 1.200 2011/01/17 20:17:58 www Exp $
 ##
 
 #
@@ -468,6 +468,17 @@
 ErrorDocument	  500 /adm/errorhandler
 </Location>
 
+<Location /adm/searchcourse>
+AuthType LONCAPA
+Require valid-user
+PerlAuthzHandler       Apache::lonacc
+SetHandler perl-script
+PerlHandler Apache::lonsearchcourse
+ErrorDocument     403 /adm/login
+ErrorDocument     500 /adm/errorhandler
+</Location>
+
+
 <Location /adm/statistics>
 AuthType LONCAPA
 Require valid-user
Index: loncom/interface/londocs.pm
diff -u loncom/interface/londocs.pm:1.448 loncom/interface/londocs.pm:1.449
--- loncom/interface/londocs.pm:1.448	Sun Jan 16 13:29:50 2011
+++ loncom/interface/londocs.pm	Mon Jan 17 20:18:02 2011
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.448 2011/01/16 13:29:50 www Exp $
+# $Id: londocs.pm,v 1.449 2011/01/17 20:18:02 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2647,6 +2647,7 @@
         $r->print('<li '.(($mode eq 'docs')?' class="active"':'').
                '><a href="/adm/coursedocs?forcestandard=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Editor').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>');
     }
+    $r->print('<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Search').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>');
     $r->print('<li '.(($mode eq 'supdocs')?' class="active"':'').
            '><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Documents').'</b></a></li>');
     $r->print('</ul>');
Index: loncom/interface/lonsearchcat.pm
diff -u loncom/interface/lonsearchcat.pm:1.326 loncom/interface/lonsearchcat.pm:1.327
--- loncom/interface/lonsearchcat.pm:1.326	Wed Aug 25 12:38:45 2010
+++ loncom/interface/lonsearchcat.pm	Mon Jan 17 20:18:02 2011
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Search Catalog
 #
-# $Id: lonsearchcat.pm,v 1.326 2010/08/25 12:38:45 wenzelju Exp $
+# $Id: lonsearchcat.pm,v 1.327 2011/01/17 20:18:02 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -173,18 +173,9 @@
     if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {
         push(@allowed_searches,'res');
     } 
-    if (exists($env{'request.course.id'}) && $env{'request.course.id'} ne '') {
-        push(@allowed_searches,'course');
-    }
     my $crumb_text = 'Portfolio Search';
-    if (@allowed_searches == 3) {
-        $crumb_text = 'Course, Portfolio and Catalog Search';
-    } elsif (@allowed_searches ==2) {
-        if (grep(/^res$/,@allowed_searches)) {
-            $crumb_text = 'Portfolio and Catalog Search'; 
-        } elsif (grep(/^course$/,@allowed_searches)) {
-            $crumb_text = 'Portfolio and Course Search';
-        }
+    if (@allowed_searches ==2) {
+       $crumb_text = 'Portfolio and Catalog Search'; 
     }
     &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>'/adm/searchcat?'.
@@ -301,8 +292,6 @@
     if ($env{'form.phase'} eq 'adv_search' ||
         $env{'form.phase'} eq 'disp_adv') {
         $env{'form.searchmode'} = 'advanced';
-    } elsif ($env{'form.phase'} eq 'course_search') {
-        $env{'form.searchmode'} = 'course_search';
     }
     #
     if ($env{'form.searchmode'} eq 'advanced') {
@@ -318,16 +307,7 @@
                   '&amp;mode='.$env{'form.mode'},
                   text=>"Advanced $srchtype Search",
                   bug=>'Searching',});
-    } elsif ($env{'form.searchmode'} eq 'course search') {
-        &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/searchcat?'.&Apache::loncommon::inhibit_menu_check().
-                  '&amp;phase=disp_adv'.
-                  '&amp;catalogmode='.$env{'form.catalogmode'}.
-                  '&amp;launch='.$env{'form.launch'}.
-                  '&amp;mode='.$env{'form.mode'},
-                  text=>"Course Search",
-                  bug=>'Searching',});
-    }
+    } 
     ##
     ## Switch on the phase
     ##
@@ -349,8 +329,6 @@
             &run_search($r,$query,$customquery,$customshow,
                         $libraries,$pretty_string,$env{'form.area'});
         }
-    } elsif ($env{'form.phase'} eq 'course_search') {
-        &course_search($r);
     } elsif(($env{'form.phase'} eq 'basic_search') ||
             ($env{'form.phase'} eq 'adv_search')) {
         #
@@ -446,244 +424,6 @@
 }
 
 ######################################################################
-######################################################################
-##
-##   Course Search
-##
-######################################################################
-######################################################################
-{   # Scope the course search to avoid global variables
-#
-# Variables For course search
-my %alreadyseen;
-my %hash;
-my $totalfound;
-
-sub make_symb {
-    my ($id)=@_;
-    my ($mapid,$resid)=split(/\./,$id);
-    my $map=$hash{'map_id_'.$mapid};
-    my $res=$hash{'src_'.$id};
-    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'.
-              '&amp;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++;
-            }
-        }
-    }
-    return $applies;
-}
-
-sub untiehash {
-    if (tied(%hash)) {
-        untie(%hash);
-    }
-}
-
-} # End of course search scoping
-
-
-######################################################################
-######################################################################
 
 =pod 
 
@@ -709,52 +449,6 @@
     }
 # Search form for accessible portfolio files
     $scrout.= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);
-    if ($env{'request.course.id'}) {
-	my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
-                                           'header' => 'Course Search',
-	 'note' => 'Enter terms or phrases, then press "Search" below',
-	 'use' => 'use related words',
-	 'full' =>'fulltext search (time consuming)',
-         'disc' => 'search discussion postings (resources and discussion boards)',
-					   );
-        $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();
     $r->print($scrout);
     return;

Index: loncom/interface/lonsearchcourse.pm
+++ loncom/interface/lonsearchcourse.pm
# The LearningOnline Network with CAPA
# Search Course
#
# $Id: lonsearchcourse.pm,v 1.1 2011/01/17 20:18:02 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
###############################################################################
###############################################################################

package Apache::lonsearchcourse;

use strict;
use Apache::Constants qw(:common :http);
use Apache::lonnet;
use GDBM_File;
use Apache::loncommon();
use Apache::lonmeta;
use Apache::lonhtmlcommon;
use Apache::lonlocal;
use LONCAPA::lonmetadata();
use HTML::Entities();
use Apache::lonnavmaps;
use Apache::londocs();
use Apache::lonindexer();
use LONCAPA;

# Variables For course search
my %alreadyseen;
my %hash;
my $totalfound;


sub menu {
    my $scrout='';
    if ($env{'request.course.id'}) {
        my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
                                           'header' => 'Course Search',
         'note' => 'Enter terms or phrases, then press "Search" below',
         'use' => 'use related words',
         'full' =>'fulltext search (time consuming)',
         'disc' => 'search discussion postings (resources and discussion boards)',
                                           );
        $scrout.=(<<ENDCOURSESEARCH);
<form name="loncapa_search" method="post" action="/adm/searchcourse">
<center>
<hr />
<h1>$lt{'header'}</h1>    
<input type="hidden" name="phase" value="results" />
<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
    }
    return $scrout;
}

sub make_symb {
    my ($id)=@_;
    my ($mapid,$resid)=split(/\./,$id);
    my $map=$hash{'map_id_'.$mapid};
    my $res=$hash{'src_'.$id};
    my $symb=&Apache::lonnet::encode_symb($map,$resid,$res);
    return $symb;
}

sub related_version {
    my ($word) = @_;
    return (undef) if (lc($word) =~ /\b(or|and|not)\b/);
    my @Words = &Apache::loncommon::get_related_words($word);
    # Only use 4 related words
    @Words = ($#Words>4? @Words[0..4] : @Words);
    my $result = join " OR ", ($word,@Words);
    return $result,sort(@Words);
}

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;

    $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++;
            }
        }
    }
    return $applies;
}

sub untiehash {
    if (tied(%hash)) {
        untie(%hash);
    }
}

sub handler {
    my $r = shift;
    &Apache::loncommon::content_type($r,'text/html');
    $r->send_http_header;
    if ($r->header_only) { return OK; }

    my $crstype = &Apache::loncommon::course_type();
    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['phase']);
    &Apache::lonhtmlcommon::clear_breadcrumbs();
    $r->print(&Apache::loncommon::start_page("$crstype Search"));
    $r->print(&Apache::lonhtmlcommon::breadcrumbs("$crstype Search"));
    &Apache::londocs::startContentScreen($r,'coursesearch');
    if ($env{'form.phase'} eq 'results') {
       &course_search($r);
    } else {
       $r->print(&menu());
    }
    &Apache::londocs::endContentScreen($r);
    $r->print(&Apache::loncommon::end_page());
    return OK;
}

1;

--www1295295482--