#!/usr/bin/perl

use strict;
use vars qw/$DB $URL/;
use lib '/usr/local/gramene/lib/perl/';

use Ace 1.38;
use CGI 2.42 qw/:standard :html3 escape/;
use CGI::Carp qw/fatalsToBrowser/;
use Ace::Browser::AceSubs qw(:DEFAULT ResolveUrl DoRedirect AceInit AceHeader);
use Ace::Browser::SearchSubs;
use GrameneSubs qw(AceSearchMenuBar);
use GramenePage;

# zero globals in utilities
AceInit();
my $query          = param('query');
my $offset         = AceSearchOffset();

$URL = url();
$URL=~s!^http://[^/]+!!;

# fetch database handle
$DB = OpenDatabase() || AceError("Couldn't open database.");

my ($objs,$count);
($objs,$count) = do_search($query,$offset) if $query;
DoRedirect(@$objs) if $count==1;

AceHeader();
my $page = GramenePage->new(Apache->request) || AceError("Can't open Gramene page configurator");

print start_html('-Title' => 'AceDB Query',
		 '-Style' => {-src => $page->stylesheet},
		 '-Target'=> '_top',
		 '-Class' => 'search');
print $page->start_body;

print
  AceSearchMenuBar('nohome'),
  h1(img({-src=>SEARCH_ICON,-align=>'MIDDLE'}),'AceDB Query');

display_search_form();
display_search($objs,$count,$offset,$query) if $query;

print  $page->end_body;
exit 0;

sub display_search_form {
  print p({-class=>'small'},
	  "Type in a search term using the Ace query language. Separate multiple statements with semicolons.",
	  br,
	 "Examples: ",
	  ul(
	     li(
		[cite({-style=>'font-size: 10pt'},'find Author COUNT Paper > 100'),
		 cite({-style=>'font-size: 10pt'},'find Author IS "Garvin*" ; >Laboratory; >Staff')
		]),br,
		 a({-href=>"http://www.acedb.org/Cornell/#query",
		   -style=>'font-size: 10pt'},
		  'Documentation and more examples')
	    ),
      );
  my $name = Configuration()->Name || get_symbolic();
  AceSearchTable("\u$name Query",
		 p(textfield(-name=>'query',-size=>40),br,
		   submit(-label=>'Query')));
}

sub do_search {
  my ($query,$offset) = @_;
  my $count;
  my (@objs) = $DB->find(-query=> $query,
			 -count  => MAXOBJECTS,
			 -offset => $offset,
			 -total => \$count);
  return unless @objs;
  return (\@objs,$count);
}

sub display_search {
    my ($objs,$count,$offset,$query) = @_;
    #extra br's are needed with netscape 4.7 to get this out from under the form button
    print br,br,p(strong($count+0),"objects satisfy the query",strong($query));
    my @objects = map { a({-href=>Object2URL($_)},"$_") } @$objs;
    AceResultsTable(\@objects,$count,$offset) if @objects;
}

