version 1.123, 2002/06/19 20:39:11
|
version 1.125, 2002/06/20 19:43:50
|
Line 121 button that closes the search window
|
Line 121 button that closes the search window
|
|
|
button to take the selecte results and go to group sorting |
button to take the selecte results and go to group sorting |
|
|
=item $hidden |
|
|
|
holds 'hidden' html forms |
|
|
|
=item $scrout |
|
|
|
string that holds portions of the screen output |
|
|
|
=item $yourself |
|
|
|
allows for quickly limiting to oneself |
|
|
|
=item %hash |
=item %hash |
|
|
The ubiquitous database hash |
The ubiquitous database hash |
Line 157 my %hitcount; # stores number of hits
|
Line 145 my %hitcount; # stores number of hits
|
# -- dynamically rendered interface components |
# -- dynamically rendered interface components |
my $closebutton; # button that closes the search window |
my $closebutton; # button that closes the search window |
my $importbutton; # button to take the selected results and go to group sorting |
my $importbutton; # button to take the selected results and go to group sorting |
my $hidden; # Holds 'hidden' html forms |
|
|
|
# -- miscellaneous variables |
# -- miscellaneous variables |
my $scrout; # string that holds portions of the screen output |
|
my $yourself; # allows for quickly limiting to oneself |
my $yourself; # allows for quickly limiting to oneself |
my %hash; # database hash |
my %hash; # database hash |
|
|
Line 199 BEGIN {
|
Line 185 BEGIN {
|
|
|
=item &handler() - main handler invoked by httpd child |
=item &handler() - main handler invoked by httpd child |
|
|
|
=item Variables |
|
|
|
=over 4 |
|
|
|
=item $hidden |
|
|
|
holds 'hidden' html forms |
|
|
|
=item $scrout |
|
|
|
string that holds portions of the screen output |
|
|
|
=back |
|
|
=cut |
=cut |
|
|
###################################################################### |
###################################################################### |
###################################################################### |
###################################################################### |
# ----------------------------- Handling routine called via Apache and mod_perl |
|
sub handler { |
sub handler { |
my $r = shift; |
my $r = shift; |
untie %hash; |
untie %hash; |
Line 217 sub handler {
|
Line 216 sub handler {
|
"\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db"; |
"\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db"; |
|
|
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['catalogmode','launch','acts','mode','form','element']); |
['catalogmode','launch','acts','mode','form','element', |
|
'reqinterface']); |
|
## |
|
## Clear out old values from database |
|
## |
if ($ENV{'form.launch'} eq '1') { |
if ($ENV{'form.launch'} eq '1') { |
if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { |
if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { |
&start_fresh_session(); |
&start_fresh_session(); |
Line 229 sub handler {
|
Line 231 sub handler {
|
return OK; |
return OK; |
} |
} |
} |
} |
|
## |
# --------------------------- Produce some output, so people know it is working |
## Produce some output, so people know it is working |
|
## |
$r->print("\n"); |
$r->print("\n"); |
$r->rflush; |
$r->rflush; |
|
## |
# ----------------------------------- configure dynamic components of interface |
## Configure dynamic components of interface |
|
## |
|
my $hidden; # Holds 'hidden' html forms |
if ($ENV{'form.catalogmode'} eq 'interactive') { |
if ($ENV{'form.catalogmode'} eq 'interactive') { |
$hidden="<input type='hidden' name='catalogmode' value='interactive'>". |
$hidden="<input type='hidden' name='catalogmode' value='interactive'>". |
"\n"; |
"\n"; |
$closebutton="<input type='button' name='close' value='CLOSE' ". |
$closebutton="<input type='button' name='close' value='CLOSE' ". |
"onClick='self.close()'>"."\n"; |
"onClick='self.close()'>"."\n"; |
} |
} elsif ($ENV{'form.catalogmode'} eq 'groupsearch') { |
elsif ($ENV{'form.catalogmode'} eq 'groupsearch') { |
|
$hidden=<<END; |
$hidden=<<END; |
<input type='hidden' name='catalogmode' value='groupsearch'> |
<input type='hidden' name='catalogmode' value='groupsearch'> |
END |
END |
Line 261 END
|
Line 263 END
|
<input type='hidden' name='element' value='$ENV{'form.element'}'> |
<input type='hidden' name='element' value='$ENV{'form.element'}'> |
<input type='hidden' name='date' value='2'> |
<input type='hidden' name='date' value='2'> |
END |
END |
# ------------------------------------------------------ Determine current user |
## |
$yourself=$ENV{'user.name'}.'@'.$ENV{'user.domain'}; |
## What are we doing? |
|
## |
# --- Now, depending on the interface actions, do one of three things here: |
|
# --- 1. a basic search |
|
# --- 2. an advanced search |
|
# --- 3. output a search interface |
|
|
|
# ----------------------------------- See if a search invocation should be done |
|
if ($ENV{'form.basicsubmit'} eq 'SEARCH') { |
if ($ENV{'form.basicsubmit'} eq 'SEARCH') { |
untie %hash; return &basicsearch($r,\%ENV); |
# Perform basic search and give results |
|
return &basicsearch($r,\%ENV,$hidden); |
|
} elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { |
|
# Perform advanced search and give results |
|
return &advancedsearch($r,\%ENV,$hidden); |
|
} elsif ($ENV{'form.reqinterface'} eq 'advanced') { |
|
# Output the advanced interface |
|
$r->print(&advanced_search_form($closebutton,$hidden)); |
|
return OK; |
|
} else { |
|
# Output normal search interface |
|
$r->print(&basic_search_form($closebutton,$hidden)); |
} |
} |
elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { |
return OK; |
untie %hash; return &advancedsearch($r,\%ENV); |
} |
|
|
|
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &basic_search_form() |
|
|
|
Returns a scalar which holds html for the basic search form. |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
|
|
|
sub basic_search_form{ |
|
my ($closebutton,$hidden) = @_; |
|
my $scrout=<<"ENDDOCUMENT"; |
|
<html> |
|
<head> |
|
<title>The LearningOnline Network with CAPA</title> |
|
<script type="text/javascript"> |
|
function openhelp(val) { |
|
openhelpwin=open('/adm/help/searchcat.html','helpscreen', |
|
'scrollbars=1,width=600,height=300'); |
|
openhelpwin.focus(); |
} |
} |
|
</script> |
|
</head> |
|
<body bgcolor="#FFFFFF"> |
|
<img align='right' src='/adm/lonIcons/lonlogos.gif' /> |
|
<h1>Search Catalog</h1> |
|
<form method="post" action="/adm/searchcat"> |
|
$hidden |
|
<h3>Basic Search</h3> |
|
<p> |
|
Enter terms or phrases separated by AND, OR, or NOT then press SEARCH below. |
|
</p> |
|
<p> |
|
<table> |
|
<tr><td> |
|
ENDDOCUMENT |
|
$scrout.=' '.&simpletextfield('basicexp',$ENV{'form.basicexp'},40). |
|
' '; |
|
# $scrout.=&simplecheckbox('allversions',$ENV{'form.allversions'}); |
|
# $scrout.='<font color="#800000">Search historic archives</font>'; |
|
$scrout.=<<ENDDOCUMENT; |
|
</td><td><a href="/adm/searchcat?reqinterface=advanced">Advanced Search</a></td></tr></table> |
|
</p> |
|
<p> |
|
<input type="submit" name="basicsubmit" value='SEARCH' /> |
|
$closebutton |
|
<!-- basic view selection --> |
|
<select name='basicviewselect'> |
|
<option value='Detailed Citation View' selected="true"> |
|
Detailed Citation View</option> |
|
<option value='Summary View'>Summary View</option> |
|
<option value='Fielded Format'>Fielded Format</option> |
|
<option value='XML/SGML'>XML/SGML</option> |
|
</select> |
|
<!-- end of basic view selection --> |
|
<input type="button" value="HELP" onClick="openhelp()" /> |
|
</p> |
|
</form> |
|
</body> |
|
</html> |
|
ENDDOCUMENT |
|
return $scrout; |
|
} |
|
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &advanced_search_form() |
|
|
|
Returns a scalar which holds html for the advanced search form. |
|
|
|
=cut |
|
|
# ----------------------------- Else, begin building search interface to output |
###################################################################### |
$scrout=''; # building a part of screen output |
###################################################################### |
|
|
|
sub advanced_search_form{ |
|
my ($closebutton,$hidden) = @_; |
|
my $scrout=<<"ENDHEADER"; |
|
<html> |
|
<head> |
|
<title>The LearningOnline Network with CAPA</title> |
|
<script type="text/javascript"> |
|
function openhelp(val) { |
|
openhelpwin=open('/adm/help/searchcat.html','helpscreen', |
|
'scrollbars=1,width=600,height=300'); |
|
openhelpwin.focus(); |
|
} |
|
</script> |
|
</head> |
|
<body bgcolor="#FFFFFF"> |
|
<img align='right' src='/adm/lonIcons/lonlogos.gif' /> |
|
<h1>Search Catalog</h1> |
|
<form method="post" action="/adm/searchcat"> |
|
$hidden |
|
<hr /> |
|
<h3>Advanced Search</h3> |
|
ENDHEADER |
$scrout.=&searchphrasefield('Limit by title','title', |
$scrout.=&searchphrasefield('Limit by title','title', |
$ENV{'form.title'}); |
$ENV{'form.title'}); |
|
|
$scrout.=&searchphrasefield('Limit by author','author', |
$scrout.=&searchphrasefield('Limit by author','author', |
$ENV{'form.author'}); |
$ENV{'form.author'}); |
|
|
$scrout.=&searchphrasefield('Limit by subject','subject', |
$scrout.=&searchphrasefield('Limit by subject','subject', |
$ENV{'form.subject'}); |
$ENV{'form.subject'}); |
|
|
$scrout.=&searchphrasefield('Limit by keywords','keywords', |
$scrout.=&searchphrasefield('Limit by keywords','keywords', |
$ENV{'form.keywords'}); |
$ENV{'form.keywords'}); |
|
|
$scrout.=&searchphrasefield('Limit by URL','url', |
$scrout.=&searchphrasefield('Limit by URL','url', |
$ENV{'form.url'}); |
$ENV{'form.url'}); |
|
|
# $scrout.=&searchphrasefield('Limit by version','version', |
# $scrout.=&searchphrasefield('Limit by version','version', |
# $ENV{'form.version'}); |
# $ENV{'form.version'}); |
|
|
$scrout.=&searchphrasefield('Limit by notes','notes', |
$scrout.=&searchphrasefield('Limit by notes','notes', |
$ENV{'form.notes'}); |
$ENV{'form.notes'}); |
|
|
$scrout.=&searchphrasefield('Limit by abstract','abstract', |
$scrout.=&searchphrasefield('Limit by abstract','abstract', |
$ENV{'form.abstract'}); |
$ENV{'form.abstract'}); |
|
|
$ENV{'form.mime'}='any' unless length($ENV{'form.mime'}); |
$ENV{'form.mime'}='any' unless length($ENV{'form.mime'}); |
$scrout.=&selectbox('Limit by MIME type','mime', |
$scrout.=&selectbox('Limit by MIME type','mime', |
$ENV{'form.mime'}, |
$ENV{'form.mime'}, |
'any','Any type', |
'any','Any type', |
\&{Apache::loncommon::filedescriptionex}, |
\&{Apache::loncommon::filedescriptionex}, |
(&Apache::loncommon::fileextensions)); |
(&Apache::loncommon::fileextensions)); |
|
|
$ENV{'form.language'}='any' unless length($ENV{'form.language'}); |
$ENV{'form.language'}='any' unless length($ENV{'form.language'}); |
|
|
$scrout.=&selectbox('Limit by language','language', |
$scrout.=&selectbox('Limit by language','language', |
$ENV{'form.language'},'any','Any Language', |
$ENV{'form.language'},'any','Any Language', |
\&{Apache::loncommon::languagedescription}, |
\&{Apache::loncommon::languagedescription}, |
(&Apache::loncommon::languageids), |
(&Apache::loncommon::languageids), |
); |
); |
|
|
# ------------------------------------------------ Compute date selection boxes |
# ------------------------------------------------ Compute date selection boxes |
$scrout.=<<CREATIONDATESTART; |
$scrout.=<<CREATIONDATESTART; |
<p> |
<p> |
Line 331 CREATIONDATESTART
|
Line 428 CREATIONDATESTART
|
$ENV{'form.creationdatestart_day'}, |
$ENV{'form.creationdatestart_day'}, |
$ENV{'form.creationdatestart_year'}, |
$ENV{'form.creationdatestart_year'}, |
); |
); |
$scrout.=<<CREATIONDATEEND; |
$scrout.="and:\n"; |
and: |
|
CREATIONDATEEND |
|
$scrout.=&dateboxes('creationdateend',12,31,2051, |
$scrout.=&dateboxes('creationdateend',12,31,2051, |
$ENV{'form.creationdateend_month'}, |
$ENV{'form.creationdateend_month'}, |
$ENV{'form.creationdateend_day'}, |
$ENV{'form.creationdateend_day'}, |
$ENV{'form.creationdateend_year'}, |
$ENV{'form.creationdateend_year'}, |
); |
); |
$scrout.="</p>"; |
$scrout.="</p>"; |
|
|
$scrout.=<<LASTREVISIONDATESTART; |
$scrout.=<<LASTREVISIONDATESTART; |
<p> |
<p> |
<font color="#800000" face="helvetica"><b>LIMIT BY LAST REVISION DATE RANGE: |
<font color="#800000" face="helvetica"><b>LIMIT BY LAST REVISION DATE RANGE: |
Line 361 LASTREVISIONDATEEND
|
Line 455 LASTREVISIONDATEEND
|
$ENV{'form.lastrevisiondateend_year'}, |
$ENV{'form.lastrevisiondateend_year'}, |
); |
); |
$scrout.='</p>'; |
$scrout.='</p>'; |
|
|
$scrout.=&searchphrasefield('Limit by publisher/owner','owner', |
$scrout.=&searchphrasefield('Limit by publisher/owner','owner', |
$ENV{'form.owner'}); |
$ENV{'form.owner'}); |
|
|
$ENV{'form.copyright'}='any' unless length($ENV{'form.copyright'}); |
$ENV{'form.copyright'}='any' unless length($ENV{'form.copyright'}); |
$scrout.=&selectbox('Limit by copyright/distribution','copyright', |
$scrout.=&selectbox('Limit by copyright/distribution','copyright', |
$ENV{'form.copyright'}, |
$ENV{'form.copyright'}, |
Line 372 LASTREVISIONDATEEND
|
Line 464 LASTREVISIONDATEEND
|
\&{Apache::loncommon::copyrightdescription}, |
\&{Apache::loncommon::copyrightdescription}, |
(&Apache::loncommon::copyrightids), |
(&Apache::loncommon::copyrightids), |
); |
); |
|
|
# ------------------------------------------- Compute customized metadata field |
# ------------------------------------------- Compute customized metadata field |
$scrout.=<<CUSTOMMETADATA; |
$scrout.=<<CUSTOMMETADATA; |
<p> |
<p> |
Line 383 For resource-specific metadata, enter in
|
Line 474 For resource-specific metadata, enter in
|
<b>Example:</b> grandmother=75 OR grandfather=85 |
<b>Example:</b> grandmother=75 OR grandfather=85 |
<br /> |
<br /> |
CUSTOMMETADATA |
CUSTOMMETADATA |
$scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'}); |
$scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'}); |
$scrout.=' <i>initial users of this system do not need to worry about this option</i>'; |
|
|
|
$scrout.=<<CUSTOMSHOW; |
$scrout.=<<CUSTOMSHOW; |
<p> |
<p> |
<font color="#800000" face="helvetica"><b>SHOW SPECIAL METADATA FIELDS:</b> |
<font color="#800000" face="helvetica"><b>SHOW SPECIAL METADATA FIELDS:</b> |
Line 394 Enter in a space-separated list of speci
|
Line 483 Enter in a space-separated list of speci
|
in a fielded listing for each record result. |
in a fielded listing for each record result. |
<br /> |
<br /> |
CUSTOMSHOW |
CUSTOMSHOW |
$scrout.=&simpletextfield('customshow',$ENV{'form.customshow'}); |
$scrout.=&simpletextfield('customshow',$ENV{'form.customshow'}); |
$scrout.=' <i>initial users of this system do not need to worry about this option</i>'; |
$scrout.=<<ENDDOCUMENT; |
|
|
# ---------------------------------------------------------------- Print screen |
|
$r->print(<<ENDDOCUMENT); |
|
<html> |
|
<head> |
|
<title>The LearningOnline Network with CAPA</title> |
|
<script type="text/javascript"> |
|
function openhelp(val) { |
|
openhelpwin=open('/adm/help/searchcat.html','helpscreen', |
|
'scrollbars=1,width=600,height=300'); |
|
openhelpwin.focus(); |
|
} |
|
</script> |
|
</head> |
|
<body bgcolor="#FFFFFF"> |
|
<img align='right' src='/adm/lonIcons/lonlogos.gif' /> |
|
<h1>Search Catalog</h1> |
|
<form method="post" action="/adm/searchcat"> |
|
$hidden |
|
<hr /> |
|
<h3>Basic Search</h3> |
|
<p> |
|
Enter terms or phrases separated by search operators |
|
such as AND, OR, or NOT then press SEARCH below. Terms should be specific |
|
to the title, author, subject, notes, or abstract information associated |
|
with a resource. |
|
<br /> |
|
ENDDOCUMENT |
|
$r->print(&simpletextfield('basicexp',$ENV{'form.basicexp'})); |
|
$r->print(' '); |
|
$r->print(&simplecheckbox('titleonly',$ENV{'form.titleonly'})); |
|
$r->print('<font color="#800000">Title only</font> '); |
|
# $r->print(&simplecheckbox('allversions',$ENV{'form.allversions'})); |
|
# <font color="#800000">Search historic archives</font> |
|
$r->print(<<ENDDOCUMENT); |
|
<br /> |
|
<input type="submit" name="basicsubmit" value='SEARCH' /> |
|
<input type="reset" name="reset" value='RESET' /> |
|
$closebutton |
|
<!-- basic view selection --> |
|
<select name='basicviewselect'> |
|
<option value='Detailed Citation View' selected="true"> |
|
Detailed Citation View</option> |
|
<option value='Summary View'>Summary View</option> |
|
<option value='Fielded Format'>Fielded Format</option> |
|
<option value='XML/SGML'>XML/SGML</option> |
|
</select> |
|
<!-- end of basic view selection --> |
|
<input type="button" value="HELP" onClick="openhelp()" /> |
|
</p> |
|
<hr /> |
|
<h3>Advanced Search</h3> |
|
$scrout |
|
<p> |
<p> |
<input type="submit" name="advancedsubmit" value='SEARCH' /> |
<input type="submit" name="advancedsubmit" value='SEARCH' /> |
<input type="reset" name="reset" value='RESET' /> |
<input type="reset" name="reset" value='RESET' /> |
Line 468 Detailed Citation View</option>
|
Line 504 Detailed Citation View</option>
|
</body> |
</body> |
</html> |
</html> |
ENDDOCUMENT |
ENDDOCUMENT |
return OK; |
return $scrout; |
} |
} |
|
|
###################################################################### |
###################################################################### |
###################################################################### |
###################################################################### |
Line 488 a 'hidden' html input tag.
|
Line 524 a 'hidden' html input tag.
|
|
|
sub make_persistent { |
sub make_persistent { |
my $persistent=''; |
my $persistent=''; |
|
|
foreach (keys %ENV) { |
foreach (keys %ENV) { |
if (/^form\./ && !/submit/) { |
if (/^form\./ && !/submit/) { |
my $name=$_; |
my $name=$_; |
Line 496 sub make_persistent {
|
Line 531 sub make_persistent {
|
$ENV{$key}=~s/\'//g; # do not mess with html field syntax |
$ENV{$key}=~s/\'//g; # do not mess with html field syntax |
$name=~s/^form\.//; |
$name=~s/^form\.//; |
$persistent.=<<END; |
$persistent.=<<END; |
<input type='hidden' name='$name' value='$ENV{$key}' /> |
<input type="hidden" name="$name" value="$ENV{$key}" /> |
END |
END |
} |
} |
} |
} |
Line 646 sub selectbox {
|
Line 681 sub selectbox {
|
###################################################################### |
###################################################################### |
###################################################################### |
###################################################################### |
sub advancedsearch { |
sub advancedsearch { |
my ($r,$envhash)=@_; |
my ($r,$envhash,$hidden)=@_; |
my %ENV=%{$envhash}; |
my %ENV=%{$envhash}; |
my $fillflag=0; |
my $fillflag=0; |
# Clean up fields for safety |
# Clean up fields for safety |
Line 749 sub advancedsearch {
|
Line 784 sub advancedsearch {
|
$reply=&Apache::lonnet::metadata_query($query, |
$reply=&Apache::lonnet::metadata_query($query, |
$customquery,$customshow); |
$customquery,$customshow); |
} |
} |
&output_results('Advanced',$r,$envhash,$customquery,$reply); |
&output_results('Advanced',$r,$envhash,$customquery,$reply,$hidden); |
} |
} |
elsif ($customquery) { |
elsif ($customquery) { |
my $reply; # reply hash reference |
my $reply; # reply hash reference |
$reply=&Apache::lonnet::metadata_query('', |
$reply=&Apache::lonnet::metadata_query('', |
$customquery,$customshow); |
$customquery,$customshow); |
&output_results('Advanced',$r,$envhash,$customquery,$reply); |
&output_results('Advanced',$r,$envhash,$customquery,$reply,$hidden); |
} |
} |
# should not get to this point |
# should not get to this point |
return 'Error. Should not have gone to this point.'; |
return 'Error. Should not have gone to this point.'; |
Line 773 sub advancedsearch {
|
Line 808 sub advancedsearch {
|
###################################################################### |
###################################################################### |
###################################################################### |
###################################################################### |
sub basicsearch { |
sub basicsearch { |
my ($r,$envhash)=@_; |
my ($r,$envhash,$hidden)=@_; |
my %ENV=%{$envhash}; |
my %ENV=%{$envhash}; |
# Clean up fields for safety |
# Clean up fields for safety |
for my $field ('basicexp') { |
for my $field ('basicexp') { |
Line 795 sub basicsearch {
|
Line 830 sub basicsearch {
|
# Build SQL query string based on form page |
# Build SQL query string based on form page |
my $query=''; |
my $query=''; |
my $concatarg=join('," ",', |
my $concatarg=join('," ",', |
('title', 'author', 'subject', 'notes', 'abstract')); |
('title', 'author', 'subject', 'notes', 'abstract', |
|
'keywords')); |
$concatarg='title' if $ENV{'form.titleonly'}; |
$concatarg='title' if $ENV{'form.titleonly'}; |
|
|
$query=&build_SQL_query('concat('.$concatarg.')',$ENV{'form.'.'basicexp'}); |
$query=&build_SQL_query('concat('.$concatarg.')',$ENV{'form.'.'basicexp'}); |
Line 805 sub basicsearch {
|
Line 841 sub basicsearch {
|
|
|
# Output search results |
# Output search results |
|
|
&output_results('Basic',$r,$envhash,$query,$reply); |
&output_results('Basic',$r,$envhash,$query,$reply,$hidden); |
|
|
return OK; |
return OK; |
} |
} |
Line 988 contacted, etc.)
|
Line 1024 contacted, etc.)
|
###################################################################### |
###################################################################### |
sub output_results { |
sub output_results { |
my $fnum; # search result counter |
my $fnum; # search result counter |
my ($mode,$r,$envhash,$query,$replyref)=@_; |
my ($mode,$r,$envhash,$query,$replyref,$hidden)=@_; |
my %ENV=%{$envhash}; |
my %ENV=%{$envhash}; |
my %rhash=%{$replyref}; |
my %rhash=%{$replyref}; |
my $compiledresult=''; |
my $compiledresult=''; |
my $timeremain=300; |
my $timeremain=300; # (seconds) |
my $elapsetime=0; |
my $elapsetime=0; |
my $resultflag=0; |
my $resultflag=0; |
my $tflag=1; |
my $tflag=1; |
|
# |
# make query information persistent to allow for subsequent revision |
# make query information persistent to allow for subsequent revision |
my $persistent=&make_persistent(); |
my $persistent=&make_persistent(); |
|
# spit out the generic header |
# output beginning of search page |
$r->print(&search_results_header()); |
$r->print(<<BEGINNING); |
|
<html> |
|
<head> |
|
<title>The LearningOnline Network with CAPA</title> |
|
BEGINNING |
|
|
|
# conditional output of script functions dependent on the mode in |
|
# which the search was invoked |
|
if ($ENV{'form.catalogmode'} eq 'interactive'){ |
|
if (! exists($ENV{'form.mode'}) || $ENV{'form.mode'} ne 'edit') { |
|
$r->print(<<SCRIPT) |
|
<script type="text/javascript"> |
|
function select_data(title,url) { |
|
changeTitle(title); |
|
changeURL(url); |
|
self.close(); |
|
} |
|
function changeTitle(val) { |
|
if (opener.inf.document.forms.resinfo.elements.t) { |
|
opener.inf.document.forms.resinfo.elements.t.value=val; |
|
} |
|
} |
|
function changeURL(val) { |
|
if (opener.inf.document.forms.resinfo.elements.u) { |
|
opener.inf.document.forms.resinfo.elements.u.value=val; |
|
} |
|
} |
|
</script> |
|
SCRIPT |
|
} elsif ($ENV{'form.mode'} eq 'edit') { |
|
my $form = $ENV{'form.form'}; |
|
my $element = $ENV{'form.element'}; |
|
$r->print(<<SCRIPT) |
|
<script type="text/javascript"> |
|
function select_data(title,url) { |
|
changeURL(url); |
|
self.close(); |
|
} |
|
function changeTitle(val) { |
|
} |
|
function changeURL(val) { |
|
if (window.opener.document) { |
|
window.opener.document.forms["$form"].elements["$element"].value=val; |
|
} else { |
|
var url = 'forms[\"$form\"].elements[\"$element\"].value'; |
|
alert("Unable to transfer data to "+url); |
|
} |
|
} |
|
</script> |
|
SCRIPT |
|
} |
|
} |
|
$r->print(<<SCRIPT) if $ENV{'form.catalogmode'} eq 'groupsearch'; |
|
<script type="text/javascript"> |
|
function select_data(title,url) { |
|
// alert('DEBUG: Should be storing '+title+' and '+url); |
|
} |
|
function queue(val) { |
|
if (eval("document.forms.results.returnvalues["+val+"].checked")) { |
|
document.forms.results.acts.value+='1a'+val+'b'; |
|
} |
|
else { |
|
document.forms.results.acts.value+='0a'+val+'b'; |
|
} |
|
} |
|
function select_group() { |
|
window.location= |
|
"/adm/groupsort?mode=$ENV{'form.mode'}&catalogmode=groupsearch&acts="+ |
|
document.forms.results.acts.value; |
|
} |
|
</script> |
|
SCRIPT |
|
$r->print(<<SCRIPT); |
|
<script type="text/javascript"> |
|
function displayinfo(val) { |
|
popwin.document.forms.popremain.sdetails.value=val; |
|
} |
|
function openhelp(val) { |
|
openhelpwin=open('/adm/help/searchcat.html','helpscreen', |
|
'scrollbars=1,width=400,height=300'); |
|
openhelpwin.focus(); |
|
} |
|
function abortsearch(val) { |
|
popwin.close(); |
|
} |
|
</script> |
|
SCRIPT |
|
$r->rflush(); |
$r->rflush(); |
|
|
# begin showing the cataloged results |
# begin showing the cataloged results |
$r->print(<<CATALOGBEGIN); |
$r->print(<<CATALOGBEGIN); |
</head> |
</head> |
Line 1109 $persistent
|
Line 1057 $persistent
|
<hr /> |
<hr /> |
<h3>Search Query</h3> |
<h3>Search Query</h3> |
CATALOGCONTROLS |
CATALOGCONTROLS |
|
# |
|
# Remind them what they searched for |
|
# |
if ($mode eq 'Basic') { |
if ($mode eq 'Basic') { |
$r->print(<<RESULTS); |
$r->print('<p><b>Basic search:</b> '.$ENV{'form.basicexp'}.'</p>'); |
<p> |
} elsif ($mode eq 'Advanced') { |
<b>Basic search:</b> $ENV{'form.basicexp'} |
$r->print('<p><b>Advanced search</b> '.$query.'</p>'); |
</p> |
|
RESULTS |
|
} |
|
elsif ($mode eq 'Advanced') { |
|
$r->print(<<RESULTS); |
|
<p> |
|
<b>Advanced search</b> |
|
$query |
|
</p> |
|
RESULTS |
|
} |
} |
$r->print('<h3>Search Results</h3>'); |
$r->print('<h3>Search Results</h3>'); |
$r->rflush(); |
$r->rflush(); |
my $servernum=(keys %rhash)+0; |
# |
|
# make the pop-up window for status |
# define server grid (shows status of multiple machines) |
# |
my $hcinit; |
$r->print(&make_popwin(%rhash)); |
my $grid="'<br />'+"; |
|
$grid.="\n"; |
|
my $sn=1; |
|
for my $sk (sort keys %rhash) { |
|
# '<a href=" |
|
$grid.="'<a href=\""; |
|
# javascript:displayinfo('+ |
|
$grid.="javascript:opener.displayinfo('+"; |
|
# "'"+'key |
|
$grid.="\"'\"+'"; |
|
$grid.=$sk; |
|
my $hc; |
|
if ($rhash{$sk} eq 'con_lost') { |
|
$hc="BAD CONNECTION, CONTACT SYSTEM ADMINISTRATOR "; |
|
} |
|
else { |
|
$hc="'+\"'\"+\"+hc['$sk']+\"+\"'\"+'"; |
|
$hcinit.="hc[\"$sk\"]=\"not yet connected...\";"; |
|
} |
|
$grid.=" hitcount=".$hc; |
|
$grid.=" domain=".$hostdomains{$sk}; |
|
$grid.=" IP=".$hostips{$sk}; |
|
# '+"'"+'">'+ |
|
$grid.="'+\"'\"+')\">'+"; |
|
$grid.="\n"; |
|
$grid.="'<img border=\"0\" name=\"img".$sn."\"". |
|
" src=\"/adm/lonIcons/srvnull.gif\" alt=\"".$sk."\" /></a>'+\n"; |
|
$grid.="'<br />'+\n" unless $sn%10; |
|
$sn++; |
|
} |
|
$r->print(<<ENDPOP); |
|
<script type="text/javascript"> |
|
popwin=open('','popwin','scrollbars=1,width=400,height=220'); |
|
popwin.focus(); |
|
popwin.document.writeln('<'+'html>'); |
|
popwin.document.writeln('<'+'head>'); |
|
popwin.document.writeln('<'+'script>'); |
|
popwin.document.writeln('hc=new Array();$hcinit'); |
|
popwin.document.writeln('<'+'/script>'); |
|
popwin.document.writeln('<'+'/head>'+ |
|
'<'+'body bgcolor="#FFFFFF">'+ |
|
'<'+'image name="whirly" align="right" src="/adm/lonIcons/'+ |
|
'lonanim.gif" '+ |
|
'alt="animated logo" />'+ |
|
'<'+'h3>Search Results Progress<'+'/h3>'+ |
|
'<'+'form name="popremain">'+ |
|
'<'+'tt>'+ |
|
'<'+'br clear="all"/><i>PLEASE BE PATIENT</i>'+ |
|
'<'+'br />SCANNING $servernum SERVERS'+ |
|
'<'+'br clear="all" />Number of record hits found '+ |
|
'<'+'input type="text" size="10" name="numhits"'+ |
|
' value="0" />'+ |
|
'<'+'br clear="all" />Time elapsed '+ |
|
'<'+'input type="text" size="10" name="elapsetime"'+ |
|
' value="0" />'+ |
|
'<'+'br />'+ |
|
'SERVER GRID (click on any cell for details)'+ |
|
$grid |
|
'<'+'br />'+ |
|
'Server details '+ |
|
'<'+'input type="text" size="35" name="sdetails"'+ |
|
' value="" />'+ |
|
'<'+'br />'+ |
|
' <'+'input type="button" name="button"'+ |
|
' value="close this window" '+ |
|
' onClick="javascript:opener.abortsearch()" />'+ |
|
' <'+'input type="button" name="button"'+ |
|
' value="help" onClick="javascript:opener.openhelp()" />'+ |
|
'<'+'/tt>'+ |
|
'<'+'/form>'+ |
|
'<'+'/body><'+'/html>'); |
|
popwin.document.close(); |
|
</script> |
|
ENDPOP |
|
$r->rflush(); |
$r->rflush(); |
|
## |
|
## Prepare for the main loop below |
|
## |
my $servercount=0; |
my $servercount=0; |
my $hitcountsum=0; |
my $hitcountsum=0; |
my $bloop=$servernum; |
my $servernum=(keys %rhash); |
my %orkey; |
my $serversleft=$servernum; |
BLOOP: while(1) { |
## |
my $sn=0; |
## Run until we run out of time or we run out of servers |
last BLOOP unless $bloop; |
## |
last BLOOP unless $timeremain; |
while($serversleft && $timeremain) { |
RLOOP: foreach my $rkey (sort keys %rhash) { |
## |
$sn++; |
## %rhash has servers deleted from it as results come in |
next RLOOP if $orkey{$rkey}; |
## (within the foreach loop below). |
|
## |
|
foreach my $rkey (sort keys %rhash) { |
$servercount++; |
$servercount++; |
$tflag=1; |
$tflag=1; |
$compiledresult=''; |
$compiledresult=''; |
my $hostname=$rkey; |
my $hostname=$rkey; |
my $reply=$rhash{$rkey}; |
my $reply=$rhash{$rkey}; |
my @results; |
my @results; |
|
|
my $replyfile=''; |
|
|
|
if ($reply eq 'con_lost') { |
if ($reply eq 'con_lost') { |
&popwin_imgupdate($r,$sn,"srvbad.gif"); |
&popwin_imgupdate($r,$rkey,"srvbad.gif"); |
$bloop--; |
$serversleft--; |
$orkey{$rkey}=1; |
delete $rhash{$rkey}; |
} |
} else { |
else { |
# must do since 'use strict' checks for tainting |
$reply=~/^([\.\w]+)$/; # must do since 'use strict' checks for tainting |
$reply=~/^([\.\w]+)$/; |
$replyfile=$r->dir_config('lonDaemons').'/tmp/'.$1; |
my $replyfile=$r->dir_config('lonDaemons').'/tmp/'.$1; |
$reply=~/(.*?)\_/; |
$reply=~/(.*?)\_/; |
{ |
{ |
my $temp=0; |
my $temp=0; |
WLOOP: while (1) { |
WLOOP: while (1) { |
if (-e $replyfile && $tflag) { |
if (-e $replyfile && $tflag) { |
&popwin_imgupdate($r,$sn,"srvhalf.gif"); |
&popwin_imgupdate($r,$rkey,"srvhalf.gif"); |
&popwin_js($r,'popwin.hc["'.$rkey.'"]='. |
&popwin_js($r,'popwin.hc["'.$rkey.'"]='. |
'"still transferring..."'.';'); |
'"still transferring..."'.';'); |
$tflag=0; |
$tflag=0; |
} |
} |
if (-e "$replyfile.end") { |
if (-e "$replyfile.end") { |
$bloop--; |
$serversleft--; |
$orkey{$rkey}=1; |
delete $rhash{$rkey}; |
if (-s $replyfile) { |
if (-s $replyfile) { |
&popwin_imgupdate($r,$sn,"srvgood.gif"); |
&popwin_imgupdate($r,$rkey,"srvgood.gif"); |
my $fh=Apache::File->new($replyfile) or |
my $fh=Apache::File->new($replyfile) or |
($r->print('ERROR: file '. |
($r->print('ERROR: file '. |
$replyfile.' cannot be opened') and |
$replyfile.' cannot be opened') and |
Line 1262 ENDPOP
|
Line 1130 ENDPOP
|
'numhits.value='.$hitcountsum.';'); |
'numhits.value='.$hitcountsum.';'); |
} |
} |
else { |
else { |
&popwin_imgupdate($r,$sn,"srvempty.gif"); |
&popwin_imgupdate($r,$rkey,"srvempty.gif"); |
&popwin_js($r,'popwin.hc["'.$rkey.'"]=0;'); |
&popwin_js($r,'popwin.hc["'.$rkey.'"]=0;'); |
} |
} |
last WLOOP; |
last WLOOP; |
} |
} # end of if ( -e "$replyfile.end") |
if ($temp>1) { |
|
sleep 1; |
|
$timeremain--; |
|
$elapsetime++; |
|
last WLOOP; |
|
} |
|
last WLOOP unless $timeremain; |
last WLOOP unless $timeremain; |
sleep 1; |
sleep 1; # wait for daemons to write files? |
$timeremain--; |
$timeremain--; |
$elapsetime++; |
$elapsetime++; |
|
last WLOOP if ($temp>1); |
&popwin_js($r,"popwin.document.popremain.". |
&popwin_js($r,"popwin.document.popremain.". |
"elapsetime.value=$elapsetime;"); |
"elapsetime.value=$elapsetime;"); |
$temp++; |
$temp++; |
Line 1284 ENDPOP
|
Line 1147 ENDPOP
|
} |
} |
&popwin_js($r,'popwin.document.whirly.'. |
&popwin_js($r,'popwin.document.whirly.'. |
'src="/adm/lonIcons/lonanimend.gif";'); |
'src="/adm/lonIcons/lonanimend.gif";'); |
} |
} # end of if ($reply eq 'con_lost') else statement |
my $customshow=''; |
my $customshow=''; |
my $extrashow=''; |
my $extrashow=''; |
my @customfields; |
my @customfields; |
Line 1326 ENDPOP
|
Line 1189 ENDPOP
|
my ($title,$author,$subject,$url,$keywords,$version, |
my ($title,$author,$subject,$url,$keywords,$version, |
$notes,$abstract,$mime,$lang, |
$notes,$abstract,$mime,$lang, |
$creationdate,$lastrevisiondate,$owner,$copyright)=@fields; |
$creationdate,$lastrevisiondate,$owner,$copyright)=@fields; |
|
unless ($title =~ /^\s*$/ ) { $title='<i>Untitled</i>'; } |
unless ($title) { $title='<i>Untitled</i>'; } |
|
unless ($ENV{'user.adv'}) { |
unless ($ENV{'user.adv'}) { |
$keywords='<i>- not displayed -</i>'; |
$keywords='<i>- not displayed -</i>'; |
$fields[4]=$keywords; |
$fields[4]=$keywords; |
Line 1448 RESULTS
|
Line 1310 RESULTS
|
###################################################################### |
###################################################################### |
###################################################################### |
###################################################################### |
|
|
|
=pod |
|
|
|
=item &search_results_header |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
|
sub search_results_header { |
|
my $result = ''; |
|
# output beginning of search page |
|
$result.=<<BEGINNING; |
|
<html> |
|
<head> |
|
<title>The LearningOnline Network with CAPA</title> |
|
BEGINNING |
|
# conditional output of script functions dependent on the mode in |
|
# which the search was invoked |
|
if ($ENV{'form.catalogmode'} eq 'interactive'){ |
|
if (! exists($ENV{'form.mode'}) || $ENV{'form.mode'} ne 'edit') { |
|
$result.=<<SCRIPT; |
|
<script type="text/javascript"> |
|
function select_data(title,url) { |
|
changeTitle(title); |
|
changeURL(url); |
|
self.close(); |
|
} |
|
function changeTitle(val) { |
|
if (opener.inf.document.forms.resinfo.elements.t) { |
|
opener.inf.document.forms.resinfo.elements.t.value=val; |
|
} |
|
} |
|
function changeURL(val) { |
|
if (opener.inf.document.forms.resinfo.elements.u) { |
|
opener.inf.document.forms.resinfo.elements.u.value=val; |
|
} |
|
} |
|
</script> |
|
SCRIPT |
|
} elsif ($ENV{'form.mode'} eq 'edit') { |
|
my $form = $ENV{'form.form'}; |
|
my $element = $ENV{'form.element'}; |
|
$result.=<<SCRIPT; |
|
<script type="text/javascript"> |
|
function select_data(title,url) { |
|
changeURL(url); |
|
self.close(); |
|
} |
|
function changeTitle(val) { |
|
} |
|
function changeURL(val) { |
|
if (window.opener.document) { |
|
window.opener.document.forms["$form"].elements["$element"].value=val; |
|
} else { |
|
var url = 'forms[\"$form\"].elements[\"$element\"].value'; |
|
alert("Unable to transfer data to "+url); |
|
} |
|
} |
|
</script> |
|
SCRIPT |
|
} |
|
} |
|
$result.=<<SCRIPT if $ENV{'form.catalogmode'} eq 'groupsearch'; |
|
<script type="text/javascript"> |
|
function select_data(title,url) { |
|
// alert('DEBUG: Should be storing '+title+' and '+url); |
|
} |
|
function queue(val) { |
|
if (eval("document.forms.results.returnvalues["+val+"].checked")) { |
|
document.forms.results.acts.value+='1a'+val+'b'; |
|
} |
|
else { |
|
document.forms.results.acts.value+='0a'+val+'b'; |
|
} |
|
} |
|
function select_group() { |
|
window.location= |
|
"/adm/groupsort?mode=$ENV{'form.mode'}&catalogmode=groupsearch&acts="+ |
|
document.forms.results.acts.value; |
|
} |
|
</script> |
|
SCRIPT |
|
$result.=<<SCRIPT; |
|
<script type="text/javascript"> |
|
function displayinfo(val) { |
|
popwin.document.forms.popremain.sdetails.value=val; |
|
} |
|
function openhelp(val) { |
|
openhelpwin=open('/adm/help/searchcat.html','helpscreen', |
|
'scrollbars=1,width=400,height=300'); |
|
openhelpwin.focus(); |
|
} |
|
function abortsearch(val) { |
|
popwin.close(); |
|
} |
|
</script> |
|
SCRIPT |
|
return $result; |
|
} |
|
|
|
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &make_popwin() |
|
|
|
Returns html with javascript in it to open up the status window. |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
|
sub make_popwin { |
|
my %rhash = @_; |
|
my $servernum=(keys %rhash); |
|
my $hcinit; |
|
my $grid="'<br />'+\n"; |
|
# $sn is the server number, used ONLY to make sure we have |
|
# rows of 10 each. No longer used to index images. |
|
my $sn=1; |
|
foreach my $sk (sort keys %rhash) { |
|
# '<a href=" |
|
$grid.="'<a href=\""; |
|
# javascript:displayinfo('+ |
|
$grid.="javascript:opener.displayinfo('+"; |
|
# "'"+'key |
|
$grid.="\"'\"+'"; |
|
$grid.=$sk; |
|
my $hc; |
|
if ($rhash{$sk} eq 'con_lost') { |
|
$hc="BAD CONNECTION, CONTACT SYSTEM ADMINISTRATOR "; |
|
} |
|
else { |
|
$hc="'+\"'\"+\"+hc['$sk']+\"+\"'\"+'"; |
|
$hcinit.="hc[\"$sk\"]=\"not yet connected...\";"; |
|
} |
|
$grid.=" hitcount=".$hc; |
|
$grid.=" domain=".$hostdomains{$sk}; |
|
$grid.=" IP=".$hostips{$sk}; |
|
# '+"'"+'">'+ |
|
$grid.="'+\"'\"+')\">'+"; |
|
$grid.="\n"; |
|
$grid.="'<img border=\"0\" name=\"img_".$hostdomains{$sk}.'_'.$sk."\"". |
|
" src=\"/adm/lonIcons/srvnull.gif\" alt=\"".$sk."\" /></a>'+\n"; |
|
$grid.="'<br />'+\n" unless $sn%10; |
|
$sn++; |
|
} |
|
my $result.=<<ENDPOP; |
|
<script type="text/javascript"> |
|
popwin=open('','popwin','scrollbars=1,width=400,height=220'); |
|
popwin.focus(); |
|
popwin.document.writeln('<'+'html>'); |
|
popwin.document.writeln('<'+'head>'); |
|
popwin.document.writeln('<'+'script>'); |
|
popwin.document.writeln('hc=new Array();$hcinit'); |
|
popwin.document.writeln('<'+'/script>'); |
|
popwin.document.writeln('<'+'/head>'+ |
|
'<'+'body bgcolor="#FFFFFF">'+ |
|
'<'+'image name="whirly" align="right" src="/adm/lonIcons/'+ |
|
'lonanim.gif" '+ |
|
'alt="animated logo" />'+ |
|
'<'+'h3>Search Results Progress<'+'/h3>'+ |
|
'<'+'form name="popremain">'+ |
|
'<'+'tt>'+ |
|
'<'+'br clear="all"/><i>PLEASE BE PATIENT</i>'+ |
|
'<'+'br />SCANNING $servernum SERVERS'+ |
|
'<'+'br clear="all" />Number of record hits found '+ |
|
'<'+'input type="text" size="10" name="numhits"'+ |
|
' value="0" />'+ |
|
'<'+'br clear="all" />Time elapsed '+ |
|
'<'+'input type="text" size="10" name="elapsetime"'+ |
|
' value="0" />'+ |
|
'<'+'br />'+ |
|
'SERVER GRID (click on any cell for details)'+ |
|
$grid |
|
'<'+'br />'+ |
|
'Server details '+ |
|
'<'+'input type="text" size="35" name="sdetails"'+ |
|
' value="" />'+ |
|
'<'+'br />'+ |
|
' <'+'input type="button" name="button"'+ |
|
' value="close this window" '+ |
|
' onClick="javascript:opener.abortsearch()" />'+ |
|
' <'+'input type="button" name="button"'+ |
|
' value="help" onClick="javascript:opener.openhelp()" />'+ |
|
'<'+'/tt>'+ |
|
'<'+'/form>'+ |
|
'<'+'/body><'+'/html>'); |
|
popwin.document.close(); |
|
</script> |
|
ENDPOP |
|
return $result; |
|
} |
|
|
|
###################################################################### |
|
###################################################################### |
|
|
=pod |
=pod |
|
|
=item Metadata Viewing Functions |
=item Metadata Viewing Functions |
Line 1791 END
|
Line 1851 END
|
|
|
=item &popwin_imgupdate() |
=item &popwin_imgupdate() |
|
|
|
Send a given image (and its location) out to the browser. Takes as |
|
input $r, loncapa server id, and an icon URL. |
|
|
=cut |
=cut |
|
|
###################################################################### |
###################################################################### |
###################################################################### |
###################################################################### |
sub popwin_imgupdate { |
sub popwin_imgupdate { |
my ($r,$imgnum,$icon) = @_; |
my ($r,$server,$icon) = @_; |
&popwin_js($r,'popwin.document.img'.$imgnum.'.'. |
&popwin_js($r,'popwin.document.img_'.$hostdomains{$server}.'_'.$server.'.'. |
'src="/adm/lonIcons/'.$icon.'";'); |
'src="/adm/lonIcons/'.$icon.'";'); |
} |
} |
|
|