#!/usr/bin/perl

# CGI script to customize output of html pages 
# for individual users (via setting cookies).
#
# copyright (c) Hans-Michael Muller, Pasadena, California, 2002-2004
#
use strict;
use CGI;


### globals
#

my $query = new CGI;
my %generalsettings = $query->cookie('generalsettings');
my %displayoptions = $query->cookie('displayoptions');
my %displayvalues = $query->cookie('displayvalues');
my %advretoptions = $query->cookie('advretoptions');
my $absmyself = $query->url(absolute=>1);

#
### end globals;

### if cookies are not present, define them
#

my @gsnamelist = ('Email');
foreach my $name (@gsnamelist) {
    if (!defined($generalsettings{$name})) {
	$generalsettings{$name} = "";
    }
}

my @donamelist = ('Select','Title','Author','Abstract','Journal','Year','Number of matches', 'Citation', 'Source Type');
foreach my $name (@donamelist) {
    if (!defined($displayoptions{$name})) {
	$displayoptions{$name} = 1;
    }
}

my @dvnamelist = ('ResultsPerPage','SentencesPerMatch');
foreach my $name (@dvnamelist) {
    if (!defined($displayvalues{$name})) {
	$displayvalues{$name} = 10;
    }
}

my @arnamelist = ('NumberOfCategories','NumberOfKeywords');
foreach my $name (@arnamelist) {
    if (!defined($advretoptions{$name})) {
	$advretoptions{$name} = 3;
    }
}

#
###

### if parameters are defined, then have them set the cookie value
#

if ($query->param('setcookies')) {

    foreach my $key (keys % generalsettings) {
	my $varname = "cookie-value-" . $key;
	if (defined($query->param($varname))) {
	    $generalsettings{$key} = $query->param($varname);
	}
    }

    # first set all display options OFF.
    foreach my $key (keys % displayoptions) {$displayoptions{$key} = 0}
    # then switch ON displayoptions chosen.
    foreach my $key ($query->param('displayoptions')) {
	$displayoptions{$key} = 1;
    }

    foreach my $key (keys % displayvalues) {
	my $varname = "cookie-value-" . $key;
	if (defined($query->param($varname))) {
	    $displayvalues{$key} = $query->param($varname);
	}
    }

    foreach my $key (keys % advretoptions) {
	my $varname = "cookie-value-" . $key;
	if (defined($query->param($varname))) {
	    $advretoptions{$key} = $query->param($varname);
	}
    }

}

#
###

### for general settings, set parameters equal to cookies, so 
### they show up in fields for sure
#

foreach my $key (keys % generalsettings) {
    my $varname = "cookie-value-" . $key;
    $query->param(-name=>$varname, -value=>$generalsettings{$key});
}

#
###


### Set cookies formally
#

my $gscookie = $query->cookie(-name => 'generalsettings', 
				-value => \%generalsettings,
				-path => '/cgi-bin/',
				-expires => '+730d');

my $docookie = $query->cookie(-name => 'displayoptions',
			      -value => \%displayoptions,
			      -path => '/cgi-bin/',
			      -expires => '+730d');

my $dvcookie = $query->cookie(-name => 'displayvalues',
			      -value => \%displayvalues,
			      -path => '/cgi-bin/',
			      -expires => '+730d');

my $arcookie = $query->cookie(-name => 'advretoptions',
			      -value => \%advretoptions,
			      -path => '/cgi-bin/',
			      -expires => '+730d');

#
###

PrintHeader($query, $gscookie, $docookie, $dvcookie, $arcookie);

### start form
#

print $query->start_form(-method => 'POST', -action => $absmyself);

#
###

### make tables with all cookies for general settings
#

my @tablecontent = "";
foreach my $key (sort keys % generalsettings) {
    my $varname = "cookie-value-" . $key;
    push @tablecontent, $query->td([$key, $query->textfield(-name => $varname,
							    -size => 40, 
							    -maxlength => 255)]);
}
print $query->table({-border => '1', -cellpadding => '4',
		     -cellspacing => '1'},
		    $query->caption($query->b("General Settings")),
		    $query->Tr([@tablecontent]));

print $query->p;

#
###

### display display options
#

my @defaults = ();
foreach my $key (keys % displayoptions) { 
    if ($displayoptions{$key}) {
	push @defaults, $key;
    }
}
print $query->b('Display Options');
print $query->font(' (determine which columns are to be displayed in the result page)');
print $query->br;
print $query->checkbox_group(-name=>'displayoptions',
			     -values=>[sort keys % displayoptions],
			     -linebreak=>'false',
			     -defaults=>[@defaults],
			     -rows=>3);

#
###

### display display values
#

print $query->br;
print $query->font('My result pages should display ');
print $query->popup_menu(-name => 'cookie-value-' . 'ResultsPerPage', 
			 -default => $displayvalues{ResultsPerPage},
			 -values => [5,6,7,8,9,10,15,20,25,30]);
print $query->font(' matches per page.');

print $query->br;
print $query->font('My match result page should display ');
print $query->popup_menu(-name => 'cookie-value-' . 'SentencesPerMatch', 
			 -default => $displayvalues{SentencesPerMatch},
			 -values => [0,2,4,6,8,10,12,14,16,18,20]);
print $query->font(' sentences around a match.');

#
###

###
#

print $query->br;
print $query->font('My advanced retrieval query should contain ');
print $query->popup_menu(-name => 'cookie-value-' . 'NumberOfCategories',
			 -default => $advretoptions{NumberOfCategories},
			 -values => [0,1,2,3,4,5,6,7,8,9,10]);
print $query->font(' categories and ');

print $query->popup_menu(-name => 'cookie-value-' . 'NumberOfKeywords',
			 -default => $advretoptions{NumberOfKeywords},
			 -values => [0,1,2,3,4,5,6,7,8,9,10]);
print $query->font(' keywords by default.');

#
###

### end form
#

print $query->p;
print $query->submit(-name => 'setcookies', -value => 'Set Values!');
print $query->end_form;

#
###

sub PrintHeader { # begin PrintHeader

    my $query = shift;
    my @cookies = ();
    while (@_) { push @cookies, shift(@_)}

    print $query->header(-cookie=>[@cookies]);
    print $query->start_html(-title=>'Customization', -author=>'Hans-Michael Muller',
			     -bgcolor => '#e6e6f6',
			     -text=>'#000000', -link=>'#333333');
    print $query->br;
    print $query->font({-face => 'verdana, arial, helvetica', -size => '5'}, 'Customization');
    print $query->p;

} # end PrintHeader

sub PrintBottom { # begin PrintBottom
    my $query = shift;
}   # end PrintBottom
