package MyLibrary;

# Thi library is a part of system of files called
# MyLibrary@NCState, a user-driven, customizable
# interface to a library's collection of information
# resources.
# 
# Copyright (C) 1999-2000, NCSU Libraries
# 
# This program 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.
# 
# This program 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 this program; if not, write
# to the Free Software Foundation, Inc., 59 Temple Place,
# Suite 330, Boston, MA 02111-1307 USA
# 
# For more information about this program write or visit:
# 
#   MyLibrary@NCState
#   NCSU Libraries
#   Box 7111
#   Raleigh, NC 27695-7111
#   
#   mylibrary@listserv.ncsu.edu
#   http://my.lib.ncsu.edu/

#use strict;
use vars qw($VERSION $HOME $DATE @ISA @EXPORT @EXPORT_OK);

use CGI;
use DBI;
use HTTP::Request;
use HTTP::Response;
use LWP::UserAgent;
use MIME::Entity;
use Net::FTP;
use Text::Wrap;
use Time::CTime;
use Time::ParseDate;
use URI::Escape;
use URI::URL;
use utf8;

require Exporter;

@ISA = qw(Exporter AutoLoader);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
@EXPORT = qw();
@EXPORT_OK = qw ();

$VERSION = '2.50';
$HOME    = 'http://hegel.lib.ncsu.edu/development/mylibrary/';
$DATE    = 'December 19, 2000';

# for later changes see the change log that came along with this module --ELM
#
# 2.2.3   - 01/10/00 - ready for first distribution
#                      moved (copied) release notes to the README file
# 2.2.2   - 12/17/99 - started cleaning it up for distribution
# 2.0.1   - 08/24/99 - made opac qsearches search via draweb ii, except for nccu
# 2.0.0   - 08/16/99 - from berekely at sigir 99, added support for draweb ii, but
#                      draweb ii support most likely needs to be added for other trln
#                      libraries. i believe we are calling this version 2.0 as well.
# 1.1.1   - 07/13/99 - removed the definition of $gPort if the port is 80 
# 1.1.0   - 07/07/99 - added updateUsageData to save information about the user and the 
#                      number of times they visit. Remember to update the data dictionary!
#                      The begining of time is 1999-07-07 16:58:38.
# 1.0.9   - 06/21/99 - added merge option when changing disciplines (first day of summer)
# 1.0.8   - 06/18/99 - added keep and replace options when changing disciplines
# 1.0.7   - 06/01/99 - implemented a impersonate feature to edit patron records
# 1.0.6   - 05/06/99 - added alphabetic list of databases and journals for customization
# 1.0.5   - 03/08/99 - enhanced send mail function to allow delivery to librarians
# 1.0.4   - 03/03/99 - implemented a simple link checker
# 1.0.3   - 02/23/99 - added ability to view recommended/non-recommend lists of resources
# 1.0.2   - 02/08/99 - added the guestbook
# 1.0.1   - 01/31/99 - added the beginings of a disciplines browsable page function
# 1.4.1b  - 01/14/99 - edited the redirection links to point to $gHome
# 1.4.0b  - 01/12/99 - the footer is no longer hard coded
# 1.3.9b  - 12/17/98 - removed usernames and passwords by relying on WRAP and Unity IDs
# 1.3.8b  - 12/16/98 - added anchors to each section to suppliment navigation on the page
# 1.3.7b  - 12/11/98 - (Linclon's birthday) we now live on port 80 of a netscape server
# 1.3.6b  - 12/09/98 - moved to my.lib.ncsu.edu on port 8080 with apache
# 1.3.5b  - 12/03/98 - commented out addUniversity and created addCAM in its place
# 1.3.4b  - 10/20/98 - add the report "Who's got the discipline"
# 1.3.3b  - 10/07/98 - added ability to send patron mail based on disciplines; checked
#                      for existance of datbase id (cookie) when people log on
# 1.3.2b  - 10/06/98 - debugged CAM so it works now (calcuated dates correctly and 
#                      updated some variables to the appropriate values)
# 1.3.1b  - 10/01/98 - added bunches more o' help texts
# 1.3.0b  - 09/30/98 - changed the email addres to go to the mylibrary mailing list;
#                      cleaned up CAM; commented out postal address; implemented
#                      cascading style sheets; modifyed displaySimpleHelp to sometime
#                      include a HTML header; if-thened the display of CAM profiles as
#                      well as personal links; added PILES of Simple Help texts.
# 1.2.9b  - 09/28/98 - changed the domain of the cookie to ncsulib9 and not just our
#                      subnet. Started dis-integrating CAM from general profiles
# 1.2.8b  - 09/25/98 - removed possibility of multiple accounts with same names and
#                      did other login verifications; reorganized the initial login
#                      screen making extensive use of the displaySimpleHelp routine;
#                      changed the way a person customizes databases, journals and
#                      reference items; added many about texts; only displayed the
#                      discipline-specific MOTD if there was one; moved University
#                      Links to the left side of the window
# 1.2.7b  - 09/22/98 - started to escape quote marks so things can contain HTML
# 1.2.6b  - 09/21/98 - removed duplicate entries when updating resource selections
#                      added ability to create simple help texts at top of some pages
# 1.2.5b  - 09/18/98 - started creating context-sensitive help
# 1.2.4b  - 09/15/98 - created the option of having your cookie permenatly saved nor not
# 1.2.3b  - 09/14/98 - can now create default resource lists for specific disciplines
#                      and those defaults will be displayed when a new user logs in
# 1.2.2b  - 09/11/98 - can now add subject headings to reference, databases, and journals
#                      and when customizing reference, databases, or journal selections the
#                      selections are grouped by discipline
# 1.2.1b  - 09/09/98 - added the ability to edit the legal disclaimer
# 1.2.0b  - 09/08/98 - can now get output of current awareness, but not for everybody,
#                      nor regularly.
# 1.1.9b  - 09/04/98 - fix the title in one place but broke it in another
#                      started adding Current Awareness (can add and delete profiles
#                      but they don't get searched.)
# 1.1.8b  - 09/03/98 - added keywords for freetext description of interests
#                      initilized variables in different order for the purposes of WRAP
#                      created manage patrons function
# 1.1.7b  - 07/17/98 - can create/edit/delete disciplines as well as
#                      managers and librarians
# 1.1.6b  - 07/16/98 - started management of librarians and disciplines
# 1.1.5b  - 07/15/98 - by using simple copy and paste functions, created
#                      editing routines for libraries, journals, databases, and
#                      university links. All these things now contain descriptions
#                      of some sort or direct links to descriptions in the OPAC
# 1.1.4b  - 07/14/98 - created menu to edit reference sources and made it fuctional
# 1.1.3b  - 07/13/98 - moved to ncsulib9, and it moved rather easily!  :-) 
# 1.1.2b  - 06/08/98 - added a bit of access control to port 8000
#                      generated dynamic $gHome variable for footer
# 1.1.1b  - 06/05/98 - made it so people can come in on port 8000
# 1.1.0b  - 06/05/98 - I believe we are pure Netscrape now
# 1.0.9b  - 06/04/98 - getting closer to pure Netscrape!
# 1.0.8b  - 06/02/98 - started recovering from the Netscrape cuo
# 1.0.7b  - 04/08/98 - added a new global variable, $gTableWidth
#                      centered all the content
# 1.0.6b  - 04/07/98 - added etexts
#                      added links to administrate chat to the administrate page
#                      added NCSU Libraries links
#                      inserted the MOTD into a table for better formatting
#                      made left-hand items thinner and right-hand items wider for readabilitiy
#                      removed 'newuser' from the main page
# 1.0.5b  - 04/06/98 - added rank to profile
#                      added ability to save quick search
#                      moved the customizable items to the right
#                      moved the uncustomizable items to the left
#                      reorderd the customizable items
#                      made the discipline-motd a separate item on the left
# 1.0.4b  - 04/02/98 - added university and reference links
# 1.0.3b  - 03/29/98 - add pesonal links
#                      added ability to edit discipline-motd
# 1.0.2b  - 03/27/98 - add the administation menu
#                      added editable global motd
#                      added editable banner
#                      added librarians depending on discipline
#                      added collection managers depending on discipline
#                      added Ask Alcuin in a new window
#                      make chat appear in a new window
# 1.0.1b  - 03/26/98 - added messages of the day (motd)
# 1.0b    - 03/24/98 - first demo



###############
# subroutines #
###############

sub updateBanner {

	if (! $bannerColor->{color_code}) {
	
		# find default banner color
		my $q = "SELECT * FROM colors WHERE color_id = '$gColor_banner_id'";
		&findBannerColors ($q);

	}
	
	my %tokens = (bannerColor => $bannerColor->{color_code});
	$gBanner = &fillTemplate($gBanner, \%tokens);

}

sub readConfig {

	my $config = @_[0];
		
	# read configuration file
	open (CONFIG, "< $config");
	while (<CONFIG>) {
		
		# process each line
		chomp;
		s/#.*//;
		s/^\s+//;
		s/\s+$//;
		next unless length;
		my ($var, $value) = split(/\s*=\s*/, $_, 2);
		
		# save the name/value pairs to a hash
		$CONFIGURATIONS{$var} = $value;
		
	}
	close CONFIG;

}

sub initalizeHome {
	
	# scope input
	my $gRelativePath;
	
	# get input
	$gRelativePath = $_[0];
	
	# gFullPath - the full path to mylibrary documents (shouldn't need editing)
	#$gFullPath = "$::gDocsRoot$::gRelativePath";

	# gHost - the name of the HTTP host
	$gHost = $ENV{SERVER_NAME};
	
	# gScript - the name of the script being executed
	#$::gScript = $ENV{SCRIPT_NAME};
	
	# gPort - the TCP/IP port the HTTP server is listening to
	if ($ENV{SERVER_PORT} ne '80') { $gPort = $ENV{SERVER_PORT} }
	else { $gPort = '' }
	
	# gRrestricted - used to hide librarians and messages from the librarians
	# from people who are not your clients/patrons (almost depreciated)
	if ($gPort eq '') { $gRestricted = 1 }
	
	# gHome - the full path back home again
	if ($gRestricted) { $gHome = "http://$gHost$gRelativePath" }
	else { $gHome = "http://$gHost:8080$gRelativePath"; }
	
	return "$gHome";

}


sub initalizeDBIO {

	# scope input
	my ($dbDriver, $database, $dbhost, $username, $password);
	
	# assign input
	$dbDriver = $MyLibrary::CONFIGURATIONS{'dbDriver'};
	$database = $MyLibrary::CONFIGURATIONS{'database'};
	$dbhost   = $MyLibrary::CONFIGURATIONS{'dbhost'};
	$username = $MyLibrary::CONFIGURATIONS{'username'};
	$password = $MyLibrary::CONFIGURATIONS{'password'};
	
	# gDBhandle - database I/O
	$gDBhandle = DBI->connect("DBI:$dbDriver:$database:$dbhost", "$username", "$password");

}


sub initalizeCGI {

	# initalized CGI I/O; should be re-named to gInput and gOuput, but...
	$input  = new CGI;
	$output = new CGI ("");

}


sub redirectHome {

	# scope input
	my $gRelativePath;
	
	# get input
	$gRelativePath = $_[0];
	
	# build a url ($u) of where we came from
	$u = "http://";
	$u .= "$gHost";
	if (length ($gPort) > 0) { $u .= ":$gPort"; }
	$u .= "$gRelativePath";
			
	# send them back to where they came
	print $output->redirect($u);
	
	#done
	exit;
	
}
	
sub simpleRedirect {
	
	local $u;
	
	# get the input
	my $section    = $input->param('section');
	my $resourceID = $input->param('resourceID');
	my $query      = $input->param('query');
			
	# if necessary, give query a value
	if ($section ne 'Q') { $query = ''}
	
	# branch according to section code
	if ($section eq 'R') {
	
		# reference
		my $q = "SELECT reference_url FROM reference WHERE reference_id = $resourceID";
		&prepareAndExecuteSQL ($q);
		&findAllReferences ($q);
		$u = $referenceURLs[0];

	}
	
	elsif ($section eq 'B') {
	
		# bibliograhic databases
		my $q = "SELECT bib_database_url FROM bib_databases WHERE bib_database_id = $resourceID";
		&prepareAndExecuteSQL ($q);
		&findAllDatabases ($q);
		$u = $databaseURLs[0];

	}
	
	elsif ($section eq 'E') {
	
		# etexts (journals)
		my $q = "SELECT etext_url FROM etexts WHERE etext_id = $resourceID";
		&prepareAndExecuteSQL ($q);
		&findAllJournals ($q);
		$u = $journalURLs[0];

	}
	
	elsif ($section eq 'L') {
	
		# library links
		my $q = "SELECT libraries_url FROM libraries WHERE libraries_id = $resourceID";
		&prepareAndExecuteSQL ($q);
		&findAllLibraries ($q);
		$u = $librariesURLs[0];

	}
	
	elsif ($section eq 'U') {
	
		# library links
		my $q = "SELECT university_url FROM university WHERE university_id = $resourceID";
		&prepareAndExecuteSQL ($q);
		&findAllUniversity ($q);
		$u = $universityURLs[0];

	}
	
	elsif ($section eq 'Q') {
	
		# do nothing;

	}
	
	else {
	
		&returnError ("Unknown section code: $sectionCode.");
		
	}
	
	# get a primary key
	my $sequence = getNewSequence();
	
	# escape the query
	my $escQuery = $gDBhandle->quote($query);
	
	# save the statistic
	my $q = qq [INSERT INTO statistics (statistic_id, patron_id, section_code, resource_id, date_used, engine, query)
	                                   VALUES
	                                   ('$sequence', '$patronRecord->{patron_id}', '$section', '$resourceID', NOW(), '$engine', $escQuery)];
	&prepareAndExecuteSQL ($q);
                         
	# redirect them accordingly
	if ($section eq 'Q') { 
	
		# proecess the quick search
		&processQSearch ($resourceID, $query);
		
	}
	
	else {
	
		# redirect them to the resource
		print $output->redirect($u)
	
	}
	
	#done
	exit;
	
}
	
	
sub removeDuplicates {

	# remove duplicate items from a list
	# from Perl Cookbook, page 102
	my @l = @_;
	my %s = ();
	my @u = grep { ! $s{$_} ++ } @l;
	return @u;
	
}

sub gracefulExit {

	# print the footer
	&printFooter;

	# close the html
	print $output->end_html;
	
	# disconnect the handle to the database
	if ($gSth) { $gSth->finish; }
	$gDBhandle->disconnect;

	# quit gracefully
	exit;

}

###############################
# subroutines for patron data #
###############################

sub updateUsageData {

	# initialize the search key
	my $id = @_[0];
	
	# get the environment variables
	my $remoteIP   = $ENV{REMOTE_ADDR};
	my $remoteName = $ENV{REMOTE_HOST};
	my $browser    = $ENV{HTTP_USER_AGENT};

	# save the information
	my $q = qq {update patrons set remote_ip    = "$remoteIP",
	                               remote_name  = "$remoteName",
	                               browser      = "$browser",
	                               last_visit   = now(),
	                               total_visits = total_visits + 1
	            where patron_id = $id};
	&prepareAndExecuteSQL ($q);

}


sub disciplineChange {

	# get the input
	my $typeOfChange = $input->param('typeOfChange');
	my $oldId        = $input->param('oldId');
	my $newId        = $input->param('newId');

	# branch accordingly
	if (! $typeOfChange) {
	
		# print my header
		&printHeader;

		# start the html
		&displaySimpleHelpMessage (220, 1);
		
		# create a base href
		my $href = "./?cmd=disciplineChange&oldId=$oldId&newId=$newId";
		
		# display the choices
		print qq(<ol>);
		print qq(<li><a href="$href&typeOfChange=keep">Mantenere</a> le personalizzazioni precedentemente impostate.);
		print qq(<li><a href="$href&typeOfChange=replace">Sostituire</a> le personalizzazioni precedentemente impostate con quelle suggerite per la nuova disciplina. ATTENZIONE! Verranno perse le personalizzazioni create finora sulla propria pagina personale!);
		print qq(<li><a href="$href&typeOfChange=merge">Unire</a> le personalizzazioni precedentemente impostate a quelle suggerite per la nuova disciplina.);
		print qq(</ol>);
	
	}
	
	else {
	
		# branch according to the type of change selected
		if ($typeOfChange eq "keep") {
		
			# keep changes; just save their new discipline id and redirect them home
			my $q = qq (update patrons set discipline_id = $newId where patron_id = $patronRecord->{patron_id});
			&prepareAndExecuteSQL ($q);
			
			# redirect them home
			&MyLibrary::redirectHome($CONFIGURATIONS{'gRelativePath'});
					
		}
		
		elsif ($typeOfChange eq "replace") {

			# replace changes; first save their discipline id 
			my $q = qq (update patrons set discipline_id = $newId where patron_id = $patronRecord->{patron_id});
			&prepareAndExecuteSQL ($q);

			# delete the existing records for this patron's LIBRARIES
			$q = qq (delete from items4libraries where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);

			# set defaults for LIBRARIES
			my $q = qq(select * from defaultLibraries where discipline_id = "$newId");
			&findDefaultResources ($q, "libraries_id");
			for ($i = 0; $i <= $#defaultIDs; $i++) {
			
				$q = qq{insert into items4libraries (patron_id, libraries_id) values ($patronRecord->{patron_id}, $defaultIDs[$i])};
				&prepareAndExecuteSQL ($q);
				
			}
	
			# delete the existing records for this patron's UNIVERSITY
			$q = qq (delete from items4university where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);
	
			# set defaults for UNIVERSITY
			my $q = qq(select * from defaultUniversity where discipline_id = "$newId");
			&findDefaultResources ($q, "university_id");
			for ($i = 0; $i <= $#defaultIDs; $i++) {
			
				$q = qq(insert into items4university (patron_id, university_id) values ($patronRecord->{patron_id}, $defaultIDs[$i]));
				&prepareAndExecuteSQL ($q);
				
			}
	
			# delete the existing records for this patron's QUICK SEARCHES
			$q = qq (delete from items4qsearches where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);

			# set defaults for QUICK SEARCHES
			my $q = qq(select * from defaultQseaches where discipline_id = "$newId");
			&findDefaultResources ($q, "qsearch_id");
			for ($i = 0; $i <= $#defaultIDs; $i++) {
			
				$q = qq(insert into items4qsearches (patron_id, qsearch_id) values ($patronRecord->{patron_id}, $defaultIDs[$i]));
				&prepareAndExecuteSQL ($q);
				
			}
	
 			# delete the existing records for this patron's REFERENCE
			$q = qq(delete from items4references where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);

			# set defaults for REFERENCE
			my $q = qq(select * from defaultReferences where discipline_id = "$newId");
			&findDefaultResources ($q, "reference_id");
			for ($i = 0; $i <= $#defaultIDs; $i++) {
			
				$q = qq(insert into items4references (patron_id, reference_id) values ($patronRecord->{patron_id}, $defaultIDs[$i]));
				&prepareAndExecuteSQL ($q);
				
			}
	
 			# delete the existing records for this patron's JOURNALS
			$q = qq(delete from items4etexts where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);

			# set defaults for JOURNALS
			my $q = qq(select * from defaultEtexts where discipline_id = "$newId");
			&findDefaultResources ($q, "etext_id");
			for ($i = 0; $i <= $#defaultIDs; $i++) {
			
				$q = qq(insert into items4etexts (patron_id, etext_id) values ($patronRecord->{patron_id}, $defaultIDs[$i]));
				&prepareAndExecuteSQL ($q);
				
			}
	
		 	# delete the existing records for this patron's BIBLIOGRAHIC DATABASES
			$q = qq(delete from items4bibdatabases where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);

			# set defaults for BIBLIOGRAHIC DATABASES
			my $q = qq(select * from defaultBibdatabases where discipline_id = "$newId");
			&findDefaultResources ($q, "bib_database_id");
			for ($i = 0; $i <= $#defaultIDs; $i++) {
			
				$q = qq(insert into items4bibdatabases (patron_id, bib_database_id) values ($patronRecord->{patron_id}, $defaultIDs[$i]));
				&prepareAndExecuteSQL ($q);
				
			}
	
			# redirect them home
			&MyLibrary::redirectHome($CONFIGURATIONS{'gRelativePath'});
					
		}
		
		elsif ($typeOfChange eq "merge") {

			# replace changes; first save their discipline id 
			my $q = qq (update patrons set discipline_id = $newId where patron_id = $patronRecord->{patron_id});
			&prepareAndExecuteSQL ($q);

			##### quick searches
			
			# find the default LIBRARIES resources for this discipline
			my $q = qq(select * from defaultQseaches where discipline_id = "$newId");
			&findDefaultResources ($q, "qsearch_id");

			# concatonate their previous selects to the new selections
			push @patronQSearchIDs, @defaultIDs;
		
			# remove duplicates
			@patronQSearchIDs = &MyLibrary::removeDuplicates(@patronQSearchIDs);

		 	# delete the existing records for this patron
			$q = qq (delete from items4qsearches where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);

			for ($i = 0; $i <= $#patronQSearchIDs; $i++) {
			
				$q = qq(insert into items4qsearches (patron_id, qsearch_id) values ($patronRecord->{patron_id}, $patronQSearchIDs[$i]));
				&prepareAndExecuteSQL ($q);
				
			}

			##### libraries shelf
			
			# find the default LIBRARIES resources for this discipline
			my $q = qq(select * from defaultLibraries where discipline_id = "$newId");
			&findDefaultResources ($q, "libraries_id");

			# concatonate their previous selects to the new selections
			push @patronLibrariesIDs, @defaultIDs;
		
			# remove duplicates
			@patronLibrariesIDs = &MyLibrary::removeDuplicates(@patronLibrariesIDs);

		 	# delete the existing records for this patron
			$q = qq (delete from items4libraries where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);

			for ($i = 0; $i <= $#patronLibrariesIDs; $i++) {
			
				$q = qq(insert into items4libraries (patron_id, libraries_id) values ($patronRecord->{patron_id}, $patronLibrariesIDs[$i]));
				&prepareAndExecuteSQL ($q);
				
			}

			##### univeresity shelf
			
			# find the default UNIVERSITY resources for this discipline
			my $q = qq(select * from defaultUniversity where discipline_id = "$newId");
			&findDefaultResources ($q, "university_id");

			# concatonate their previous selects to the new selections
			push @patronUniversityIDs, @defaultIDs;
		
			# remove duplicates
			@patronUniversityIDs = &MyLibrary::removeDuplicates(@patronUniversityIDs);

		 	# delete the existing records for this patron
			$q = qq (delete from items4university where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);

			for ($i = 0; $i <= $#patronUniversityIDs; $i++) {
			
				$q = qq(insert into items4university (patron_id, university_id) values ($patronRecord->{patron_id}, $patronUniversityIDs[$i]));
				&prepareAndExecuteSQL ($q);
				
			}

			##### reference shelf
			
			# find the default REFERENCE resources for this discipline
			my $q = qq(select * from defaultReferences where discipline_id = "$newId");
			&findDefaultResources ($q, "reference_id");

			# concatonate their previous selects to the new selections
			push @patronReferenceIDs, @defaultIDs;
		
			# remove duplicates
			@patronReferenceIDs = &MyLibrary::removeDuplicates(@patronReferenceIDs);

		 	# delete the existing records for this patron
			$q = qq(delete from items4references where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);

			for ($i = 0; $i <= $#patronReferenceIDs; $i++) {
			
				$q = qq(insert into items4references (patron_id, reference_id) values ($patronRecord->{patron_id}, $patronReferenceIDs[$i]));
				&prepareAndExecuteSQL ($q);
				
			}

			##### databases
			
			# find the default DATABASES resources for this discipline
			my $q = qq(select * from defaultBibdatabases where discipline_id = "$newId");
			&findDefaultResources ($q, "bib_database_id");

			# concatonate their previous selects to the new selections
			push @patronDatabaseIDs, @defaultIDs;
		
			# remove duplicates
			@patronDatabaseIDs = &MyLibrary::removeDuplicates(@patronDatabaseIDs);

		 	# delete the existing records for this patron
			$q = qq(delete from items4bibdatabases where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);

			for ($i = 0; $i <= $#patronDatabaseIDs; $i++) {
			
				$q = qq(insert into items4bibdatabases (patron_id, bib_database_id) values ($patronRecord->{patron_id}, $patronDatabaseIDs[$i]));
				&prepareAndExecuteSQL ($q);
				
			}

			##### journals
			
			# find the default JOURNALS resources for this discipline
			my $q = qq(select * from defaultEtexts where discipline_id = "$newId");
			&findDefaultResources ($q, "etext_id");

			# concatonate their previous selects to the new selections
			push @patronJournalIDs, @defaultIDs;
		
			# remove duplicates
			@patronJournalIDs = &MyLibrary::removeDuplicates(@patronJournalIDs);

		 	# delete the existing records for this patron
			$q = qq(delete from items4etexts where patron_id = "$patronRecord->{patron_id}");
			&prepareAndExecuteSQL ($q);

			for ($i = 0; $i <= $#patronJournalIDs; $i++) {
			
				$q = qq(insert into items4etexts (patron_id, etext_id) values ($patronRecord->{patron_id}, $patronJournalIDs[$i]));
				&prepareAndExecuteSQL ($q);
				
			}

			# redirect them home
			&MyLibrary::redirectHome($CONFIGURATIONS{'gRelativePath'});

		}
		
		else {
		
			# error
			&returnError ("Unknown value for typeOfChange: $typeOfChange.");
			
		}
		
	}
	
}


sub setProfile {

	# inialize the to-do list (@todo)
	@todo = ('name_f', 'name_l',
	         'telephone_number_start', 'telephone_number_end', 'telephone_extention',
			 'can_contact', 'email', 'rank_id',
			 'keywords');
	
	# process every item in the to-do list, tricky
	for $t (@todo) {
		
		# get the input
		my $v = $input->param($t);
		
		# make sure there is a FIRST name
		if ($t eq 'name_f' && $v eq "") {
		
			# start the output
			print $output->header(-expires => '-1d');
		
			# display error message
			&displaySimpleHelpMessage (11, 1);
		
			# exit gracefully		
			&gracefulExit;

			}
			
		# make sure there is a LAST name
		if ($t eq 'name_l' && $v eq "") {
		
			# start the output
			print $output->header(-expires => '-1d');
		
			# display error message
			&displaySimpleHelpMessage (11, 1);
		
			# exit gracefully		
			&gracefulExit;

			}
			
		# make sure there is a EMAIL ADDRESS
		if ($t eq 'email' && $v eq "") {
		
			# start the output
			print $output->header(-expires => '-1d');
		
			# display error message
			&displaySimpleHelpMessage (11, 1);
		
			# exit gracefully		
			&gracefulExit;

			}
			
		# escape any quotes
		$v = $MyLibrary::gDBhandle->quote($v);
		
		# create a query and execute it
		my $q = qq (update patrons set $t = $v where patron_id = $patronRecord->{patron_id});
		&prepareAndExecuteSQL ($q);
		}
		
	# process the discipline
	my $v = $input->param('discipline_id');	

	# check to see if the discipine has changed
	if ($v eq $patronRecord->{discipline_id}) {

		# do nothing, just resave their discipline id
		my $q = qq (update patrons set discipline_id = $v where patron_id = $patronRecord->{patron_id});
		&prepareAndExecuteSQL ($q);
	
	}
	
	else {
	
		# redirect them to the change discipline page and quit
		my $oldId = $patronRecord->{discipline_id};
		my $newId = $v;
		&MyLibrary::redirectHome("$CONFIGURATIONS{'gRelativePath'}/?cmd=disciplineChange&oldId=$oldId&newId=$newId");
		exit;
		
	}

}
	

sub customizeProfile {

	# find all the disciplines
	my $q = "select * from disciplines order by discipline_name";
	&findAllDisciplines ($q);
	
	# read the ranks
	my $q = "select * from ranks";
	&findAllRanks ($q);
	
	# find the help
	$q = qq(select * from help_simple where help_id = "8");
	&findAllSimpleHelp ($q);
	
	# print my header
	&printHeader;

	# start the html
	&displaySimpleHelpMessage (8, 1);
	
	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setProfile');

	print qq (<center>\n);
	print qq (<table border=1>\n);
	
	# user id
	print qq (<tr valign="top">\n);
	print qq (<td align="right">\n);
	print qq (Username (ID));
	print qq (</td>\n);
	print qq (<td>\n);
	print qq($patronRecord->{username} ($patronRecord->{patron_id}));
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (Questi sono lo username e l'ID. Non &egrave; possibile cambiarli.);
	print qq (</td>\n);
	print qq (</tr>\n);
		
	# first name
	print qq (<tr valign="top">\n);
	print qq (<td align="right">\n);
	print qq (Nome);
	print qq (</td>\n);
	print qq (<td>\n);
	print $output->textfield(-name => 'name_f', -size => "50", -value => "$patronRecord->{name_f}");
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (Inserire il nome (<a href="./?cmd=about&id=162">Help</a>));
	print qq (</td>\n);
	print qq (</tr>\n);
		
	# last name
	print qq (<tr valign="top">\n);
	print qq (<td align=\"right\">\n);
	print qq (Cognome);
	print qq (</td>\n);
	print qq (<td>\n);
	print $output->textfield(-name => 'name_l', -size => "50", -value => "$patronRecord->{name_l}");
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (Inserire il cognome (<a href="./?cmd=about&id=163">Help</a>));
	print qq (</td>\n);
	print qq (</tr>\n);
		
	# disciplines
	print qq (<tr valign="top">\n);
	print qq (<td align="right">\n);
	print qq (Disciplina);
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (<select name = "discipline_id">);
	for ($i=0; $i <= $#disciplineIDs; $i++) {
		
		if ($disciplineIDs[$i] eq $patronRecord->{discipline_id}) {
			print qq (<option value="$disciplineIDs[$i]" selected>$disciplineNames[$i]\n);
			}
		else {
			print qq (<option value="$disciplineIDs[$i]">$disciplineNames[$i]\n);
			}
		}
			
	print qq (</select>);
	print qq (<td>\n);
	print qq (Selezionare l'area di interesse principale. (<a href="./?cmd=about&id=164">Help</a>));
	print qq (</td>\n);
	print qq (</tr>\n);
		
	# keywords
	#print qq (<tr valign="top">\n);
	#print qq (<td align=\"right\">\n);
	#print qq (Keywords);
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print $output->textarea(-name => 'keywords', -rows => 3, -columns => 50, -value => "$patronRecord->{keywords}");
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print qq (Inserire una o due frasi che descrivano i tuoi interessi. (<a href="./?cmd=about&id=165">Help</a>));
	#print qq (</td>\n);
	#print qq (</tr>\n);
		
	# rank
	print qq (<tr valign="top">\n);
	print qq (<td align="right">\n);
	print qq (Status);
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (<select name="rank_id">);
	for ($i=0; $i <= $#rankIDs; $i++) {
		
		if ($rankIDs[$i] eq $patronRecord->{rank_id}) {
			print qq (<option value="$rankIDs[$i]" selected>$rankNames[$i]\n);
			}
		else {
			print qq (<option value="$rankIDs[$i]">$rankNames[$i]\n);
			}
		}
			
	print qq (</select>);
	print qq (<td>\n);
	print qq (Scegliere la categoria. (<a href="./?cmd=about&id=166">Help</a>));
	print qq (</td>\n);
	print qq (</tr>\n);
		
	# email address
	print qq (<tr valign="top">\n);
	print qq (<td align="right">\n);
	print qq (Indirizzo email);
	print qq (</td>\n);
	print qq (<td>\n);
	print $output->textfield(-name => 'email', -size => "50", -value => "$patronRecord->{email}");
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (Inserire il proprio indirizzo email. (<a href="./?cmd=about&id=167">Help</a>));
	print qq (</td>\n);
	print qq (</tr>\n);
		
	# can contact
	print qq (<tr valign="top">\n);
	print qq (<td align="right">\n);
	print qq (Contatto);
	print qq (</td>\n);
	print qq (<td>\n);
	if ($patronRecord->{can_contact}) {
		print qq (<input type="radio" name="can_contact" value="1" checked>Si );
		print qq (<input type="radio" name="can_contact" value="0">No);
		}
	else {
		print qq (<input type="radio" name="can_contact" value="1">Yes );
		print qq (<input type="radio" name="can_contact" value="0" checked>No);
		}
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (Possiamo inviarti email? (<a href="./?cmd=about&id=168">Help</a>));
	print qq (</td>\n);
	print qq (</tr>\n);
		
	# telephone number
	print qq (<tr valign="top">\n);
	print qq (<td align="right">\n);
	print qq (Telefono);
	print qq (</td>\n);
	print qq (<td>\n);
	print "+";
	print $output->textfield(-name => 'telephone_area', -value => "$patronRecord->{telephone_area}", -size => 10, -maxlength => 10);
	print $output->textfield(-name => 'telephone_number_start', -value => "$patronRecord->{telephone_number_start}", -size => 10, -maxlength => 10);
	print qq (-);
	print $output->textfield(-name => 'telephone_number_end', -value => "$patronRecord->{telephone_number_end}", -size => 10, -maxlength => 10);
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (Numero di telefono (Es.: +0039 0331-572265) (<a href="./?cmd=about&id=169">Help</a>));
	print qq (</td>\n);
	print qq (</tr>\n);
		
	# postal address 1
	#print qq (<tr valign="top">\n);
	#print qq (<td align="right">\n);
	#print qq (Indirizzo postale 1\n);
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print $output->textfield(-name => 'address_1', -value => "$patronRecord->{address_1}");
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print qq (Prima linea dell'indirizzo di posta (<A HREF="./assistance/20-customize-your-profile.html#45">More help</A>));
	#print qq (</td>\n);
	#print qq (</tr>\n);
		
	# postal address 2
	#print qq (<tr valign="top">\n);
	#print qq (<td align="right">\n);
	#print qq (Indirizzo postale 2\n);
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print $output->textfield(-name => 'address_2', -value => "$patronRecord->{address_2}");
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print qq (Seconda linea dell'indirizzo di posta (<A HREF="./assistance/20-customize-your-profile.html#50">More help</A>));
	#print qq (</td>\n);
	#print qq (</tr>\n);
		
	# city
	#print qq (<tr valign="top">\n);
	#print qq (<td align="right">\n);
	#print qq (Citt&agrave;\n);
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print $output->textfield(-name => 'city', -value => "$patronRecord->{city}");
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print qq (Citt&agrave; di residenza (<A HREF="./assistance/20-customize-your-profile.html#55">More help</A>));
	#print qq (</td>\n);
	#print qq (</tr>\n);
		
	# state
	#print qq (<tr valign="top">\n);
	#print qq (<td align="right">\n);
	#print qq (Stato\n);
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print $output->textfield(-name => 'state', -value => "$patronRecord->{state}", -size => 2, -maxlength => 2);
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print qq (Nazione di residenza (<A HREF="./assistance/20-customize-your-profile.html#60">More help</A>));
	#print qq (</td>\n);
	#print qq (</tr>\n);
		
	# zip
	#print qq (<tr valign="top">\n);
	#print qq (<td align="right">\n);
	#print qq (CAP\n);
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print $output->textfield(-name => 'zip_base', -value => "$patronRecord->{zip_base}", -size => 5, -maxlength => 5);
	#print qq (-);
	#print $output->textfield(-name => 'zip_four', -value => "$patronRecord->{zip_four}", -size => 4, -maxlength => 4);
	#print qq (</td>\n);
	#print qq (<td>\n);
	#print qq (Codice di avviamento postale (<A HREF="./assistance/20-customize-your-profile.html#65">More help</A>));
	#print qq (</td>\n);
	#print qq (</tr>\n);
				
	# end the table
	print qq (</table>\n);

	# add a submit and reset button
	print qq (<p>\n);
	print $output->submit(-name => 'submit', -value => 'Invia');              
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print qq (</p>\n);

	# finish the form
	print qq (</center>\n);
	print $output->endform;
	

	}
	
	
sub readPatron {
		
	# initialize the search key
	my $id = @_[0];
		
	# find the patron
	my $q = qq (select * from patrons where patron_id = $id);
	&findPatrons ($q);
	
	# check to see whether or not the id was found
	if (! $patronRecord->{patron_id}) {
	
		# redefine their cookie
		my $cookie = $output->cookie(-name    => 'uid',
	                            	 -value   => "$id",
	                            	 -expires => '-1y',
	                            	 -path    => "$MyLibrary::CONFIGURATIONS{'gRelativePath'}/");
		
		# output an http header
		print $output->header(-expires => '-1d', -cookie => "$cookie");
		
		# display the error message
		&displaySimpleHelpMessage (203, 1);
		
		# quit gracefully
		&gracefulExit;
		
	}

	# find the banner color
	$q = qq (select color_id, color_code from colors, patrons
	         where patrons.color_banner_id=colors.color_id
	         and
	         patrons.patron_id= '$patronRecord->{patron_id}');
	&findBannerColors ($q);
	
	# find the background color
	$q = qq (select color_id, color_code from colors, patrons
	         where patrons.color_bg_id=colors.color_id
	         and
	         patrons.patron_id = '$patronRecord->{patron_id}');
	&findBackgroundColors ($q);

	# find the text color
	$q = qq (select color_id, color_code from colors, patrons
	         where patrons.color_text_id=colors.color_id
	         and
	         patrons.patron_id = '$patronRecord->{patron_id}');
	&findTextColors ($q);
	
	# find link color
	$q = qq (select color_id, color_code from colors, patrons
	         where patrons.color_link_id=colors.color_id
	         and
	         patrons.patron_id = '$patronRecord->{patron_id}');
	&findLinkColors ($q);
	
	# find alink color
	$q = qq (select color_id, color_code from colors, patrons
	         where patrons.color_alink_id=colors.color_id
	         and
	         patrons.patron_id = '$patronRecord->{patron_id}');
	&findAlinkColors ($q);

	# find vlink color
	$q = qq (select color_id, color_code from colors, patrons
	         where patrons.color_vlink_id=colors.color_id
	         and
	         patrons.patron_id = '$patronRecord->{patron_id}');
	&findVlinkColors ($q);
	
	# find quick searches
	$q = qq (select * from items4qsearches, qsearches
	         where items4qsearches.patron_id = '$patronRecord->{patron_id}'
	         and
	         items4qsearches.qsearch_id=qsearches.qsearch_id
	         order by qsearch_name);
	&findPatronQSearches ($q);

	# find last quick search query
	$q = qq (select last_query from patrons
	         where patrons.patron_id = '$patronRecord->{patron_id}');
	&findQuickSearchQuerys ($q);
	
	# find patron references
	$q = qq (select reference_url, reference_name from items4references, reference
	         where items4references.patron_id = '$patronRecord->{patron_id}'
	         and
	         items4references.reference_id = reference.reference_id
	         order by reference_name);
	&findPatronReferences ($q);
		
	# find bibliographic databases
	$q = qq (select bib_database_url, bib_database_name, bib_databases.bib_database_id  from items4bibdatabases, bib_databases
	         where items4bibdatabases.patron_id = '$patronRecord->{patron_id}'
	         and
	         items4bibdatabases.bib_database_id=bib_databases.bib_database_id
	         order by bib_database_name);
	&findPatronDatabases ($q);
		
	# find reference sources
	$q = qq (select reference_url, reference_name, reference.reference_id from items4references, reference
	         where items4references.patron_id = '$patronRecord->{patron_id}'
	         and
	         items4references.reference_id=reference.reference_id
	         order by reference_name);
	&findPatronReferences ($q);
		
	# find library urls
	$q = qq (select * from items4libraries, libraries
	         where items4libraries.patron_id = '$patronRecord->{patron_id}'
	         and
	         items4libraries.libraries_id=libraries.libraries_id
	         order by libraries_name);
	&findPatronLibraries ($q);
		
	# find etext urls
	$q = qq (select etext_url, etext_name, etexts.etext_id from etexts, items4etexts 
	         where items4etexts.patron_id = '$patronRecord->{patron_id}'
	         and
	         items4etexts.etext_id=etexts.etext_id
	         order by etext_name);
	&findPatronJournals ($q);
		
	# find university urls
	$q = qq (select * from items4university, university
	         where items4university.patron_id = '$patronRecord->{patron_id}'
	         and
	         items4university.university_id=university.university_id
	         order by university_name);
	&findPatronUniversity ($q);
		
	# find discipline-specific MOTD
	$q = qq (select * from disciplines where discipline_id = '$patronRecord->{discipline_id}');
	&findAllDisciplines ($q);

	# find librarians
	$q = qq (select name, email_address, url, telephone_start, telephone_end
            from librarians, patrons, items4librarians
            where patrons.patron_id = '$patronRecord->{patron_id}'
            and
            patrons.discipline_id = items4librarians.discipline_id
            and
            items4librarians.librarian_id = librarians.librarian_id
	        order by name);
	&findLibrarians ($q);
		
	# find the collection managers
	$q = qq (select name, email_address, url, telephone_start, telephone_end
             from managers, patrons, items4managers
             where patrons.patron_id= '$patronRecord->{patron_id}'
             and
             patrons.discipline_id = items4managers.discipline_id
             and
             items4managers.manager_id = managers.manager_id
	         order by name);
	&findCollectionManagers ($q);

	# find selected template
	$q = qq (select template from templates, patrons
	         where patrons.template_id = templates.template_id
	         and
	         patrons.template_id = '$patronRecord->{template_id}');
	&findPatronTemplate ($q);
	
}

###############
# databases   #
###############


sub displayAlphabeticDatabases {

	# find all the databases
	my $q = qq (SELECT *
                FROM bib_databases
                ORDER BY bib_database_name);
	&findAllDatabases ($q);
	
	# print my header
	&printHeader;

	# display simple help
	&displaySimpleHelpMessage (217, 1);
	
	# display the form
	&displayDatabaseSelectionForm;

}


sub displayDatabaseSelectionForm {

	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setDatabases');
	
	# add a submit and reset button
	print "<p><center>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');
	print ' ';           
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</center></p>\n";

	# start the table
	print "<table border=1>\n";
	
	# process each quick search
	for (my $i=0; $i <= $#databaseNames; $i++) {
		
		# check to see what was previously selected
		my $ps = 0;
		for $m (@patronDatabaseNames) { if ($databaseNames[$i] eq $m) { $ps = 1; last; } }
		
		# print the row
		print "<tr valign=top>\n";
		if ($ps) {
			print qq (<td align="right"><input type="checkbox" name="database" value="$databaseIDs[$i]" checked></td>\n);
		}
		else {
			print qq (<td align="right"><input type="checkbox" name="database" value="$databaseIDs[$i]"></td>\n);
		}
		if ($gSaveStatistics) { print qq[<td><a href=./?cmd=simpleRedirect&section=B&resourceID=$databaseIDs[$i]>$databaseNames[$i]</a>]; }
		else { print qq (<td><a href="$databaseURLs[$i]">$databaseNames[$i]</a>\n);}
		if ($databaseNotes[$i]) {
			print " - $databaseNotes[$i]";
		}
		if ($databaseFKeys[$i]) {
			print " (<a href='$gMarion$databaseFKeys[$i]'>full record</a>)";
		}
		print qq (</td></tr>\n);
		
	}
	
	# end the table
	print "</table>\n";
	
	# add a submit and reset button
	print "<p><center>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');              
	print ' ';           
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</center></p>\n";

	# finish the form
	print "</center>\n";
	print $output->endform;	

}


sub customizeDatabases {

	# get all the disciplines for later use
	my $q = "select * from disciplines order by discipline_name";
	&findAllDisciplines($q);

	# print my header
	&printHeader;

	# display simple help
	&displaySimpleHelpMessage (2, 1);
	
	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setDefaultDatabases');
	
	# process every database they have selected
	print "<ol>";
	for ($i = 0; $i <= $#patronDatabaseIDs; $i++) {
		print qq(<li><input type="checkbox" name="databases" value="$patronDatabaseIDs[$i]" checked>$patronDatabaseNames[$i]\n);
		}
	print "</ol>";

	# add a submit and reset button
	print "<p>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');              
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</p>\n";

	# return to MyLibrary
	print "<p>\n";
	print qq(<a href="./">Torna a Segnaweb</a>);              
	print "</p>\n";

	# end the form
	print $output->endform;	
	
	# display simple help
	&displaySimpleHelpMessage (216, 0);
	
	# display simple help
	&displaySimpleHelpMessage (27, 0);
	
	# display a list of all the disciplines
	print "<ol>";
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
		print qq(<li><a href="./?cmd=displayDisciplineDatabases&id=$disciplineIDs[$i]">$disciplineNames[$i]</a>\n);
		}
	print "</ol>";
	
	# return to MyLibrary
	print "<p>\n";
	print qq(<a href="./">Torna a Segnaweb</a>);              
	print "</p>\n";

}


sub setDefaultDatabases {

	my @b = $input->param('databases');

 	# delete the existing records for this patron
	$q = qq(delete from items4bibdatabases where patron_id = "$patronRecord->{patron_id}");
	&prepareAndExecuteSQL ($q);

	# create new records for each new selection
	for $b (@b) {
	
		$q = qq(insert into items4bibdatabases values ("$patronRecord->{patron_id}", "$b"));
		&prepareAndExecuteSQL ($q);
				
	}
		
}


sub displayDisciplineDatabases {
	
	# get the discipline id
	my $id = $input->param('id');
	
	# find all the resources for this discipline	
	$q = qq (SELECT bib_databases.*
             FROM bib_databases, items4DisBibdatabases
             WHERE items4DisBibdatabases.discipline_id = '$id'
             AND items4DisBibdatabases.bib_database_id = bib_databases.bib_database_id
             ORDER BY bib_databases.bib_database_name);
	&findAllDatabases ($q);
	
	# print my header
	&printHeader;

	# display the form
	if ($#databaseIDs >= 0) {

		# display simple help
		&displaySimpleHelpMessage (30, 1);
	
		# display the form
		&displayDatabaseSelectionForm;
		
	}
	
	# explain that no titles were found
	else {&displaySimpleHelpMessage (218, 1);}

}
	
	
sub setDatabases {

	my @b = $input->param('database');

	# concatonate their previous selects to the new selections
	push @b, @patronDatabaseIDs;
		
	# remove duplicates
	@b = &removeDuplicates(@b);

 	# delete the existing records for this patron
	$q = qq(DELETE FROM items4bibdatabases WHERE patron_id = '$patronRecord->{patron_id}');
	&prepareAndExecuteSQL ($q);

	# create new records for each new selection
	for $b (@b) {
	
		$q = qq(INSERT INTO items4bibdatabases
		        VALUES ('$patronRecord->{patron_id}', '$b'));
		&prepareAndExecuteSQL ($q);
		
	}
		
}





###############
# colors      #
###############


sub customizeColors {
	
	# find all the colors	
	my $q = "select * from colors order by color_name";
	&findAllColors ($q);
		
	# find all templates
	my $q = "select * from templates order by template_name";
	&findAllTemplates ($q);
		
	# print my header
	&printHeader;
		
	# find the help
	&displaySimpleHelpMessage (9, 1);

	# build the labels for the select statement
	for ($i=0; $i < $#colorId+1; $i++) { $labels{$colorId[$i]} = $colorNames[$i]; }
		
	# build the labels for templates
	for ($i=0; $i < $#templateIDs+1; $i++) { $templateLabels{$templateIDs[$i]} = $templateNames[$i]; }
		
	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setColors');

	print "<center>\n";
	print "<table border=1>\n";
	
	# title
	print "<tr valign=top>\n";
	print "<td align=right>Titolo</td>\n";
	print "<td>\n";
	print qq(<input type="text" name="page_title" value="$patronRecord->{page_title}">);
	print "</td>\n";
	print qq (<td>\n);
	print qq (Titolo della pagina principale (<a href="./?cmd=about&id=178">Help</a>));
	print qq (</td>\n);
	print "</tr>\n";
	
	# print the banner selections
	print "<tr valign=top>\n";
	print "<td align=right>Colore delle intestazioni</td>\n";
	print "<td>\n";
	print $output->popup_menu(-name => 'color_banner_id', -value => \@colorId, -default => "$bannerColor->{color_id}", -labels => \%labels);
	print "<br>\n";
	print "</td>\n";
	print qq (<td>\n);
	print qq (Scegliere il colore delle intestazioni. (<a href="./?cmd=about&id=179">Help</a>));
	print qq (</td>\n);
	print "</tr>\n";
	    
	# print the background selections
	print "<tr valign=top>\n";
	print "<td align=right>Colore di background</td>\n";
	print "<td>\n";
	print $output->popup_menu(-name => 'color_bg_id', -value => \@colorId, -default => "$backgroundColor->{color_id}", -labels => \%labels);
	print "<br>\n";
	print "</td>\n";
	print qq (<td>\n);
	print qq (Scegliere il colore di background. (<a href="./?cmd=about&id=180">Help</a>));
	print qq (</td>\n);
	print "</tr>\n";

	# print the text selections
	print "<tr valign=top>\n";
	print "<td align=right>Colore del testo</td>\n";
	print "<td>\n";
	print $output->popup_menu(-name => 'color_text_id', -value => \@colorId, -default => "$textColor->{color_id}", -labels => \%labels);
	print "<br>\n";
	print "</td>\n";
	print qq (<td>\n);
	print qq (Scegliere il colore del testo. (<a href="./?cmd=about&id=181">Help</a>));
	print qq (</td>\n);
	print "</tr>\n";

	# print the link selections
	print "<tr valign=top>\n";
	print "<td align=right>Colore dei links</td>\n";
	print "<td>\n";
	print $output->popup_menu(-name => 'color_link_id', -value => \@colorId, -default => "$linkColor->{color_id}", -labels => \%labels);
	print "<br>\n";
	print "</td>\n";
	print qq (<td>\n);
	print qq (Scegliere il colore dei links non ancora visitati. (<a href="./?cmd=about&id=182">Help</a>));
	print qq (</td>\n);
	print "</tr>\n";

	# print the alink selections
	print "<tr valign=top>\n";
	print "<td align=right>Colore dei links attivi</td>\n";
	print "<td>\n";
	print $output->popup_menu(-name => 'color_alink_id', -value => \@colorId, -default => "$alinkColor->{color_id}", -labels => \%labels);
	print "<br>\n";
	print "</td>\n";
	print qq (<td>\n);
	print qq (Scegliere il colore dei links attivi. (<a href="./?cmd=about&id=183">Help</a>));
	print qq (</td>\n);
	print "</tr>\n";

	# print the vlink selections
	print "<tr valign=top>\n";
	print "<td align=right>Colore dei links visitati</td>\n";
	print "<td>\n";
	print $output->popup_menu(-name => 'color_vlink_id', -value => \@colorId, -default => "$vlinkColor->{color_id}", -labels => \%labels);
	print "<br>\n";
	print "</td>\n";
	print qq (<td>\n);
	print qq (Scegliere il colore dei links visitati. (<a href="./?cmd=about&id=184">Help</a>));
	print qq (</td>\n);
	print "</tr>\n";

	# end the table
	print "</table>\n";

	# add a submit and reset button
	print "<p>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');    
	print ' '; 
	print $output->submit(-name => 'submit', -value => 'Impostazioni di default');              
	print ' '; 
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</p>\n";

	# finish the form
	print "</center>\n";
	print $output->endform;	
	
	}


sub setColors {

	# get the value of the submit button
	my $b = $input->param('submit');
	
	# check to see if they want the default colors
	if ($b eq "Impostazioni di default") {
	
		# create a query and exectue it
		my $query = qq (update patrons set color_bg_id     = "$gColor_bg_id",
		                                   color_text_id   = "$gColor_text_id",
		                                   color_link_id   = "$gColor_link_id",
		                                   color_vlink_id  = "$gColor_vlink_id",
		                                   color_alink_id  = "$gColor_alink_id",
		                                   color_banner_id = "$gColor_banner_id",
		                                   template_id     = "$gTemplateID"
		                       where patron_id = $patronRecord->{patron_id});
		&updatePatron ($query);
	
	}
	
	# save their customizations
	else {
	
		# inialize the to-do list (@todo)
		@todo = ('page_title', 'color_bg_id', 'color_banner_id', 'color_text_id',
	         	'color_link_id', 'color_alink_id', 'color_vlink_id');
	
		# process every item in the to-do list, tricky
		for $t (@todo) {
	
			# get the form's input
			my $v = $input->param($t);
		
			# escape any quotes
			$v = $gDBhandle->quote($v);
		
			# create a query and exectue it
			my $query = qq (update patrons set $t = $v where patron_id = $patronRecord->{patron_id});
			&updatePatron ($query);
		
		}
	}

}


	
###############
# html        #
###############

sub displaySimpleHelpMessage {
	
	# get the input
	my $n = @_[0];	# message number
	my $h = @_[1];	# a boolean whether or not to display a header
	
	# find the help
	my $q = qq(select * from help_simple where help_id = "$n");
	&findAllSimpleHelp ($q);
	
	# define the title
	my $title = "$simpleHelpTitle[0]";
			
	# output a header?
	if ($h) {
	
		print $output->start_html (-title => "$title", -style => "$gStyleSheet");
		if ($::gShowBanner) {
		
			&updateBanner;
			print qq($gBanner);
		}
		
		else { &displayAdminBanner; }
	      
	}
	
	# display the title and texts
	print "\n<!-- SIMPLE HELP TEXT ID #$n -->\n";
	print qq(<h2>$title</h2>\n);
	print "$simpleHelpText[0]";

}

	
sub printHeader {
	
	# do they want a cookie?
	if ($patronRecord->{wants_cookie}) {
		$cookie = $output->cookie(-name    => 'uid',
	                              -value   => "$patronRecord->{patron_id}",
								  -expires => "$gExpires",
	                              -path    => "$MyLibrary::CONFIGURATIONS{'gRelativePath'}/");
	}
		
	else {
		$cookie = $output->cookie(-name    => 'uid',
	                              -value   => "$patronRecord->{patron_id}",
	                              -path    => "$MyLibrary::CONFIGURATIONS{'gRelativePath'}/");
	}
	
	# output the header
	print $output->header(-expires => '-1d',
	                      -cookie  => $cookie);
	
}
		
		
sub printFooter {

	# if the footer file exists ($footer), then slup it up and print it
	#print "\n\n<!-- F O O T E R -->\n";
	#if (-e $footer) {
	#	
	#	my $b = `cat $footer`;
	#	print $b;
	#	
	#}
	
	print $gFooter;
		
}

sub returnError {

	my $errorMessage = @_[0];
	&printHeader;
	print qq(ERROR: $errorMessage Email <a href="mailto:clucchesi\@liuc.it">biblioteca</a>.);
	
}
		
		
sub notImplemented {

	&returnError("Funzione non ancora implementata.");
	
}

sub fillTemplate {

	# this code is based on (stolen from) the Perl Cookbook, pg. 721
	my ($text, $fillings) = @_;
	
	$text =~ s{ %% ( .*? ) %% }
	          { exists ( $fillings->{$1} )
	                   ? $fillings->{$1}
	                   : ""
	          }gsex;
	          
	return $text;

}

	
sub outputMyLibrary {

	my %tokens;
	my $librarians;
	my $listLibraryLinks;
	my $listUniversityLinks;
	my $formCurrentAwareness;
	my $listPersonalLinks;
	my $formQuickSearches;
	my $listReferenceLinks;
	my $listDatabaseLinks;
	my $listJournalLinks;
	
	# output a header
	&printHeader;
	
	# get the librarians
	$librarians = &addLibrarians();
	
	# get the library links
	$listLibraryLinks = &addLibraries();
	
	# get the university links
	$listUniversityLinks = &addUniversity();
	
	# get the current awareness
	$formCurrentAwareness = &addCAM();
	
	# get the what's new form
	$formWhatsNew = &addWhatsNew();
	
	# get the personal links
	$listPersonalLinks = &addPersonal();
	
	# get the quick searches
	$formQuickSearches = &addQuickSearches();
	
	# get the reference links
	$listReferenceShelf = &addReference();
	
	# get the bibliograhic databases
	$listDatabaseLinks = &addDatabases();
	
	# get the journals
	$listJournalLinks = &addJournals();
	
	# update the banner
	&updateBanner;
		
	# fill up the token list
	%tokens = (
				patronFirst               => $patronRecord->{name_f},
				title                     => $patronRecord->{page_title},
				bgcolor                   => $backgroundColor->{color_code},
				link                      => $linkColor->{color_code},
				alink                     => $alinkColor->{color_code},
				vlink                     => $vlinkColor->{color_code},
				text                      => $textColor->{color_code},
				bannerColor               => $bannerColor->{color_code},
				banner                    => $gBanner,
				motd                      => $gGlobalMessage,
				aboutMyLibrary            => './?cmd=about&id=39',
				customizeProfile          => './?cmd=about&id=43',
				logout                    => './?cmd=killCookie',

				messageFromLibrarian      => $gMessageFromTheLibrarian,
				aboutMessageFromLibrarian => './?cmd=about&id=42',
				disciplineMotd            => $disciplineMOTDs[0],

				yourLibrarians            => $gYourLibrarians,
				aboutLibrarians           => './?cmd=about&id=36',
				librarians                => $librarians,

				libraryLinks              => $gLibraryLinks,
				aboutLibraryLinks         => './?cmd=about&id=38',
				customizeLibraryLinks     => './?cmd=customizeLibraries',
				listLibraryLinks          => $listLibraryLinks,

				universityLinks           => $gUniversityLinks,
				aboutUniversityLinks      => './?cmd=about&id=37',
				customizeUniversityLinks  => './?cmd=customizeUniversity',
				listUniversityLinks       => $listUniversityLinks,
				
				currentAwareness          => $gCurrentAwarenessManager,
				aboutCurrentAwareness     => './?cmd=about&id=45',
				customizeCurrentAwareness => './?cmd=customizeCAMProfile',
				formCurrentAwareness      => $formCurrentAwareness,
				
				personalLinks             => $gPersonalLinks,
				aboutPersonalLinks        => './?cmd=about&id=31',
				customizePersonalLinks    => './?cmd=customizePersonalLinks',
				listPersonalLinks         => $listPersonalLinks,
				
				quickSearches             => $gQuickSearches,
				aboutQuickSearches        => './?cmd=about&id=32',
				customizeQuickSearches    => './?cmd=customizeQSearches',
				formQuickSearches         => $formQuickSearches,
				
				referenceShelf            => $gReferenceShelf,
				aboutReferenceShelf       => './?cmd=about&id=33',
				customizeReferenceShelf   => './?cmd=customizeReference',
				listReferenceShelf        => $listReferenceShelf,
				
				databaseLinks             => $gBibliographicDatabaseLinks,
				aboutDatabaseLinks        => './?cmd=about&id=34',
				customizeDatabaseLinks    => './?cmd=customizeDatabases',
				listDatabaseLinks         => $listDatabaseLinks,
				
				journalLinks              => $gElectronicJournals,
				aboutJournalLinks         => './?cmd=about&id=35',
				customizeJournalLinks     => './?cmd=customizeJournals',
				listJournalLinks          => $listJournalLinks,
				
				formWhatsNew              => $formWhatsNew
				
	);
	
	# finally, output the html
	print &fillTemplate($gPatronTemplate[0], \%tokens);

}
	
			
sub addLibrarians {
		
	my $librarians;
	
	# start with the reference librarians
	for ($i = 0; $i <= $#librarianNames; $i++) {
	
		# get the subject specalist librarian(s)
		my $l = $librarianNames[$i];
		my $e = $librarianEmailAddress[$i];
		my $t = "$librarianTelephoneStart[$i]-$librarianTelephoneEnd[$i]";
		my $u = $librarianURL[$i];
	
		if ($#librarianNames == 0 && $i == 0) {
			
			# display the librarian's name
			$librarians = "<p>$gLibrarianBlurb <a href=\"$u\">$l</a> ($t, <a href=\"mailto:$e\">$e</a>)";
			
		}
			
		elsif ($#librarianNames > 0 && $i == 0) {

			# display the librarian's name
			$librarians .= "<p>$gLibrarianBlurb <a href=\"$u\">$l</a> ($t, <a href=\"mailto:$e\">$e</a>)";
			
		}
			
		else {
			
			# display more names
			$librarians .=  " and <a href=\"$u\">$l</a> ($t, <a href=\"mailto:$e\">$e</a>)";
			
		}
			
	}
		
	# end the sentence
	$librarians .= ".</p>\n";
		
	# check for collection managers
	if ($gShowCollectionManagers) {
	
		# display the collection managers
		for ($i = 0; $i <= $#managerNames; $i++) {
	
			# get the subject specalist librarian(s)
			my $l = $managerNames[$i];
			my $e = $managerEmailAddress[$i];
			my $t = "$managerTelephoneStart[$i]-$managerTelephoneEnd[$i]";
			my $u = $managerURL[$i];
	
			if ($#managerNames == 0 && $i == 0) {
			
				# display the manager's name
				$librarians .= "<p>$gManagerBlurb <a href=\"$u\">$l</a> ($t, <a href=\"mailto:$e\">$e</a>)";
			
			}
			
			elsif ($#managerNames > 0 && $i == 0) {

				# display the librarian's name
				$librarians .= "<p>$gManagerBlurb <a href=\"$u\">$l</a> ($t, <a href=\"mailto:$e\">$e</a>)";
			
			}
			
			else {
			
				# display more names
				$librarians .= " and <a href=\"$u\">$l</a> ($t, <a href=\"mailto:$e\">$e</a>)";
			
			}
			
		}
		
	# end the sentence
	$librarians .=  ".</p>\n";
			
	}
		
	# check for libref
	if ($gShowLibRef) {
	
		# display more traditional help modes
		$librarians .= "$gGenericBlurb\n";
	
	}
	
	return $librarians;
		
}

		
sub addReference {

	my $listReferenceShelf;
	
	$listReferenceShelf = '<ol>';

	# display every selected database
	for ($i = 0; $i <= $#patronReferenceNames; $i++) {
	
		if ($gSaveStatistics) { $listReferenceShelf .= "<li><a href=./?cmd=simpleRedirect&section=R&resourceID=$patronReferenceIDs[$i]>$patronReferenceNames[$i]</a>"; }
		else { $listReferenceShelf .= qq (<li><a href="$patronReferenceURLs[$i]">$patronReferenceNames[$i]</a>\n);}
		
	}

	$listReferenceShelf .= '</ol>';

	return $listReferenceShelf;
		
}


sub addDatabases {

	my $listDatabaseLinks;
	
	$listDatabaseLinks = "<ol>\n";

	# display every selected database
	for ($i=0; $i <= $#patronDatabaseNames; $i++) {
	
		if ($gSaveStatistics) { $listDatabaseLinks .= "<li><a href=./?cmd=simpleRedirect&section=B&resourceID=$patronDatabaseIDs[$i]>$patronDatabaseNames[$i]</a>"; }
		else { $listDatabaseLinks .= qq (<li><a href="$patronDatabaseURLs[$i]">$patronDatabaseNames[$i]</a>\n);}
		
	}

	$listDatabaseLinks .= "</ol>\n";

	return $listDatabaseLinks;
		
}


sub addUniversity {

	my $universityLinks;

	$universityLinks = "<ol>";

	# display every selected database
	for ($i = 0; $i <= $#patronUniversityURLs; $i++) { 
	
		if ($gSaveStatistics) { $universityLinks .= "<li><a href=./?cmd=simpleRedirect&section=U&resourceID=$patronUniversityIDs[$i]>$patronUniversityNames[$i]</a>"; }
		else { $universityLinks .= qq (<li><a href="$patronUniversityURLs[$i]">$patronUniversityNames[$i]</a>);}
		
	}

	$universityLinks .= "</ol>";
	
	return $universityLinks;
	
}


sub addLibraries {

	my $libraryLinks;
	
	$libraryLinks = "<ol>";
		
	# display every selected database
	for ($i=0; $i <= $#patronLibrariesURLs; $i++) { 
	
		if ($gSaveStatistics) { $libraryLinks .= "<li><a href=./?cmd=simpleRedirect&section=L&resourceID=$patronLibrariesIDs[$i]>$patronLibrariesNames[$i]</a>"; }
		else { $libraryLinks .= qq (<li><a href=\"$patronLibrariesURLs[$i]\">$patronLibrariesNames[$i]</a>);}
		
	}

	$libraryLinks .= "</ol>";
	
	return $libraryLinks;
	
}


sub addJournals {

	my $listJournalLinks;
	
	$listJournalLinks = "<ol>\n";
	
	# display every selected database
	for ($i=0; $i <= $#patronJournalNames; $i++) {
	
		if ($gSaveStatistics) { $listJournalLinks .= "<li><a href=./?cmd=simpleRedirect&section=E&resourceID=$patronJournalIDs[$i]>$patronJournalNames[$i]</a>"; }
		else { $listJournalLinks .= qq (<li><a href="$patronJournalURLs[$i]">$patronJournalNames[$i]</a>\n);}
		
	}

	$listJournalLinks .= "</ol>\n";

	return $listJournalLinks;
		
}


sub addQuickSearches {
	
	my $formQuickSearches;
		
	$formQuickSearches =  qq (<form action="./" method="GET">\n);
	
	# branch according to gSaveStatistics
	if ($gSaveStatistics) {

		# capture statistics
		$formQuickSearches .= "<input type=hidden name=cmd value=simpleRedirect>";
		$formQuickSearches .= "<input type=hidden name=section value=Q>";
		
	}
	
	else {

		# just a plain search
		$formQuickSearches .= "<input type=hidden name=cmd value=qsearch>";

	}
	
	$formQuickSearches .= qq (<select name="resourceID">\n);
	for ($i = 0; $i <= $#patronQSearchIDs; $i++) {
	
		$formQuickSearches .= qq (<option value="$patronQSearchIDs[$i]">$patronQSearchNames[$i]\n);
		
	}
	
	$formQuickSearches .= "</select><br>\n";
	$formQuickSearches .= "<input type=text size=30 name=query value='$lastQuery->{last_query}'>";
	$formQuickSearches .= ' ';
	$formQuickSearches .= '<input type="submit" value="Cerca">';
	$formQuickSearches .= "</form>\n";
	
	return $formQuickSearches;
		
}



##################
# personal links #
##################

sub customizePersonalLinks {
	
	# get the personal links
	$q = qq (select link_id, link_name, link_url from personallinks
	         where patron_id = '$patronRecord->{patron_id}'
	         order by link_name);
	&findPersonalLinks ($q);
	
	# display the header
	&printHeader;
	
	# start the html
	&displaySimpleHelpMessage (6, 1);

	# print the help text
	print "<center>\n";
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setPersonalLinks');
	print "<table border=1>\n";

	# name of link
	print "<tr>\n";
	print "<td align=right>Nome</td>\n";
	print "<td>";
	print $output->textfield(-name => 'link_name');
	print "</td>\n";
	print qq (<td>\n);
	print qq (Inserire il titolo di una risorsa Internet. (<a href="./?cmd=about&id=185">Help</a>));
	print qq (</td>\n);
	print "</tr>\n";

	# url of link
	print "<tr>\n";
	print "<td align=right>Localizzazione</td>\n";
	print "<td>";
	print $output->textfield(-name => 'link_url', -value=> "http://");
	print "</td>\n";
	print qq (<td>\n);
	print qq (URL della risorsa. (<a href="./?cmd=about&id=186">Help</a>));
	print qq (</td>\n);
	print "</tr>\n";

	print "</table>\n";

	# add a submit and reset button
	print "<p>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');              
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</p>\n";
	print $output->endform;	

	# return home
	print "<p>\n";
	print "<a href=\"./\">Torna a Segnaweb</a>\n";
	print "</p>\n";
	print "</center>\n";
	
	# check for personal links existance
	if ($#personalLinksIDs > -1) {
	
		# display help for editing personal links
		&displaySimpleHelpMessage (24, 0);
		
		# dislay the existing links
		print "<center>\n";
		print "<p>\n";
		print "<table border=1>\n";
		print "<tr>\n";
		print "<td align='center'><b>Link</b>\n";
		print "<td align='center'><b>Localizzazione</b>\n";
		print "<td align='center'><b>Azione</b>\n";
		print "</tr>\n";
	
		for ($i=0; $i <= $#personalLinksIDs; $i++) {
		
			print "<tr>\n";
			print qq(<td><a href="$personalLinksURLs[$i]">$personalLinksNames[$i]</a></td>\n);
			print qq(<td>$personalLinksURLs[$i]</td>\n);
			print qq|<td><a href="./?cmd=deletePersonalLinks&uid=$patronRecord->{patron_id}&link_id=$personalLinksIDs[$i]">Elimina</a> (<a href="./?cmd=about&id=187">Help</a>) </td> \n|;
			print "</tr>\n";
			
		}
	
		print "</table>\n";
		print "</p>\n";
	
		# return home
		print "<p>\n";
		print "<a href=\"./\">Torna a Segnaweb</a>\n";
		print "</p>\n";

	}
	
	print "</center>\n";
	
	}
	

sub addPersonal {

	my $listPersonalLinks;
	
	# get the personal links
	$q = qq [select link_id, link_name, link_url from personallinks where patron_id = '$patronRecord->{patron_id}' order by link_name];
	&findPersonalLinks ($q);
	
	$listPersonalLinks = "<ol>\n";

	for ($i = 0; $i <= $#personalLinksIDs; $i++) {
	
		$listPersonalLinks .= "<li><a href=\"$personalLinksURLs[$i]\">$personalLinksNames[$i]</a>\n";
		
	}

	$listPersonalLinks .= "</ol>\n";

	return $listPersonalLinks;
		
}


sub deletePersonalLinks {

	my $patron_id = $input->param('uid');
	my $link_id   = $input->param('link_id');

	# set the personal link
	$q = qq (delete from personallinks where patron_id = '$patron_id' and link_id = '$link_id');

	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
}
	

sub setPersonalLinks {

	my $link_name = $MyLibrary::gDBhandle->quote($input->param('link_name'));
	my $link_url  = $input->param('link_url');
	
	# get a new sequence
	my $sequence = getNewSequence();
	
	# set the personal link
	$q = qq[insert into personallinks (link_id, patron_id, link_name, link_url) values ('$sequence', '$patronRecord->{patron_id}', $link_name, '$link_url')];

	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
}	
	
##################
# quick searches #
##################

sub setQSearches {

	# get the input
	my @e = $input->param('engine');

	# delete the existing records for this patron
	$q = qq (delete from items4qsearches where patron_id = "$patronRecord->{patron_id}");
	&prepareAndExecuteSQL ($q);

	# create new records for each new selection
	for $e (@e) {
	
		$q = qq (insert into items4qsearches values ("$patronRecord->{patron_id}", "$e"));
		&prepareAndExecuteSQL ($q);
		
	}
		
}
	

sub customizeQSearches {

	# define the query ($q), execute it, and put it into $allColors
	my $q = "SELECT * FROM qsearches ORDER BY qsearch_name";
	&findAllQSearches ($q);

	# print my header
	&printHeader;

	# start the html
	&displaySimpleHelpMessage (1, 1);
	
	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setQSearches');

	print "<center>\n";
	print "<table border=1>\n";
	
	# process each quick search
	for ($i = 0; $i <= $#qSearchIDs; $i++) {
		
		# check to see what was previously selected
		my $ps = 0;
		for $m (@patronQSearchNames) { if ($qSearchNames[$i] eq $m) { $ps = 1; last; } }

		# print the row
		print "<tr valign=top>\n";
		if ($ps) {
			print qq (<td align="right"><input type="checkbox" name="engine" value="$qSearchIDs[$i]" checked></td>\n);
		}
		else {
			print qq (<td align="right"><input type="checkbox" name="engine" value="$qSearchIDs[$i]"></td>\n);
		}
		if ($gSaveStatistics) { print qq[<td><a href=./?cmd=simpleRedirect&section=Q&resourceID=$qSearchIDs[$i]>$qSearchNames[$i]</a>]; }
		else { print qq (<td><a href="$qSearchURLs[$i]">$qSearchNames[$i]</a>\n);}
		if ($qSearchNotes[$i]) {
			print " - $qSearchNotes[$i]";
		}
		if ($qSearchFKeys[$i]) {
			print " (<a href='$gMarion$qSearchFKeys[$i]'>full record</a>)";
		}
		print qq (</td></tr>\n);
		
	}
	
	# end the table
	print "</table>\n";

	# add a submit and reset button
	print "<p>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');
	print ' ';            
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</p>\n";

	# finish the form
	print "</center>\n";
	print $output->endform;	
	
}


sub processQSearch {

	# get the engine ($engine) and the query ($query)
	my $engine = @_[0];
	my $query  = @_[1];
	
	# escape the query
	my $escQuery = $gDBhandle->quote($query);
	
	# save the query for future use
	my $q = qq (update patrons set last_query = $escQuery where patron_id = "$patronRecord->{patron_id}");
	&prepareAndExecuteSQL ($q);
		
	# get the prefix and suffix for this engine
	my $q = "SELECT * FROM qsearches WHERE qsearch_id = '$engine'";
	&findAllQSearches($q);
	
	# search
	&searchViaGETQuery($query, $qSearchPrefixes[0], $qSearchSuffixes[0]);
	
}
	
	
sub searchViaGETQuery {
	
	# get the input: query ($q), prefix ($p), suffix ($s)
	my $q = @_[0];
	my $p = @_[1];
	my $s = @_[2];
	
	# escape the query
	$q = uri_escape("$q");
	
	# create a new URL object ($url) and encode it
	$url = new URI::URL "$q";
	$url = $url->as_string;

	# build the encloded URL
	$url = $p.$url.$s;
    $url = uri_escape("$url","+");

	# redirect the browser accordingly
	print $output->redirect("$url");

	# quit
	exit;
	
}
	


###############
# libraries   #
###############

sub setLibraries {
	
	# get the input
	my @b = $input->param('libraries');

	# delete the existing records for this patron
	$q = qq (delete from items4libraries where patron_id = "$patronRecord->{patron_id}");
	&prepareAndExecuteSQL ($q);

	# create new records for each new selection
	for $b (@b) {
	
		$q = qq(insert into items4libraries values ("$patronRecord->{patron_id}", "$b"));
		&prepareAndExecuteSQL ($q);

	}

}


sub customizeLibraries {

	# find the help
	$q = qq(select * from help_simple where help_id = "7");
	&findAllSimpleHelp ($q);
	
	# define the query ($q), execute it, and put it into $allColors
	my $q = "select * from libraries order by libraries_name";
	&findAllLibraries ($q);
	
	# print my header
	&printHeader;

	# start the html
	&displaySimpleHelpMessage (7, 1);
		
	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setLibraries');

	print "<center>\n";
	print "<table border=1>\n";
	
	# process each quick search
	for (my $i=0; $i <= $#librariesNames; $i++) {
		
		# check to see if it was Previosly Selected
		my $ps = 0;
		for $m (@patronLibrariesNames) { if ($librariesNames[$i] eq $m) { $ps = 1; last; } }

		# print the row
		print "<tr valign=top>\n";
		if ($ps) {
			print qq (<td align="right"><input type="checkbox" name="libraries" value="$librariesIDs[$i]" checked></td>\n);
		}
		else {
			print qq (<td align="right"><input type="checkbox" name="libraries" value="$librariesIDs[$i]"></td>\n);
		}
		if ($gSaveStatistics) { print "<td><a href=./?cmd=simpleRedirect&section=L&resourceID=$librariesIDs[$i]>$librariesNames[$i]</a>"; }
		else { print qq (<td><a href="$librariesURLs[$i]">$librariesNames[$i]</a>);}
		if ($librariesNotes[$i]) {
			print " - $librariesNotes[$i]";
		}
		if ($librariesFKeys[$i]) {
			print " (<a href='$gMarion$librariesFKeys[$i]'>full record</a>)";
		}
		print qq (</td></tr>\n);
		
	}
	
	# end the table
	print "</table>\n";

	# add a submit and reset button
	print "<p>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');
	print ' ';         
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</p>\n";

	# finish the form
	print "</center>\n";
	print $output->endform;	
	
}


###############
# university  #
###############


sub setUniversity {

	# get the input
	my @b = $input->param('university');
	
	# delete the existing records for this patron
	$q = qq (delete from items4university where patron_id = "$patronRecord->{patron_id}");
	&prepareAndExecuteSQL ($q);
	
	# create new records for each new selection
	for $b (@b) {
	
		$q = qq (insert into items4university values ("$patronRecord->{patron_id}", "$b"));
		&prepareAndExecuteSQL ($q);
		
	}
		
}



sub customizeUniversity {

	# find all university
	my $q = "SELECT * FROM university ORDER BY university_name";
	&findAllUniversity ($q);
		
	# print my header
	&printHeader;

	# start the html
	&displaySimpleHelpMessage (3, 1);

	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setUniversity');
	
	# display the table
	print "<center>\n";
	print "<table border=1>\n";
	print "<tr>\n";
	print "<td align=right><b>Selection</b></td>\n";
	print "<td><b>Item</b></td>\n";
	print "</tr>\n";
	
	# process each quick search
	for (my $i=0; $i <= $#universityNames; $i++) {
		
		# see which databases were Previously Selected
		my $ps = 0;
		for $m (@patronUniversityNames) { if ($universityNames[$i] eq $m) { $ps = 1; last; } }

		# print the row
		print "<tr valign=top>\n";
		if ($ps) {
			print qq (<td align="right"><input type="checkbox" name="university" value="$universityIDs[$i]" checked></td>\n);
		}
		else {
			print qq (<td align="right"><input type="checkbox" name="university" value="$universityIDs[$i]"></td>\n);
		}
		if ($gSaveStatistics) { print qq[<td><a href=./?cmd=simpleRedirect&section=U&resourceID=$universityIDs[$i]>$universityNames[$i]</a>]; }
		else { print qq (<td><a href="$universityURLs[$i]">$universityNames[$i]</a>\n);}
		if ($universityNotes[$i]) {
			print " - $universityNotes[$i]";
		}
		if ($universityFKeys[$i]) {
			print " (<a href='$gMarion$universityFKeys[$i]'>full record</a>)";
		}
		print qq (</td></tr>\n);
		
	}
	
	# end the table
	print "</table>\n";

	# add a submit and reset button
	print "<p>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');
	print ' ';           
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</p>\n";

	# finish the form
	print "</center>\n";
	print $output->endform;	
	
}


###############
# reference   #
###############

sub displayDisciplineReference {
	
	# get the discipline id
	my $id = $input->param('id');
	
	# find all the resources for this discipline	
	$q = qq (SELECT reference.*
             FROM reference, items4DisReference
             WHERE items4DisReference.discipline_id = '$id'
             AND items4DisReference.reference_id = reference.reference_id
             ORDER BY reference.reference_name);
	&findAllReferences ($q);
	
	# print my header
	&printHeader;

	# display simple help
	&displaySimpleHelpMessage (29, 1);
	
	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setReference');
	
	# add a submit and reset button
	print "<p><center>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');
	print ' ';              
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</center></p>\n";

	# start the table
	print "<table border=1>\n";
	
	# process each quick search
	for (my $i=0; $i <= $#referenceNames; $i++) {
		
		# check to see what was previously selected
		my $ps = 0;
		for $m (@patronReferenceNames) { if ($referenceNames[$i] eq $m) { $ps = 1; last; } }
		
		# print the row
		print "<tr valign=top>\n";
		if ($ps) {
			print qq (<td align="right"><input type="checkbox" name="reference" value="$referenceIDs[$i]" checked></td>\n);
		}
		else {
			print qq (<td align="right"><input type="checkbox" name="reference" value="$referenceIDs[$i]"></td>\n);
		}
		if ($gSaveStatistics) { print qq[<td><a href=./?cmd=simpleRedirect&section=R&resourceID=$referenceIDs[$i]>$referenceNames[$i]</a>]; }
		else { print qq (<td><a href="$referenceURLs[$i]">$referenceNames[$i]</a>\n);}
		if ($referenceNotes[$i]) {
			print " - $referenceNotes[$i]";
		}
		if ($referenceFKeys[$i]) {
			print " (<a href='$gMarion$referenceFKeys[$i]'>full record</a>)";
		}
		print qq (</td></tr>\n);
		
	}
	
	# end the table
	print "</table>\n";
	
	# add a submit and reset button
	print "<p><center>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');              
	print ' ';              
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</center></p>\n";

	# finish the form
	print "</center>\n";
	print $output->endform;	
	
}
	
	
sub setDefaultReferences {
	my @b = $input->param('references');

 	# delete the existing records for this patron
	$q = qq(delete from items4references where patron_id = "$patronRecord->{patron_id}");
	&prepareAndExecuteSQL ($q);

	# create new records for each new selection
	for $b (@b) {
	
		$q = qq(insert into items4references values ("$patronRecord->{patron_id}", "$b"));
		&prepareAndExecuteSQL ($q);
				
	}
		
}

sub setReference {
	my @b = $input->param('reference');

	# concatonate their previous selects to the new selections
	push @b, @patronReferenceIDs;
		
	# remove duplicates
	@b = &removeDuplicates(@b);

 	# delete the existing records for this patron
	$q = qq(delete from items4references where patron_id = "$patronRecord->{patron_id}");
	&prepareAndExecuteSQL ($q);

	# create new records for each new selection
	for $b (@b) {
	
		$q = qq(insert into items4references values ("$patronRecord->{patron_id}", "$b"));
		&prepareAndExecuteSQL ($q);
		
	}
		
}

sub customizeReference {

	# get all the disciplines for later use
	my $q = "select * from disciplines order by discipline_name";
	&findAllDisciplines($q);

	# print my header
	&printHeader;

	# display simple help
	&displaySimpleHelpMessage (5, 1);
	
	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setDefaultReferences');
	
	# process every reference they have selected
	print "<ol>";
	for ($i = 0; $i <= $#patronReferenceIDs; $i++) {
	
		print qq(<li><input type="checkbox" name="references" value="$patronReferenceIDs[$i]" checked>$patronReferenceNames[$i]\n);
		
	}
	
	print "</ol>";

	# add a submit and reset button
	print "<p>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');              
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</p>\n";

	# return to MyLibrary
	print "<p>\n";
	print qq(<a href="./">Torna a Segnaweb</a>);              
	print "</p>\n";

	# end the form
	print $output->endform;	
	
	# display simple help
	&displaySimpleHelpMessage (28, 0);
	
	# display a list of all the disciplines
	print "<ol>";
	for ($i = 0; $i <= $#disciplineIDs; $i++) {

			
		print qq(<li><a href="./?cmd=displayDisciplineReference&id=$disciplineIDs[$i]">$disciplineNames[$i]</a>\n) unless $disciplineNames[$i] =~ /[A-Z]{3,}/;
	
	}
	
	print "</ol>";
	
	# return to MyLibrary
	print "<p>\n";
	print qq(<a href="./">Torna a Segnaweb</a>);              
	print "</p>\n";

}

###############
# journals    #
###############
sub displayAlphabeticJournals {

	# find all the journals
	
	# my $q = qq (select *
        #     from etexts
        #     order by etext_name);
	
	my $q = qq (select *
             from etexts
             where etext_id = 531);
	
	&findAllJournals ($q);
	
	# print my header
	&printHeader;

	# display simple help
	&displaySimpleHelpMessage (215, 1);
	
	# display the form
	&displayJournalSelectionForm;

}


sub displayJournalSelectionForm {

	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setJournals');

	# add a submit and reset button
	print "<p><center>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');
	print ' ';        
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</center></p>\n";
	
	# start the table
	print "<table border=1>\n";
	
	# process each quick search
	for (my $i=0; $i <= $#journalNames; $i++) {
		
		# check to see what was previously selected
		my $ps = 0;
		for $m (@patronJournalNames) { if ($journalNames[$i] eq $m) { $ps = 1; last; } }
		
		# print the row
		print "<tr valign=top>\n";
		if ($ps) {
			print qq (<td align="right"><input type="checkbox" name="journal" value="$journalIDs[$i]" checked></td>\n);
		}
		else {
			print qq (<td align="right"><input type="checkbox" name="journal" value="$journalIDs[$i]"></td>\n);
		}
		if ($gSaveStatistics) { print qq[<td><a href=./?cmd=simpleRedirect&section=E&resourceID=$journalIDs[$i]>$journalNames[$i]</a>]; }
		else { print qq (<td><a href="$journalURLs[$i]">$journalNames[$i]</a>\n);}
		if ($journalNotes[$i]) {
			print " - $journalNotes[$i]";
		}
		if ($journalFKeys[$i]) {
			print " (<a href='$gMarion$journalFKeys[$i]'>full record</a>)";
		}
		print qq (</td></tr>\n);
		
	}
	
	# end the table
	print "</table>\n";
	
	# add a submit and reset button
	print "<p><center>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');              
	print ' ';        
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</center></p>\n";

	# finish the form
	print "</center>\n";
	print $output->endform;	

}

sub customizeJournals {

	# get all the disciplines for later use
	my $q = "select * from disciplines order by discipline_name";
	&findAllDisciplines($q);

	# print my header
	&printHeader;

	# display simple help
	&displaySimpleHelpMessage (4, 1);
	
	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setDefaultJournals');
	
	# process every journal they have selected
	print "<ol>";
	for ($i = 0; $i <= $#patronJournalIDs; $i++) {
		print qq(<li><input type="checkbox" name="journals" value="$patronJournalIDs[$i]" checked>$patronJournalNames[$i]\n);
		
		}
	print "</ol>";

	# add a submit and reset button
	print "<p>\n";
	print $output->submit(-name => 'submit', -value => 'Invia');              
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</p>\n";

	# return to MyLibrary
	print "<p>\n";
	print qq(<a href="./">Torna a Segnaweb</a>);              
	print "</p>\n";

	# end the form
	print $output->endform;	
	
	# display simple help message to list all journals; it links to ./?cmd=displayAlphabeticJournals
	&displaySimpleHelpMessage (214, 0);
	
	# display simple help
	&displaySimpleHelpMessage (26, 0);
	
	# display a list of all the disciplines
	print "<ol>";
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
		print qq(<li><a href="./?cmd=displayDisciplineJournals&id=$disciplineIDs[$i]">$disciplineNames[$i]</a>\n);
		}
	print "</ol>";
	
	# return to MyLibrary
	print "<p>\n";
	print qq(<a href="./">Torna a Segnaweb</a>);              
	print "</p>\n";

}


sub setDefaultJournals {
	my @b = $input->param('journals');

 	# delete the existing records for this patron
	$q = qq(delete from items4etexts where patron_id = "$patronRecord->{patron_id}");
	&prepareAndExecuteSQL ($q);

	# create new records for each new selection
	for $b (@b) {
	
		$q = qq(insert into items4etexts values ("$patronRecord->{patron_id}", "$b"));
		&prepareAndExecuteSQL ($q);
				
	}
		
}


sub displayDisciplineJournals {
	
	# get the discipline id
	my $id = $input->param('id');
	
	# find all the resources for this discipline	
	$q = qq (SELECT etexts.*
             FROM etexts, items4DisEtexts
             WHERE items4DisEtexts.discipline_id = $id
             AND items4DisEtexts.etext_id = etexts.etext_id
             ORDER BY etexts.etext_name);
	&findAllJournals ($q);
	
	# print my header
	&printHeader;

	# display the form
	if ($#journalIDs >= 0) {
	
		# display simple help
		&displaySimpleHelpMessage (25, 1);
	
		# display the form
		&displayJournalSelectionForm;
	}
	
	# explain that no titles were found
	else {&displaySimpleHelpMessage (218, 1);}

}
	
	
sub setJournals {

	my @b = $input->param('journal');

	# concatonate their previous selects to the new selections
	push @b, @patronJournalIDs;
		
	# remove duplicates
	@b = &removeDuplicates(@b);

 	# delete the existing records for this patron
	$q = qq(delete from items4etexts where patron_id = "$patronRecord->{patron_id}");
	&prepareAndExecuteSQL ($q);

	# create new records for each new selection
	for $b (@b) {
	
		$q = qq(insert into items4etexts values ("$patronRecord->{patron_id}", "$b"));
		&prepareAndExecuteSQL ($q);
		
	}
		
}


##################
# login / logout #
##################

sub findPatron {
	
	local $username, $pwd, $q;
	
	# check for WRAP
	if ($CONFIGURATIONS{'gUsingWrap'}) {
	
		# authenticate the user
		&::WRAP_AUTHENTICATE;

		# read the cookie
		my @wrapCookie = split (/ /, $input->cookie(-name => 'WRAP'));
	
		# read the unity id, element 0 of the array
		$username = $wrapCookie[0];
		
		# define query to find the patron
		$q = qq(SELECT * FROM patrons WHERE username = "$username");

	}
	
	# not using WRAP
	else {
	
		# get the username and password
		$username = $input->param('username');
		$pwd      = $input->param('password');
		
		# check for input
		if (! $username) {
		
			# display a login form
			print $output->header(-expires => '-1d');

			# display the loging message
			&displaySimpleHelpMessage(16, 1);
	
			print "<center>\n";
			print "<table border=1>\n";

			print $output->startform(-method => 'POST', -action => './');
			print $output->hidden(-name => 'cmd',  -value => 'findPatron');

			# user name
			print "<tr valign=top>\n";
			print "<td align=right>Username</td>\n";
			print "<td>\n";
			print $output->textfield(-name => 'username');
			print "<br>\n";
			print "</td>\n";
			print qq{<td>Inserire lo username. </td>\n};
			print "</tr>\n";

			# password
			print "<tr valign=top>\n";
			print "<td align=right>Password</td>\n";
			print "<td>\n";
			print $output->password_field(-name => 'password');
			print "<br>\n";
			print "</td>\n";
			print qq{<td>Inserire la password. </td>\n};
			print "</tr>\n";

			# end the table
			print "</table>\n";

			# add a submit and reset button
			print "<p>\n";
			print $output->submit(-name => 'submit', -value => 'Login');              
			print "</p>\n";

			# finish the form
			print "</center>\n";
			print $output->endform;	

			# exit gracefully		
			&MyLibrary::gracefulExit;
			
		}
		
		else {
                        # Need to look up password first to get the salt
                        $q = qq(select password from patrons where username ="$username");
                        &findPatrons($q);

                        my $salt = substr $patronRecord->{password}, 0, 2;

                        my $crypted_pw = crypt($pwd, $salt);

			# define query to find the patron
                      $q = qq(select * from patrons where username = "$username" and password = "$crypted_pw");
			
		}
			
	}

	# find the user id 
	&findPatrons ($q);
	
	# make sure the username and password were valid
	my $n = $gSth->rows;
	if (! $n) {
	
		# start the output
		&printHeader;

		# display error message
		&displaySimpleHelpMessage (20, 1);
		
		# exit gracefully		
		&gracefulExit;

	}
		
	# define the title
	my $title = "Collegato!";
		
	# do they want a cookie?
	if ($patronRecord->{wants_cookie}) {
	
		$cookie = $output->cookie(-name    => 'uid',
	                              -value   => "$patronRecord->{patron_id}",
							      -expires => "$gExpires",
	                              -path    => "$MyLibrary::CONFIGURATIONS{'gRelativePath'}/");
	                              
	}
		
	else {
	
		$cookie = $output->cookie(-name  => 'uid',
	                              -value => "$patronRecord->{patron_id}",
	                              -path  => "$MyLibrary::CONFIGURATIONS{'gRelativePath'}/");
	                              
	}
	
	# start the output
	print $output->header(-expires => '-1d', -cookie => $cookie);

	# display the login message
	&displaySimpleHelpMessage (21, 1);

}
	

sub setNewUser {
		
    local $pwd_1, $pwd_2, crypted_pw;

	# intilize the input
	my $username      = $input->param('username');
	my $name_f        = $input->param('name_f');
	my $name_l        = $input->param('name_l');
	my $email         = $input->param('email');
	my $canContact    = $input->param('can_contact');
	my $discipline_id = $input->param('discipline_id');
	my $rank_id		  = $input->param('rank_id');
	
	# check for WRAP
	if (! $CONFIGURATIONS{'gUsingWrap'}) {
	
		# get password
		$pwd_1 = $input->param('password_1');
		$pwd_2 = $input->param('password_2');

	}
	
	# check for WRAP
	if ($CONFIGURATIONS{'gUsingWrap'}) {
	
		# make sure all field have values
		if ($username eq "" || $name_f eq "" || $name_l eq "" || $email eq "" ) {
	    
			# start the output
			print $output->header(-expires => '-1d');
		
			# display error message
			&displaySimpleHelpMessage (11, 1);
		
			# exit gracefully		
			&gracefulExit;

	    }	

	}
	
	# not using WRAP
	else {
	
		# make sure all field have values
		if ($username eq "" || $pwd_1 eq "" || $pwd_2 eq "" || $name_f eq "" || $name_l eq "" || $email eq "" ) {
	    
			# start the output
			print $output->header(-expires => '-1d');
		
			# display error message
			&displaySimpleHelpMessage (11, 1);
		
			# exit gracefully		
			&gracefulExit;

	    }	
	
		# make sure the username is at least 6 characters long
		if (length ($username) < 6) {
	
			# start the output
			print $output->header(-expires => '-1d');
		
			# display error message
			&displaySimpleHelpMessage (14, 1);
		
			# exit gracefully		
			&gracefulExit;

		}
		
		# make sure the password is at least 8 characters long
		if (length ($pwd_1) < 8) {
	
			# start the output
			print $output->header(-expires => '-1d');
		
			# display error message
			&displaySimpleHelpMessage (15, 1);
		
			# exit gracefully		
			&gracefulExit;

		}
		
		# make sure the passwords match
		if ($pwd_1 ne $pwd_2) {

			# start the output
			print $output->header(-expires => '-1d');
		
			# display error message
			&displaySimpleHelpMessage (12, 1);
		
			# exit gracefully		
			&gracefulExit;

		}
		
		# Password is ok, crypt it for storage
		my $salt = (localtime)[0];
		$crypted_pw = crypt($pwd_1, $salt);
		
	}
	
	# search for the username
	my $q = qq(select username from patrons where username = '$username');
	&prepareAndExecuteSQL ($q);
	my $n = $gSth->rows;

	# make sure the username is unique
	if ($n) {
	    
		# start the output
		print $output->header(-expires => '-1d');
		
		# display error message
		&displaySimpleHelpMessage (13, 1);
		
		# exit gracefully		
		&gracefulExit;

	}	
	
	# get a new sequence
	my $sequence = &getNewSequence();
	
	# create defaults settings for the new user
	my $q = qq{INSERT INTO patrons (
	                patron_id,
					username,
					password,
				    name_f,
				    name_l,
	                email,
	                can_contact,
	                discipline_id,
					rank_id,
	                template_id,
	                page_title,
	                color_bg_id,
                    color_text_id,
                    color_link_id,
                    color_vlink_id,
                    color_alink_id,
                    color_banner_id,
                    wants_cookie )
	             VALUES (
	                "$sequence",
	               	"$username",
                    "$crypted_pw",
	                "$name_f",
	                "$name_l",
	                "$email",
	                "$canContact",
	                "$discipline_id",
					"$rank_id",
	                "$gTemplateID",
	                "$gPage_title",
	                "$gColor_bg_id",
	                "$gColor_text_id",
	                "$gColor_link_id",
	                "$gColor_vlink_id",
	                "$gColor_alink_id",
	                "$gColor_banner_id",
	                "0"
	             )};
	&prepareAndExecuteSQL ($q);
	
	# find the record
	my $q = qq (select patron_id from patrons where username="$username");
	&findPatrons ($q);
	
	# set defaults for LIBRARIES
	my $q = qq(select * from defaultLibraries where discipline_id = "$discipline_id");
	&findDefaultResources ($q, "libraries_id");
	for ($i = 0; $i <= $#defaultIDs; $i++) {
	
		$q = qq{INSERT INTO items4libraries (patron_id, libraries_id) values ($patronRecord->{patron_id}, $defaultIDs[$i])};
		&prepareAndExecuteSQL ($q);
	
	}
	
	# set defaults for UNIVERSITY
	my $q = qq(select * from defaultUniversity where discipline_id = "$discipline_id");
	&findDefaultResources ($q, "university_id");
	for ($i = 0; $i <= $#defaultIDs; $i++) {
	
		$q = qq{INSERT INTO items4university (patron_id, university_id) values ($patronRecord->{patron_id}, $defaultIDs[$i])};
		&prepareAndExecuteSQL ($q);
	
	}
	
	# set defaults for CAM
	my $q = qq(SELECT * FROM defaultProfiles WHERE discipline_id = "$discipline_id");
	&findAllDefaultProfiles ($q);
	for ($i = 0; $i <= $#defaultProfileIDs; $i++) {
	
		my $sequence = &getNewSequence();
		$q = qq{INSERT INTO profiles 
		        (profile_id, patron_id, lower_bounds, upper_bounds)
		        VALUES
		        ('$sequence', $patronRecord->{patron_id}, '$lowerBounds[$i]', '$upperBounds[$i]')};
		&prepareAndExecuteSQL ($q);
	
	}
	
	# set defaults for QUICK SEARCHES
	my $q = qq(select * from defaultQseaches where discipline_id = "$discipline_id");
	&findDefaultResources ($q, "qsearch_id");
	for ($i = 0; $i <= $#defaultIDs; $i++) {
	
		$q = qq{INSERT INTO items4qsearches (patron_id, qsearch_id) values ($patronRecord->{patron_id}, $defaultIDs[$i])};
		&prepareAndExecuteSQL ($q);
	
	}
	
	# set defaults for REFERENCE
	my $q = qq(select * from defaultReferences where discipline_id = "$discipline_id");
	&findDefaultResources ($q, "reference_id");
	for ($i = 0; $i <= $#defaultIDs; $i++) {
	
		$q = qq{INSERT INTO items4references (patron_id, reference_id) values ($patronRecord->{patron_id}, $defaultIDs[$i])};
		&prepareAndExecuteSQL ($q);
		
	}
	
	# set defaults for BIBLIOGRAHIC DATABASES
	my $q = qq(select * from defaultBibdatabases where discipline_id = "$discipline_id");
	&findDefaultResources ($q, "bib_database_id");
	for ($i = 0; $i <= $#defaultIDs; $i++) {
	
		$q = qq{INSERT INTO items4bibdatabases (patron_id, bib_database_id) values ($patronRecord->{patron_id}, $defaultIDs[$i])};
		&prepareAndExecuteSQL ($q);
	
	}
	
	# set defaults for JOURNALS
	my $q = qq(select * from defaultEtexts where discipline_id = "$discipline_id");
	&findDefaultResources ($q, "etext_id");
	for ($i = 0; $i <= $#defaultIDs; $i++) {
	
		$q = qq{INSERT INTO items4etexts (patron_id, etext_id) values ($patronRecord->{patron_id}, $defaultIDs[$i])};
		&prepareAndExecuteSQL ($q);
	
	}
	
	# set their cookie
	my $cookie = $output->cookie(-name    => 'uid',
	                             -value   => "$patronRecord->{patron_id}",
	                             -path    => "$MyLibrary::CONFIGURATIONS{'gRelativePath'}/");
	print $output->header(-expires => '-1d', -cookie => $cookie);

	# display the login message
	&displaySimpleHelpMessage (21, 1);
		
}
	

sub search {

 local $unityID;
   
    # check for WRAP
    if ($CONFIGURATIONS{'gUsingWrap'}) {
   
        # get the unity id
        $unityID = &getUnityID;
   
    }

     # print a generic header
     print $output->header(-expires => '-1d');

     &updateBanner;
     print qq($gBanner);


   my $query = $input->param('query');
  
   my $start = $input->param('start');

$start =~ s/[^0-9]//g;
 
   if ($start eq '') { $start=0; } 

  my $group = $CONFIGURATIONS{'searchGrouping'};




if ($query !~ m/^[a-zA-Z0-9 *+-]+$/) {
#if ($query !~ m/^[a-zA-Z0-9Á-Uá-u +-]+$/) {
#if ($query !~ m/^[a-zA-Z0-9Ã| Ã¨Ã¬Ã²Ã¹ +-]+$/) { lettere accentate???
print << "EOF";

Attenzione, la stringa che hai inserito contiene caratteri non validi.<br>

I caratteri validi per la ricerca sono quelli alfanumerici, gli spazi, i segni *, + e -.<br>
Inoltre la stringa di ricerca non puo` essere vuota. Premere il tasto "Indietro" per riprovare.
EOF
&gracefulExit;
exit;

}

if (length ($query)<=3) {
#if (length ($query)<=2) {
print << "EOF";

Errore nell'input: <b>$query</b>.<br>

Le parole da ricercare devono essere almeno di 4 caratteri.
<br>
Premere il tasto "Indietro" per riprovare.
EOF
&gracefulExit;
exit;

}


#$query =~ s/ +/ /g;


# l'url qui sotto va sotituita con una form

my $newstart = $start+$group;

print <<"EOF";
<form action="/" method=GET>
<input type="hidden" name="cmd" value="search">
<input type=text name=query value="$query">
<input type=submit name="submit" value=" Cerca ">
</form>

EOF

my $qn = "select count(*) as conto from reference where match(reference_name,reference_note) against ('$query' IN BOOLEAN MODE )";
my $q =  "select reference_name, reference_url, reference_note, match(reference_name,reference_note) against ('$query' IN BOOLEAN MODE ) as score from reference where match(reference_name,reference_note,reference_url) against ('$query' IN BOOLEAN MODE ) ORDER BY score DESC";

#&prepareAndExecuteSQL($qn);

#$row=$gSth->fetchrow_hashref;
#my $conto=$row->{conto};
&prepareAndExecuteSQL($q);

#my $next= $start + $group;
#my $prev= $start - $group;;

#if($prev>=0) {
		#
#print "<a href=\"/?cmd=search&query=$query&start=$prev\">Risultati precedenti</a>"; 
#
#}

#if ($prev>=0 && $next < $conto) {
#print " | ";

#}

#if($next<$conto) {

#print "<a href=\"/?cmd=search&query=$query&start=$next\">Risultati seguenti</a>";


#}

print "<h1>Informazioni rapide</h1>";
print "<ol>\n";
while($row=$gSth->fetchrow_hashref) {
 print "<li><a href=\"$row->{reference_url}\"><b>$row->{reference_name}</b></a> &nbsp; &lt;&nbsp;$row->{reference_url}&nbsp;&gt;<br>\n";
 print "$row->{reference_note}<br>\n";
# print "Rilevanza $row->{score}\n";



}
print "</ol>";



$q = "select bib_database_name, bib_database_url, bib_database_note, match(bib_database_name,bib_database_note) against ('$query' IN BOOLEAN MODE) as score from bib_databases where match(bib_database_name,bib_database_note,bib_database_url) against ('$query' IN BOOLEAN MODE) ORDER BY score DESC";

&prepareAndExecuteSQL($q);

print "<h1>Cerca per argomenti</h1>";

print "<ol>\n";

while($row=$gSth->fetchrow_hashref) {
 print "<li><a href=\"$row->{bib_database_url}\"><b>$row->{bib_database_name}</b></a> &nbsp; &lt;&nbsp;$row->{bib_database_url}&nbsp;&gt;<br>\n";
 print "$row->{reference_note}<br>\n";
#  print "Rilevanza $row->{score}\n";
  



}
print "</ol>";


$q = "select etext_name, etext_url, etext_note, match(etext_name,etext_note) against ('$query' IN BOOLEAN MODE) as score from etexts where match(etext_name,etext_note,etext_url) against ('$query' IN BOOLEAN MODE) ORDER BY score DESC";

&prepareAndExecuteSQL($q);

print "<h1>Ricerche</h1>";


print "<ol>\n";

while($row=$gSth->fetchrow_hashref) {

print "<li><a href=\"$row->{etext_url}\"><b>$row->{etext_name}</b></a> &nbsp; &lt; &nbsp;$row->{etext_url}&nbsp; &gt;<br>\n";
 print "$row->{etext_note}<br>\n";
#  print "Rilevanza $row->{score}\n";



}
print "</ol>";


}


sub customizeNewUser {

	local $unityID;
	
	# check for WRAP
	if ($CONFIGURATIONS{'gUsingWrap'}) {
	
		# get the unity id
		$unityID = &getUnityID;
	
	}

	# read the disciplines
	my $q  = "select * from disciplines order by discipline_name";
	&findAllDisciplines ($q);
	

       # read the ranks
	   my $q = "select * from ranks";
	   &findAllRanks ($q);
	
	# print a generic header
	print $output->header(-expires => '-1d');

	# display the help message
	&displaySimpleHelpMessage(10, 1);
		
	# start the form
	print $output->startform(-method => 'POST', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setNewUser');
	
	print "<center>\n";
	print "<table border=1>\n";
	
	# check for WRAP
	if ($CONFIGURATIONS{'gUsingWrap'}) {
	
		# supply the unity id
		print $output->hidden(-name => 'username',  -value => "$unityID");

	}
	
	else {
	
		# user name
		print "<tr valign=top>\n";
		print "<td align=\"right\">\n";
		print "Username\n";
		print "</td>\n";
		print "<td>\n";
		print $output->textfield(-name => 'username');
		print "</td>\n";
		print "<td>\n";
		print qq(Assegnati uno username (almeno 6 caratteri). (<a href="./?cmd=about&id=188">Help</a>));
		print "</td>\n";
		print "</tr>\n";

		# password
		print "<tr valign=top>\n";
		print "<td align=\"right\">\n";
		print "Password\n";
		print "</td>\n";
		print "<td>\n";
		print $output->password_field(-name => 'password_1');
		print "</td>\n";
		print "<td>\n";
		print qq(Assegnati una password (Almeno 8 caratteri). (<a href="./?cmd=about&id=189">Help</a>));
		print "</td>\n";
		print "</tr>\n";
				
		# echo password
		print "<tr valign=top>\n";
		print "<td align=\"right\">\n";
		print "Password (di nuovo)\n";
		print "</td>\n";
		print "<td>\n";
		print $output->password_field(-name => 'password_2');
		print "</td>\n";
		print "<td>\n";
		print qq(Ridigita la password. (<a href="./?cmd=about&id=189">Help</a>));
		print "</td>\n";
		print "</tr>\n";
				
	}
	
	# first name
	print "<tr valign=top>\n";
	print "<td align=\"right\">\n";
	print "Nome o nome della Biblioteca\n";
	print "</td>\n";
	print "<td>\n";
	print $output->textfield(-name => 'name_f');
	print "</td>\n";
	print "<td>\n";
	print qq(Inserire il nome. (<a href="./?cmd=about&id=162">Help</a>));
	print "</td>\n";
	print "</tr>\n";
				
	# last name
	print "<tr valign=top>\n";
	print "<td align=\"right\">\n";
	print "Cognome o nome dell'Ente\n";
	print "</td>\n";
	print "<td>\n";
	print $output->textfield(-name => 'name_l');
	print "</td>\n";
	print "<td>\n";
	print qq(Inserire il cognome. (<a href="./?cmd=about&id=163">Help</a>));
	print "</td>\n";
	print "</tr>\n";
				
	# email address
	print "<tr valign=top>\n";
	print "<td align=\"right\">\n";
	print "Indirizzo email";
	print "</td>\n";
	print "<td>\n";
	print $output->textfield(-name => 'email');
	print "</td>\n";
	print "<td>\n";
	print qq(Inserire il proprio indirizzo email. (<a href="./?cmd=about&id=167">Help</a>));
	print "</td>\n";
	print "</tr>\n";
				
	# can contact
	print qq (<tr valign="top">\n);
	print qq (<td align="right">\n);
	print qq (Contatto);
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (<input type="radio" name="can_contact" value="1" checked>Si );
	print qq (<input type="radio" name="can_contact" value="0">No);
	print "</td>\n";
	print "<td>\n";
	print qq(Possiamo inviarti email? (<a href="./?cmd=about&id=168">Help</a>));
	print "</td>\n";
	print "</tr>\n";
				
	# disciplines
	print qq(<tr valign="top">\n);
	print "<td align=\"right\">\n";
	print "Disciplina\n";
	print "</td>\n";
	print "<td>\n";
	print qq(<select name="discipline_id">);
	for ($i; $i <= $#disciplineIDs; $i++) { print qq(<option value="$disciplineIDs[$i]">$disciplineNames[$i]\n); }
	print "</select>";
	print "<td>\n";
	print qq(Selezionare l'area di interesse principale. Questa selezione non limiter&agrave; la possibilit&agrave; di scegliere risorse di altre discipline. (<a href="./?cmd=about&id=164">Help</a>));
	print "</td>\n";
	print "</tr>\n";


	   # rank
	 print qq (<tr valign="top">\n);
	print qq (<td align="right">\n);
	print qq (Status);
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (<select name="rank_id">);
	for ($i=0; $i<= $#rankIDs; $i++) {
	print qq (<option value="$rankIDs[$i]">$rankNames[$i]\n);


	}
	
	print qq (</select>);
	print qq (<td>\n);
	print qq (Scegliere la categoria. (<a href="./?cmd=about&id=166">Help</a>));

				
	# end the table
	print "</table>\n";

	# add a submit and reset button
	print "<p>\n";
	print $output->submit(-name => 'submit', -value => 'Crea');              
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</p>\n";

	# finish the form
	print "</center>\n";
	print $output->endform;	

}
	

sub getUnityID {

	# authenticate the user
	&::WRAP_AUTHENTICATE;
	
	# read the cookie
	my @wrapCookie = split (/ /, $input->cookie(-name => 'WRAP'));
	
	# return the unity id, element 0 of the array
	return $wrapCookie[0];
	
}
	

sub killCookie {

	# redefine their cookie
	my $cookie = $output->cookie(-name    => 'uid',
	                             -value   => "$patronRecord->{patron_id}",
	                             -expires => '-1y',
	                             -path    => "$MyLibrary::CONFIGURATIONS{'gRelativePath'}/");
	print $output->header(-expires => '-1d', -cookie => "$cookie");

	# display error message
	&displaySimpleHelpMessage (17, 1);
		
}
	
	
sub logout {

	# start the output
	&printHeader;

	# display error message
	&displaySimpleHelpMessage (18, 1);
		
}


sub splash {
	
	my %tokens;
	my $librarians;
	my $listLibraryLinks;
	my $listUniversityLinks;
	my $formCurrentAwareness;
	my $listPersonalLinks;
	my $formQuickSearches;
	my $listReferenceShelf;
	my $listDatabaseLinks;
	my $listJournalLinks;
	
	# get the default template
	$q = "SELECT * FROM templates_free WHERE template_free_id = '$gTemplateFreeID'";
	&findAllFreeTemplates($q);
		
	# find default background color
	$q = "SELECT * FROM colors WHERE color_id = '$gColor_bg_id'";
	&findBackgroundColors ($q);
	
	# find default link color
	$q = "SELECT * FROM colors WHERE color_id = '$gColor_link_id'";
	&findLinkColors ($q);
	
	# find default banner color
	$q = "SELECT * FROM colors WHERE color_id = '$gColor_banner_id'";
	&findBannerColors ($q);
	
	# find default text color
	$q = "SELECT * FROM colors WHERE color_id = '$gColor_text_id'";
	&findTextColors ($q);
	
	# find default active link color
	$q = "SELECT * FROM colors WHERE color_id = '$gColor_alink_id'";
	&findAlinkColors ($q);
	
	# find default visited link color
	$q = "SELECT * FROM colors WHERE color_id = '$gColor_vlink_id'";
	&findVlinkColors ($q);
	
	# find all LCD references
	$q = qq(SELECT * FROM reference WHERE reference_lcd = '1' ORDER BY reference_name);
	&findAllReferences($q);
	$listReferenceShelf = '<ol>';
	for ($i = 0; $i <= $#referenceIDs; $i++) {
	
		if ($gSaveStatistics) { $listReferenceShelf .= "<li><a href=./?cmd=simpleRedirect&section=R&resourceID=$referenceIDs[$i]>$referenceNames[$i]</a>"}
		else { $listReferenceShelf .= "<li><a href=$referenceURLs[$i]>$referenceNames[$i]</a>"; }
		
	}
	$listReferenceShelf .= '</ol>';
	
	# find all LCD journals
	$q = qq(SELECT * FROM etexts WHERE etext_lcd = '1' ORDER BY etext_name);
	&findAllJournals($q);
	$listJournalLinks = '<ol>';
	for ($i = 0; $i <= $#journalIDs; $i++) {
	
		if ($gSaveStatistics) { $listJournalLinks .= "<li><a href=./?cmd=simpleRedirect&section=E&resourceID=$journalIDs[$i]>$journalNames[$i]</a>"}
		else { $listJournalLinks .= "<li><a href=$journalURLs[$i]>$journalNames[$i]</a>"; }
		
	}
	$listJournalLinks .= '</ol>';
	
	# find all LCD databases
	$q = qq(SELECT * FROM bib_databases WHERE bib_database_lcd = '1' ORDER BY bib_database_name);
	&findAllDatabases($q);
	$listDatabaseLinks = '<ol>';
	for ($i = 0; $i <= $#databaseIDs; $i++) {
	
		if ($gSaveStatistics) { $listDatabaseLinks .= "<li><a href=./?cmd=simpleRedirect&section=B&resourceID=$databaseIDs[$i]>$databaseNames[$i]</a>"}
		else { $listDatabaseLinks .= "<li><a href=$databaseURLs[$i]>$databaseNames[$i]</a>"; }
		
	}
	$listDatabaseLinks .= '</ol>';
	
	# find all LCD library links
	$q = qq(SELECT * FROM libraries WHERE libraries_lcd = '1' ORDER BY libraries_name);
	&findAllLibraries($q);
	$listLibraryLinks = '<ol>';
	for ($i = 0; $i <= $#librariesIDs; $i++) {
	
		if ($gSaveStatistics) { $listLibraryLinks .= "<li><a href=./?cmd=simpleRedirect&section=L&resourceID=$librariesIDs[$i]>$librariesNames[$i]</a>"}
		else { $listLibraryLinks .= "<li><a href=$librariesURLs[$i]>$librariesNames[$i]</a>"; }
		
	}
	$listLibraryLinks .= '</ol>';
	
	# find all LCD university links
	$q = qq(SELECT * FROM university WHERE university_lcd = '1' ORDER BY university_name);
	&findAllUniversity($q);
	$listUniversityLinks = '<ol>';
	for ($i = 0; $i <= $#universityIDs; $i++) {
	
		if ($gSaveStatistics) { $listUniversityLinks .= "<li><a href=./?cmd=simpleRedirect&section=U&resourceID=$universityIDs[$i]>$universityNames[$i]</a>"}
		else { $listUniversityLinks .= "<li><a href=$universityURLs[$i]>$universityNames[$i]</a>"; }
		
	}
	$listUniversityLinks .= '</ol>';
	
	# find all LCD quick searches
	$q = qq(SELECT * FROM qsearches WHERE qsearch_lcd = '1' ORDER BY qsearch_name);
	&findAllQSearches($q);
	$formQuickSearches =  qq (<form action="./" method="GET">\n);
	if ($gSaveStatistics) {

		# capture statistics
		$formQuickSearches .= "<input type=hidden name=cmd value=simpleRedirect>";
		$formQuickSearches .= "<input type=hidden name=section value=Q>";
		
	}
	
	else {

		# just a plain search
		$formQuickSearches .= "<input type=hidden name=cmd value=qsearch>";

	}
	
	$formQuickSearches .= qq (<select name="resourceID">\n);
	for ($i = 0; $i <= $#qSearchIDs; $i++) { $formQuickSearches .= qq (<option value="$qSearchIDs[$i]">$qSearchNames[$i]\n); }
	$formQuickSearches .= "</select><br>\n";
	$formQuickSearches .= "<input type=text size=70 name='query'> ";
	$formQuickSearches .= '<input type="submit" value="Cerca">';
	$formQuickSearches .= "</form>\n";
	
	# update the banner
	&updateBanner;
		
	# fill up the token list
	%tokens = (
				title                     => $gPage_title,
				bgcolor                   => $backgroundColor->{color_code},
				link                      => $linkColor->{color_code},
				alink                     => $alinkColor->{color_code},
				vlink                     => $vlinkColor->{color_code},
				text                      => $textColor->{color_code},
				bannerColor               => $bannerColor->{color_code},
				banner                    => $gBanner,
				motd                      => $gGlobalMessage,
				aboutMyLibrary            => './?cmd=about&id=39',
				customizeProfile          => './?cmd=about&id=43',
				logout                    => './?cmd=killCookie',

				yourLibrarians            => $gYourLibrarians,
				aboutLibrarians           => './?cmd=about&id=36',
				librarians                => $gGenericBlurb,

				libraryLinks              => $gLibraryLinks,
				aboutLibraryLinks         => './?cmd=about&id=38',
				customizeLibraryLinks     => './?cmd=customizeLibraries',
				listLibraryLinks          => $listLibraryLinks,

				universityLinks           => $gUniversityLinks,
				aboutUniversityLinks      => './?cmd=about&id=37',
				customizeUniversityLinks  => './?cmd=customizeUniversity',
				listUniversityLinks       => $listUniversityLinks,
				
				currentAwareness          => $gCurrentAwarenessManager,
				aboutCurrentAwareness     => './?cmd=about&id=45',
				customizeCurrentAwareness => './?cmd=customizeCAMProfile',
				formCurrentAwareness      => $formCurrentAwareness,
				
				personalLinks             => $gPersonalLinks,
				aboutPersonalLinks        => './?cmd=about&id=31',
				customizePersonalLinks    => './?cmd=customizePersonalLinks',
				listPersonalLinks         => $listPersonalLinks,
				
				quickSearches             => $gQuickSearches,
				aboutQuickSearches        => './?cmd=about&id=32',
				customizeQuickSearches    => './?cmd=customizeQSearches',
				formQuickSearches         => $formQuickSearches,
				
				referenceShelf            => $gReferenceShelf,
				aboutReferenceShelf       => './?cmd=about&id=33',
				customizeReferenceShelf   => './?cmd=customizeReference',
				listReferenceShelf        => $listReferenceShelf,
				
				databaseLinks             => $gBibliographicDatabaseLinks,
				aboutDatabaseLinks        => './?cmd=about&id=34',
				customizeDatabaseLinks    => './?cmd=customizeDatabases',
				listDatabaseLinks         => $listDatabaseLinks,
				
				journalLinks              => $gElectronicJournals,
				aboutJournalLinks         => './?cmd=about&id=35',
				customizeJournalLinks     => './?cmd=customizeJournals',
				listJournalLinks          => $listJournalLinks,
								
	);
	
	# output a header
	&printHeader;
	
	# finally, output the html
	print &fillTemplate($templatesFree[0], \%tokens);
	
}
	
	
sub saveCookie {

	# get the input
	my $wants_cookie = $input->param('wants_cookie');
	
	# update wants_cookie to true
	my $q = qq(update patrons set wants_cookie = $wants_cookie where patron_id = $patronRecord->{patron_id});
	&prepareAndExecuteSQL ($q);

}


###############
# mysql       #
###############


sub getNewSequence {

	# get a new sequence number
	# this is a function that will have to be re-written for every database backend
	# NEVER DELETE FROM THE SEQUENCE TABLE OR YOU WILL NOT BE ABLE TO GARENTEE
	# UNIQUNE NUMBERS!
	
	# update the sequence table
	my $q = 'UPDATE sequence SET id = id + 1';
	&prepareAndExecuteSQL ($q);
	
	# select the new value
	my $q = 'select id FROM sequence';
	&prepareAndExecuteSQL ($q);
	
	# extract the value
	my $h = $gSth->fetchrow_hashref;
	my $id = $h->{id};
		
	# return it
	return ($id);
	
}

sub getGlobalVariables {

	# create and execute an sql query getting the preferences
	my $q = "SELECT * FROM preferences";
	&prepareAndExecuteSQL ($q);
	
	# extract the values
	my $h = $gSth->fetchrow_hashref;
	$gShowCollectionManagers     = $h->{'SHOW_COLLECTION_MANAGERS'};
	$gShowQuickSearches          = $h->{'SHOW_QUICK_SEARCHES'};
	$gMessageFromTheLibrarian    = $h->{'MESSSAGE_FROM_LIBRARIAN'};
	$gYourLibrarians             = $h->{'YOUR_LIBRARIANS'};
	$gLibraryLinks               = $h->{'LIBRARY_LINKS'};
	$gUniversityLinks            = $h->{'UNIVERSITY_LINKS'};
	$gCurrentAwarenessManager    = $h->{'CURRENT_AWARENESS'};
	$gPersonalLinks              = $h->{'PERSONAL_LINKS'};
	$gQuickSearches              = $h->{'QUICK_SEARCHES'};
	$gReferenceShelf             = $h->{'REFERENCE_SHELF'};
	$gBibliographicDatabaseLinks = $h->{'BIBLIOGRAPHIC_DATABASES'};
	$gElectronicJournals         = $h->{'ETEXTS'};
	$gGlobalMessage              = $h->{'GLOBAL_MESSAGE'};
	$gFooter                     = $h->{'FOOTER'};
	$gBanner                     = $h->{'BANNER'};
	$gShowLibRef                 = $h->{'SHOW_LIBREF'};
	$gGenericBlurb               = $h->{'GENERIC_BLURB'};
	$gShowCAM                    = $h->{'SHOW_CAM'};
	$gMarion                     = $h->{'MARION'};
	$gDisclaimer                 = $h->{'DISCLAIMER'};
	$gFromAddress                = $h->{'FROM_ADDRESS'};
	$gExpires                    = $h->{'EXPIRES'};
	$gTableWidth                 = $h->{'TABLE_WIDTH'};
	$gPage_title                 = $h->{'PAGE_TITLE'};
	$gColor_bg_id                = $h->{'COLOR_BACKGROUND'};
	$gColor_text_id              = $h->{'COLOR_TEXT'};
	$gColor_link_id              = $h->{'COLOR_LINK'};
	$gColor_vlink_id             = $h->{'COLOR_VLINK'};
	$gColor_alink_id             = $h->{'COLOR_ALINK'};
	$gColor_banner_id            = $h->{'COLOR_BANNER'};
	$gSaveStatistics             = $h->{'SAVE_STATISTICS'};
	$gStyleSheet                 = $h->{'STYLE_SHEET'};
	$gShowStaticPageCreation     = $h->{'STATIC_PAGES_SHOW'};
	$gManageDiscipline           = $h->{'MANAGE_DISCIPLINE'};
	$gLibrarianBlurb             = $h->{'LIBRARIAN_BLURB'};
	$gManagerBlurb               = $h->{'MANAGER_BLURB'};
	$gTemplateID                 = $h->{'TEMPLATEID'};
	$gTemplateFreeID             = $h->{'TEMPLATE_FREE_ID'};

}


sub findItems4DisJoins {

	# get the query
	my $q = $_[0];
	
	# initialize the join table array
	@I4DisJoinIDs  = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
	
		push (@I4DisJoinIDs,   $h->{discipline_id});
		
	}

}
	


sub getNewTitles {

	# get the query
	my $q = @_[0];
	
	#  initilize title arrays
	@gCallNumbers    = ();
	@gAuthors        = ();
	@gTitles         = ();
	@gControlNumbers = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
		
	# slurp up the results
	while ($h = $gSth->fetchrow_hashref) {
		push (@gCallNumbers,    $h->{call_number});
		push (@gAuthors,        $h->{author});
		push (@gTitles,         $h->{title});
		push (@gControlNumbers, $h->{control_number});
		}
	
	}
	

sub getCAProfiles {
	
	# get the query
	my $q = @_[0];
		
	# initialize the arrays
	@gProfileIDs  = ();
    @gLowerBounds = ();
    @gUpperBounds = ();

	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	# slurp up the results
	while ($h = $gSth->fetchrow_hashref) {
		push (@gProfileIDs,  $h->{profile_id});
		push (@gLowerBounds, $h->{lower_bounds});
		push (@gUpperBounds, $h->{upper_bounds});
		}

	}	

sub prepareAndExecuteSQL {
	
	# get the query
	my $q = $_[0];
	
	#$q = $gDBhandle->quote($q);
	
	# prepare and execute the query
	$gSth = $MyLibrary::gDBhandle->prepare("$q");
	if (! $gSth) { &returnError ( "query: $q" . $MyLibrary::gDBhandle->errstr); }
    if (! $gSth->execute) { &returnError ("query: $q" . $MyLibrary::gDBhandle->errstr); }
    
}
	
		
sub findItems4Librarians {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@I4LibrariansIDs  = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@I4LibrariansIDs,   $h->{discipline_id});
		}

	}
	

sub findItems4Managers {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@I4ManagersIDsIDs  = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@I4ManagersIDs,   $h->{discipline_id});
		}

	}
	

sub findAllSimpleHelp {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@simpleHelpID    = ();
	@simpleHelpTitle = ();
	@simpleHelpText  = ();
	@simpleHelpURL   = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@simpleHelpID,    $h->{help_id});
		push (@simpleHelpTitle, $h->{help_title});
		push (@simpleHelpText,  $h->{help_text});
		push (@simpleHelpURL,   $h->{help_url});
		}

	}
	

sub findAllDisciplines {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@disciplineIDs   = ();
	@disciplineNames  = ();
	@disciplineMOTDs = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@disciplineIDs,   $h->{discipline_id});
		push (@disciplineNames, $h->{discipline_name});
		push (@disciplineMOTDs, $h->{motd_text});
		}

	}
	

sub findAllDefaultProfiles {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@defaultProfileIDs = ();
	@disciplineIDs     = ();
	@lowerBounds       = ();
	@upperBounds       = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
	
		push (@defaultProfileIDs, $h->{defaultProfile_id});
		push (@disciplineIDs,     $h->{discipline_id});
		push (@lowerBounds,       $h->{lower_bounds});
		push (@upperBounds,       $h->{upper_bounds});
		
	}

}
	

sub findAllQSearches {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@qSearchIDs      = ();
	@qSearchURLs     = ();
	@qSearchPrefixes = ();
	@qSearchSuffixes = ();
	@qSearchNames    = ();
	@qSearchNotes    = ();
	@qSearchDates    = ();
	@qSearchLCDs     = ();
	@qSearchFKeys    = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
	
		push (@qSearchIDs,      $h->{qsearch_id});
		push (@qSearchURLs,     $h->{qsearch_url});
		push (@qSearchPrefixes, $h->{prefix});
		push (@qSearchSuffixes, $h->{suffix });
		push (@qSearchNames,    $h->{qsearch_name});
		push (@qSearchNotes,    $h->{note});
		push (@qSearchDates,    $h->{qsearch_date});
		push (@qSearchLCDs,     $h->{qsearch_lcd});
		push (@qSearchFKeys,    $h->{qsearch_fkey});
		
	}

}
	

sub findAllJournals {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@journalIDs   = ();
	@journalURLs  = ();
	@journalNames = ();
	@journalNotes = ();
	@journalDates = ();
	@journalLCDs  = ();
	@journalFKeys = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
	
		push (@journalIDs,   $h->{etext_id});
		push (@journalURLs,  $h->{etext_url});
		push (@journalNames, $h->{etext_name});
		push (@journalNotes, $h->{etext_note});
		push (@journalDates, $h->{etext_date});
		push (@journalLCDs,  $h->{etext_lcd});
		push (@journalFKeys, $h->{etext_fkey});
		
	}

}
	

sub findPatronLibraries {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@patronLibrariesIDs  = ();
	@patronLibrariesURLs  = ();
	@patronLibrariesNames = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@patronLibrariesIDs,   $h->{libraries_id});
		push (@patronLibrariesURLs,  $h->{libraries_url});
		push (@patronLibrariesNames, $h->{libraries_name});
		
		}
	
	}
	
	
sub findDefaultResources {

	# get the query
	my $q = $_[0];
	my $f = $_[1];
	
	# initialize the reference sources arrays
	@defaultIDs = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@defaultIDs, $h->{$f});
		}

	}
	
sub findAllLibraries {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@librariesIDs   = ();
	@librariesURLs  = ();
	@librariesNames = ();
	@librariesNotes = ();
	@librariesDates = ();
	@librariesLCDs  = ();
	@librariesFKeys = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
	
		push (@librariesIDs,   $h->{libraries_id});
		push (@librariesURLs,  $h->{libraries_url});
		push (@librariesNames, $h->{libraries_name});
		push (@librariesNotes, $h->{libraries_note});
		push (@librariesDates, $h->{libraries_date});
		push (@librariesLCDs,  $h->{libraries_lcd});
		push (@librariesFKeys, $h->{libraries_fkey});
		
	}

}
	
	
sub findPatronUniversity {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@patronUniversityIDs = ();
	@patronUniversityURLs = ();
	@patronUniversityNames = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@patronUniversityIDs,  $h->{university_id});
		push (@patronUniversityURLs,  $h->{university_url});
		push (@patronUniversityNames, $h->{university_name});
		}
	
	}
	
		
sub findAllUniversity {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@universityIDs   = ();
	@universityURLs  = ();
	@universityNames = ();
	@universityNotes = ();
	@universityDates = ();
	@universityLCDs  = ();
	@universityFKeys = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
	
		push (@universityIDs,   $h->{university_id});
		push (@universityURLs,  $h->{university_url});
		push (@universityNames, $h->{university_name});
		push (@universityNotes, $h->{university_note});
		push (@universityDates, $h->{university_date});
		push (@universityLCDs,  $h->{university_lcd});
		push (@universityFKeys, $h->{university_fkey});
		
	}

}
	
	
sub findAllDatabases {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@databaseIDs   = ();
	@databaseURLs  = ();
	@databaseNames = ();
	@databaseNotes = ();
	@databaseDates = ();
	@databaseLCDs  = ();
	@databaseFKeys = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
	
		push (@databaseIDs,   $h->{bib_database_id});
		push (@databaseURLs,  $h->{bib_database_url});
		push (@databaseNames, $h->{bib_database_name});
		push (@databaseNotes, $h->{bib_database_note});
		push (@databaseDates, $h->{bib_database_date});
		push (@databaseLCDs,  $h->{bib_database_lcd});
		push (@databaseFKeys, $h->{bib_database_fkey});
		
	}

}
	

sub findPatronDatabases {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@patronDatabaseIDs   = ();
	@patronDatabaseURLs  = ();
	@patronDatabaseNames = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@patronDatabaseIDs,   $h->{bib_database_id});
		push (@patronDatabaseURLs,  $h->{bib_database_url});
		push (@patronDatabaseNames, $h->{bib_database_name});
		}

	}
	
	
sub findPatronReferences {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@patronReferenceIDs   = ();
	@patronReferenceURLs  = ();
	@patronReferenceNames = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@patronReferenceIDs,   $h->{reference_id});
		push (@patronReferenceURLs,  $h->{reference_url});
		push (@patronReferenceNames, $h->{reference_name});
		}

	}
	
	
sub findAllReferences {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@referenceIDs   = ();
	@referenceURLs  = ();
	@referenceNames = ();
	@referenceNotes = ();
	@referenceDates = ();
	@referenceLCDs  = ();
	@referenceFKeys = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	 
	while ($h = $gSth->fetchrow_hashref) {
	
		push (@referenceIDs,   $h->{reference_id});
		push (@referenceURLs,  $h->{reference_url});
		push (@referenceNames, $h->{reference_name});
		push (@referenceNotes, $h->{reference_note});
		push (@referenceDates, $h->{reference_date});
		push (@referenceLCDs,  $h->{reference_lcd});
		push (@referenceFKeys, $h->{reference_fkey});
		
	}

}
	
	
sub findAllRanks {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@rankIDs   = ();
	@rankNames = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@rankIDs,   $h->{rank_id});
		push (@rankNames, $h->{rank_name});
		}

	}
	
	
sub updatePatron {
	
	# initialize the query
	my $q = @_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	}
	

sub findPatrons {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	$patronRecord = $gSth->fetchrow_hashref;
	
}
	
sub findPatrons4CAM {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@patrons4CAMIDs       = ();
	@patrons4CAMFirst     = ();
	@patrons4CAMLast      = ();
	@patrons4CAMEmail     = ();
	@patrons4CAMWantsHTML = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@patrons4CAMIDs,       $h->{patron_id});
		push (@patrons4CAMFirst,     $h->{name_f});
		push (@patrons4CAMLast,      $h->{name_l});
		push (@patrons4CAMEmail,     $h->{email});
		push (@patrons4CAMWantsHTML, $h->{wants_html});
		}
	
	}
	
	
sub findPatrons4Email {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@patrons4EmailFirst      = ();
	@patrons4EmailLast       = ();
	@patrons4EmailEmail      = ();
	@patrons4EmailDiscipline = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@patrons4EmailFirst,      $h->{name_f});
		push (@patrons4EmailLast,       $h->{name_l});
		push (@patrons4EmailEmail,      $h->{email});
		push (@patrons4EmailDiscipline, $h->{discipline_id});
		}
	
	}
	
	
sub findLibrarians4Email {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@librarians4EmailFirst      = ();
	@librarians4EmailLast       = ();
	@librarians4EmailEmail      = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@librarians4EmailFirst, $h->{name});
		push (@librarians4EmailLast,  '');
		push (@librarians4EmailEmail, $h->{email_address});
		}
	
	}
	
	
sub findPatrons4Manage {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@patrons4ManageIDs      = ();
	@patrons4ManageFirst    = ();
	@patrons4ManageLast     = ();
	@patrons4ManageUsername = ();
	@patrons4ManageEmail    = ();
	@patrons4ManagePassword = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@patrons4ManageIDs,      $h->{patron_id});
		push (@patrons4ManageFirst,    $h->{name_f});
		push (@patrons4ManageLast,     $h->{name_l});
		push (@patrons4ManageUsername, $h->{username});
		push (@patrons4ManageEmail,    $h->{email});
		push (@patrons4ManagePassword, $h->{password});
		}
	
	}
	
	
sub findBannerColors {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	$bannerColor = $gSth->fetchrow_hashref;
	
	}
	
	
sub findBackgroundColors {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	$backgroundColor = $gSth->fetchrow_hashref;
	
	}
	
	
sub findTextColors {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	$textColor = $gSth->fetchrow_hashref;
	
	}
	
	
sub findPatronTemplate {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	$gPatronTemplate[0] = $gSth->fetchrow_array;
	
}
	
sub findAllTemplates {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	# initialize the reference sources arrays
	@templateIDs          = ();
	@templateNames        = ();
	@templateDescriptions = ();
	@templates            = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@templateIDs,          $h->{template_id});
		push (@templateNames,        $h->{template_name});
		push (@templateDescriptions, $h->{template_description});
		push (@templates,            $h->{template});
		
	}
	
}
	
sub findAllFreeTemplates {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	# initialize the reference sources arrays
	@templateFreeIDs          = ();
	@templateFreeNames        = ();
	@templateFreeDescriptions = ();
	@templatesFree            = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@templateFreeIDs,          $h->{template_free_id});
		push (@templateFreeNames,        $h->{template_free_name});
		push (@templateFreeDescriptions, $h->{template_free_description});
		push (@templatesFree,            $h->{template});
		
	}
	
}
	
sub findAllStaticTemplates {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	# initialize the reference sources arrays
	@templateStaticIDs          = ();
	@templateStaticNames        = ();
	@templateStaticDescriptions = ();
	@templatesStatic            = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@templateStaticIDs,          $h->{template_static_id});
		push (@templateStaticNames,        $h->{template_static_name});
		push (@templateStaticDescriptions, $h->{template_static_description});
		push (@templatesStatic,            $h->{template_static});
		
	}
	
}
	
	
sub findLinkColors {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	$linkColor = $gSth->fetchrow_hashref;
	
	}
	
	
sub findAlinkColors {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	$alinkColor = $gSth->fetchrow_hashref;
	
	}
	
	
sub findVlinkColors {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	$vlinkColor = $gSth->fetchrow_hashref;
	
	}
	
	
sub findPatronJournals {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@patronJournalIDs   = ();
	@patronJournalURLs  = ();
	@patronJournalNames = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@patronJournalIDs,   $h->{etext_id});
		push (@patronJournalURLs,  $h->{etext_url});
		push (@patronJournalNames, $h->{etext_name});
		}
	
	}
	
	
sub findReferenceSources {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@referenceURLs = ();
	@referenceNames = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@referenceURLs,  $h->{reference_url});
		push (@referenceNames, $h->{reference_name});
		}
	
	}
	
	
sub findPatronQSearches {

	# get the query
	my $q = $_[0];
	
	# initialize the quick search arrays
	@patronQSearchIDs = ();
	@patronQSearchCodes = ();
	@patronQSearchNames = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@patronQSearchIDs,   $h->{qsearch_id});
		push (@patronQSearchCodes, $h->{qsearch_code});
		push (@patronQSearchNames, $h->{qsearch_name});
		}
	
	}
	
	
sub findLibrarians {

	# get the query
	my $q = $_[0];
	
	# initialize the quick search arrays
	@librarianIDs            = ();
	@librarianNames          = ();
	@librarianURL            = ();
	@librarianTelephoneArea  = ();
	@librarianTelephoneStart = ();
	@librarianTelephoneEnd   = ();
	@librarianEmailAddress   = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@librarianIDs,            $h->{librarian_id});
		push (@librarianNames,          $h->{name});
		push (@librarianURL,            $h->{url});
		push (@librarianTelephoneArea,  $h->{telephone_area});
		push (@librarianTelephoneStart, $h->{telephone_start});
		push (@librarianTelephoneEnd,   $h->{telephone_end});
		push (@librarianEmailAddress,   $h->{email_address});
		}
	
	}
	
	
sub findCollectionManagers {

	# get the query
	my $q = $_[0];
	
	# initialize the quick search arrays
	@managerIDs            = ();
	@managerNames          = ();
	@managerURL            = ();
	@managerTelephoneArea  = ();
	@managerTelephoneStart = ();
	@managerTelephoneEnd   = ();
	@managerEmailAddress   = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@managerIDs,            $h->{manager_id});
		push (@managerNames,          $h->{name});
		push (@managerURL,            $h->{url});
		push (@managerTelephoneArea,  $h->{telephone_area});
		push (@managerTelephoneStart, $h->{telephone_start});
		push (@managerTelephoneEnd,   $h->{telephone_end});
		push (@managerEmailAddress,   $h->{email_address});
		}
	
	}
	
	
sub findDisciplineMOTDs {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
		
	$disciplineMotd = $gSth->fetchrow_hashref;
	
	}
	
	
sub findQuickSearchQuerys {

	# get the query
	my $q = $_[0];
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	$lastQuery = $gSth->fetchrow_hashref;
	
	}
	
sub findAllColors {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@colorId   = ();
	@colorCodes = ();
	@colorNames  = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@colorId,    $h->{color_id});
		push (@colorCodes, $h->{color_code});
		push (@colorNames, $h->{color_name});
		}
	
	}
	
sub findPersonalLinks {

	# get the query
	my $q = $_[0];
	
	# initialize the reference sources arrays
	@personalLinksIDs   = ();
	@personalLinksNames = ();
	@personalLinksURLs  = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	while ($h = $gSth->fetchrow_hashref) {
		push (@personalLinksIDs,   $h->{link_id});
		push (@personalLinksNames, $h->{link_name});
		push (@personalLinksURLs,  $h->{link_url});
		}
	
	}
	
	
###############
# CAM         #
###############

sub addCAM {

	my $formCurrentAwareness;
	
	# query for CAM profiles
	my $id = $patronRecord->{patron_id};
	$q = qq (select * from profiles where patron_id = '$id' order by lower_bounds);
	&getCAProfiles($q);
			
	# no profiles 
	if ($#gProfileIDs < 0) { $formCurrentAwareness = qq (<p>Non esiste un profilo. Usare l'hotlink &quot;personalizza&quot; per crearne uno.</p>); }
	
	# has profiles
	else {

		# display the profiles
		$formCurrentAwareness = "<p>Il profilo attuale include i seguenti ranges di call number:";
		for ($i=0; $i <= $#gProfileIDs; $i++) {
		
			if ($i == $#gProfileIDs) { $formCurrentAwareness .= " $gLowerBounds[$i] - $gUpperBounds[$i].\n"; }
			else { $formCurrentAwareness .= " $gLowerBounds[$i] - $gUpperBounds[$i],\n"; }
			
		}
		
		$formCurrentAwareness .= "</p>";
		
		# display some directions
		$formCurrentAwareness .= qq(<p>Usare il form per cercare questi ranges oppure cliccare sull'hotlink &quot;personalizza&quot; per modificarli, come pure per modificare altre parti del profilo.</p>);
		
		# start the form
		$formCurrentAwareness .= '<center>';
		$formCurrentAwareness .= $output->startform(-method => 'GET', -action => './');
		$formCurrentAwareness .= $output->hidden(-name => 'cmd',  -value => 'cam4one');
		$formCurrentAwareness .= $output->hidden(-name => 'id',  -value => "$patronRecord->{patron_id}");
	
		# headers
		$formCurrentAwareness .= "<table border=1>\n";

		# early date range
		$formCurrentAwareness .= "<tr>\n";
		$formCurrentAwareness .= "<td align=right>Da</td>\n";
		$formCurrentAwareness .= "<td>";

		$formCurrentAwareness .= "<select name=\"earlyDate\">\n";
		$formCurrentAwareness .= "<option value=\"35\">ultima settimana\n";
		$formCurrentAwareness .= "<option value=\"42\" selected>ultime 2 settimane\n";
		$formCurrentAwareness .= "<option value=\"49\">ultime 3 settimane\n";
		$formCurrentAwareness .= "<option value=\"56\">ultime 4 settimane\n";
		$formCurrentAwareness .= "<option value=\"63\">ultime 5 settimane\n";
		$formCurrentAwareness .= "<option value=\"70\">ultime 6 settimane\n";
		$formCurrentAwareness .= "<option value=\"77\">ultime 7 settimane\n";
		$formCurrentAwareness .= "<option value=\"84\">ultime 8 settimane\n";
		$formCurrentAwareness .= "<option value=\"91\">ultime 9 settimane\n";
		$formCurrentAwareness .= "<option value=\"98\">ultime 10 settimane\n";
		$formCurrentAwareness .= "</select>\n";
	
		$formCurrentAwareness .= "</td>\n";
		$formCurrentAwareness .= "</tr>\n";

		# late date range
		$formCurrentAwareness .= "<tr>\n";
		$formCurrentAwareness .= "<td align=right>Fino a</td>\n";
		$formCurrentAwareness .= "<td>";

		$formCurrentAwareness .= "<select name=\"lateDate\">\n";
		$formCurrentAwareness .= "<option value=\"28\" selected>Settimana corrente\n";
		$formCurrentAwareness .= "<option value=\"35\">ultima settimana\n";
		$formCurrentAwareness .= "<option value=\"42\">ultime 2 settimane\n";
		$formCurrentAwareness .= "<option value=\"49\">ultime 3 settimane\n";
		$formCurrentAwareness .= "<option value=\"56\">ultime 4 settimane\n";
		$formCurrentAwareness .= "<option value=\"63\">ultime 5 settimane\n";
		$formCurrentAwareness .= "<option value=\"70\">ultime 6 settimane\n";
		$formCurrentAwareness .= "<option value=\"77\">ultime 7 settimane\n";
		$formCurrentAwareness .= "<option value=\"84\">ultime 8 settimane\n";
		$formCurrentAwareness .= "<option value=\"91\">ultime 9 settimane\n";
		$formCurrentAwareness .= "<option value=\"98\">ultime 10 settimane\n";
		$formCurrentAwareness .= "</select>\n";
	
		$formCurrentAwareness .= "</td>\n";
		$formCurrentAwareness .= "</tr>\n";

		# output
		$formCurrentAwareness .= "<tr valign=\"top\">\n";
		$formCurrentAwareness .= "<td align=right>Output</td>\n";
		$formCurrentAwareness .= "<td>";
		$formCurrentAwareness .= "<input type=\"radio\" name=\"outfile\" value=\"screen\" checked>schermo<br>";
		$formCurrentAwareness .= "<input type=\"radio\" name=\"outfile\" value=\"email\">email";
		$formCurrentAwareness .= "</td>\n";
		$formCurrentAwareness .= "</tr>\n";

		# end the table
		$formCurrentAwareness .= "</table>\n";
	
		# add a submit and reset button
		$formCurrentAwareness .= '<br>';           
		$formCurrentAwareness .= '<center>';           
		$formCurrentAwareness .= '<input type=submit value=Cerca>';             
		$formCurrentAwareness .= ' ';           
		$formCurrentAwareness .= '<input type=reset value=Azzera>';          
		$formCurrentAwareness .= '</center>';           
		$formCurrentAwareness .= '</form>';
		$formCurrentAwareness .= '</center>';


	}
	
	return $formCurrentAwareness;
		
}


###############
# What's new  #
###############

sub addWhatsNew {

	my $formWhatsNew;
	
	# start the form
	$formWhatsNew  = "<center>";
	$formWhatsNew .= $output->startform(-method => 'GET', -action => './');
	$formWhatsNew .= $output->hidden(-name => 'cmd', -value => 'whatsNew');
	$formWhatsNew .= $output->hidden(-name => 'id',  -value => "$patronRecord->{patron_id}");
	
	$formWhatsNew .= "<select name=daysAgo>\n";
	$formWhatsNew .= "<option value=14>ultime 2 settimane\n";
	$formWhatsNew .= "<option value=30 selected>ultimo mese\n";
	$formWhatsNew .= "<option value=60>ultimi 2 mesi\n";
	$formWhatsNew .= "<option value=90>ultimi 3 mesi\n";
	$formWhatsNew .= "<option value=120>ultimi 4 mesi\n";
	$formWhatsNew .= "</select><br><br>\n";
	$formWhatsNew .= "<input type=checkbox name=only value=1 checked>Solo nella disciplina scelta<br><br>";
		
	# add a submit button
	$formWhatsNew .= '<input type=submit value=Vai>';       
	$formWhatsNew .= '</form>';
	$formWhatsNew .= '</center>';           
	
	return $formWhatsNew;
		
}

sub whatsNew {

	my $id      = $input->param('id');
	my $daysAgo = $input->param('daysAgo');
	my $only    = $input->param('only');
	my $sql;
	
	# calculate date
	$daysAgo = strftime ("%Y-%m-%d", localtime(parsedate ("-$daysAgo days", NOW)));
	
	# branch according to $only
	if ($only) {
		
		# create sql query
		$sql = "SELECT reference.reference_name
                FROM reference, items4DisReference
                WHERE items4DisReference.discipline_id = '$patronRecord->{discipline_id}'
                AND items4DisReference.reference_id = reference.reference_id
                AND reference.reference_date > '$daysAgo'
                ORDER BY reference.reference_name";
                
	}
	
	else {
	
		# create sql query
		$sql = "SELECT reference.reference_name
                FROM reference, items4references
                WHERE reference.reference_date > '$daysAgo'
                ORDER BY reference_name";

	}
	
	&returnError ("<pre>$sql</pre>");
	
}


sub getCAMDisclaimer {

	# get submit button
	my $submit = $input->param('submit');
	
	# start the output
	print $output->header();
	
	# check for submit
	if (! $submit) {

		# start the html
		&displaySimpleHelpMessage (61, 1);

		# output the form
		print "<center>\n";
		print $output->startform(-method => 'GET', -action => './');
		print $output->hidden(-name => 'cmd',  -value => 'getCAMDisclaimer');
		print qq (<textarea rows="13" cols="65" wrap="virtual" name="gDisclaimer">$gDisclaimer</textarea>);
		print "<p>\n";
		print $output->submit(-name => 'submit', -value => 'Modifica');              
		print $output->reset(-name => 'Reset', -value => 'Azzera');              
		print "</p>\n";
		print "</center>\n";
		print $output->endform;	

	}
	
	else {
	
		# get the global message
		my $gDisclaimer = $gDBhandle->quote($input->param('gDisclaimer'));
		
		# update the database
		my $q = "UPDATE preferences SET disclaimer = $gDisclaimer";
		&prepareAndExecuteSQL ($q);
		
		# start the html
		&displaySimpleHelpMessage (62, 1);
		
		# echo the input
		print "<pre>" . $input->param('gDisclaimer') . "</pre>";
		
	}
	
}


sub setCAMDisclaimer {
	
	# read the contents of the form
	my $m = $input->param('disclaimer');

	# save it
	open (DISCLAIMER, "> $gDisclaimer") or &returnError("Non &egrave; possibile aprire il file di rinuncia per l'output ($!). ");
	print DISCLAIMER $m;
	close (DISCLAIMER);
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (62, 1);
	
	# display the text
	print "<blockquote>";
	print "<pre>";
	print `cat $gDisclaimer`;
	print "</pre>";
	print "</blockquote>";
	
}
	

sub customizeCAMProfile {

	# create a query for the profile data
	my $q = qq (select * from profiles where patron_id = '$patronRecord->{patron_id}' order by lower_bounds);
	&getCAProfiles ($q);

	# print my header
	&printHeader;

	# dislay about message for profiles
	&displaySimpleHelpMessage (22, 1);
		
	# start the form
	print "<center>\n";
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setCAM');

	print qq (<table border=1>\n);
	
	# wants current awareness
	print qq (<tr valign="top">\n);
	print qq (<td align=right>Ultime accessioni</td>\n);
	print qq (<td>\n);
	if ($patronRecord->{wants_ca} == 0) {
	
		print qq (<input type="radio" name="wants_ca" value="1">Yes );
		print qq (<input type="radio" name="wants_ca" value="0" checked>No);
		
	}
		
	else {
	
		print qq (<input type="radio" name="wants_ca" value="1" checked>Yes );
		print qq (<input type="radio" name="wants_ca" value="0">No);
		
	}
	
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (Desideri ricevere le ultime accessioni? (<a href="/?cmd=about&id=171">Help</a>));
	print qq (</td>\n);
	print qq (</tr>\n);
		
	# wants html
	print qq (<tr valign="top">\n);
	print qq (<td align=right>HTML</td>\n);
	print qq (<td>\n);
	if ($patronRecord->{wants_html} == 0) {
	
		print qq (<input type="radio" name="wants_html" value="1">Yes );
		print qq (<input type="radio" name="wants_html" value="0" checked>No);
		
	}
		
	else {
	
		print qq (<input type="radio" name="wants_html" value="1" checked>Yes );
		print qq (<input type="radio" name="wants_html" value="0">No);
		
	}
	
	print qq (</td>\n);
	print qq (<td>\n);
	print qq (Desideri ricevere l'output HTML? (<a href="/?cmd=about&id=170">Help</a>));
	print qq (</td>\n);
	print qq (</tr>\n);
		
	# end the table
	print qq (</table>\n);

	# add a submit and reset button
	print qq (<p>\n);
	print $output->submit(-name => 'submit', -value => 'Invia');              
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print qq (</p>\n);
	print $output->endform;	
	
	# return home
	print "<p>\n";
	print qq(<a href="./">Torna a Segnaweb</a> \n);
	print "</p>\n";
	print "</center>";

	# check to see whether or not they have profiles created
	if ($#gProfileIDs > -1) {
	
		# dislay about message for profiles
		&displaySimpleHelpMessage (23, 0);
		
		# dislay the existing links
		print "<center>\n";
		print "<p>\n";
		print "<table border=1>\n";
		
		for ($i=0; $i <= $#gProfileIDs; $i++) {
		
			print "<tr>\n";
			print "<td>$gLowerBounds[$i] - $gUpperBounds[$i]</td>\n";
			print qq{<td><a href="./?cmd=deleteCAProfile&profile_id=$gProfileIDs[$i]">Elimina</a> (<a href="/?cmd=about&id=174">Help</a>)</td>};
			print "</tr>\n";
			
		}
	
		print "</table>\n";
		print "</p>\n";
		
		# return home
		print "<p>\n";
		print qq(<a href="./">Torna a Segnaweb</a> \n);
		print "</p>\n";
		print "</center>";

	}
		
	# dislay about message for profiles
	&displaySimpleHelpMessage (47, 0);

	# display a table/form of the profiles
	print "<p>\n";
	print "<center>\n";
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setCAProfile');
	print "<table border=1>\n";

	# lower bounds
	print "<tr>\n";
	print "<td align=right>Limite inferiore</td>\n";
	print "<td>";
	print $output->textfield(-name => 'lower_bounds');
	print "</td>\n";
	print qq (<td>\n);
	print qq (Call number pi&ugrave; basso. (<a href="/?cmd=about&id=172">Help</a>));
	print qq (</td>\n);
	print "</tr>\n";

	# upper bounds
	print "<tr>\n";
	print "<td align=right>Limite superiore</td>\n";
	print "<td>";
	print $output->textfield(-name => 'upper_bounds');
	print "</td>\n";
	print qq (<td>\n);
	print qq (Call number pi&ugrave; alto. (<a href="/?cmd=about&id=173">Help</a>));
	print qq (</td>\n);
	print "</tr>\n";
	
	# finish the table
	print "</table>\n";

	# add a submit and reset button
	print qq (<p>\n);
	print $output->submit(-name => 'submit', -value => 'Invia');              
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print qq (</p>\n);
	print $output->endform;	

	# return home
	print "<p>\n";
	print qq(<a href="./">Torna a Segnaweb</a> \n);
	print "</p>\n";
	print "</center>";

	
}
	
sub setCAM {

	# inialize the to-do list (@todo)
	@todo = ('wants_html', 'wants_ca');
	
	# process every item in the to-do list, tricky
	for $t (@todo) {
		
		# get the input
		my $v = $input->param($t);
					
		# create a query and execute it
		my $q = qq (update patrons set $t = $v where patron_id = $patronRecord->{patron_id});
		&prepareAndExecuteSQL ($q);
		
	}
		
}
	
	
sub setCAProfile {

	my $id           = $patronRecord->{patron_id};
	my $lower_bounds = $input->param('lower_bounds');
	my $upper_bounds = $input->param('upper_bounds');
	
	# get a new sequence
	my $sequence = getNewSequence();
	
	# set the profile
	$q = qq [insert into profiles
	         (profile_id, patron_id, lower_bounds, upper_bounds)
	         values
	         ('$sequence', '$id', '$lower_bounds', '$upper_bounds')];
	&prepareAndExecuteSQL ($q);
		
}	


sub cam4one {
	my $id        = $input->param('id');
	my $outfile   = $input->param('outfile');
	my $earlyDate = $input->param('earlyDate');
	my $lateDate  = $input->param('lateDate');
	
	# INSERT ERROR CHECKING ROUTINE HERE!

	if (! $id) {
		
		# start the output
		print $output->header(-expires => '-1d');
		
		# start HTML
		&displaySimpleHelpMessage (48, 1);
		
		# start the form
		print "<center>\n";
		print $output->startform(-method => 'GET', -action => './');
		print $output->hidden(-name => 'cmd',  -value => 'cam4one');
		print $output->hidden(-name => 'id',  -value => "$patronRecord->{patron_id}");
	
		# headers
		print "<table border=1>\n";

		# early date range
		print "<tr>\n";
		print "<td align=right>Da</td>\n";
		print "<td>";

		print "<select name=\"earlyDate\">\n";
		print "<option value=\"35\">ultima settimana\n";
		print "<option value=\"42\" selected>ultime 2 settimane\n";
		print "<option value=\"49\">ultime 3 settimane\n";
		print "<option value=\"56\">ultime 4 settimane\n";
		print "<option value=\"63\">ultime 5 settimane\n";
		print "<option value=\"70\">ultime 6 settimane\n";
		print "<option value=\"77\">ultime 7 settimane\n";
		print "<option value=\"84\">ultime 8 settimane\n";
		print "<option value=\"91\">ultime 9 settimane\n";
		print "<option value=\"98\">ultime 10 settimane\n";
		print "</select>\n";
	
		print "</td>\n";
		print qq (<td>\n);
		print qq (Data pi&ugrave; prossima (<a href="/?cmd=about&id=175">Help</a>));
		print qq (</td>\n);
		print "</tr>\n";

		# late date range
		print "<tr>\n";
		print "<td align=right>Fino a</td>\n";
		print "<td>";

		print "<select name=\"lateDate\">\n";
		print "<option value=\"28\" selected>Settimana corrente\n";
		print "<option value=\"35\">ultima settimana\n";
		print "<option value=\"42\">ultime 2 settimane\n";
		print "<option value=\"49\">ultime 3 settimane\n";
		print "<option value=\"56\">ultime 4 settimane\n";
		print "<option value=\"63\">ultime 5 settimane\n";
		print "<option value=\"70\">ultime 6 settimane\n";
		print "<option value=\"77\">ultime 7 settimane\n";
		print "<option value=\"84\">ultime 8 settimane\n";
		print "<option value=\"91\">ultime 9 settimane\n";
		print "<option value=\"98\">ultime 10 settimane\n";
		print "</select>\n";
	
		print "</td>\n";
		print qq (<td>\n);
		print qq (Data pi&ugrave; lontana (<a href="/?cmd=about&id=176">Help</a>));
		print qq (</td>\n);
		print "</tr>\n";

		# output
		print "<tr valign=\"top\">\n";
		print "<td align=right>Output</td>\n";
		print "<td>";
		print "<input type=\"radio\" name=\"outfile\" value=\"screen\" checked>schermo<br>";
		print "<input type=\"radio\" name=\"outfile\" value=\"email\">email";
		print "</td>\n";
		print qq (<td>\n);
		print qq (Dove si desidera l'output? (<a href="/?cmd=about&id=177">Help</a>));
		print qq (</td>\n);
		print "</tr>\n";

		# end the table
		print "</table>\n";
	
		# add a submit and reset button
		print "<p>\n";
		print $output->submit(-name => 'submit', -value => 'Invia');              
		print $output->reset(-name => 'Reset', -value => 'Azzera');              
		print "</p>\n";
		print $output->endform;	
		print "</center>\n";
		
	}
		
	else {
	
		# convert the date input into actual dates
		$earlyDate = strftime ("%Y/%m/%d", localtime(parsedate ("-$earlyDate days", NOW)));
		$lateDate  = strftime ("%Y/%m/%d", localtime(parsedate ("-$lateDate days", NOW)));

		# get the patron
		$q = qq (select * from patrons where patron_id = '$id');
		&findPatrons ($q);
		
		# start the ouput
		my $title = "$patronRecord->{name_f} $patronRecord->{name_l}";
		print $output->header(-expires => '-1d');
		print $output->start_html(-title => "$title");
			
		# get the upper and lower bounds for the selected patron
		$q = qq (select * from profiles where patron_id = '$id' order by lower_bounds);
		&getCAProfiles($q);
			
		# process every profile
		for ($i = 0; $i <= $#gProfileIDs; $i++) {
		
			# get the new titles
			$q = qq (select * from new_titles
	      	         where call_number  >= '$gLowerBounds[$i]'
	       	         and call_number    <= '$gUpperBounds[$i]'
	       	         and inventory_date >= '$earlyDate'
	       	         and inventory_date <= '$lateDate'
	        	     group by call_number);
	    	 &getNewTitles($q);
	     
	    	 # return the output
	    	 if ($outfile eq "screen") {
	     	
	     		# dislay a header
	     		print "<p>\n";
	     		print "Nome: <b>$patronRecord->{name_f} $patronRecord->{name_l} (<a href=\"mailto:$patronRecord->{email}\">$patronRecord->{email}</a>)</b><br>\n";
	     		print "Range dei Call number: <b>$gLowerBounds[$i] - $gUpperBounds[$i]</b><br>\n";
	     		print "Range delle date: <b>$earlyDate - $lateDate</b>\n";
	     	
	     		# process every located record
	     		print "<table border=\"1\">\n";
	     		for ($j=0; $j <= $#gCallNumbers; $j++) {
	     		
	     			print "<tr valign=\"top\">\n";
	     			print "<td>$gCallNumbers[$j]</td>\n";
	     			print "<td>$gAuthors[$j]</td>\n";
	     			print "<td><a href=\"$gMarion$gControlNumbers[$j]\">$gTitles[$j]</a></td>\n";
	     			print "</tr>\n";
	     			
	     		}
	     		
	     		print "</table>\n";
	     		print "<p>\n";
	     		
	     	}
	     	
	     	elsif ($outfile eq "email") {
	     
				# build and email message
				&buildEmail ($patronRecord->{name_f}, $patronRecord->{name_l}, $patronRecord->{email}, $patronRecord->{wants_html}, $earlyDate, $lateDate);
				#&buildEmail ($patronRecord->{name_f}, $patronRecord->{name_l}, "emorgan\@sunsite.berkeley.edu", $patronRecord->{wants_html}, $earlyDate, $lateDate);
				
			}
	 
			# return to the main menu
			print "<p>\n";
			print "<a href=\"./\">Torna a Segnaweb</a> \n";
			print "</p>\n";

		}
			
	}
		
}


sub buildEmail {

	# get the parameters
	$f  = $_[0];  # first name
	$l  = $_[1];  # last name
	$e  = $_[2];  # email
	$h  = $_[3];  # wants HTML
	$ed = $_[4];  # early date
	$ld = $_[5];  # late date
	
	# branch according to the type of email they want
	if ($h) {
	     	
		# open my temporary file
		$htmlFile = "/tmp/current-awareness.html";
		open OUT, "> $htmlFile";
	     		
		# start the html
		$htmlTitle = ($#gCallNumbers + 1 ) ." records found ($gLowerBounds[$i] - $gUpperBounds[$i])";
		print OUT "<html><head><title>$htmlTitle</title></head><body>\n";
		print OUT "<h1>$htmlTitle</h1>\n";
		print OUT "Range delle date: <b>$ed - $ld</b>\n";

		# process every located record
		print OUT "<table border=\"1\">\n";
		print OUT "<tr>\n";
		print OUT "<td><b>Call number</b></td>";
		print OUT "<td><b>Autore</b></td>";
		print OUT "<td><b>Titolo</b></td>";
		print OUT "</tr>";
			for ($k = 0; $k <= $#gCallNumbers; $k++) {
				print OUT "<tr valign=\"top\">\n";
	     		print OUT "<td>$gCallNumbers[$k]</td>\n";
	     		print OUT "<td>$gAuthors[$k]</td>\n";
	     		print OUT "<td><a href=\"$gMarion$gControlNumbers[$k]\">$gTitles[$k]</a></td>\n";
	     		print OUT "</tr>\n";
	     		}
	     	print OUT "</table>\n";
	     	print OUT "<p>\n";
	     		     		
	     	# close the output
	     	close OUT;
	     		
	     	# build a MIME message
	     	$top = build MIME::Entity Type         => "multipart/mixed",
                                      'Errors-to:' => "$gFromAddress",
                                      Subject      => ($#gCallNumbers + 1 ) ." records found ($gLowerBounds[$i] - $gUpperBounds[$i])";
	     		
	     	# attatch the disclaimer
	     	$message = `cat $gDisclaimer`;
	     	attach $top Data => $message;
	     		
	     	# append the output
	     	attach $top Path => "$htmlFile",
	     		        Type => "text/html";
	     		
		}
	     		
	else {
	     		
		# wants simple ascii, open my temporary file
		$textFile = "/tmp/current-awareness.txt";
		open OUT, "> $textFile";
	     		
		# start the output
		$textTitle = ($#gCallNumbers + 1 ) ." records found ($gLowerBounds[$i] - $gUpperBounds[$i])";
		print OUT "$gDisclaimer";
		print OUT "\n\n$textTitle\n";
		print OUT "Range delle date: $ed - $ld\n\n";
	
		# process every located record
		for ($k=0; $k <= $#gCallNumbers; $k++) {
			$n = $k+1;
			print OUT "$n. Call number: $gCallNumbers[$k]\n";
			print OUT "        Author: $gAuthors[$k]\n";
			print OUT "         Title: $gTitles[$k]\n";
			print OUT "           URL: $gMarion$gControlNumbers[$k]\n\n";
			
	     	}
	     		     		
		# close the output
		close OUT;
	     		
		# slurp up the output
		$message = `cat $textFile`;
					     		
		# construct it
		$top = build MIME::Entity 'Errors-To:' => "$gFromAddress",
                                  Subject      => ($#gCallNumbers + 1 ) ." records found ($gLowerBounds[$i] - $gUpperBounds[$i])",
                                  Data         => "$message";
	     		
		}
	     		
	# send it
	open MAIL, qq(| /usr/lib/sendmail -t -i -f "$gFromAddress" "$e") or die "open: $!";
	$top->print(\*MAIL);
	close MAIL;
			
	# return success
	print "<p>";
	print "La ricerca per <b>$gLowerBounds[$i] - $gUpperBounds[$i]</b> &egrave; stata effettuata e il risultato &egrave; stato inviato a <b>$f $l</b> (<a href=\"mailto:$e\">$e</a>).";
	print "</p>";

	}

sub deleteCAProfile {
	my $patronID  = $patronRecord->{patron_id};
	my $profileID = $input->param('profile_id');

	# define the query and execute it
	$q = qq(delete from profiles where patron_id = '$patronID' and profile_id = '$profileID');
	&prepareAndExecuteSQL ($q);
	
	}
	
	
sub cam4all {
	
	# define the date ranges
	$earlyDate = strftime ("%Y/%m/%d", localtime(parsedate ("-35 days", NOW)));
	$lateDate  = strftime ("%Y/%m/%d", localtime(parsedate ("-27 days", NOW)));
	
	# find all the patrons
	$q = "select * from patrons where wants_ca = '1'";
	&findPatrons4CAM($q);
		
	# start the ouput
	my $title = "Run 4 All";
	print $output->header(-expires => '-1d');
	print $output->start_html(-title => "$title");

	# process each patron
	for ($j = 0; $j <= $#patrons4CAMIDs; $j++) {
			
		# get the upper and lower bounds for the selected patron
		$q = qq (select * from profiles
	             where patron_id = '$patrons4CAMIDs[$j]' 
	             order by lower_bounds);
		&getCAProfiles($q);
			
		# process every profile
		for ($i = 0; $i <= $#gProfileIDs; $i++) {
	    
			# get the new titles
			$q = qq (select *
			         from new_titles
	                 where call_number  >= '$gLowerBounds[$i]'
	                 and call_number    <= '$gUpperBounds[$i]'
	                 and inventory_date >= '$earlyDate'
	                 and inventory_date <  '$lateDate'
	                 group by call_number);
	     	&getNewTitles($q);
	     	
	     	    	
	    	# build and email message
			&buildEmail ($patrons4CAMFirst[$j], $patrons4CAMLast[$j], $patrons4CAMEmail[$j], $patrons4CAMWantsHTML[$j], $earlyDate, $lateDate);
			#&buildEmail ($patrons4CAMFirst[$j], $patrons4CAMLast[$j], "eric_morgan\@ncsu.edu", $patrons4CAMWantsHTML[$j], $earlyDate, $lateDate);
			}
		}
	}
	
#################################################################
# administrative functions                                      #
#################################################################

##################################
# administrative interface menu  #
##################################

sub displayAdminBanner {

	print '<table cellpadding=10 border=0>';

	print '<tr valign=top>';
	print '<td VALIGN="top" ALIGN="right" BGCOLOR="silver">';
	print '<center>';
	print '<A HREF="./"><big><b>Home</b></big></A><br>';
	print '</center><br>';
	print '<nobr>';
	print '<small>';
	
	print '<b>Gestori di contenuti</b><br>';
	print qq(<a href="./?cmd=customizeDisciplineMOTD">$gMessageFromTheLibrarian</a><br>);
	print qq(<a href="./?cmd=displayLibrariesMenu">$gLibraryLinks</a><br>);
	print qq(<a href="./?cmd=displayUniversityMenu">$gUniversityLinks</a><br>);
	if ($gShowQuickSearches) { print qq(<a href="./?cmd=displayQSearchesMenu">$gQuickSearches</a><br>); }
	print qq(<a href="./?cmd=displayReferenceMenu">$gReferenceShelf</a><br>);
	print qq(<a href="./?cmd=displayDatabaseMenu">$gBibliographicDatabaseLinks</a><br>);
	print qq(<a href="./?cmd=displayJournalMenu">$gElectronicJournals</a><br>);
	print qq(<a href="./?cmd=customizeDisciplineDefaults">Defaults delle discipline</a><br>);
	if ($gShowCAM) { print qq(<a href="./?cmd=editDisciplineProfiles">Profili delle discipline</a><br>); }
	print qq(<a href="./?cmd=displayPatronsMenu">Patrons</a><br>);
	print qq(<a href="./?cmd=sendMail">Send mail</a><br>);
	print '<br>';

	print '<b>Reports</b><br>';
	print qq(<a href="./?cmd=whosGotTheDiscipline">Chi si occupa delle discipline</a><br>);
	if ($gShowStaticPageCreation) { print qq(<a href="./?cmd=displayDisciplinePagesMenu">Creare le pagine statiche</a><br>); }
	print qq(<a href="./?cmd=displayDisciplineViewsMenu">Liste delle discipline</a><br>);
	print qq(<a href="./?cmd=displayLinkCheckerMenu">Link checker</a><br>);
	print '<br>';

	print '<b>Webmasters</b><br>';
	print qq(<A HREF="./?cmd=customizeStyleSheet">Style sheet</A><br>);
	print qq(<A HREF="./?cmd=customizeBanner">Banner</A><br>);
	print qq(<A HREF="./?cmd=customizeFooter">Footer</A><br>);
	print qq(<A HREF="./?cmd=customizeMOTD">Messaggio generale</A><br>);
	print qq(<a href="./?cmd=displayFreeTemplateMenu">Free templates</a><br>);
	print qq(<a href="./?cmd=displayTemplateMenu">User templates</a><br>);
	print qq(<a href="./?cmd=displayStaticTemplateMenu">Static templates</a><br>);
	print '<br>';

	print '<b>Amministratori di sistema</b><br>';
	print qq(<A HREF="./?cmd=setPreferences">Preferenze globali</A><br>);
	print qq(<a href="./?cmd=displayDisciplinesMenu">Discipline</a><br>);
	print qq(<a href="./?cmd=displayLibrariansMenu">Reference librarians</a><br>);
	if ($gShowCollectionManagers) { print qq(<a href="./?cmd=displayManagersMenu">Collection managers</a><br>); }
	print qq(<a href="./?cmd=customizeSimpleHelp">Simple help texts</a><br>);
	if ($gShowCAM) { print qq(<a href="./?cmd=getCAMDisclaimer">$gCurrentAwarenessManager disclaimer</a><br>); }
	print '<br>';

	print '</small>';
	print '</nobr>';
	print '</td>';
	print '<td width=80%>';

}


sub displayMainMenu {
	
	# start the output
	print $output->header();

	# start the html
	&displaySimpleHelpMessage (49, 1);
	
	print '<center>';
	print "<table width=100% border=1>";
	print "<tr>";
	print "<td valign=top width=50%>";
	
	print "<center><h2>Gestori di contenuti</h2></center>";
	print "<ol>\n";
	print qq(<li><a href="./?cmd=customizeDisciplineMOTD">Modifica $gMessageFromTheLibrarian</a>\n);
	print qq(<li><a href="./?cmd=displayLibrariesMenu">Amministra $gLibraryLinks</a>\n);
	print qq(<li><a href="./?cmd=displayUniversityMenu">Amministra $gUniversityLinks</a>\n);
	if ($gShowQuickSearches) { print qq(<li><a href="./?cmd=displayQSearchesMenu">Amministra $gQuickSearches</a>\n); }
	print qq(<li><a href="./?cmd=displayReferenceMenu">Amministra $gReferenceShelf</a>\n);
	print qq(<li><a href="./?cmd=displayDatabaseMenu">Amministra $gBibliographicDatabaseLinks</a>\n);
	print qq(<li><a href="./?cmd=displayJournalMenu">Amministra $gElectronicJournals</a>\n);
	print qq(<li><a href="./?cmd=customizeDisciplineDefaults">Modifica i defaults delle discipline</a>\n);
	if ($gShowCAM) { print qq(<li><a href="./?cmd=editDisciplineProfiles">Modifica il range del profilo della disciplina</a>\n); }
	print qq(<li><a href="./?cmd=displayPatronsMenu">Amministra i patrons</a>\n);
	print qq(<li><a href="./?cmd=sendMail">Invia una mail</a>\n);
	print "</ol>\n";

	print "</td>";
	
	print "<td valign=top width=50%>";

	print "<center><h2>Reports</h2></center>";
	print "<ol>\n";
	print qq(<li><a href="./?cmd=whosGotTheDiscipline">Chi si occupa delle discipline</a>\n);
	if ($gShowStaticPageCreation) { print qq(<li><a href="./?cmd=displayDisciplinePagesMenu">Crea le pagine statiche</a>\n); }
	print qq(<li><a href="./?cmd=displayDisciplineViewsMenu">Mostra le liste delle discipline</a>\n);
	print qq(<li><a href="./?cmd=displayLinkCheckerMenu">Link checker</a>\n);
	if ($gManageDiscipline) {
	
		# one-stop shopping for maintaining a discipline --CG 3/25/2000
		print qq(<li><form action="./" method="get">\n);
		print qq(<input type="hidden" name="cmd" value="manageDiscipline">\n);
		print qq(<input type="submit" value="Amministra questa disciplina"><br>\n);
		print qq(<select name="disc">\n);
		$q = "SELECT * FROM disciplines ORDER BY discipline_name";
		&findAllDisciplines($q);
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
			print qq (<option value="$disciplineIDs[$i]">$disciplineNames[$i]\n);
	
		}
	
		print "</select></form></li>\n";
		
	}
	
	print "</ol>\n";

	print "</td>";
	print "</tr>";
	print "<tr>";
	print "<td valign=top width=50%>";

	
	print "<center><h2>Webmasters</h2></center>";
	print "<ol>\n";
	print qq(<li><A HREF="./?cmd=customizeStyleSheet">Modifica lo style sheet</A>\n);
	print qq(<li><A HREF="./?cmd=customizeBanner">Modifica il banner</A>\n);
	print qq(<li><A HREF="./?cmd=customizeFooter">Modifica il footer</A>\n);
	print qq(<li><A HREF="./?cmd=customizeMOTD">Modifica il global message of the day</A>\n);
	print qq(<li><a href="./?cmd=displayFreeTemplateMenu">Amministra i free templates</a>\n);
	print qq(<li><a href="./?cmd=displayTemplateMenu">Amministra gli user templates</a>\n);
	print qq(<li><a href="./?cmd=displayStaticTemplateMenu">Amministra gli static templates</a>\n);
	print "</ol>\n";
	
	print "</td>";
	print "<td valign=top width=50%>";
	
	print "<center><h2>Amministratori di sistema</h2></center>";
	print "<ol>";
	print qq(<li><A HREF="./?cmd=setPreferences">Set le preferenze globali</A>\n);
	print qq(<li><a href="./?cmd=displayDisciplinesMenu">Amministra le disciplines</a>\n);
	print qq(<li><a href="./?cmd=displayLibrariansMenu">Amministra i reference librarians</a>\n);
	if ($gShowCollectionManagers) { print qq(<li><a href="./?cmd=displayManagersMenu">Amministra i collection managers</a>\n); }
	print qq(<li><a href="./?cmd=customizeSimpleHelp">Modifica i simple help texts</a>\n);
	if ($gShowCAM) { print qq(<li><a href="./?cmd=getCAMDisclaimer">Modifica il $gCurrentAwarenessManager disclaimer</a>\n); }
	print "</ol>";
	print "</td>";
	print "</tr>";
	print "</table>";
	print '</center>';

}


##################################
# mystery function (utilitites)  #
##################################


sub addUserNames {

	# get the id's and first names of all the current patrons
	my $q = qq(select patron_id, name_f from patrons);
	
	# initialize the arrays I will use
	my @ids   = ();
	my @names = ();
	
	# prepare the query and execute it
	&prepareAndExecuteSQL ($q);
	
	# slurp up the output
	while ($h = $gSth->fetchrow_hashref) {
		push (@ids,  $h->{patron_id});
		push (@names, $h->{name_f});
		
		}
	
	# process each record
	for ($i = 0; $i <= $#ids; $i++) {
		
		# copy the first name to the username field
		$q = qq(update patrons set username = '$names[$i]' where patron_id = $ids[$i]);
		&prepareAndExecuteSQL ($q);

		}

	&returnError ("Done.");

}


#####################
# university admin  #
#####################


sub displayUniversityMenu {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (128, 1);
	
	# display the menu
	print qq(<ol>);
	print qq(<li><a href="./?cmd=displayUniversityInputForm">Crea una  risorsa $gUniversityLinks</a>);
	print qq(<li><a href="./?cmd=displayUniversityFindForm">Trova e modifica o elimina una risorsa $gUniversityLinks</a>);
	print qq(<li><a href="./?cmd=editUniversity">Modifica un item $gUniversityLinks</a>);
	print qq(<li><a href="./?cmd=deleteUniversity">Elimina un item $gUniversityLinks</a>);
	print qq(</ol>);
	
}
	

sub displayUniversityInputForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (129, 1);
	
	# display the input form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="createUniversity">\n);
	print qq(<table border="1">\n);
	print "<!--  F O R G I E N  K E Y  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">F Key</td>\n);
	print qq(<td align="left"><input type="text" name="fkey" size="45"></td>\n);
	print "<td>Foreign key</td>\n";
	print "</tr>\n";
	print "<!--  N A M E  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">$gUniversityLinks</td>\n);
	print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
	print "<td>Inserire un termine $gUniversityLinks</td>\n";
	print "</tr>\n";
	print "<!--  U R L  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">URL</td>\n);
	print qq(<td align="left"><input type="text" name="url" size="45"></td>\n);
	print "<td>Inserire l'URL</td>\n";
	print "</tr>\n";
	print "<!--  L C D -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">LCD</td>\n);
	print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
	print "<td>Risorsa LCD?</td>\n";
	print "</tr>\n";
	print "<!--  D E S C R I P T I O N  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Descrizione</td>\n);
	print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="45"></textarea>\n);
	print "<td>Inserire una nota di commento</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Crea"> \n);
	print qq(<input type="reset" value="Azzera">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}


sub createUniversity {

	# get the input
	my $name = $gDBhandle->quote($input->param('name'));
	my $url  = $input->param('url');
	my $note = $gDBhandle->quote($input->param('note'));
	my $lcd  = $input->param('lcd');
	my $fkey = $input->param('fkey');
	
	# INSERT ERROR CHECKING HERE!
	
	# get today's date
	my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));
	
	# get a new sequence
	my $sequence = getNewSequence();
	
	# create a query to update the database and update it
	my $q = qq(INSERT INTO university (university_id, university_name, university_url, university_note, university_date, university_lcd, university_fkey)
	           VALUES ($sequence, $name, '$url', $note, '$today', '$lcd', '$fkey'));
	&prepareAndExecuteSQL($q);
		
	# find the record just added
	$q = qq(SELECT * FROM university WHERE university_name = $name);
	&findAllUniversity($q);
	
	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (130, 1);
	
	# display it for confirmation
	&displayTabledUniversityOutput;
	
}
	

sub displayTabledUniversityOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>$gUniversityLinks</b></td>\n);
	print qq(<td align="left"><b>Data</b></td>\n);
	print "<td><b>Azione</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#universityIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$universityIDs[$i]</td>\n);
		print qq(<td align="left"><a href="$universityURLs[$i]">$universityNames[$i]</a></td>\n);
		print qq(<td align="left">$universityDates[$i]</td>\n);
		print qq(<td><a href="./?cmd=editUniversity&id=$universityIDs[$i]">Modifica</a> or <a href="./?cmd=deleteUniversity&id=$universityIDs[$i]">Elimina</a></td>\n);
		print "</tr>\n";
		
	}
		
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayUniversityFindForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (131, 1);
	
	# display the search form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="displayUniversitySearchResults">\n);
	print qq(<table border="1">\n);
	print "<!--  O P E R A T O R  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Operator</td>\n);
	print qq(<td align="left">\n);
	print qq(<select name="searchOperator">\n);
	print qq(<option value="=">is\n);
	print qq(<option value="like" selected>like\n);
	print "</select>\n";
	print "</td>\n";
	print "<td>Select an operator</td>\n";
	print "</tr>\n";
	print "<!--  S E A R C H  S T R I N G  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Search string</td>\n);
	print qq(<td align="left">\n);
	print qq(<input type="text" name="searchString" value="%">\n);
	print "</td>";
	print "<td>Enter a query term</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Cerca"> \n);
	print qq(<input type="reset" value="Azzera">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayUniversitySearchResults {

	# get the input
	my $searchOperator = $input->param('searchOperator');
	my $searchString   = $input->param('searchString');
	
	# INSERT ERROR CHECKING HERE!
	
	# create a query and execute it
	my $q = qq(SELECT *
	           FROM university
	           WHERE university_name $searchOperator '$searchString'
	           ORDER BY university_name);
	&findAllUniversity($q);

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (132, 1);
	
	# display the results
	&displayTabledUniversityOutput;
	
}
	

sub deleteUniversity {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (133, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteUniversity">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Elimina"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the university from the university table
		my $q = qq(delete from university where university_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(delete from items4university where university_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (134, 1);
	
	}

}
	
sub editUniversity {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (135, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editUniversity">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# find the record to edit
		my $q = qq(SELECT * FROM university WHERE university_id = "$id");
		&findAllUniversity($q);

		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (136, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updateUniversity">\n);
		print qq(<input type="hidden" name="id" value="$universityIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$universityIDs[0]</td>\n);
		print "<td>Record number</td>\n";
		print "</tr>\n";
		print "<!--  D A T E S  -->";
		print "<tr>\n";
		print qq(<td align="right">Date</td>\n);
		print qq(<td align="left">$universityDates[0]</td>\n);
		print "<td>Last modified</td>\n";
		print "</tr>\n";
		print "<!--  F O R G I E N  K E Y  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">F Key</td>\n);
		print qq(<td align="left"><input type="text" name="fkey" size="45" value="$universityFKeys[0]"></td>\n);
		print "<td>Foreign key</td>\n";
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">$gUniversityLinks</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$universityNames[0]"></td>\n);
		print "<td>Enter a $gUniversityLinks term</td>\n";
		print "</tr>\n";
		print "<!--  U R L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">URL</td>\n);
		print qq(<td align="left"><input type="text" name="url" size="45" value="$universityURLs[0]"></td>\n);
		print "<td>What is the URL?</td>\n";
		print "</tr>\n";
		print "<!--  L C D -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">LCD</td>\n);
		
		if ($universityLCDs[0]) {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1" checked></td>\n);
		}
		else {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
		}
		
		print "<td>LCD Resource?</td>\n";
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="45">$universityNotes[0]</textarea>\n);
		print "<td>Enter a scope note</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}

}
	
	
sub updateUniversity {

	# get the input
	my $id   = $input->param('id');
	my $name = $gDBhandle->quote($input->param('name'));
	my $url  = $input->param('url');
	my $note = $gDBhandle->quote($input->param('note'));
	my $lcd  = $input->param('lcd');
	my $fkey = $input->param('fkey');
	
	# get today's date
	my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));
	
	# create the query and update the database
	my $q = qq(UPDATE university
	           SET university_name = $name,
	               university_url  = '$url',
	               university_note = $note,
	               university_date = '$today',
	               university_lcd  = '$lcd',
	               university_fkey = '$fkey'
	           WHERE university_id = '$id');
	&prepareAndExecuteSQL ($q);
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (137, 1);
	
}


################
# style-sheet  #
################

sub customizeStyleSheet {

	# get submit button
	my $submit = $input->param('submit');
	
	# start the output
	print $output->header();
	
	# check for submit
	if (! $submit) {

		# start the html
		&displaySimpleHelpMessage (52, 1);

		# output the form
		print "<center>\n";
		print $output->startform(-method => 'GET', -action => './');
		print $output->hidden(-name => 'cmd',  -value => 'customizeStyleSheet');
		print qq (<textarea rows="13" cols="50" wrap="virtual" name="gStyleSheet">$gStyleSheet</textarea>);
		print "<p>\n";
		print $output->submit(-name => 'submit', -value => 'Modifica');              
		print $output->reset(-name => 'Reset', -value => 'Azzera');              
		print "</p>\n";
		print "</center>\n";
		print $output->endform;	

	}
	
	else {
	
		# get the global message
		my $gStyleSheet = $gDBhandle->quote($input->param('gStyleSheet'));
		
		# update the database
		my $q = "UPDATE preferences SET style_sheet = $gStyleSheet";
		&prepareAndExecuteSQL ($q);
		
		# start the html
		&displaySimpleHelpMessage (53, 1);
		
		# echo the input
		print "<pre>";
		print $input->param('gStyleSheet');
		print "</pre>";
		
	}
	
}


###############
# send mail   #
###############


sub sendMail {

	# get the input
	my $results      = $input->param(results);
	my @disciplines  = $input->param(IDs);
	my $honor        = $input->param(honor);
	my $audience     = $input->param(audience);
	my $firstName    = $input->param(firstName);
	my $lastName     = $input->param(lastName);
	my $emailAddress = $input->param(emailAddress);
	my $subject      = $input->param(subject);
	my $message      = $input->param(message);
			
	# display an input form
	if (! $results) {
	
		# find all the disciplines
		my $q = qq(select * from disciplines order by discipline_name);
		&findAllDisciplines($q);
		
		# start the header
		print $output->header();
		
		# start the html
		&displaySimpleHelpMessage (191, 1);
		
		# start the form
		print "<center>";
		print "<p>";
		print qq(<form method="POST" action="./">);
		print qq(<input type="hidden" name="cmd" value="sendMail">);
		print qq(<table border=1>);
		print qq(<tr valign="top">);
		print qq(<td align="right"><b>Item</b></td>);
		print qq(<td><b>Selection</b></td>);
		print qq(<td><b>Description</b></td>);
		print qq(</tr>);

		# disciplines
		print qq(<tr valign="top">);
		print qq(<td align="right">Disciplines</td>);
		print qq(<td><select size=7 multiple name="IDs">);
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
			print qq(<option value="$disciplineIDs[$i]">$disciplineNames[$i]\n);
		}
		print qq(</select></td>);
		print qq(<td>Select the disciplines of the people who will get this message. Multiple disciplines may be selected.</td>);
		print qq(</tr>);
		
		# audience
		print qq(<tr valign="top">);
		print qq(<td align="right">Audience</td>);
		print qq(<td>);
		print qq(<input type="radio" name="audience" value="collectionManagers" checked>All collection managers for the selected disciplines classified in MyLibrary<br>); 
		print qq(<input type="radio" name="audience" value="referenceLibrarians">All reference librarians for the selected disciplines classified in MyLibrary<br>); 
		print qq(<input type="radio" name="audience" value="patrons">All patrons for the selected disciplines classified in MyLibrary);
		print qq(</td>);
		print qq(<td>From the selected disciplines, who is the audience for your message?</td>);
		print qq(</tr>);
		
		# honor can contact
		print qq(<tr valign="top">);
		print qq(<td align="right">Honor</td>);
		print qq(<td>);
		print qq(<input type="radio" name="honor" value="1" checked>Yes<br>); 
		print qq(<input type="radio" name="honor" value="0">No);
		print qq(</td>);
		print qq(<td>Do you want to honor the user's "Can contact" stipulation?</td>);
		print qq(</tr>);
		
		# first name
		print qq(<tr valign="top">);
		print qq(<td align="right">First name</td>);
		print qq(<td><input type="text" name="firstName"></td>);
		print qq(<td>What is your first name?</td>);
		print qq(</tr>);
		
		# last name
		print qq(<tr valign="top">);
		print qq(<td align="right">Last name</td>);
		print qq(<td><input type="text" name="lastName"></td>);
		print qq(<td>What is your last name?</td>);
		print qq(</tr>);
		
		# email address
		print qq(<tr valign="top">);
		print qq(<td align="right">Email address</td>);
		print qq(<td><input type="text" name="emailAddress"></td>);
		print qq(<td>What is your email address?</td>);
		print qq(</tr>);
		
		# subject
		print qq(<tr valign="top">);
		print qq(<td align="right">Subject</td>);
		print qq(<td><input type="text" name="subject"></td>);
		print qq(<td>What is the subject of this message?</td>);
		print qq(</tr>);
		
		# message
		print qq(<tr valign="top">);
		print qq(<td align="right">Message</td>);
		print qq(<td><textarea cols="50" rows="20" wrap="virtual" name="message"></textarea></td>);
		print qq(<td>What do you want to say?</td>);
		print qq(</tr>);
		
		# output
		print qq(<tr valign="top">);
		print qq(<td align="right">Results</td>);
		print qq(<td>);
		print qq(<input type="radio" name="results" value="sqlQuery">Show me the SQL query<br>);
		print qq(<input type="radio" name="results" value="sqlResults">Show me the SQL results<br>);
		print qq(<input type="radio" name="results" value="money">Show me the money<br>);
		print qq(<input type="radio" name="results" value="emailSender" checked>Send me the message only<br>);
		print qq(<input type="radio" name="results" value="emailEverybody">Send everybody the message<br>);
		print qq(</td>);
		print qq(<td>What sort of results do you want to see?</td>);
		print qq(</tr>);
		
		# end the table
		print qq(</table>);
		print "</p>";
		
		# end the form
		print "<p>";
		print qq(<input type="submit" value="Invia"> );
		print qq(<input type="reset" value="Azzera"> );
		print "</p>";
		print qq(</form>);
		
	}
	
	# see the SQL query results
	elsif ($results eq 'sqlQuery') {
	
		# build the sql query
		if ($audience eq 'referenceLibrarians' || $audience eq 'collectionManagers') {
			
			# create librarian query
			$q = &buildSQL4Librarians (\@disciplines, $audience);
			
		}
		
		elsif ($audience eq 'patrons') {
		
			# create patron query
			$q = &buildSQL (\@disciplines, $honor);
		
		}
		
		else {
		
			# error
			&returnError ("Programmer error: Unknown value for audience ($audience).");
			return;
		
		}
		
		# start the output
		print $output->header();
		
		# start the html
		&displaySimpleHelpMessage (192, 1);

		# display the query
		print "<blockquote><pre>$q</pre></blockquote>";
		
	}
	
	# see the SQL query
	elsif ($results eq 'sqlResults') {
	
		# build the sql query
		if ($audience eq 'referenceLibrarians' || $audience eq 'collectionManagers') {
			
			# create librarian query
			my $q = &buildSQL4Librarians (\@disciplines, $audience);
			&findLibrarians4Email ($q)
			
		}
		
		elsif ($audience eq 'patrons') {
		
			# patrons query
			my $q = &buildSQL (\@disciplines, $honor);
			&findPatrons4Email ($q);
			
		}
		
		else {
		
			# error
			&returnError ("Programmer error: Unknown value for audience ($audience).");
			return;
			
		}
		
		# start the output
		print $output->header();
		
		# start the html
		&displaySimpleHelpMessage (193, 1);

		# display each hit
		if ($audience eq 'patrons') {
		
			# start the table/results
			print "<p>";
			print "<center>";
			print qq(<table border=1>);
			print qq(<tr>);
			print qq(<td align="right"><b>Discipline ID</b></td>);
			print qq(<td><b>Last name</b></td>);
			print qq(<td><b>First name</b></td>);
			print qq(<td><b>Email address</b></td>);
			print qq(</tr>);
		
			# patrons
			for ($i = 0; $i <= $#patrons4EmailFirst; $i++) {
			
				print qq(<tr>);
				print qq(<td align="right">$patrons4EmailDiscipline[$i]</td>);
				print qq(<td>$patrons4EmailLast[$i]</td>);
				print qq(<td>$patrons4EmailFirst[$i]</td>);
				print qq(<td>$patrons4EmailEmail[$i]</td>);
				print qq(</tr>);
			
			}
		
		}
		
		elsif ($audience eq 'referenceLibrarians' || $audience eq 'collectionManagers') {
		
			# start the table/results
			print "<p>";
			print "<center>";
			print qq(<table border=1>);
			print qq(<tr>);
			print qq(<td align=right><b>Name</b></td>);
			print qq(<td><b>Email address</b></td>);
			print qq(</tr>);
		
			# librarians
			for ($i = 0; $i <= $#librarians4EmailFirst; $i++) {
			
				print qq(<tr>);
				print qq(<td align=right>$librarians4EmailFirst[$i]</td>);
				print qq(<td>$librarians4EmailEmail[$i]</td>);
				print qq(</tr>);
			
			}
		
		}
		
		print qq(</table>);
		print "</center>";
		print "</p>";
		
	}
	
	# show me the money :-)
	elsif ($results eq 'money') {
	
		# start the output
		print $output->header();
		
		# start the html
		&displaySimpleHelpMessage (194, 1);
		
	}
	
	# just email the sender
	elsif ($results eq 'emailSender') {
	
		# validate first name
		&validateEmailInput (1, $firstName);
		
		# validate last name
		&validateEmailInput (2, $lastName);
		
		# validate subject
		&validateEmailInput (3, $emailAddress);
		
		# validate subject
		&validateEmailInput (4, $subject);
		
		# validate subject
		&validateEmailInput (5, $message);
		
		# initalize the arrays
		my @firstNames = ($firstName);
		my @lastNames = ($lastName);
		my @emailAddresses = ($emailAddress);
		
		# send the message
		&sendTheMessage (\@firstNames, \@lastNames, \@emailAddresses, $firstName, $lastName, $emailAddress, $subject, $message, $audience);
		
		# start the output
		print $output->header();
		
		# start the html
		&displaySimpleHelpMessage (196, 1);
		
		# display the email address
		print qq(<center><a href="mailto:$emailAddress">$emailAddress</a></center>);
		
	}
	
	# go for it; mail everybody
	elsif ($results eq 'emailEverybody') {
	
		# validate first name
		&validateEmailInput (1, $firstName);
		
		# validate last name
		&validateEmailInput (2, $lastName);
		
		# validate subject
		&validateEmailInput (3, $emailAddress);
		
		# validate subject
		&validateEmailInput (4, $subject);
		
		# validate subject
		&validateEmailInput (5, $message);
		
		# build the sql query and exectute it
		if ($audience eq 'patrons') {
		
			# patrons
			my $q = &buildSQL (\@disciplines, $honor);
			&findPatrons4Email ($q);
		
			# append sender's data to the data for the message
			push @patrons4EmailFirst, $firstName;
			push @patrons4EmailLast,  $lastName;
			push @patrons4EmailEmail, $emailAddress;
			
			# email patrons
			&sendTheMessage (\@patrons4EmailFirst, \@patrons4EmailLast, \@patrons4EmailEmail, $firstName, $lastName, $emailAddress, $subject, $message, $audience);
				
		}
		
		elsif ($audience eq 'referenceLibrarians' || $audience eq 'collectionManagers') {
		
			# create librarian query
			my $q = &buildSQL4Librarians (\@disciplines, $audience);
			&findLibrarians4Email ($q);
		
			# append sender's data to the data for the message
			push @librarians4EmailFirst, $firstName;
			push @librarians4EmailLast,  $lastName;
			push @librarians4EmailEmail, $emailAddress;
			
			# email patrons
			&sendTheMessage (\@librarians4EmailFirst, \@librarians4EmailLast, \@librarians4EmailEmail, $firstName, $lastName, $emailAddress, $subject, $message, $audience);
		
		}
		
		# start the output
		print $output->header();
		
		# start the html
		&displaySimpleHelpMessage (202, 1);
		
		# start the list
		print qq(<center>);
		print qq(<table border=1>);
		print qq(<tr>);
		print qq(<td align=right><b>Name</b></td>);
		print qq(<td><b>Address</b></td>);
		print qq(</tr>);
		
		# process every email address
		if ($audience eq 'patrons') {
		
			# patrons
			for ($i = 0; $i <= $#patrons4EmailEmail; $i++) {

				print qq(<tr>);
				print qq(<td align=right>$patrons4EmailLast[$i], $patrons4EmailFirst[$i]</td>);
				print qq(<td>);
				print qq(<a href="mailto:$patrons4EmailEmail[$i]">$patrons4EmailEmail[$i]);
				print qq(</td>);
				print qq(</tr>);

			}
		
		}
		
		elsif ($audience eq 'referenceLibrarians' || $audience eq 'collectionManagers') {
		
			# librarians
			for ($i = 0; $i <= $#librarians4EmailFirst; $i++) {

				print qq(<tr>);
				print qq(<td align=right>$librarians4EmailFirst[$i]</td>);
				print qq(<td>);
				print qq(<a href="mailto:$librarians4EmailEmail[$i]">$librarians4EmailEmail[$i]);
				print qq(</td>);
				print qq(</tr>);

			}
		
		}
		
		# finish the table
		print qq(</table>);
		print qq(</center>);
		
	}
	
	# unknown results option
	else { &returnError ("Unknown results option '$results'."); }
	
}

sub sendTheMessage {

	my $firstNames     = @_[0];  # a referenced array
	my $lastNames      = @_[1];  # a referenced array
	my $emailAddresses = @_[2];  # a referenced array
	my $f              = @_[3];
	my $l              = @_[4];
	my $e              = @_[5];
	my $s              = @_[6];
	my $m              = @_[7];
	my $a              = @_[8];
		
	# wrap the message
	$m = wrap ("", "", $m);
	
	# process each emailAddress
	for ($i = 0; $i <= $#$emailAddresses; $i++) {
	
		# construct the message
		if ($a eq 'patrons') {
		
			# email patrons
			$mail = build MIME::Entity 'Errors-to:'   => "$e",
                                       Subject        => "$s",
                                       Data           => "$m";
        
        }
        
		elsif ($a eq 'referenceLibrarians' || $a eq 'collectionManagers') {
		
			# email librarians
			$mail = build MIME::Entity 'Errors-to:' => "$e",
                                       Subject      => "$s",
                                       Data         => "$m";
                                       
		}
		
		else {
		
			# error
			&returnError ("Programmer error: Unknown value for a ($a)");
			return;
			
		}
		     		
		# send it
		open MAIL, qq(| /usr/lib/sendmail -t -i -f "$e" "$emailAddresses->[$i]") || &returnError ("Couldn't open mail: $!");
		$mail->print(\*MAIL);
		close MAIL;
	     		
	}

}


sub buildSQL {

	# get the input
	my $ids = @_[0];
	my $h   = @_[1];
			
	# validate the input
	if ($#$ids < 0) {
	
		# start the output
		print $output->header();
		
		# display the error message
		&displaySimpleHelpMessage (195, 1);
		
		# exit gracefully		
		&gracefulExit;

	}
	
	# initalize the query
	my $q = "select name_f, name_l, email, discipline_id from patrons where\n";
	         
	# make sure there is an email address
	$q .= "email <> '' and ";
	
	# honor can contact?
	if ($h) { $q .= "can_contact = '1' and " }
	
	# start the phrase
	$q .= "(";
	
	# process each discipline
	for ($i = 0; $i <= $#$ids; $i++) {
	
		# append a boolean operation
		if ($i == $#$ids) { $q .= "discipline_id = '$$ids[$i]')\n" }
		
		# finish the boolean operation
		else { $q .= "discipline_id = '$$ids[$i]' or \n" }
		
	}
	
	# finish the query
	$q .= "order by name_l";
	
	# return the result
	return $q;
	
}


sub buildSQL4Librarians {

	# get the input
	my $ids = @_[0];
	my $a   = @_[1];
			
	# validate the input
	if ($#$ids < 0) {
	
		# start the output
		print $output->header();
		
		# display the error message
		&displaySimpleHelpMessage (195, 1);
		
		# exit gracefully		
		&gracefulExit;

	}
	
	# initalize the query
	if ($a eq 'referenceLibrarians') {
	
		# initialize the query for reference librarians
		$q = "select name, email_address from librarians, items4librarians\n";
		$q .= "where librarians.librarian_id = items4librarians.librarian_id\n";
	
	}
	
	elsif ($a eq 'collectionManagers') {
	
		# initialize the query for collection managers
		$q = "select name, email_address from managers, items4managers\n";
		$q .= "where managers.manager_id = items4managers.manager_id\n";
	
	}
	
	else {
	
		# error
		&returnError ("Unknown value for a: ($a)");
		return;
		
	}
	
	# start the phrase
	$q .= "and (";
	
	# process each discipline
	for ($i = 0; $i <= $#$ids; $i++) {
	
		# append a boolean operation
		if ($i == $#$ids) { $q .= "discipline_id = '$$ids[$i]')\n" }
		
		# finish the boolean operation
		else { $q .= "discipline_id = '$$ids[$i]' or \n" }
		
	}
	
	# finish the query
	$q .= "group by name";
	
	# return the result
	return $q;
	
}


sub validateEmailInput {

	# get the input
	my $check = @_[0];
	my $value = @_[1];
	
	# check for first name
	if ($check == 1 && ! $value) {
	
		# start the output
		print $output->header();
		
		# display the error message
		&displaySimpleHelpMessage (197, 1);
		
		# exit gracefully		
		&gracefulExit;
		
	}
	
	# check for last name
	elsif ($check == 2 && ! $value) {
	
		# start the output
		print $output->header();
		
		# display the error message
		&displaySimpleHelpMessage (198, 1);
		
		# exit gracefully		
		&gracefulExit;
		
	}
	
	# check for email address
	elsif ($check == 3 && ! $value) {
	
		# start the output
		print $output->header();
		
		# display the error message
		&displaySimpleHelpMessage (199, 1);
		
		# exit gracefully		
		&gracefulExit;
		
	}
	
	# check for subject
	elsif ($check == 4 && ! $value) {
	
		# start the output
		print $output->header();
		
		# display the error message
		&displaySimpleHelpMessage (200, 1);
		
		# exit gracefully		
		&gracefulExit;
		
	}
	
	# check for message
	elsif ($check == 5 && ! $value) {
	
		# start the output
		print $output->header();
		
		# display the error message
		&displaySimpleHelpMessage (201, 1);
		
		# exit gracefully		
		&gracefulExit;
		
	}
	
}


###############
# reports     #
###############

sub whosGotTheDiscipline {

	# find all the disciplines
	my $q = "select * from disciplines order by discipline_name";
	&findAllDisciplines($q);
	
	# start the output
	print $output->header();

	# start the html
	&displaySimpleHelpMessage (205, 1);
	
	# start the table
	print qq(<table border=1>\n);
	print "<tr>\n";
	print qq(<td align="right"><b>Discipline</b></td>\n);
	if ($gShowCollectionManagers) { print "<td><b>Collection Managers</b></td>\n"; }
	print "<td><b>Reference Librarians</b></td>\n";
	print "</tr>\n";
	
	# process each discipline
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		# start the row and display the discipline
		print qq(<tr valign="top">\n);
		print qq(<td align="right">$disciplineNames[$i]</td>);
		
		if ($gShowCollectionManagers) {
		
			# get the managers for this discipline
			$q = qq(select name, email_address
                    from managers, items4managers, disciplines
                    where items4managers.discipline_id = $disciplineIDs[$i]
                    and disciplines.discipline_id = items4managers.discipline_id
                    and items4managers.manager_id = managers.manager_id
                    order by name);
			&findCollectionManagers ($q);
        
        	# process each manager
			print "<td>";
        	for ($j = 0; $j <= $#managerIDs; $j++) {
        		print $j + 1 . qq(. <a href="mailto:$managerEmailAddress[$j]">$managerNames[$j]</a><br>);
        	}
			print "</td>";
			
		}
        
 		# get the librarians for this discipline
		$q = qq(select name, email_address
                from librarians, items4librarians, disciplines
                where items4librarians.discipline_id = $disciplineIDs[$i]
                and disciplines.discipline_id = items4librarians.discipline_id
                and items4librarians.librarian_id = librarians.librarian_id
                order by name);
        &findLibrarians ($q);
        
        # process each librarian
		print "<td>";
        for ($j = 0; $j <= $#librarianIDs; $j++) {
        	print $j + 1 . qq(. <a href="mailto:$librarianEmailAddress[$j]">$librarianNames[$j]</a><br>);
        }
		print "</td>";
       
        
        # end the row
		print "</tr>\n";
		
	}
	
	# end the table
	print "</table>\n";

}


####################
# reference admin  #
####################

sub displayReferenceMenu {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (148, 1);

    $q = "SELECT count(*) as conto from reference";
    &prepareAndExecuteSQL($q);
   
    $row=$gSth->fetchrow_hashref;
    my $conto = $row->{conto};

    print qq(L'archivio contiene <b>$conto</b> Informazioni rapide);

	
	# display the menu
	print qq(<ol>);
	print qq(<li><a href="./?cmd=displayReferenceInputForm">Create a $gReferenceShelf resource</a>);
	print qq(<li><a href="./?cmd=displayReferenceFindForm">Find and then edit or delete a $gReferenceShelf resource</a>);
	print qq(<li><a href="./?cmd=editReference">Edit a $gReferenceShelf item</a>);
	print qq(<li><a href="./?cmd=deleteReference">Delete a $gReferenceShelf item</a>);
	print qq(</ol>);
	
}
	

sub displayReferenceInputForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (149, 1);
	
	# display the input form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="createReference">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print qq(</tr>\n);
	print "<!--  F O R G I E N  K E Y  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">F Key</td>\n);
	print qq(<td align="left"><input type="text" name="fkey" size="45"></td>\n);
	print "<td>Foreign key</td>\n";
	print "</tr>\n";
	print "<!--  N A M E  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">$gReferenceShelf</td>\n);
	print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
	print "<td>Enter a $gReferenceShelf term</td>\n";
	print "</tr>\n";
	print "<!--  U R L  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">URL</td>\n);
	print qq(<td align="left"><input type="text" name="url" size="45"></td>\n);
	print "<td>What is the URL?</td>\n";
	print "</tr>\n";
	print "<!--  L C D -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">LCD</td>\n);
	print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
	print "<td>LCD Resource?</td>\n";
	print "</tr>\n";
	print "<!--  D E S C R I P T I O N  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Description</td>\n);
	print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="45"></textarea>\n);
	print "<td>Enter a scope note</td>\n";
	print "</tr>\n";
	
	# get and display all the disciplines
	&displayAllDisciplines;
	
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Crea"> \n);
	print qq(<input type="reset" value="Azzera">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}


sub createReference {

	# get the input
	my $name          = $gDBhandle->quote($input->param('name'));
	my $url           = $input->param('url');
	my $note          = $gDBhandle->quote($input->param('note'));
	my @disciplineIDs = $input->param('disciplineIDs');
	my $lcd           = $input->param('lcd');
	my $fkey          = $input->param('fkey');
	
	# INSERT ERROR CHECKING HERE!
	
	# get today's date
	my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));

	# get a new sequence
	my $sequence = getNewSequence();
	
	# create a query to update the database and update it
	my $q = qq{INSERT INTO reference (reference_id, reference_name, reference_url, reference_note, reference_date, reference_lcd, reference_fkey)
	           VALUES ($sequence, $name, '$url', $note, '$today', '$lcd', '$fkey')};
	&prepareAndExecuteSQL($q);
		
	# find the record just added
	$q = qq(SELECT *
	        FROM reference
	        WHERE reference_id = '$sequence');
	&findAllReferences($q);
	
	# update discipline descriptions
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		$q = qq(INSERT INTO items4DisReference (discipline_id, reference_id)
		        VALUES ('$disciplineIDs[$i]', '$referenceIDs[0]'));
		&prepareAndExecuteSQL($q);
		
	}
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (150, 1);
	
	# display it for confirmation
	&displayTabledReferenceOutput;
	
}
	

sub displayTabledReferenceOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>$gReferenceShelf</b></td>\n);
	print qq(<td align="left"><b>Date</b></td>\n);
	print "<td><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#referenceIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$referenceIDs[$i]</td>\n);
		print qq(<td align="left"><a href="$referenceURLs[$i]">$referenceNames[$i]</a></td>\n);
		print qq(<td align="right">$referenceDates[$i]</td>\n);
		print qq(<td><a href="./?cmd=editReference&id=$referenceIDs[$i]">Edit</a> or <a href="./?cmd=deleteReference&id=$referenceIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		
	}
		
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayReferenceFindForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (151, 1);
	
	# display the search form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="displayReferenceSearchResults">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print "</tr>\n";
	print "<!--  O P E R A T O R  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Operator</td>\n);
	print qq(<td align="left">\n);
	print qq(<select name="searchOperator">\n);
	print qq(<option value="=">is\n);
	print qq(<option value="like" selected>like\n);
	print "</select>\n";
	print "</td>\n";
	print "<td>Select an operator</td>\n";
	print "</tr>\n";
	print "<!--  S E A R C H  S T R I N G  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Search string</td>\n);
	print qq(<td align="left">\n);
	print qq(<input type="text" name="searchString" value="%">\n);
	print "</td>";
	print "<td>Enter a query term</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Cerca"> \n);
	print qq(<input type="reset" value="Azzera">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayReferenceSearchResults {

	# get the input
	my $searchOperator = $input->param('searchOperator');
	my $searchString   = $input->param('searchString');
	
	# INSERT ERROR CHECKING HERE!
	
	# create a query and execute it
	my $q = qq(SELECT *
	           FROM reference
	           WHERE reference_name $searchOperator '$searchString'
	           ORDER BY reference_name);
	&findAllReferences($q);

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (152, 1);
	
	# display the results
	&displayTabledReferenceOutput;
	
}
	

sub deleteReference {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (153, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteReference">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Elimina"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the reference from the reference table
		my $q = qq(DELETE FROM reference WHERE reference_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(DELETE FROM items4references WHERE reference_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(DELETE FROM items4DisReference WHERE reference_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header(-expires => '-1d');

		# start the html
		&displaySimpleHelpMessage (154, 1);
	
	}

}
	
sub editReference {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (155, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editReference">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# find the record to edit
		my $q = qq(SELECT * 
		           FROM reference
		           WHERE reference_id = '$id');
		&findAllReferences($q);

		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (156, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updateReference">\n);
		print qq(<input type="hidden" name="id" value="$referenceIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$referenceIDs[0]</td>\n);
		print "<td>Record number</td>\n";
		print "</tr>\n";
		print "<!--  D A T E  -->";
		print "<tr>\n";
		print qq(<td align="right">Date</td>\n);
		print qq(<td align="left">$referenceDates[0]</td>\n);
		print "<td>Last modified</td>\n";
		print "</tr>\n";
		print "<!--  F O R G I E N  K E Y  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">F Key</td>\n);
		print qq(<td align="left"><input type="text" name="fkey" size="45" value="$referenceFKeys[0]"></td>\n);
		print "<td>Foreign key</td>\n";
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">$gReferenceShelf</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$referenceNames[0]"></td>\n);
		print "<td>Enter a $gReferenceShelf term</td>\n";
		print "</tr>\n";
		print "<!--  U R L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">URL</td>\n);
		print qq(<td align="left"><input type="text" name="url" size="45" value="$referenceURLs[0]"></td>\n);
		print "<td>What is the URL?</td>\n";
		print "</tr>\n";
		print "<!--  L C D -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">LCD</td>\n);
		
		if ($referenceLCDs[0]) {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1" checked></td>\n);
		}
		else {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
		}
		
		print "<td>LCD Resource?</td>\n";
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="40">$referenceNotes[0]</textarea></td>\n);
		print "<td>Enter a scope note</td>\n";
		print "</tr>\n";
	
		# get and display all the previouslyu selected disciplines
		&displayAllSelectedDisciplines ($id, 'items4DisReference', 'reference_id');
	
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}

}
	
	
sub updateReference {

	# get the input
	my $id            = $input->param('id');
	my $name          = $gDBhandle->quote($input->param('name'));
	my $url           = $input->param('url');
	my $note          = $gDBhandle->quote($input->param('note'));
	my @disciplineIDs = $input->param('disciplineIDs');
	my $lcd           = $input->param('lcd');
	my $fkey          = $input->param('fkey');
	
	# get today's date
	my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));
	
	# create the query and update the database
	my $q = qq(UPDATE reference
	           SET reference_name = $name,
	               reference_url  = '$url',
	               reference_note = $note,
	               reference_date = '$today',
	               reference_lcd  = '$lcd',
	               reference_fkey = '$fkey'
	           WHERE reference_id = '$id');
	&prepareAndExecuteSQL ($q);
	
	# delete old join relationships
	$q = qq(DELETE FROM items4DisReference WHERE reference_id = '$id');
	&prepareAndExecuteSQL ($q);
	
	# update items for disclines
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		$q = qq(INSERT INTO items4DisReference (discipline_id, reference_id)
		        VALUES ('$disciplineIDs[$i]', '$id'));
		&prepareAndExecuteSQL($q);
		
	}

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (157, 1);
	
}


####################
# qsearches admin  #
####################

sub editQSearch {

	# get the input
	my $id   = $input->param('id');
	my $name = $input->param('name');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (231, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editQSearch">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	# check for the name's existance
	elsif (! $name)  {
	
		# find the record to edit
		my $q = qq(select * from qsearches where qsearch_id = "$id");
		&findAllQSearches($q);

		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (232, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editQSearch">\n);
		print qq(<input type="hidden" name="id" value="$qSearchIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$qSearchIDs[0]</td>\n);
		print "<td>Record number</td>\n";
		print "</tr>\n";
		print "<!--  D A T E  -->";
		print "<tr>\n";
		print qq(<td align="right">Date</td>\n);
		print qq(<td align="left">$qSearchDates[0]</td>\n);
		print "<td>Last modified</td>\n";
		print "</tr>\n";
		print "<!--  F O R G I E N  K E Y  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">F Key</td>\n);
		print qq(<td align="left"><input type="text" name="fkey" size="45" value="$qSearchFKeys[0]"></td>\n);
		print "<td>Foreign key</td>\n";
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">$gQuickSearches</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$qSearchNames[0]"></td>\n);
		print "<td>Enter a $gQuickSearches term</td>\n";
		print "</tr>\n";
		print "<!--  U R L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">URL</td>\n);
		print qq(<td align="left"><input type="text" name="url" size="45" value="$qSearchURLs[0]"></td>\n);
		print "<td>What is the URL?</td>\n";
		print "</tr>\n";
		print "<!--  P R E F I X  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Prefix</td>\n);
		print qq(<td align="left"><input type="text" name="prefix" value="$qSearchPrefixes[0]" size="45"></td>\n);
		print "<td>What is the prefix of the engine?</td>\n";
		print "</tr>\n";
		print "<!--  S U F F I X  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Suffix</td>\n);
		print qq(<td align="left"><input type="text" name="suffix" value="$qSearchSuffixes[0]" size="45"></td>\n);
		print "<td>What is the suffix of the engine?</td>\n";
		print "</tr>\n";
		print "<!--  L C D -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">LCD</td>\n);
		
		if ($qSearchLCDs[0]) {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1" checked></td>\n);
		}
		else {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
		}
		
		print "<td>LCD Resource?</td>\n";
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="45">$qSearchNotes[0]</textarea>\n);
		print "<td>Enter a scope note</td>\n";
		print "</tr>\n";
	
		# get and display all the previouslyu selected disciplines
		&displayAllSelectedDisciplines ($id, "items4DisQSearches", "qsearch_id");
	
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}
	
	else {
	
		# get the rest of the input
		my $name          = $gDBhandle->quote($input->param('name'));
		my $url           = $input->param('url');
		my $prefix        = $input->param('prefix');
		my $suffix        = $input->param('suffix');
		my $note          = $gDBhandle->quote($input->param('note'));
		my @disciplineIDs = $input->param('disciplineIDs');
		my $lcd           = $input->param('lcd');
		my $fkey          = $input->param('fkey');
		
		# get today's date
		my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));
	
		# create the query and update the database
		my $q = qq(UPDATE qsearches
		           SET qsearch_name = $name,
	                   qsearch_url  = '$url',
	                   prefix       = '$prefix',
	                   suffix       = '$suffix',
	                   note         = $note,
	                   qsearch_date = '$today',
	                   qsearch_lcd  = '$lcd',
	                   qsearch_fkey = '$fkey'
	               WHERE qsearch_id = '$id');
		&prepareAndExecuteSQL ($q);
	
		# delete any old join relationships
		$q = qq(DELETE FROM items4DisQSearches WHERE qsearch_id = '$id');
		&prepareAndExecuteSQL ($q);
	
		# update items for disclines
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
			$q = qq(INSERT INTO items4DisQSearches (discipline_id, qsearch_id)
			        VALUES ('$disciplineIDs[$i]', '$id'));
			&prepareAndExecuteSQL($q);
		
		}

		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (233, 1);
	
	}

}
	

sub findQSearch {

	# get the value of submit
	my $submit = $input->param('submit');

	# branch according to submit's existance
	if (! $submit) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (229, 1);
	
		# display the search form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="findQSearch">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print "</tr>\n";
		print "<!--  O P E R A T O R  -->\n";
		print qq (<tr valign="top">\n);
		print qq(<td align="right">Operator</td>\n);
		print qq(<td align="left">\n);
		print qq(<select name="searchOperator">\n);
		print qq(<option value="=">is\n);
		print qq(<option value="like" selected>like\n);
		print "</select>\n";
		print "</td>\n";
		print "<td>Select an operator</td>\n";
		print "</tr>\n";
		print "<!--  S E A R C H  S T R I N G  -->\n";
		print qq (<tr valign="top">\n);
		print qq(<td align="right">Search string</td>\n);
		print qq(<td align="left">\n);
		print qq(<input type="text" name="searchString" value="%">\n);
		print "</td>";
		print "<td>Enter a query term</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" name="submit" value="Cerca"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}
	
	else {
	
		# get the input
		my $searchOperator = $input->param('searchOperator');
		my $searchString = $input->param('searchString');
	
		# INSERT ERROR CHECKING HERE!
	
		# create a query and execute it
		my $q = qq(select *
	              from qsearches
	              where qsearch_name $searchOperator "$searchString"
	              order by qsearch_name);
		&findAllQSearches($q);

		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (230, 1);
	
		# display the results
		&displayTabledQSearchesOutput;
		
	}
	
}
	

sub deleteQSearch {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (235, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteQSearch">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Elimina"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the reference from the reference table
		my $q = qq(delete from qsearches where qsearch_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(delete from items4qsearches where qsearch_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(delete from items4DisQSearches where qsearch_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header();

		# start the html
		&displaySimpleHelpMessage (236, 1);
	
	}

}
	

sub displayQSearchesMenu {

	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (234, 1);
	
	# display the menu
	print qq(<ol>);
	print qq(<li><a href="./?cmd=createQSearch">Create a $gQuickSearches resource</a>);
	print qq(<li><a href="./?cmd=findQSearch">Find and then edit or delete a $gQuickSearches resource</a>);
	print qq(<li><a href="./?cmd=editQSearch">Edit a $gQuickSearches item</a>);
	print qq(<li><a href="./?cmd=deleteQSearch">Delete a $gQuickSearches item</a>);
	print qq(</ol>);
	
}


sub createQSearch {

	# get the value of submit
	my $submit = $input->param('submit');
	
	# branch according to submit's existance
	if (! $submit) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (227, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="createQSearch">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  F O R G I E N  K E Y  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">F Key</td>\n);
		print qq(<td align="left"><input type="text" name="fkey" size="45"></td>\n);
		print "<td>Foreign key</td>\n";
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">$gQuickSearches</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
		print "<td>Enter a $gQuickSearches name</td>\n";
		print "</tr>\n";
		print "<!--  U R L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">URL</td>\n);
		print qq(<td align="left"><input type="text" name="url" size="45"></td>\n);
		print "<td>What is the URL of this $gQuickSearches</td>\n";
		print "</tr>\n";
		print "<!--  P R E F I X  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Prefix</td>\n);
		print qq(<td align="left"><input type="text" name="prefix" size="45"></td>\n);
		print "<td>What is the prefix of the engine?</td>\n";
		print "</tr>\n";
		print "<!--  S U F F I X  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Suffix</td>\n);
		print qq(<td align="left"><input type="text" name="suffix" size="45"></td>\n);
		print "<td>What is the suffix of the engine?</td>\n";
		print "</tr>\n";
		print "<!--  L C D -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">LCD</td>\n);
		print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
		print "<td>LCD Resource?</td>\n";
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="45"></textarea>\n);
		print "<td>Enter a scope note</td>\n";
		print "</tr>\n";
	
		# get and display all the disciplines
		&displayAllDisciplines;
	
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" name="submit" value="Crea"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}
	
	else {
	
		# get the input
		my $name          = $gDBhandle->quote($input->param('name'));
		my $url           = $input->param('url');
		my $prefix        = $input->param('prefix');
		my $suffix        = $input->param('suffix');
		my $note          = $gDBhandle->quote($input->param('note'));
		my @disciplineIDs = $input->param('disciplineIDs');
		my $lcd           = $input->param('lcd');
		my $fkey          = $input->param('fkey');

		# INSERT ERROR CHECKING HERE!
	
		# get today's date
		my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));
	
		# get a new sequence
		my $sequence = getNewSequence();
	
		# create a query to update the database and update it
		my $q = qq{INSERT INTO qsearches (qsearch_id, qsearch_name, qsearch_url, prefix, suffix, note, qsearch_date, qsearch_lcd, qsearch_fkey)
	               VALUES ($sequence, $name, '$url', '$prefix', '$suffix', $note, '$today', '$lcd', '$fkey')};
		&prepareAndExecuteSQL($q);
		
		# find the record just added
		$q = qq(SELECT * FROM qsearches WHERE qsearch_id = '$sequence');
		&findAllQSearches($q);
	
		# update discipline descriptions
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
			$q = qq(INSERT INTO items4DisQSearches (discipline_id, qsearch_id)
			        VALUES ('$disciplineIDs[$i]', '$qSearchIDs[0]'));
			&prepareAndExecuteSQL($q);
		
		}
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (228, 1);
	
		# display it for confirmation
		&displayTabledQSearchesOutput;
	
	}
		
}


sub displayTabledQSearchesOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>$gQuickSearches</b></td>\n);
	print qq(<td align="left"><b>Date</b></td>\n);
	print "<td><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#qSearchIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$qSearchIDs[$i]</td>\n);
		print qq(<td align="left"><a href="$qSearchURLs[$i]">$qSearchNames[$i]</a></td>\n);
		print qq(<td align="left"i>$qSearchDates[$i]</td>\n);
		print qq(<td><a href="./?cmd=editQSearch&id=$qSearchIDs[$i]">Edit</a> or <a href="./?cmd=deleteQSearch&id=$qSearchIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		
	}
		
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}


################
# preferences  #
################

sub setPreferences {

	# get the value of submit
	my $submit = $input->param('submit');

	# branch according to value
	if (! $submit) {
	
		# start the output
		print $output->header();

		# start the html
		&displaySimpleHelpMessage (225, 1);
		
		# begin the form
		print "<center>";
		print "<p>";
		print "<form action=./ method=POST>";
		print "<input type=hidden name=cmd value=setPreferences>";
		print "<table border=1>";
		print "<tr>";
		print "<td align=right><B>Item</B></td>";
		print "<td><B>Setting</B></td>";
		print "<td><B>Note</B></td>";
		print "</tr>";
		
		# page look and feel
		print "<tr bgcolor=silver><td colspan=3>User page look and feel</td></tr>";
		
		# define TABLE WIDTH
		print "<tr>";
		print "<td align=right>Table width</td>";
		print "<td><input type=text name=tableWidth value='$gTableWidth'></td>";
		print "<td>How wide, in pixels, is the user page?</td>";
		print "</tr>";
		
		# default title of user's page
		print "<tr>";
		print "<td align=right>Page title</td>";
		print "<td><input type=text name=gPage_title value='$gPage_title'></td>";
		print "<td>What is the default title of the patron's page?</td>";
		print "</tr>";
	
		# find all the USER templates	
		my $q = "select * from templates order by template_name";
		&findAllTemplates ($q);

		# build the labels for the select statement
		for ($i=0; $i < $#templateIDs+1; $i++) { $templateLabels{$templateIDs[$i]} = $templateNames[$i]; }

		# default template
		print "<tr>";
		print "<td align=right>Template</td>";
		print "<td>";
		print $output->popup_menu(-name => 'gTemplateID', -value => \@templateIDs, -default => "$gTemplateID", -labels => \%templateLabels);
		print "</td>";
		print "<td>What is the default template?</td>";
		print "</tr>";
	    
		# find all the FREE templates	
		my $q = "select * from templates_free order by template_free_name";
		&findAllFreeTemplates ($q);

		# build the labels for the select statement
		for ($i=0; $i < $#templateFreeIDs+1; $i++) { $templateFreeLabels{$templateFreeIDs[$i]} = $templateFreeNames[$i]; }

		# default TEMPLATE
		print "<tr>";
		print "<td align=right>Free template</td>";
		print "<td>";
		print $output->popup_menu(-name => 'gTemplateFreeID', -value => \@templateFreeIDs, -default => "$gTemplateFreeID", -labels => \%templateFreeLabels);
		print "</td>";
		print "<td>What is the default free template?</td>";
		print "</tr>";
	    
		# find all the colors	
		my $q = "select * from colors order by color_name";
		&findAllColors ($q);

		# build the labels for the select statement
		for ($i=0; $i < $#colorId+1; $i++) { $labels{$colorId[$i]} = $colorNames[$i]; }

		# default BANNER COLOR
		print "<tr>";
		print "<td align=right>Banner color</td>";
		print "<td>";
		print $output->popup_menu(-name => 'gColor_banner_id', -value => \@colorId, -default => "$gColor_banner_id", -labels => \%labels);
		print "</td>";
		print "<td>Default banner color</td>";
		print "</tr>";
	    
		# default BACKGROUND COLOR
		print "<tr>";
		print "<td align=right>Background color</td>";
		print "<td>";
		print $output->popup_menu(-name => 'gColor_bg_id', -value => \@colorId, -default => "$gColor_bg_id", -labels => \%labels);
		print "</td>";
		print "<td>Default background color</td>";
		print "</tr>";
	    
		# default TEXT COLOR
		print "<tr>";
		print "<td align=right>Text color</td>";
		print "<td>";
		print $output->popup_menu(-name => 'gColor_text_id', -value => \@colorId, -default => "$gColor_text_id", -labels => \%labels);
		print "</td>";
		print "<td>Default text color</td>";
		print "</tr>";
	    
		# default LINK COLOR
		print "<tr>";
		print "<td align=right>Link color</td>";
		print "<td>";
		print $output->popup_menu(-name => 'gColor_link_id', -value => \@colorId, -default => "$gColor_link_id", -labels => \%labels);
		print "</td>";
		print "<td>Default link color</td>";
		print "</tr>";
	    
		# default ACTIVE LINK COLOR
		print "<tr>";
		print "<td align=right>Active link color</td>";
		print "<td>";
		print $output->popup_menu(-name => 'gColor_alink_id', -value => \@colorId, -default => "$gColor_alink_id", -labels => \%labels);
		print "</td>";
		print "<td>Default active link color</td>";
		print "</tr>";
	    
		# default VISITED LINK COLOR
		print "<tr>";
		print "<td align=right>Visited link color</td>";
		print "<td>";
		print $output->popup_menu(-name => 'gColor_vlink_id', -value => \@colorId, -default => "$gColor_vlink_id", -labels => \%labels);
		print "</td>";
		print "<td>Default visited link color</td>";
		print "</tr>";

		# define MESSAGE FROM THE LIBRARIAN
		print "<tr>";
		print "<td align=right>$gMessageFromTheLibrarian</td>";
		print "<td><input type=text name=gMessageFromTheLibrarian value='$gMessageFromTheLibrarian'></td>";
		print "<td>What do you want to call $gMessageFromTheLibrarian?</td>";
		print "</tr>";
		
		# librarian stuff
		print "<tr bgcolor=silver><td colspan=3>Librarians</td></tr>";
		
		# define LIBRARIANS
		print "<tr>";
		print "<td align=right>$gYourLibrarians</td>";
		print "<td><input type=text name=gYourLibrarians value='$gYourLibrarians'></td>";
		print "<td>What do you want to call $gYourLibrarians?</td>";
		print "</tr>";
		
		# show COLLECTION MANAGERS
		print "<tr>";
		print "<td align=right>Collection managers</td>";
		print "<td>";
		if ($gShowCollectionManagers) {
		
			print "<input type=radio name=gShowCollectionManagers value=1 checked>Yes ";
			print "<input type=radio name=gShowCollectionManagers value=0>No";
			
		}
		
		else {
		
			print "<input type=radio name=gShowCollectionManagers value=1>Yes ";
			print "<input type=radio name=gShowCollectionManagers value=0 checked>No";
			
		}
		
		print "</td>";
		print "<td>Do you want to show the collection managers?</td>";
		print "</tr>";
		
		# COLLECTION MANAGERS BLURB
		print "<tr>";
		print "<td align=right>Collection manager blurb</td>";
		print "<td><input type=text name=gManagerBlurb value='$gManagerBlurb'></td>";
		print "<td>What is your collection manager blurb?</td>";
		print "</tr>";
		
		# show LIBREF
		print "<tr>";
		print "<td align=right>Library Reference</td>";
		print "<td>";
		if ($gShowLibRef) {
		
			print "<input type=radio name=gShowLibRef value=1 checked>Yes ";
			print "<input type=radio name=gShowLibRef value=0>No";
			
		}
		
		else {
		
			print "<input type=radio name=gShowLibRef value=1>Yes ";
			print "<input type=radio name=gShowLibRef value=0 checked>No";
			
		}
		
		print "</td>";
		print "<td>Do you want to show the links to library reference?</td>";
		print "</tr>";
		
		# REFERENCE LIBRARIAN BLURB
		print "<tr>";
		print "<td align=right>Reference Librarian blurb</td>";
		print "<td><input type=text name=gLibrarianBlurb value='$gLibrarianBlurb'></td>";
		print "<td>What is your reference librarian blurb?</td>";
		print "</tr>";
		
		# define LIBREF EMAIL
		print "<tr>";
		print "<td align=right>Generic service</td>";
		print "<td><input type=text name=gGenericBlurb value='$gGenericBlurb'></td>";
		print "<td>What text points to your generic information service?</td>";
		print "</tr>";
		
		# resources stuff
		print "<tr bgcolor=silver><td colspan=3>Resources</td></tr>";
		
		# define LIBRARY LINKS
		print "<tr>";
		print "<td align=right>$gLibraryLinks</td>";
		print "<td><input type=text name=gLibraryLinks value='$gLibraryLinks'></td>";
		print "<td>What do you want to call $gLibraryLinks?</td>";
		print "</tr>";
		
		# define UNIVERSITY LINKS
		print "<tr>";
		print "<td align=right>$gUniversityLinks</td>";
		print "<td><input type=text name=gUniversityLinks value='$gUniversityLinks'></td>";
		print "<td>What do you want to call $gUniversityLinks?</td>";
		print "</tr>";
		
		# define PERSONAL LINKS
		print "<tr>";
		print "<td align=right>$gPersonalLinks</td>";
		print "<td><input type=text name=gPersonalLinks value='$gPersonalLinks'></td>";
		print "<td>What do you want to call $gPersonalLinks?</td>";
		print "</tr>";
		
		# show QUICK SEARCHES
		print "<tr>";
		print "<td align=right>$gQuickSearches</td>";
		print "<td>";
		if ($gShowQuickSearches) {
		
			print "<input type=radio name=gShowQuickSearches value=1 checked>Yes ";
			print "<input type=radio name=gShowQuickSearches value=0>No";
			
		}
		
		else {
		
			print "<input type=radio name=gShowQuickSearches value=1>Yes ";
			print "<input type=radio name=gShowQuickSearches value=0 checked>No";
			
		}
		
		print "</td>";
		print "<td>Do you want to show $gQuickSearches?</td>";
		print "</tr>";
		
		# define QUICK SEARCHES
		print "<tr>";
		print "<td align=right>$gQuickSearches</td>";
		print "<td><input type=text name=gQuickSearches value='$gQuickSearches'></td>";
		print "<td>What do you want to call $gQuickSearches?</td>";
		print "</tr>";
		
		# define REFERENCE SHELF
		print "<tr>";
		print "<td align=right>$gReferenceShelf</td>";
		print "<td><input type=text name=gReferenceShelf value='$gReferenceShelf'></td>";
		print "<td>What do you want to call $gReferenceShelf?</td>";
		print "</tr>";
		
		# define BIBLIOGRAHIC DATABASES
		print "<tr>";
		print "<td align=right>$gBibliographicDatabaseLinks</td>";
		print "<td><input type=text name=gBibliographicDatabaseLinks value='$gBibliographicDatabaseLinks'></td>";
		print "<td>What do you want to call $gBibliographicDatabaseLinks?</td>";
		print "</tr>";
		
		# define ETEXTS
		print "<tr>";
		print "<td align=right>$gElectronicJournals</td>";
		print "<td><input type=text name=gElectronicJournals value='$gElectronicJournals'></td>";
		print "<td>What do you want to call $gElectronicJournals?</td>";
		print "</tr>";
		
		# CAM stuff
		print "<tr bgcolor=silver><td colspan=3>Current Awareness Manager</td></tr>";
		
		# show CURRENT AWARENESS MANAGER
		print "<tr>";
		print "<td align=right>Show $gCurrentAwarenessManager</td>";
		print "<td>";
		if ($gShowCAM) {
		
			print "<input type=radio name=gShowCAM value=1 checked>Yes ";
			print "<input type=radio name=gShowCAM value=0>No";
			
		}
		
		else {
		
			print "<input type=radio name=gShowCAM value=1>Yes ";
			print "<input type=radio name=gShowCAM value=0 checked>No";
			
		}
		
		print "</td>";
		print "<td>Do you want to show the $gCurrentAwarenessManager?</td>";
		print "</tr>";
		
		# define CURRENT AWARENESS MANAGER
		print "<tr>";
		print "<td align=right>$gCurrentAwarenessManager</td>";
		print "<td><input type=text name=gCurrentAwarenessManager value='$gCurrentAwarenessManager'></td>";
		print "<td>What do you want to call $gCurrentAwarenessManager?</td>";
		print "</tr>";
		
		# define MARION
		print "<tr>";
		print "<td align=right>URL root</td>";
		print "<td><input type=text name=gMarion value='$gMarion'></td>";
		print "<td>What is URL root of a known item search?</td>";
		print "</tr>";
		
		# define FROM ADDRESS
		print "<tr>";
		print "<td align=right>$gCurrentAwarenessManager email</td>";
		print "<td><input type=text name=gFromAddress value='$gFromAddress'></td>";
		print "<td>What is the email address sending $gCurrentAwarenessManager?</td>";
		print "</tr>";
		
		# other stuff
		print "<tr bgcolor=silver><td colspan=3>Static page creation</td></tr>";
		
		# show STATIC PAGE CREATION ON OR OFF
		print "<tr>";
		print "<td align=right>Static page creation</td>";
		print "<td>";
		
		if ($gShowStaticPageCreation) {
		
			print "<input type=radio name=gShowStaticPageCreation value=1 checked>Yes ";
			print "<input type=radio name=gShowStaticPageCreation value=0>No";
			
		}
		
		else {
		
			print "<input type=radio name=gShowStaticPageCreation value=1>Yes ";
			print "<input type=radio name=gShowStaticPageCreation value=0 checked>No";
			
		}
		
		print "</td>";
		print "<td>Do you want to turn on the static page creation option?</td>";
		print "</tr>";
				
		# other stuff
		print "<tr bgcolor=silver><td colspan=3>Other stuff</td></tr>";
		
		# show MANAGE DISCIPLINE
		print "<tr>";
		print "<td align=right>Manage discipline</td>";
		print "<td>";
		if ($gManageDiscipline) {
		
			print "<input type=radio name=gManageDiscipline value=1 checked>Yes ";
			print "<input type=radio name=gManageDiscipline value=0>No";
			
		}
		
		else {
		
			print "<input type=radio name=gManageDiscipline value=1>Yes ";
			print "<input type=radio name=gManageDiscipline value=0 checked>No";
			
		}
		
		print "</td>";
		print "<td>Do you want use the experimental 'Manage discipline' option?</td>";
		print "</tr>";
		
		# save STATISTICS
		print "<tr>";
		print "<td align=right>Save statistics</td>";
		print "<td>";
		if ($gSaveStatistics) {
		
			print "<input type=radio name=gSaveStatistics value=1 checked>Yes ";
			print "<input type=radio name=gSaveStatistics value=0>No";
			
		}
		
		else {
		
			print "<input type=radio name=gSaveStatistics value=1>Yes ";
			print "<input type=radio name=gSaveStatistics value=0 checked>No";
			
		}
		
		print "</td>";
		print "<td>Do you want to save usage statistics?</td>";
		print "</tr>";
		
		# define COOKIE EXPIRES
		print "<tr>";
		print "<td align=right>Cookie expires</td>";
		print "<td><input type=text name=gExpires value='$gExpires'></td>";
		print "<td>How long 'till cookies expire? (See CGI.pm)</td>";
		print "</tr>";
		
		# end the table and the form
		print "</table>";
		print "</p>";
		print "<p>";
		print "<input type=submit name=submit value=Set> <input type=reset>";
		print "</form>";
		print "</p>";
		print "</center>";

	}
	
	else {
	
		# get the form's contents
		my $gShowCollectionManagers     = $input->param('gShowCollectionManagers');
		my $gShowQuickSearches          = $input->param('gShowQuickSearches');
		my $gPersonalLinks              = $input->param('gPersonalLinks');
		my $gReferenceShelf             = $input->param('gReferenceShelf');
		my $gBibliographicDatabaseLinks = $input->param('gBibliographicDatabaseLinks');
		my $gElectronicJournals         = $input->param('gElectronicJournals');
		my $gYourLibrarians             = $input->param('gYourLibrarians');
		my $gMessageFromTheLibrarian    = $input->param('gMessageFromTheLibrarian');
		my $gLibraryLinks               = $input->param('gLibraryLinks');
		my $gUniversityLinks            = $input->param('gUniversityLinks');
		my $gCurrentAwarenessManager    = $input->param('gCurrentAwarenessManager');
		my $gQuickSearches              = $input->param('gQuickSearches');
		my $gShowLibRef                 = $input->param('gShowLibRef');
		my $gGenericBlurb               = $input->param('gGenericBlurb');
		my $gFromAddress                = $input->param('gFromAddress');
		my $gShowCAM                    = $input->param('gShowCAM');
		my $gMarion                     = $input->param('gMarion');
		my $gFromAddress                = $input->param('gFromAddress');
		my $gExpires                    = $input->param('gExpires');
		my $gTableWidth                 = $input->param('tableWidth');
		my $gPage_title                 = $input->param('gPage_title');
		my $gColor_banner_id            = $input->param('gColor_banner_id');
		my $gColor_bg_id                = $input->param('gColor_bg_id');
		my $gColor_text_id              = $input->param('gColor_text_id');
		my $gColor_link_id              = $input->param('gColor_link_id');
		my $gColor_alink_id             = $input->param('gColor_alink_id');
		my $gColor_vlink_id             = $input->param('gColor_vlink_id');
		my $gSaveStatistics             = $input->param('gSaveStatistics');
		my $gManageDiscipline           = $input->param('gManageDiscipline');
		my $gShowStaticPageCreation     = $input->param('gShowStaticPageCreation');		
		my $gManagerBlurb               = $input->param('gManagerBlurb');		
		my $gLibrarianBlurb             = $input->param('gLibrarianBlurb');		
		my $gTemplateID                 = $input->param('gTemplateID');		
		my $gTemplateFreeID             = $input->param('gTemplateFreeID');		

		# update the database
		my $q = "UPDATE preferences SET show_collection_managers = '$gShowCollectionManagers',
		                                show_quick_searches      = '$gShowQuickSearches',
		                                personal_links           = '$gPersonalLinks',
		                                reference_shelf          = '$gReferenceShelf',
		                                bibliographic_databases  = '$gBibliographicDatabaseLinks',
		                                etexts                   = '$gElectronicJournals',
		                                your_librarians          = '$gYourLibrarians',
		                                messsage_from_librarian  = '$gMessageFromTheLibrarian',
		                                library_links            = '$gLibraryLinks',
		                                university_links         = '$gUniversityLinks',
		                                current_awareness        = '$gCurrentAwarenessManager',
		                                quick_searches           = '$gQuickSearches',
		                                show_libref              = '$gShowLibRef',
		                                generic_blurb            = '$gGenericBlurb',
		                                show_cam                 = '$gShowCAM',
		                                marion                   = '$gMarion',
		                                from_address             = '$gFromAddress',
		                                expires                  = '$gExpires',
		                                table_width              = '$gTableWidth',
		                                page_title               = '$gPage_title',
		                                color_banner             = '$gColor_banner_id',
		                                color_background         = '$gColor_bg_id',
		                                color_text               = '$gColor_text_id',
		                                color_link               = '$gColor_link_id',
		                                color_alink              = '$gColor_alink_id',
		                                color_vlink              = '$gColor_vlink_id',
		                                save_statistics          = '$gSaveStatistics',
		                                manage_discipline        = '$gManageDiscipline',
		                                static_pages_show        = '$gShowStaticPageCreation',
		                                manager_blurb            = '$gManagerBlurb',
		                                librarian_blurb          = '$gLibrarianBlurb',
		                                templateID               = '$gTemplateID',
		                                template_free_ID         = '$gTemplateFreeID'";
		&prepareAndExecuteSQL ($q);

		# start the output
		print $output->header();

		# start the html
		&displaySimpleHelpMessage (226, 1);
			
	}	

}


###############
# patrons     #
###############


sub impersonatePatron {

	# get my input
	my $id = $input->param('id');
		
	# get the patron's record
	my $q = qq(select * from patrons where patron_id = "$id");
	&findPatrons($q);
	
	# extract the parts from the patron's record that I want
	my $patronId    = "$patronRecord->{patron_id}";
	my $firstName   = "$patronRecord->{name_f}";
	my $lastName    = "$patronRecord->{name_l}";
	my $email       = "$patronRecord->{email}";
	my $browser     = "$patronRecord->{browser}";
	my $remoteIP    = "$patronRecord->{remote_ip}";
	my $remoteName  = "$patronRecord->{remote_name}";
	my $lastVisit   = "$patronRecord->{last_visit}";
	my $totalVisits = "$patronRecord->{total_visits}";
	my $phone       = "($patronRecord->{telephone_area}) $patronRecord->{telephone_number_start}-$patronRecord->{telephone_number_end}";	
	if ($patronRecord->{can_contact} eq 0) { $canContact = "No"}
	else {$canContact = "Yes"}
	
	# find their discipline
	$q = qq(select discipline_name from disciplines where discipline_id = "$patronRecord->{discipline_id}");
	&findAllDisciplines($q);
	
	# give myself their cookie
	$cookie = $output->cookie(-name    => 'uid',
	                          -value   => "$id",
	                          -path    => "/",
	                          -domain  => "$gHost");
	
	# start the output
	print $output->header(-cookie => $cookie);
	
	# start the html
	&displaySimpleHelpMessage (219, 1);

	# build a pretty table with the output
	print qq(<center>);
	print qq(<table border=1>);
	print qq(<tr>);
	print qq(<td align="right"><b>Field</b></td>);
	print qq(<td><b>Value</b></td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<td align="right">ID</td>);
	print qq(<td>$patronId</td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<td align="right">First name</td>);
	print qq(<td>$firstName</td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<td align="right">Last name</td>);
	print qq(<td>$lastName</td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<td align="right">Email</td>);
	print qq(<td><a href="mailto:$email">$email</a></td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<td align="right">Browser</td>);
	print qq(<td>$browser</td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<tr>);
	print qq(<td align="right">Remote IP</td>);
	print qq(<td>$remoteIP</td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<tr>);
	print qq(<td align="right">Remote name</td>);
	print qq(<td>$remoteName</td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<tr>);
	print qq(<td align="right">Last visit</td>);
	print qq(<td>$lastVisit</td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<tr>);
	print qq(<td align="right">Total visits</td>);
	print qq(<td>$totalVisits</td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<td align="right">Can contact</td>);
	print qq(<td>$canContact</td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<td align="right">Phone</td>);
	print qq(<td>$phone</td>);
	print qq(</tr>);
	print qq(<tr>);
	print qq(<td align="right">Discipline</td>);
	print qq(<td>$disciplineNames[0]</td>);
	print qq(</tr>);
	print qq(</table>);
	print qq(</center>);
	

}

	
sub displayPatronsMenu {

	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (63, 1);
	
	print qq(<ol>);
	print qq(<li><a href="./?cmd=displayPatronsFindForm">Find and then impersonate or delete a patron</a>);
	print qq(<li><a href="./?cmd=editPatrons">Edit patron</a>);
	#print qq(<li><a href="./?cmd=deletePatrons">Delete patron</a>);
	print qq(</ol>);
	
	}


sub displayTabledPatronsOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>Patrons</b></td>\n);
	print "<td colspan=2><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i; $i <= $#patrons4ManageIDs; $i++) {
		print "<tr>\n";
		print qq(<td align="right">$patrons4ManageIDs[$i]</td>\n);
		print qq(<td align="left">$patrons4ManageLast[$i], $patrons4ManageFirst[$i] ($patrons4ManageUsername[$i], $patrons4ManageEmail[$i])</td>\n);
		print qq(<td><a href="./?cmd=editPatrons&id=$patrons4ManageIDs[$i]">Edit</a> or <a href="./?cmd=deletePatrons&id=$patrons4ManageIDs[$i]">Delete</a></td>\n);
		print qq(<td><a href="./?cmd=impersonatePatron&id=$patrons4ManageIDs[$i]">Impersonate patron</a> or <a href="./?cmd=deletePatrons&id=$patrons4ManageIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		}
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
	}
	

sub displayPatronsFindForm {

	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (64, 1);
	
	# display the search form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="displayPatronsSearchResults">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print "</tr>\n";

	print "<!--  S E A R C H  F E I L D  -->\n";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Field</td>\n);
	print qq(<td align="left">\n);
	print qq(<select name="searchField">\n);
	print qq(<option value="name_f" selected>first name\n);
	print qq(<option value="name_l">last name\n);
	print qq(<option value="email">email address\n);
	print qq(</select>\n);
	print qq(</td>\n);
	print qq(<td>Instructions go here.</td>\n);
	print qq(</tr>\n);

	print "<!--  O P E R A T O R  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Operator</td>\n);
	print qq(<td align="left">\n);
	print qq(<select name="searchOperator">\n);
	print qq(<option value="=">is\n);
	print qq(<option value="like" selected>like\n);
	print "</select>\n";
	print "</td>\n";
	print "<td>Select an operator</td>\n";
	print "</tr>\n";

	print "<!--  S E A R C H  S T R I N G  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Search string</td>\n);
	print qq(<td align="left">\n);
	print qq(<input type="text" name="searchString" value="%">\n);
	print "</td>";
	print "<td>Enter a query term</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Cerca"> \n);
	print qq(<input type="reset" value="Azzera">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
	}
	

sub displayPatronsSearchResults {

	# get the input
	my $searchField    = $input->param('searchField');
	my $searchOperator = $input->param('searchOperator');
	my $searchString   = $input->param('searchString');
	
	# INSERT ERROR CHECKING HERE!
	
	# create a query and execute it
	my $q = qq(select *
	           from patrons
	           where $searchField $searchOperator "$searchString"
	           order by name_l, name_f);
	&findPatrons4Manage($q);

	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (66, 1);
	

	# display the results
	&displayTabledPatronsOutput;
	
	}
	

sub deletePatrons {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (67, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deletePatrons">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Elimina"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
		}

	else {
	
		# delete the patron from the patron table
		my $q = qq(delete from patrons where patron_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from each of the join tables; clean up
		$q = qq(delete from items4bibdatabases where patron_id = '$id');
		&prepareAndExecuteSQL($q);
		$q = qq(delete from items4etexts where patron_id = '$id');
		&prepareAndExecuteSQL($q);
		$q = qq(delete from items4libraries where patron_id = '$id');
		&prepareAndExecuteSQL($q);
		$q = qq(delete from items4qsearches where patron_id = '$id');
		&prepareAndExecuteSQL($q);
		$q = qq(delete from items4references where patron_id = '$id');
		&prepareAndExecuteSQL($q);
		$q = qq(delete from items4university where patron_id = '$id');
		&prepareAndExecuteSQL($q);
		$q = qq(delete from items4references where patron_id = '$id');
		&prepareAndExecuteSQL($q);
		$q = qq(delete from personallinks where patron_id = '$id');
		&prepareAndExecuteSQL($q);
		$q = qq(delete from profiles where patron_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (68, 1);
	

		}

	}
	
sub editPatrons {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (69, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editPatrons">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
		}

	else {
	
		# find the record to edit
		$q = qq(select * from patrons where patron_id = "$id");
		&findPatrons($q);
		
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (70, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updatePatrons">\n);
		print qq(<input type="hidden" name="id" value="$patronRecord->{'patron_id'}">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$patronRecord->{'patron_id'}</td>\n);
		print "<td>Record number</td>\n";
		print "</tr>\n";
		print "<!--  F I R S T  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">First name</td>\n);
		print qq(<td align="left"><input type="text" name="name_f" size="45" value="$patronRecord->{'name_f'}"></td>\n);
		print "<td>Enter the patron's first name</td>\n";
		print "</tr>\n";
		print "<!--  L A S T  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Last name</td>\n);
		print qq(<td align="left"><input type="text" name="name_l" size="45" value="$patronRecord->{'name_l'}"></td>\n);
		print "<td>Enter the patron's last name</td>\n";
		print "</tr>\n";
		print "<!--  E M A I L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Email address</td>\n);
		print qq(<td align="left"><input type="text" name="email" size="45" value="$patronRecord->{'email'}"></td>\n);
		print "<td>What is their email address?</td>\n";
		print "</tr>\n";
		print "<!--  P A S S W O R D  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Password</td>\n);
		print qq(<td align="left"><input type="password" name="pwd_1" size="45" value="$patronRecord->{'password'}"></td>\n);
		print "<td>What is their new password?</td>\n";
		print "</tr>\n";
		print "<!--  P A S S W O R D,  E C H O E D  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Password again</td>\n);
		print qq(<td align="left"><input type="password" name="pwd_2" size="45" value="$patronRecord->{'password'}"></td>\n);
		print "<td>Retype new password</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
		}

	}
	
	
sub updatePatrons {

	# get the input
	my $id     = $input->param('id');
	my $name_f = $input->param('name_f');
	my $name_l = $input->param('name_l');
	my $email  = $input->param('email');
	my $pwd_1  = $input->param('pwd_1');
	my $pwd_2  = $input->param('pwd_2');
	
	# make sure the passwords match
	if ($pwd_1 ne $pwd_2) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (12, 1);
	
		# exit gracefully		
		&gracefulExit;
	
		}

        # Password is ok, crypt it for storage
        my $salt = (localtime)[0];
        my $crypted_pw = crypt($pwd_1, $salt);

	# create the query and update the database
	my $q = qq(update patrons set    name_f = '$name_f',
	                                 name_l = '$name_l',
	                                  email = '$email',
                                     password = '$crypted_pw'
	                        where patron_id = '$id');
	&prepareAndExecuteSQL ($q);
		
	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (71, 1);
	
	}


###############
# managers    #
###############

sub displayManagersMenu {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (72, 1);
	
	# display the menu
	print qq(<ol>);
	print qq(<li><a href="./?cmd=displayManagersInputForm">Create collection manager</a>);
	print qq(<li><a href="./?cmd=displayManagersFindForm">Find and then edit or delete a collection manager</a>);
	#print qq(<li><a href="./?cmd=editManagers">Edit manager</a>);
	#print qq(<li><a href="./?cmd=deleteManagers">Delete manager</a>);
	print qq(</ol>);
	
}
	

sub displayManagersInputForm {

	# get all the disciplines for later use
	my $q = "select * from disciplines order by discipline_name";
	&findAllDisciplines($q);

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (73, 1);
	
	# display the input form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="createManagers">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print qq(</tr>\n);
	print "<!--  N A M E  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Name</td>\n);
	print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
	print "<td>Enter the manager's name</td>\n";
	print "</tr>\n";
	print "<!--  E M A I L  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Email address</td>\n);
	print qq(<td align="left"><input type="text" name="email" size="45"></td>\n);
	print "<td>What is their email address?</td>\n";
	print "</tr>\n";
	print "<!--  T E L E P H O N E  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Telephone number</td>\n);
	print qq(<td align="left">\n);
	print qq(<input type="text" name="area" size="10" width="10" maxlength="10">\n);
	print qq(<input type="text" name="start" size="10" maxlength="10">\n);
	print qq(<input type="text" name="end" size="10" maxlength="10">\n);
	print qq(</td>\n);
	print "<td>Enter the telephone number?</td>\n";
	print "</tr>\n";
	print "<!--  U R L  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">URL</td>\n);
	print qq(<td align="left"><input type="text" name="url" size="45"></td>\n);
	print "<td>What is the URL of their home page?</td>\n";
	print "</tr>\n";
	print "<!--  D I S C I P L I N E S  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Disciplines</td>\n);
	print qq(<td align="left">\n);
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		print qq(<input type="checkbox" name="disciplineIDs" value="$disciplineIDs[$i]">$disciplineNames[$i]<br>\n);
		
	}
		
	print qq(</td>\n);
	print "<td>Select the disciplines.</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Crea"> \n);
	print qq(<input type="reset" value="Azzera">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}


sub createManagers {

	# get the input
	my $name          = $gDBhandle->quote($input->param('name'));
	my $email         = $input->param('email');
	my $area          = $input->param('area');
	my $start         = $input->param('start');
	my $end           = $input->param('end');
	my $url           = $input->param('url');
	my @disciplineIDs = $input->param('disciplineIDs');
	
	# INSERT ERROR CHECKING HERE!
	
	# get a new sequence
	my $sequence = getNewSequence();
	
	# create a query to update the database and update it
	my $q = qq{insert into managers (manager_id, name, telephone_area, telephone_start, telephone_end, email_address, url)
	           values ('$sequence', $name, '$area', '$start', '$end', '$email', '$url')};
	&prepareAndExecuteSQL($q);
		
	# find the record just added
	$q = qq(select * from managers where manager_id = '$sequence');
	&findCollectionManagers($q);
	
	# update items for disclines
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		$q = qq(insert into items4managers (discipline_id, manager_id) values ('$disciplineIDs[$i]', '$managerIDs[0]'));
		&prepareAndExecuteSQL($q);
		
	}
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (74, 1);
	
	# display it for confirmation
	&displayTabledManagersOutput;
	
}
	

sub displayTabledManagersOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>Managers</b></td>\n);
	print "<td><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#managerIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$managerIDs[$i]</td>\n);
		print qq(<td align="left"><a href="$managerURL[$i]">$managerNames[$i]</a></td>\n);
		print qq(<td><a href="./?cmd=editManagers&id=$managerIDs[$i]">Edit</a> or <a href="./?cmd=deleteManagers&id=$managerIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		
	}
		
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayManagersFindForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (75, 1);
	
	# display the search form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="displayManagersSearchResults">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print "</tr>\n";
	print "<!--  O P E R A T O R  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Operator</td>\n);
	print qq(<td align="left">\n);
	print qq(<select name="searchOperator">\n);
	print qq(<option value="=">is\n);
	print qq(<option value="like" selected>like\n);
	print "</select>\n";
	print "</td>\n";
	print "<td>Select an operator</td>\n";
	print "</tr>\n";
	print "<!--  S E A R C H  S T R I N G  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Search string</td>\n);
	print qq(<td align="left">\n);
	print qq(<input type="text" name="searchString" value="%">\n);
	print "</td>";
	print "<td>Enter a query term</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Cerca"> \n);
	print qq(<input type="reset" value="Azzera">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayManagersSearchResults {

	# get the input
	my $searchOperator = $input->param('searchOperator');
	my $searchString   = $input->param('searchString');
	
	# INSERT ERROR CHECKING HERE!
	
	# create a query and execute it
	my $q = qq(select *
	           from managers
	           where name $searchOperator "$searchString"
	           order by name);
	&findCollectionManagers($q);

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (76, 1);
	
	# display the results
	&displayTabledManagersOutput;
	
}
	

sub deleteManagers {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (77, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteManagers">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Elimina"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the manager from the manager table
		my $q = qq(delete from managers where manager_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(delete from items4managers where manager_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (78, 1);
	
	}

}
	
sub editManagers {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (79, 1);

		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editManagers">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# get all the disciplines for later use
		my $q = "select * from disciplines order by discipline_name";
		&findAllDisciplines($q);

		# find the record to edit
		$q = qq(select * from managers where manager_id = "$id");
		&findCollectionManagers($q);

		# find the linked items for managers
		$q = qq(select discipline_id
		        from items4managers
		        where manager_id = '$id');
		&findItems4Managers($q);
		
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (80, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updateManagers">\n);
		print qq(<input type="hidden" name="id" value="$managerIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$managerIDs[0]</td>\n);
		print "<td>Record number</td>\n";
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Name</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$managerNames[0]"></td>\n);
		print "<td>Enter the manager's name</td>\n";
		print "</tr>\n";
		print "<!--  E M A I L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Email address</td>\n);
		print qq(<td align="left"><input type="text" name="email" size="45" value="$managerEmailAddress[0]"></td>\n);
		print "<td>What is their email address?</td>\n";
		print "</tr>\n";
		print "<!--  T E L E P H O N E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Telephone number</td>\n);
		print qq(<td align="left">\n);
		print qq(<input type="text" name="area" size="10" width="10" maxlength="10" value="$managerTelephoneArea[0]">\n);
		print qq(<input type="text" name="start" size="10" maxlength="10" value="$managerTelephoneStart[0]">\n);
		print qq(<input type="text" name="end" size="10" maxlength="10" value="$managerTelephoneEnd[0]">\n);
		print qq(</td>\n);
		print "<td>Enter the telephone number?</td>\n";
		print "</tr>\n";
		print "<!--  U R L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">URL</td>\n);
		print qq(<td align="left"><input type="text" name="url" size="45" value="$managerURL[0]"></td>\n);
		print "<td>What is the URL of their home page?</td>\n";
		print "</tr>\n";
		print "<!--  D I S C I P L I N E S  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Disciplines</td>\n);
		print qq(<td align="left">\n);
		# process every discipline id
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
		
			# check to see if the reference was Previously Selected
			my $ps = 0;
			for $m (@I4ManagersIDs) { if ($disciplineIDs[$i] eq $m) { $ps = 1; last; } }

			if ($ps) {
			
				print qq(<input type="checkbox" name="disciplineIDs" value="$disciplineIDs[$i]" checked>$disciplineNames[$i]<br>\n);
				
			}
			
			else {
			
				print qq(<input type="checkbox" name="disciplineIDs" value="$disciplineIDs[$i]">$disciplineNames[$i]<br>\n);
				
			}
			
		}
			
		print qq(</td>\n);
		print "<td>Select the disciplines.</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}

}
	
	
sub updateManagers {

	# get the input
	my $id            = $input->param('id');
	my $name          = $input->param('name');
	my $email         = $input->param('email');
	my $area          = $input->param('area');
	my $start         = $input->param('start');
	my $end           = $input->param('end');
	my $url           = $input->param('url');
	my @disciplineIDs = $input->param('disciplineIDs');
	
	# create the query and update the database
	my $q = qq(update managers set name = '$name',
	                        email_address = '$email',
	                       telephone_area = '$area',
	                      telephone_start = '$start',
	                        telephone_end = '$end',
	                                  url = '$url'
	                  where manager_id  = '$id');
	&prepareAndExecuteSQL ($q);
	
	# delete any old item links 4 managers
	$q = qq(delete from items4managers where manager_id = '$id');
	&prepareAndExecuteSQL ($q);
	
	# update items for disclines
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		$q = qq(insert into items4managers (discipline_id, manager_id) values ('$disciplineIDs[$i]', '$id'));
		&prepareAndExecuteSQL($q);
		
	}
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (81, 1);

}



#######################
# manage disciplines  #
#######################

sub manageDiscipline {
	
	# start the output
	print $output->header();
	&displaySimpleHelpMessage(222, 1);

	# added simple help message 300 to help_simple table

	# get the selected discipline
	my $disc = $input->param('disc');
	$q = qq(SELECT * FROM disciplines WHERE discipline_id = $disc);
	&findAllDisciplines($q);

	print qq(<h2 align="center">$disciplineNames[0]</h2>\n);
	print qq(<table border="1"><tr><td valign="top" width=50%>);
	print "\n\n<!-- edit MOTD section -->\n\n";

	# get and/or motd
	my $m = $input->param('dmotd');
	if ($m) {

		$dmotd = $gDBhandle->quote($input->param('dmotd'));
	    my $q = qq (update disciplines set motd_text = $dmotd where discipline_id = "$disc");
	    &prepareAndExecuteSQL ($q);
	    
	}

	# display moth edit form
	&displaySimpleHelpMessage (103, 0);
	print qq(<form action="./" method="get">\n);
	print qq(<input type="hidden" name="cmd" value="manageDiscipline">\n);
	print qq(<input type="hidden" name="disc" value="$disc">\n);
	if ($m) { print qq(<p><big><font color="red">Message has been changed!</font></big></p>\n); }
	$q = qq(SELECT * FROM disciplines WHERE discipline_id = $disc);
	&findAllDisciplines($q);
	print qq (<textarea rows="13" cols="45" wrap="virtual" name="dmotd">);
	print $disciplineMOTDs[0];
	print qq(</textarea>\n);
	print qq(<br><input type="submit" value="Invia">\n);
	print qq(&nbsp;<input type="reset">\n);
	print "</form>\n";

	print "<!-- add resource section -->\n";

	# display form to create new resource
	&displaySimpleHelpMessage(223, 0);

	# get input
	my $n = $input->param('name');
	if ($n) {
	    
	    my $type = $input->param('type');
	    my $rec  = $input->param('rec');
	    my $name = $gDBhandle->quote($input->param('name'));
	    my $url  = $gDBhandle->quote($input->param('url'));
	    my $note = $gDBhandle->quote($input->param('note'));

	    # INSERT ERROR CHECKING HERE!
		
	    # create a query to update the database and update it
	    if ($type eq 'libraries') {
		
			# get a new sequence
			my $sequence = getNewSequence();
	
			my $q = qq(INSERT INTO libraries (libraries_id, libraries_name, libraries_url, libraries_note) VALUES ($sequence, $name, $url, $note));
			&prepareAndExecuteSQL($q);
		
			if ($rec) {
		
				$q = qq(SELECT * FROM libraries WHERE libraries_name = $name);
				&findAllLibraries($q);
				$q = qq(INSERT INTO defaultLibraries (discipline_id, libraries_id) VALUES ('$disc', '$librariesIDs[0]'));
				&prepareAndExecuteSQL($q);
		    
			}
		
			print qq(<big><font color="red">Resource created!</font></big>);
			
		}
	    
	    elsif ($type eq 'university') {
	    
			# get a new sequence
			my $sequence = getNewSequence();
	
			my $q = qq(INSERT INTO university (university_id, university_name, university_url, university_note) VALUES ($sequence, $name, $url, $note));
			&prepareAndExecuteSQL($q);
			
			if ($rec) {
			
		    	$q = qq(SELECT * FROM university WHERE university_name = $name);
		    	&findAllUniversity($q);
		    	$q = qq(INSERT INTO defaultUniversity (discipline_id, university_id) VALUES ('$disc', '$universityIDs[0]'));
		    	&prepareAndExecuteSQL($q);
		    	
			}
			
			print qq(<big><font color="red">Resource created!</font></big>);
		
		}
	    
	    elsif ($type eq 'reference') {
	    
			# get a new sequence
			my $sequence = getNewSequence();
	
			my $q = qq(INSERT INTO reference (reference_id, reference_name, reference_url, reference_note) VALUES ($sequence, $name, $url, $note));
			&prepareAndExecuteSQL($q);
			
			$q = qq(SELECT * FROM reference WHERE reference_name = $name);
			&findAllReferences($q);
		
			# update discipline descriptions
			$q = qq(INSERT INTO items4DisReference (discipline_id, reference_id) VALUES ('$disc', '$referenceIDs[0]'));
			&prepareAndExecuteSQL($q);
			if ($rec) {
			
		   		$q = qq(insert into defaultReferences (discipline_id, reference_id) values ('$disc', '$referenceIDs[0]'));
		    	&prepareAndExecuteSQL($q);
		    	
			}
		
			print qq(<big><font color="red">Resource created!</font></big>);
			
	    }
	    
	    elsif ($type eq 'database') {
		
			# get a new sequence
			my $sequence = getNewSequence();
	
			my $q = qq(INSERT INTO bib_databases (bib_database_id, bib_database_name, bib_database_url, bib_database_note) VALUES ($sequence, $name, $url, $note));
			&prepareAndExecuteSQL($q);
			
			$q = qq(SELECT * FROM bib_databases WHERE bib_database_name = $name);
			&findAllDatabases($q);
		
			# update discipline descriptions
			$q = qq(INSERT INTO items4DisBibdatabases (discipline_id, bib_database_id) VALUES ('$disc', '$databaseIDs[0]'));
			&prepareAndExecuteSQL($q);
			if ($rec) {
			
		    	$q = qq(INSERT INTO defaultBibdatabases (discipline_id, bib_database_id) VALUES ('$disc', '$databaseIDs[0]'));
		    	&prepareAndExecuteSQL($q);
			}
			
			print qq(<big><font color="red">Resource created!</font></big>);
			
	    }
	    
	    elsif ($type eq 'journal') {
	    
			# get a new sequence
			my $sequence = getNewSequence();
	
			my $q = qq(INSERT INTO etexts (etext_id, etext_name, etext_url, etext_note) VALUES ($sequence, $name, $url, $note));
			&prepareAndExecuteSQL($q);
			
			$q = qq(SELECT * FROM etexts WHERE etext_name = $name);
			&findAllJournals($q);
		
			# update discipline descriptions
			$q = qq(INSERT INTO items4DisEtexts (discipline_id, etext_id) VALUES ('$disc', '$journalIDs[0]'));
			&prepareAndExecuteSQL($q);
			if ($rec) {
			
		    	$q =qq(INSERT INTO defaultEtexts (discipline_id, etext_id) values ('$disc', '$journalIDs[0]'));
		    	&prepareAndExecuteSQL($q);
			}
		
			print qq(<big><font color="red">Resource created!</font></big>);
			
	    }
	    
	    else {
	    
			print qq(<p><big><font color="red">Please select a type!</font></big></p>\n);
			
	    }
	    
	}

	# display the input form
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="manageDiscipline">\n);
	print qq(<input type="hidden" name="disc" value="$disc">\n);
	print qq(<table border="1">\n);
	print "<!--  T Y P E  -->";
	print qq(<tr>\n);
	print qq(<td><b>Type</b>&nbsp;\n);
	print qq(<select name="type">);
	print qq(<option value="default">\n);
	print qq(<option value="libraries">$gLibraryLinks\n);
	print qq(<option value="university">$gUniversityLinks\n);
	print qq(<option value="reference">$gReferenceShelf\n);
	print qq(<option value="database">$gBibliographicDatabaseLinks\n);
	print qq(<option value="journal">$gElectronicJournals\n);
	print qq(</select>);
	print qq(Default:&nbsp;<input type="checkbox" name="rec">);
	print qq(</td>\n);
	print "</tr>\n";
	print "<!--  N A M E  -->";
	print qq(<tr>\n);
	print qq(<td><b>Resource</b>\n);
	print qq(<input type="text" name="name" size="45"></td>\n);
	print "</tr>\n";
	print "<!--  U R L  -->";
	print qq(<tr>\n);
	print qq(<td><b>URL</b>\n);
	print qq(<input type="text" name="url" size="45"></td>\n);
	print "</tr>\n";
	print "<!--  D E S C R I P T I O N  -->";
	print qq(<tr>\n);
	print qq(<td><b>Description</b>\n);
	print qq(<textarea name="note" wrap="virtual" rows="4" cols="45"></textarea>\n);
	print "</tr>\n";
	print "</table>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Crea"> \n);
	print qq(<input type="reset" value="Azzera">\n);
	print "</form>\n";

	print "</td><!-- =================Edit Defaults Section============== -->\n";

	print qq(<td valign="top">);

	# start the html
	&displaySimpleHelpMessage (224, 0);
	
	# process input if defaults were changed
	my $def = $input->param('def');
	if ($def) {

	    # read the contents of the form
	    my @librariesIDs  = $input->param(librariesIDs);
	    my @universityIDs = $input->param(universityIDs);
	    my @qSearchIDs    = $input->param(qSearchIDs);
	    my @referenceIDs  = $input->param(referenceIDs);
	    my @databaseIDs   = $input->param(databaseIDs);
	    my @journalIDs    = $input->param(journalIDs);
	    
	    # delete old LIBRARIES data and update it accordingly
	    my $q = qq(delete from defaultLibraries where discipline_id = "$disc");
	    &prepareAndExecuteSQL($q);
	    
	    for ($i = 0; $i <= $#librariesIDs; $i++) {
	    
			$q = qq(insert into defaultLibraries (discipline_id, libraries_id) values ("$disc", "$librariesIDs[$i]"));
			&prepareAndExecuteSQL($q);
			
	    }
	    
	    # delete old UNIVERSITY data and update it accordingly
	    my $q = qq(delete from defaultUniversity where discipline_id = "$disc");
	    &prepareAndExecuteSQL($q);
	    
	    for ($i = 0; $i <= $#universityIDs; $i++) {
	    
			$q = qq(insert into defaultUniversity (discipline_id, university_id) values ("$disc", "$universityIDs[$i]"));
			&prepareAndExecuteSQL($q);
			
	    }

	    # check for quick searches
	    if ($gShowQuickSearches) {
		
			# delete old QUICK SEARCHES data and update it accordingly
			my $q = qq(delete from defaultQseaches where discipline_id = "$disc");
			&prepareAndExecuteSQL($q);
			
			for ($i = 0; $i <= $#qSearchIDs; $i++) {
			
		    	$q = qq(insert into defaultQseaches (discipline_id, qsearch_id) values ("$disc", "$qSearchIDs[$i]"));
		    	&prepareAndExecuteSQL($q);
		    	
			}
			
	    }

	    # delete old REFERENCE data and update it accordingly
	    my $q = qq(delete from defaultReferences where discipline_id = "$disc");
	    &prepareAndExecuteSQL($q);
	    
	    for ($i = 0; $i <= $#referenceIDs; $i++) {
	    
			$q = qq(insert into defaultReferences (discipline_id, reference_id) values ("$disc", "$referenceIDs[$i]"));
			&prepareAndExecuteSQL($q);
			
	    }

	    # delete old REFERENCE data and update it accordingly
	    my $q = qq(delete from defaultReferences where discipline_id = "$disc");
	    &prepareAndExecuteSQL($q);
	    for ($i = 0; $i <= $#referenceIDs; $i++) {
	    
			$q = qq(insert into defaultReferences (discipline_id, reference_id) values ("$disc", "$referenceIDs[$i]"));
			&prepareAndExecuteSQL($q);
			
	    }

	    # delete old BIBLIOGRAPHIC DATABASES data and update it accordingly
	    my $q = qq(delete from defaultBibdatabases where discipline_id = "$disc");
	    &prepareAndExecuteSQL($q);
	    
	    for ($i = 0; $i <= $#databaseIDs; $i++) {
	    
			$q = qq(insert into defaultBibdatabases (discipline_id, bib_database_id) values ("$disc", "$databaseIDs[$i]"));
			&prepareAndExecuteSQL($q);
			
	    }

	    # delete old JOURNALS data and update it accordingly
	    my $q = qq(delete from defaultEtexts where discipline_id = "$disc");
	    &prepareAndExecuteSQL($q);
	    for ($i = 0; $i <= $#journalIDs; $i++) {
	    
			$q = qq(insert into defaultEtexts (discipline_id, etext_id) values ("$disc", "$journalIDs[$i]"));
			&prepareAndExecuteSQL($q);
			
	    }

	    print qq(<p><big><font color="red">Defaults Changed</font></big></p>);
	    
	}

	# start edit defaults form
	print $output->startform(-method => 'GET',  -action => './');
	print $output->hidden(-name      => 'cmd',  -value  => 'manageDiscipline');
	print $output->hidden(-name      => 'disc', -value  => $disc);
	print $output->hidden(-name      => 'def',  -value  => 'on');

	# get all the LIBRARIES resources and display them
	$q = qq(select * from libraries order by libraries_name);
	&findAllLibraries($q);
	$q = qq(select * from defaultLibraries where discipline_id = "$disc");
	&findDefaultResources($q, "libraries_id");
	print "<h2>$gLibraryLinks resources</h2>\n";
	print qq(<select name="librariesIDs" size="8" multiple>\n);
	for ($i = 0; $i <= $#librariesIDs; $i++) {
	
	    my $ps = 0;
	    for ($j = 0; $j <= $#defaultIDs; $j++) { if ($librariesIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
	    
	    if ($ps) {
	    	
			print qq(<option value="$librariesIDs[$i]" selected>$librariesNames[$i]\n);	
						
	    }
	    	
	    else {
	    
			print qq(<option value="$librariesIDs[$i]">$librariesNames[$i]\n);
						
	    }
	}
	
	print "</select>";	
			
	# get all the UNIVERSITY resources and display them
	$q = qq(select * from university order by university_name);
	&findAllUniversity($q);
	$q = qq(select * from defaultUniversity where discipline_id = "$disc");
	&findDefaultResources($q, "university_id");
	print "<h2>$gUniversityLinks resources</h2>\n";
	print qq(<select name="universityIDs" size="8" multiple>\n);
	for ($i = 0; $i <= $#universityIDs; $i++) {
	
	    my $ps = 0;
	    for ($j = 0; $j <= $#defaultIDs; $j++) { if ($universityIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
	    
	    if ($ps) {
	    
			print qq(<option value="$universityIDs[$i]" selected>$universityNames[$i]\n);
						
	    }
	    
	    else {
		
			print qq(<option value="$universityIDs[$i]">$universityNames[$i]\n);	
					
	    }
	    
	}
	
	print "</select>";	
	
	# check for quick searches
	if ($gShowQuickSearches) {
	    
	    # get all the QUICK SEARCHES resources and display them
	    $q = qq(select * from qsearches order by qsearch_name);
	    &findAllQSearches($q);
	    $q = qq(select * from defaultQseaches where discipline_id = "$disc");
	    &findDefaultResources($q, "qsearch_id");
	    print "<h2>$gQuickSearches</h2>\n";
	    print qq(<select name="qSearchIDs" size="8" multiple>\n);
	    for ($i = 0; $i <= $#qSearchIDs; $i++) {
	    
			my $ps = 0;
			for ($j = 0; $j <= $#defaultIDs; $j++) { if ($qSearchIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
		
			if ($ps) {
		
		    	print qq(<option value="$qSearchIDs[$i]" selected>$qSearchNames[$i]\n);		
		    	
			}
		
			else {
		    
		    	print qq(<option value="$qSearchIDs[$i]">$qSearchNames[$i]\n);			
		
			}
		
		}
		
	    print "</select>";	
	    
	}
	
	# get all the REFERENCE resources and display them
	$q = qq(select * from reference order by reference_name);
	&findAllReferences($q);
	$q = qq(select * from defaultReferences where discipline_id = "$disc");
	&findDefaultResources($q, "reference_id");
	print "<h2>$gReferenceShelf resources</h2>\n";
	print qq(<select name="referenceIDs" size="8" multiple>\n);
	for ($i = 0; $i <= $#referenceIDs; $i++) {
	
	    my $ps = 0;
	    for ($j = 0; $j <= $#defaultIDs; $j++) { if ($referenceIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
	    if ($ps) {
	    
			print qq(<option value="$referenceIDs[$i]" selected>$referenceNames[$i]\n);	
					
	    }
	    
	    else {
		
			print qq(<option value="$referenceIDs[$i]">$referenceNames[$i]\n);
						
	    }
	    
	}
	
	print "</select>";	
	
	# get all the BIBLIOGRAPHIC DATABASES resources and display them
	$q = qq(select * from bib_databases order by bib_database_name);
	&findAllDatabases($q);
	$q = qq(select * from defaultBibdatabases where discipline_id = "$disc");
	&findDefaultResources($q, "bib_database_id");
	print "<h2>$gBibliographicDatabaseLinks resources</h2>\n";
	print qq(<select name="databaseIDs" size="8" multiple>\n);
	for ($i = 0; $i <= $#databaseIDs; $i++) {
	
	    my $ps = 0;
	    for ($j = 0; $j <= $#defaultIDs; $j++) { if ($databaseIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
	    if ($ps) {
		
			print qq(<option value="$databaseIDs[$i]" selected>$databaseNames[$i]\n);			
	    
	    }
	    
	    else {
	    
			print qq(<option value="$databaseIDs[$i]">$databaseNames[$i]\n);
						
	    }
	    
	}
	
	print "</select>";	
	
	# get all the JOURNALS resources and display them
	$q = qq(select * from etexts order by etext_name);
	&findAllJournals($q);
	$q = qq(select * from defaultEtexts where discipline_id = "$disc");
	&findDefaultResources($q, "etext_id");
	print "<h2>$gElectronicJournals resources</h2>\n";
	print qq(<select name="journalIDs" size="8" multiple>\n);
	for ($i = 0; $i <= $#journalIDs; $i++) {
	
	    my $ps = 0;
	    for ($j = 0; $j <= $#defaultIDs; $j++) { if ($journalIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
	    if ($ps) {
	    
			print qq(<option value="$journalIDs[$i]" selected>$journalNames[$i]\n);		
				
	    }
	    
	    else {
	    
			print qq(<option value="$journalIDs[$i]">$journalNames[$i]\n);	
					
	    }
	    
	}
	
	print "</select>";	
	
	print "<p>";
	print $output->submit(-name => 'submit', -value => ' Change Defaults ');              
	print "&nbsp;";
	print $output->reset(-name => 'Reset', -value => 'Reset');              
	print "</p>\n";
	print $output->endform;	

	print "</td></tr></table>";

}



#################
# link checker  #
#################

sub checkLinksTXT {

	# get the input
	my @disciplineIDs  = $input->param('disciplineIDs');
	my @sections       = $input->param('sections');
	my $libraryPart    = $input->param('libraryPart');
	my $universityPart = $input->param('universityPart');
	my $resultOutput   = $input->param('resultOutput');
	
	# check for selected discipline
	if (! $disciplineIDs[0]) { &returnError ("No discipline(s) selected"); return; }
	
	# check for selected section
	if (! $sections[0]) { &returnError ("No section selected"); return; }
	
	# get today
	my $today = strftime ("%m/%d/%Y", localtime(parsedate ('now', NOW)));

	# flush output
	$| = 1;
	
	# start the output
#	print $output->header();
print "Content-Type: text/html\n\n";
	
	# start the html
#	&displaySimpleHelpMessage (213, 1);

	# process every discipline
	for ($j = 0; $j <= $#disciplineIDs; $j++ ) {
	
		# get the discipline ID's name
		$q = qq(select * from disciplines where discipline_id = $disciplineIDs[$j]);
		&findAllDisciplines($q);
	
		# display a header
		#print "$disciplineNames[0] as of $today\n";
	
		# process every section	
		for ($i = 0; $i <= $#sections; $i++) {

			# library links
			if ($sections[$i] eq 'libraries') {
				
				# process the part
				if ($libraryPart eq 'thisDiscipline') {
				
					# find just this discipline's links
					my $q = qq(select libraries.libraries_id, libraries_url, libraries_name
                       	      from libraries, defaultLibraries
                              where libraries.libraries_id = defaultLibraries.libraries_id
                              and discipline_id = $disciplineIDs[$j]
                              order by libraries_name);
					&findAllLibraries ($q);
				
				}
				
				elsif ($libraryPart eq 'everything') {
				
					# find all the links
					my $q = qq(select * from libraries order by libraries_name);
					&findAllLibraries ($q);
				
				}
				
				else {
				
					# error
					&returnError ("Programmer error: Unknown value for libraryPart ($libraryPart)");
					return;
					
				}
				
				# process the links
				&processLinksTXT (\@librariesIDs, \@librariesURLs, \@librariesNames, "Biblioteche e Cataloghi", "editLibraries", "deleteLibraries");
			
			}
			
			# university links
			elsif ($sections[$i] eq 'university') {
				
				# process the part
				if ($universityPart eq 'thisDiscipline') {

					# find all the university links
					my $q = qq(select university.university_id, university_url, university_name
                              from university, defaultUniversity
                              where university.university_id = defaultUniversity.university_id
                              and discipline_id = $disciplineIDs[$j]
                              order by university_name);
					&findAllUniversity ($q);
				
				}
				
				elsif ($universityPart eq 'everything') {
				
					# find all the links
					my $q = qq(select * from university order by university_name);
					&findAllUniversity ($q);
				
				}
				
				else {
				
					# error
					&returnError ("Programmer error: Unknown value for universityPart ($universityPart)");
					return;
					
				}
				
				# process the links
				&processLinksTXT (\@universityIDs, \@universityURLs, \@universityNames, "Altri come Segnaweb", "editUniversity", "deleteUniversity");
			
			
			}
			
			# reference shelf
			elsif ($sections[$i] eq 'referenceShelf') {
	
				#find all reference shelf resoruces for the selected discipline
				$q = qq(select reference.reference_id, reference.reference_name,
    	    	  	   reference.reference_url, reference.reference_note
    	      	   	   from reference, items4DisReference
    	       	       where items4DisReference.discipline_id = $disciplineIDs[$j]
    	       	       and
    	       	       items4DisReference.reference_id = reference.reference_id
    	       	       order by reference.reference_name);
				&findAllReferences($q);
		
				# process the links
				&processLinksTXT (\@referenceIDs, \@referenceURLs, \@referenceNames, "Informazioni Rapide", "editReference", "deleteReference");
			
			}
			
			# bibliographic databases
			elsif ($sections[$i] eq 'bibliographicDatabases') {
			
				# find all bibliographic database resoruces for this discipline
				$q = qq(select bib_databases.bib_database_id, bib_databases.bib_database_name,
             			bib_databases.bib_database_url, bib_databases.bib_database_note
             			from bib_databases, items4DisBibdatabases
             			where items4DisBibdatabases.discipline_id = $disciplineIDs[$j]
             			and
             			items4DisBibdatabases.bib_database_id = bib_databases.bib_database_id
             			order by bib_databases.bib_database_name);
				&findAllDatabases($q);

				# process the links
				&processLinksTXT (\@databaseIDs, \@databaseURLs, \@databaseNames, "Cerca per Argomenti", "editDatabase", "deleteDatabase");
		
			}
				
			# ejournals
			elsif ($sections[$i] eq 'electronicJournals') {
		
				# find all electronic journals resoruces for this discipline
				$q = qq (select etexts.etext_id, etexts.etext_name,
             			etexts.etext_url, etexts.etext_note
             			from etexts, items4DisEtexts
             			where items4DisEtexts.discipline_id = $disciplineIDs[$j]
            			and
             			items4DisEtexts.etext_id = etexts.etext_id
             			order by etexts.etext_name);
           	 &findAllJournals($q);
		
				# process the links
				&processLinksTXT (\@journalIDs, \@journalURLs, \@journalNames, "Ricerche", "editJournal", "deleteJournal");
		
			}
		
			# error
			else { &returnError ("Programmer error; Unknown section ($section[$i]). ") }
	
		}
		
	}
	
}



#################
# link checker  #
#################

sub checkLinks {

	# get the input
	my @disciplineIDs  = $input->param('disciplineIDs');
	my @sections       = $input->param('sections');
	my $libraryPart    = $input->param('libraryPart');
	my $universityPart = $input->param('universityPart');
	my $resultOutput   = $input->param('resultOutput');
	
	# check for selected discipline
	if (! $disciplineIDs[0]) { &returnError ("No discipline(s) selected"); return; }
	
	# check for selected section
	if (! $sections[0]) { &returnError ("No section selected"); return; }
	
	# get today
	my $today = strftime ("%m/%d/%Y", localtime(parsedate ('now', NOW)));

	# flush output
	$| = 1;
	
	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (213, 1);

	# process every discipline
	for ($j = 0; $j <= $#disciplineIDs; $j++ ) {
	
		# get the discipline ID's name
		$q = qq(select * from disciplines where discipline_id = $disciplineIDs[$j]);
		&findAllDisciplines($q);
	
		# display a header
		print "<h2>$disciplineNames[0] as of $today</h2>";
	
		# process every section	
		for ($i = 0; $i <= $#sections; $i++) {

			# library links
			if ($sections[$i] eq 'libraries') {
				
				# process the part
				if ($libraryPart eq 'thisDiscipline') {
				
					# find just this discipline's links
					my $q = qq(select libraries.libraries_id, libraries_url, libraries_name
                       	      from libraries, defaultLibraries
                              where libraries.libraries_id = defaultLibraries.libraries_id
                              and discipline_id = $disciplineIDs[$j]
                              order by libraries_name);
					&findAllLibraries ($q);
				
				}
				
				elsif ($libraryPart eq 'everything') {
				
					# find all the links
					my $q = qq(select * from libraries order by libraries_name);
					&findAllLibraries ($q);
				
				}
				
				else {
				
					# error
					&returnError ("Programmer error: Unknown value for libraryPart ($libraryPart)");
					return;
					
				}
				
				# process the links
				&processLinks (\@librariesIDs, \@librariesURLs, \@librariesNames, "Biblioteche e Cataloghi", "editLibraries", "deleteLibraries");
			
			}
			
			# university links
			elsif ($sections[$i] eq 'university') {
				
				# process the part
				if ($universityPart eq 'thisDiscipline') {

					# find all the university links
					my $q = qq(select university.university_id, university_url, university_name
                              from university, defaultUniversity
                              where university.university_id = defaultUniversity.university_id
                              and discipline_id = $disciplineIDs[$j]
                              order by university_name);
					&findAllUniversity ($q);
				
				}
				
				elsif ($universityPart eq 'everything') {
				
					# find all the links
					my $q = qq(select * from university order by university_name);
					&findAllUniversity ($q);
				
				}
				
				else {
				
					# error
					&returnError ("Programmer error: Unknown value for universityPart ($universityPart)");
					return;
					
				}
				
				# process the links
				&processLinks(\@universityIDs, \@universityURLs, \@universityNames, "Altri come Segnaweb", "editUniversity", "deleteUniversity");
			
			
			}
			
			# reference shelf
			elsif ($sections[$i] eq 'referenceShelf') {
	
				#find all reference shelf resoruces for the selected discipline
				$q = qq(select reference.reference_id, reference.reference_name,
    	    	  	   reference.reference_url, reference.reference_note
    	      	   	   from reference, items4DisReference
    	       	       where items4DisReference.discipline_id = $disciplineIDs[$j]
    	       	       and
    	       	       items4DisReference.reference_id = reference.reference_id
    	       	       order by reference.reference_name);
				&findAllReferences($q);
		
				# process the links
				&processLinks (\@referenceIDs, \@referenceURLs, \@referenceNames, "Informazioni Rapide", "editReference", "deleteReference");
			
			}
			
			# bibliographic databases
			elsif ($sections[$i] eq 'bibliographicDatabases') {
			
				# find all bibliographic database resoruces for this discipline
				$q = qq(select bib_databases.bib_database_id, bib_databases.bib_database_name,
             			bib_databases.bib_database_url, bib_databases.bib_database_note
             			from bib_databases, items4DisBibdatabases
             			where items4DisBibdatabases.discipline_id = $disciplineIDs[$j]
             			and
             			items4DisBibdatabases.bib_database_id = bib_databases.bib_database_id
             			order by bib_databases.bib_database_name);
				&findAllDatabases($q);

				# process the links
				&processLinks (\@databaseIDs, \@databaseURLs, \@databaseNames, "Cerca per Argomenti", "editDatabase", "deleteDatabase");
		
			}
				
			# ejournals
			elsif ($sections[$i] eq 'electronicJournals') {
		
				# find all electronic journals resoruces for this discipline
				$q = qq (select etexts.etext_id, etexts.etext_name,
             			etexts.etext_url, etexts.etext_note
             			from etexts, items4DisEtexts
             			where items4DisEtexts.discipline_id = $disciplineIDs[$j]
            			and
             			items4DisEtexts.etext_id = etexts.etext_id
             			order by etexts.etext_name);
           	 &findAllJournals($q);
		
				# process the links
				&processLinks (\@journalIDs, \@journalURLs, \@journalNames, "Ricerche", "editJournal", "deleteJournal");
		
			}
		
			# error
			else { &returnError ("Programmer error; Unknown section ($section[$i]). ") }
	
		}
		
	}
	
}


sub displayLinkCheckerMenu {

	# read all the discipline MOTDs
	my $q = "select * from disciplines order by discipline_name";
	&findAllDisciplines($q);
	
	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (212, 1);

	# start form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'checkLinks');

	# display a pop-up list of disciplines
	print "Select the discipline(s) to check:";
	print qq(<p><select name="disciplineIDs" multiple size=8>\n);
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
		print qq(<option value="$disciplineIDs[$i]" selected>$disciplineNames[$i]\n);
	}
	print "</select></p>\n";
	
	# display the sections
	print "<p>Select the sections within that discipline to check:<br>";
	print "<ol>";
	print "<li><input type=checkbox name=sections value=libraries checked>Biblioteche e cataloghi  ";
	print qq(<input type=radio name=libraryPart value=thisDiscipline checked>Solo i link della disciplina );
	print qq(<input type=radio name=libraryPart value=everything>Tutti i link);
	print "<li><input type=checkbox name=sections value=university checked>Altri come Segnaweb\n";
	print qq(<input type=radio name=universityPart value=thisDiscipline checked>Solo i link della disciplina );
	print qq(<input type=radio name=universityPart value=everything>Tutti i link);
	print "<li><input type=checkbox name=sections value=referenceShelf checked>Informazioni rapide\n";
	print "<li><input type=checkbox name=sections value=bibliographicDatabases checked>Cerca per argomenti\n";
	print "<li><input type=checkbox name=sections value=electronicJournals checked>Ricerche\n";
	print "</ol></p>\n";
	
	# select where the output goes
	#print "<p>Where do you want the output to go:";
	#print "<ol>";
	#print "<li><input type=radio name=resultOutput value=screen checked>My screen";
	#print "<li><input type=radio name=resultOutput value=email>My email";
	#print "</ol></p>\n";

	# end the form
	print "<p>";
	print $output->submit(-name => 'submit', -value => 'Spunta');              
	print $output->reset(-name => 'Reset', -value => 'Azzera');              
	print "</p>\n";
	print $output->endform;	

}






sub processLinks {

	# get the input
	my $IDs            = @_[0];
	my $URLs           = @_[1];
	my $names          = @_[2];
	my $section        = @_[3];
	my $editFunction   = @_[4];
	my $deleteFunction = @_[5];
	

	# create a user agent
	my $ua = LWP::UserAgent->new();
	$ua->agent ("MyLibrary\@NCState Link Checker/v1.0");
	$ua->from ($gFromAddress);
	
	# process every URL
	print "<h3>$section, ". ($#$IDs + 1) ." links</h3>\n"; 
	print "<ol>";
	for (my $i = 0; $i <= $#$IDs; $i++) {
	
		# create a new request
		my $request = HTTP::Request->new();
		$request->method ("HEAD");
		$request->url ($URLs->[$i]);
		#$request->referer ($gHome);
		
		# get the response
		my $response = $ua->simple_request ($request);
		my $c  = $response->code;
		my $m  = $response->message;
		my $d = $IDs->[$i];
		my $u  = $URLs->[$i];
		my $n  = $names->[$i];
		
		# display the return code
		print qq(<li>$c [ <a href="$gHome/admin/?cmd=$editFunction&id=$d">Edit</a> | <a href="$gHome/admin/?cmd=$deleteFunction&id=$d">Delete</a> ] <a href="$u">$n</a> - $m\n);
		
	}
	print "</ol>";
	
	return;
	
}


sub processLinksTXT {

	# get the input
	my $IDs            = @_[0];
	my $URLs           = @_[1];
	my $names          = @_[2];
	my $section        = @_[3];
	my $editFunction   = @_[4];
	my $deleteFunction = @_[5];
	

	# create a user agent
	my $ua = LWP::UserAgent->new();
	$ua->agent ("MyLibrary\@NCState Link Checker/v1.0");
	$ua->from ($gFromAddress);
	
	# process every URL
#	print "<h3>$section, ". ($#$IDs + 1) ." links</h3>\n"; 
	print "<ul>";
	for (my $i = 0; $i <= $#$IDs; $i++) {
	
		# create a new request
		my $request = HTTP::Request->new();
		$request->method ("HEAD");
		$request->url ($URLs->[$i]);
		#$request->referer ($gHome);
		
		# get the response
		my $response = $ua->simple_request ($request);
		my $c  = $response->code;
		my $m  = $response->message;
		my $d = $IDs->[$i];
		my $u  = $URLs->[$i];
		my $n  = $names->[$i];
		
		# display the return code
		if( $c !='200' && $c!='302' && $c!='304') {
		print qq(<li>$c - $n<br>\n <a href="$u">$u</a> - $m\n);
		}
		
	}
	print "</ul>";
	
	return;
	
}

############################
# static templates admin   #
############################

sub displayStaticTemplateMenu {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (269, 1);
	
	print qq(<ol>);
	print qq(<li><a href="./?cmd=createStaticTemplate">Create a new static template</a>);
	print qq(<li><a href="./?cmd=listAllStaticTemplates">Find and then edit or delete a static template</a>);
	print qq(<li><a href="./?cmd=editStaticTemplate">Edit a static template</a>);
	print qq(<li><a href="./?cmd=deleteStaticTemplate">Delete a static template</a>);
	print qq(</ol>);
	
}
	
sub createStaticTemplate {
	
	# start the output
	print $output->header(-expires => '-1d');

	# check for submit button
	if (! $input->param('submit')) {
	
		# start the html
		&displaySimpleHelpMessage (270, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="POST" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="createStaticTemplate">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print qq(</tr>\n);
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Name</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><input type="text" name="description" size="45"></td>\n);
		print "</tr>\n";
		print "<!--  T E M P L A T E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Template</td>\n);
		print qq(<td align="left"><textarea name="template" wrap="virtual" rows="40" cols="80"></textarea>\n);
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" name=submit value="Crea"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}
	
	# save their customizations
	else {
	
		# get the input
		my $name        = $gDBhandle->quote($input->param('name'));
		my $description = $gDBhandle->quote($input->param('description'));
		my $template    = $gDBhandle->quote($input->param('template'));
		
		# get a new sequence
		my $sequence = getNewSequence();
	
		# create a query to update the database and update it
		my $q = qq{insert into templates_static (template_static_id, template_static_name, template_static_description, template_static)
	           	   values ($sequence, $name, $description, $template)};
		&prepareAndExecuteSQL($q);
			
		# find the record just added
		$q = qq(select * from templates_static where template_static_name = $name);
		&findAllStaticTemplates($q);
	
		# start the html
		&displaySimpleHelpMessage (271, 1);
	
		# display it for confirmation
		&displayTabledStaticTemplateOutput;

	}

}

sub displayTabledStaticTemplateOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>Name</b></td>\n);
	print "<td><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#templateStaticIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$templateStaticIDs[$i]</td>\n);
		print qq(<td align="left">$templateStaticNames[$i]</td>\n);
		print qq(<td><a href="./?cmd=editStaticTemplate&id=$templateStaticIDs[$i]">Edit</a> or <a href="./?cmd=deleteStaticTemplate&id=$templateStaticIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		
	}
		
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}

sub deleteStaticTemplate {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (277, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteStaticTemplate">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Elimina"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the libraries from the libraries table
		my $q = qq(delete from templates_static where template_static_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (273, 1);
	
	}

}

sub listAllStaticTemplates {

	# find the record just added
	$q = qq(select * from templates_static order by template_static_name);
	&findAllStaticTemplates($q);
	
	# start the output
	print $output->header(-expires => '-1d');

	# start the html
	&displaySimpleHelpMessage (276, 1);
	
	# display it for confirmation
	&displayTabledStaticTemplateOutput;

}

sub editStaticTemplate {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (274, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editStaticTemplate">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# find the record to edit
		my $q = qq(select * from templates_static where template_static_id = "$id");
		&findAllStaticTemplates($q);

		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (272, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="POST" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updateStaticTemplate">\n);
		print qq(<input type="hidden" name="id" value="$templateStaticIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$templateStaticIDs[0]</td>\n);
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Name</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$templateStaticNames[0]"></td>\n);
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><input type="text" name="description" size="45" value="$templateStaticDescriptions[0]"></td>\n);
		print "</tr>\n";
		print "<!--  T E M P L A T E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Template</td>\n);
		print qq(<td align="left"><textarea name="template" wrap="virtual" rows="40" cols="80">$templatesStatic[0]</textarea>\n);
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}

}

sub updateStaticTemplate {

	# get the input
	my $id          = $gDBhandle->quote($input->param('id'));
	my $name        = $gDBhandle->quote($input->param('name'));
	my $description = $gDBhandle->quote($input->param('description'));
	my $template    = $gDBhandle->quote($input->param('template'));
	
	# create the query and update the database
	my $q = qq(update templates_static set template_static_name        = $name,
	                                template_static_description = $description,
	                                template_static             = $template
	                           where template_static_id  = $id);
	&prepareAndExecuteSQL ($q);
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (275, 1);
	
}

########################
# free templates admin #
########################

sub displayFreeTemplateMenu {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (258, 1);
	
	print qq(<ol>);
	print qq(<li><a href="./?cmd=createFreeTemplate">Create a new free template</a>);
	print qq(<li><a href="./?cmd=listAllFreeTemplates">Find and then edit or delete a free template</a>);
	print qq(<li><a href="./?cmd=editFreeTemplate">Edit a free template</a>);
	print qq(<li><a href="./?cmd=deleteFreeTemplate">Delete a free template</a>);
	print qq(</ol>);
	
}


sub updateFreeTemplate {

	# get the input
	my $id          = $gDBhandle->quote($input->param('id'));
	my $name        = $gDBhandle->quote($input->param('name'));
	my $description = $gDBhandle->quote($input->param('description'));
	my $template    = $gDBhandle->quote($input->param('template'));
	
	# create the query and update the database
	my $q = qq(update templates_free set template_free_name        = $name,
	                                 template_free_description = $description,
	                                 template             = $template
	                           where template_free_id  = $id);
	&prepareAndExecuteSQL ($q);
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (264, 1);
	
}


sub editFreeTemplate {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (261, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editFreeTemplate">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# find the record to edit
		my $q = qq(select * from templates_free where template_free_id = "$id");
		&findAllFreeTemplates($q);

		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (263, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="POST" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updateFreeTemplate">\n);
		print qq(<input type="hidden" name="id" value="$templateFreeIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$templateFreeIDs[0]</td>\n);
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Name</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$templateFreeNames[0]"></td>\n);
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><input type="text" name="description" size="45" value="$templateFreeDescriptions[0]"></td>\n);
		print "</tr>\n";
		print "<!--  T E M P L A T E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Template</td>\n);
		print qq(<td align="left"><textarea name="template" wrap="virtual" rows="40" cols="80">$templatesFree[0]</textarea>\n);
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}

}
	

sub listAllFreeTemplates {

	# find the record just added
	$q = qq(select * from templates_free order by template_free_name);
	&findAllFreeTemplates($q);
	
	# start the output
	print $output->header(-expires => '-1d');

	# start the html
	&displaySimpleHelpMessage (262, 1);
	
	# display it for confirmation
	&displayTabledFreeTemplateOutput;

}


sub deleteFreeTemplate {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (266, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteFreeTemplate">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Elimina"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the libraries from the libraries table
		my $q = qq(delete from templates_free where template_free_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (267, 1);
	
	}

}
	

sub displayTabledFreeTemplateOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>Name</b></td>\n);
	print "<td><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#templateFreeIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$templateFreeIDs[$i]</td>\n);
		print qq(<td align="left">$templateFreeNames[$i]</td>\n);
		print qq(<td><a href="./?cmd=editFreeTemplate&id=$templateFreeIDs[$i]">Edit</a> or <a href="./?cmd=deleteFreeTemplate&id=$templateFreeIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		
	}
		
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}


sub createFreeTemplate {
	

	# start the output
	print $output->header(-expires => '-1d');

	# check for submit button
	if (! $input->param('submit')) {
	
		# start the html
		&displaySimpleHelpMessage (259, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="POST" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="createFreeTemplate">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print qq(</tr>\n);
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Name</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><input type="text" name="description" size="45"></td>\n);
		print "</tr>\n";
		print "<!--  T E M P L A T E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Template</td>\n);
		print qq(<td align="left"><textarea name="template" wrap="virtual" rows="40" cols="80"></textarea>\n);
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" name=submit value="Crea"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}
	
	# save their customizations
	else {
	
		# get the input
		my $name        = $gDBhandle->quote($input->param('name'));
		my $description = $gDBhandle->quote($input->param('description'));
		my $template    = $gDBhandle->quote($input->param('template'));
		
		# get a new sequence
		my $sequence = getNewSequence();
	
		# create a query to update the database and update it
		my $q = qq{insert into templates_free (template_free_id, template_free_name, template_free_description, template)
	           	   values ($sequence, $name, $description, $template)};
		&prepareAndExecuteSQL($q);
			
		# find the record just added
		$q = qq(select * from templates_free where template_free_name = $name);
		&findAllFreeTemplates($q);
	
		# start the html
		&displaySimpleHelpMessage (265, 1);
	
		# display it for confirmation
		&displayTabledFreeTemplateOutput;

	}

}

	
#####################
# templates admin   #
#####################

sub displayTemplateMenu {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (247, 1);
	
	print qq(<ol>);
	print qq(<li><a href="./?cmd=createTemplate">Create a new template</a>);
	print qq(<li><a href="./?cmd=listAllTemplates">Find and then edit or delete a template</a>);
	print qq(<li><a href="./?cmd=editTemplate">Edit a template</a>);
	print qq(<li><a href="./?cmd=deleteTemplate">Delete a template</a>);
	print qq(</ol>);
	
}
	

sub updateTemplate {

	# get the input
	my $id          = $gDBhandle->quote($input->param('id'));
	my $name        = $gDBhandle->quote($input->param('name'));
	my $description = $gDBhandle->quote($input->param('description'));
	my $template    = $gDBhandle->quote($input->param('template'));
	
	# create the query and update the database
	my $q = qq(update templates set template_name        = $name,
	                                template_description = $description,
	                                template             = $template
	                           where template_id  = $id);
	&prepareAndExecuteSQL ($q);
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (253, 1);
	
}


sub editTemplate {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (251, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editTemplate">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# find the record to edit
		my $q = qq(select * from templates where template_id = "$id");
		&findAllTemplates($q);

		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (252, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="POST" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updateTemplate">\n);
		print qq(<input type="hidden" name="id" value="$templateIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$templateIDs[0]</td>\n);
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Name</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$templateNames[0]"></td>\n);
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><input type="text" name="description" size="45" value="$templateDescriptions[0]"></td>\n);
		print "</tr>\n";
		print "<!--  T E M P L A T E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Template</td>\n);
		print qq(<td align="left"><textarea name="template" wrap="virtual" rows="40" cols="80">$templates[0]</textarea>\n);
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Modifica"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}

}
	

sub listAllTemplates {

	# find the record just added
	$q = qq(select * from templates order by template_name);
	&findAllTemplates($q);
	
	# start the output
	print $output->header(-expires => '-1d');

	# start the html
	&displaySimpleHelpMessage (250, 1);
	
	# display it for confirmation
	&displayTabledTemplateOutput;

}


sub createTemplate {
	

	# start the output
	print $output->header(-expires => '-1d');

	# check for submit button
	if (! $input->param('submit')) {
	
		# start the html
		&displaySimpleHelpMessage (248, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="POST" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="createTemplate">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print qq(</tr>\n);
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Name</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><input type="text" name="description" size="45"></td>\n);
		print "</tr>\n";
		print "<!--  T E M P L A T E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Template</td>\n);
		print qq(<td align="left"><textarea name="template" wrap="virtual" rows="40" cols="80"></textarea>\n);
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" name=submit value="Crea"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}
	
	# save their customizations
	else {
	
		# get the input
		my $name        = $gDBhandle->quote($input->param('name'));
		my $description = $gDBhandle->quote($input->param('description'));
		my $template    = $gDBhandle->quote($input->param('template'));
		
		# get a new sequence
		my $sequence = getNewSequence();
	
		# create a query to update the database and update it
		my $q = qq{insert into templates (template_id, template_name, template_description, template)
	           	   values ($sequence, $name, $description, $template)};
		&prepareAndExecuteSQL($q);
			
		# find the record just added
		$q = qq(select * from templates where template_name = $name);
		&findAllTemplates($q);
	
		# start the html
		&displaySimpleHelpMessage (249, 1);
	
		# display it for confirmation
		&displayTabledTemplateOutput;

	}

}


sub displayTabledTemplateOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>Name</b></td>\n);
	print "<td><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#templateIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$templateIDs[$i]</td>\n);
		print qq(<td align="left">$templateNames[$i]</td>\n);
		print qq(<td><a href="./?cmd=editTemplate&id=$templateIDs[$i]">Edit</a> or <a href="./?cmd=deleteTemplate&id=$templateIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		
	}
		
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}

sub deleteTemplate {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (254, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteTemplate">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Elimina"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the libraries from the libraries table
		my $q = qq(delete from templates where template_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (255, 1);
	
	}

}
	
	

#####################
# libraries admin   #
#####################

sub displayLibrariesMenu {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (108, 1);
	
	print qq(<ol>);
	print qq(<li><a href="./?cmd=displayLibrariesInputForm">Create a $gLibraryLinks item</a>);
	print qq(<li><a href="./?cmd=displayLibrariesFindForm">Find and then edit or delete a $gLibraryLinks item</a>);
	print qq(<li><a href="./?cmd=editLibraries">Edit a $gLibraryLinks item</a>);
	print qq(<li><a href="./?cmd=deleteLibraries">Delete a $gLibraryLinks item</a>);
	print qq(</ol>);
	
}
	

sub displayLibrariesInputForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (109, 1);
	
	# display the input form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="createLibraries">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print qq(</tr>\n);
	print "<!--  F O R G I E N  K E Y  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">F Key</td>\n);
	print qq(<td align="left"><input type="text" name="fkey" size="45"></td>\n);
	print "<td>Foreign key</td>\n";
	print "</tr>\n";
	print "<!--  N A M E  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Libraries</td>\n);
	print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
	print "<td>Enter a libraries term</td>\n";
	print "</tr>\n";
	print "<!--  U R L  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">URL</td>\n);
	print qq(<td align="left"><input type="text" name="url" size="45"></td>\n);
	print "<td>What is the URL?</td>\n";
	print "</tr>\n";
	print "<!--  L C D -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">LCD</td>\n);
	print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
	print "<td>LCD Resource?</td>\n";
	print "</tr>\n";
	print "<!--  D E S C R I P T I O N  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Description</td>\n);
	print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="45"></textarea>\n);
	print "<td>Enter a scope note</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Crea"> \n);
	print qq(<input type="reset" value="Azzera">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}


sub createLibraries {

	# get the input
	my $name = $gDBhandle->quote($input->param('name'));
	my $url  = $gDBhandle->quote($input->param('url'));
	my $note = $gDBhandle->quote($input->param('note'));
	my $lcd  = $input->param('lcd');
	my $fkey = $input->param('fkey');
	
	# INSERT ERROR CHECKING HERE!
		
	# get today's date
	my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));
	
	# get a new sequence
	my $sequence = getNewSequence();
	
	# create a query to update the database and update it
	my $q = qq{INSERT INTO libraries (libraries_id, libraries_name, libraries_url, libraries_note, libraries_date, libraries_lcd, libraries_fkey)
	           VALUES ($sequence, $name, $url, $note, '$today', '$lcd', '$fkey')};
	&prepareAndExecuteSQL($q);
		
	# find the record just added
	$q = qq(SELECT * FROM libraries WHERE libraries_name = $name);
	&findAllLibraries($q);
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (110, 1);
	
	# display it for confirmation
	&displayTabledLibrariesOutput;
	
}
	

sub displayTabledLibrariesOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>$gLibraryLinks item</b></td>\n);
	print qq(<td align="left"><b>Date</b></td>\n);
	print "<td><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#librariesIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$librariesIDs[$i]</td>\n);
		print qq(<td align="left"><a href="$librariesURLs[$i]">$librariesNames[$i]</a></td>\n);
		print qq(<td align="left">$librariesDates[$i]</td>\n);
		print qq(<td><a href="./?cmd=editLibraries&id=$librariesIDs[$i]">Edit</a> or <a href="./?cmd=deleteLibraries&id=$librariesIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		
	}
		
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayLibrariesFindForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (111, 1);
	
	# display the search form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="displayLibrariesSearchResults">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print "</tr>\n";
	print "<!--  O P E R A T O R  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Operator</td>\n);
	print qq(<td align="left">\n);
	print qq(<select name="searchOperator">\n);
	print qq(<option value="=">is\n);
	print qq(<option value="like" selected>like\n);
	print "</select>\n";
	print "</td>\n";
	print "<td>Select an operator</td>\n";
	print "</tr>\n";
	print "<!--  S E A R C H  S T R I N G  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Search string</td>\n);
	print qq(<td align="left">\n);
	print qq(<input type="text" name="searchString" value="%">\n);
	print "</td>";
	print "<td>Enter a query term</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Cerca"> \n);
	print qq(<input type="reset" value="Azzera">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayLibrariesSearchResults {

	# get the input
	my $searchOperator = $input->param('searchOperator');
	my $searchString = $input->param('searchString');
	
	# INSERT ERROR CHECKING HERE!
	
	# create a query and execute it
	my $q = qq(select *
	           from libraries
	           where libraries_name $searchOperator "$searchString"
	           order by libraries_name);
	&findAllLibraries($q);

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (112, 1);
	
	# display the results
	&displayTabledLibrariesOutput;
	
}
	

sub deleteLibraries {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (113, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteLibraries">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Elimina"> \n);
		print qq(<input type="reset" value="Azzera">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the libraries from the libraries table
		my $q = qq(delete from libraries where libraries_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(delete from items4libraries where libraries_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (114, 1);
	
	}

}
	
sub editLibraries {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (115, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editLibraries">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Edit"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# find the record to edit
		my $q = qq(select * from libraries where libraries_id = "$id");
		&findAllLibraries($q);

		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (116, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updateLibraries">\n);
		print qq(<input type="hidden" name="id" value="$librariesIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$librariesIDs[0]</td>\n);
		print "<td>Record number</td>\n";
		print "</tr>\n";
		print "<!--  D A T E  -->";
		print "<tr>\n";
		print qq(<td align="right">Date</td>\n);
		print qq(<td align="left">$librariesDates[0]</td>\n);
		print "<td>Last modified</td>\n";
		print "</tr>\n";
		print "<!--  F O R G I E N  K E Y  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">F Key</td>\n);
		print qq(<td align="left"><input type="text" name="fkey" size="45" value="$librariesFKeys[0]"></td>\n);
		print "<td>Foreign key</td>\n";
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">$gLibraryLinks item</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$librariesNames[0]"></td>\n);
		print "<td>Enter a $gLibraryLinks term</td>\n";
		print "</tr>\n";
		print "<!--  U R L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">URL</td>\n);
		print qq(<td align="left"><input type="text" name="url" size="45" value="$librariesURLs[0]"></td>\n);
		print "<td>What is the URL?</td>\n";
		print "</tr>\n";
		print "<!--  L C D -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">LCD</td>\n);
		
		if ($librariesLCDs[0]) {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1" checked></td>\n);
		}
		else {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
		}
		
		print "<td>LCD Resource?</td>\n";
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="45">$librariesNotes[0]</textarea>\n);
		print "<td>Enter a scope note</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Edit"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}

}
	
	
sub updateLibraries {

	# get the input
	my $id   = $input->param('id');
	my $name = $input->param('name');
	my $url  = $input->param('url');
	my $note = $gDBhandle->quote($input->param('note'));
	my $lcd  = $input->param('lcd');
	my $fkey = $input->param('fkey');
	
	# get today's date
	my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));
	
	# create the query and update the database
	my $q = qq(UPDATE libraries
	           SET libraries_name = '$name',
	               libraries_url  = '$url',
	               libraries_note = $note,
	               libraries_date = '$today',
	               libraries_lcd  = '$lcd',
	               libraries_fkey = '$fkey'
	           WHERE libraries_id = '$id');
	&prepareAndExecuteSQL ($q);
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (117, 1);
	
}


#####################
# librarians admin  #
#####################


sub displayLibrariansMenu {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (82, 1);
	
	# display the menu
	print qq(<ol>);
	print qq(<li><a href="./?cmd=displayLibrariansInputForm">Create librarian</a>);
	print qq(<li><a href="./?cmd=displayLibrariansFindForm">Find and then edit or delete a librarian</a>);
	#print qq(<li><a href="./?cmd=editLibrarians">Edit librarian</a>);
	#print qq(<li><a href="./?cmd=deleteLibrarians">Delete librarian</a>);
	print qq(</ol>);
	
}
	

sub displayLibrariansInputForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (83, 1);
	
	# display the input form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="createLibrarians">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print qq(</tr>\n);
	print "<!--  N A M E  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Name</td>\n);
	print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
	print "<td>Enter the librarian's name</td>\n";
	print "</tr>\n";
	print "<!--  E M A I L  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Email address</td>\n);
	print qq(<td align="left"><input type="text" name="email" size="45"></td>\n);
	print "<td>What is their email address?</td>\n";
	print "</tr>\n";
	print "<!--  T E L E P H O N E  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Telephone number</td>\n);
	print qq(<td align="left">\n);
	print qq(<input type="text" name="area" size="10" width="10" maxlength="10">\n);
	print qq(<input type="text" name="start" size="10" maxlength="10">\n);
	print qq(<input type="text" name="end" size="10" maxlength="10">\n);
	print qq(</td>\n);
	print "<td>Enter the telephone number?</td>\n";
	print "</tr>\n";
	print "<!--  U R L  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">URL</td>\n);
	print qq(<td align="left"><input type="text" name="url" size="45"></td>\n);
	print "<td>What is the URL of their home page?</td>\n";
	print "</tr>\n";

	# get and display all the disciplines
	&displayAllDisciplines;
	
	# end the table
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Create"> \n);
	print qq(<input type="reset" value="Reset">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}


sub createLibrarians {

	# get the input
	my $name          = $gDBhandle->quote($input->param('name'));
	my $email         = $input->param('email');
	my $area          = $input->param('area');
	my $start         = $input->param('start');
	my $end           = $input->param('end');
	my $url           = $input->param('url');
	my @disciplineIDs = $input->param('disciplineIDs');
	
	# INSERT ERROR CHECKING HERE!
	
	# get a new sequence
	my $sequence = getNewSequence();
	
	# create a query to update the database and update it
	my $q = qq(INSERT INTO librarians (librarian_id, name, telephone_area, telephone_start, telephone_end, email_address, url)
	           values ('$sequence', $name, '$area', '$start', '$end', '$email', '$url'));
	&prepareAndExecuteSQL($q);
		
	# find the record just added
	$q = qq(select * from librarians where librarian_id = '$sequence');
	&findLibrarians($q);
	
	# update items for disclines
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		$q = qq(INSERT INTO items4librarians (discipline_id, librarian_id) values ('$disciplineIDs[$i]', '$librarianIDs[0]'));
		&prepareAndExecuteSQL($q);
		
	}
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (84, 1);
	
	# display it for confirmation
	&displayTabledLibrariansOutput;
	
}
	

sub displayTabledLibrariansOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>Librarians</b></td>\n);
	print "<td><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#librarianIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$librarianIDs[$i]</td>\n);
		print qq(<td align="left"><a href="$librarianURL[$i]">$librarianNames[$i]</a></td>\n);
		print qq(<td><a href="./?cmd=editLibrarians&id=$librarianIDs[$i]">Edit</a> or <a href="./?cmd=deleteLibrarians&id=$librarianIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		
	}
		
	# end the table
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayLibrariansFindForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (85, 1);
	
	# display the search form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="displayLibrariansSearchResults">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print "</tr>\n";
	print "<!--  O P E R A T O R  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Operator</td>\n);
	print qq(<td align="left">\n);
	print qq(<select name="searchOperator">\n);
	print qq(<option value="=">is\n);
	print qq(<option value="like" selected>like\n);
	print "</select>\n";
	print "</td>\n";
	print "<td>Select an operator</td>\n";
	print "</tr>\n";
	print "<!--  S E A R C H  S T R I N G  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Search string</td>\n);
	print qq(<td align="left">\n);
	print qq(<input type="text" name="searchString" value="%">\n);
	print "</td>";
	print "<td>Enter a query term</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Search"> \n);
	print qq(<input type="reset" value="Reset">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayLibrariansSearchResults {

	# get the input
	my $searchOperator = $input->param('searchOperator');
	my $searchString   = $input->param('searchString');
	
	# INSERT ERROR CHECKING HERE!
	
	# create a query and execute it
	my $q = qq(SELECT *
	           FROM librarians
	           WHERE name $searchOperator "$searchString"
	           order by name);
	&findLibrarians($q);

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (86, 1);
	
	# display the results
	&displayTabledLibrariansOutput;
	
}
	

sub deleteLibrarians {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (87, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteLibrarians">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Delete"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the librarian from the librarian table
		my $q = qq(delete from librarians where librarian_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(delete from items4librarians where librarian_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (88, 1);
	
	}

}
	
sub editLibrarians {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (89, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editLibrarians">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Edit"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# get all the disciplines for later use
		my $q = "select * from disciplines order by discipline_name";
		&findAllDisciplines($q);

		# find the record to edit
		$q = qq(select * from librarians where librarian_id = "$id");
		&findLibrarians($q);

		# find the linked items for librarians
		$q = qq(select discipline_id
		        from items4librarians
		        where librarian_id = '$id');
		&findItems4Librarians($q);
		
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (90, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updateLibrarians">\n);
		print qq(<input type="hidden" name="id" value="$librarianIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$librarianIDs[0]</td>\n);
		print "<td>Record number</td>\n";
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Name</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$librarianNames[0]"></td>\n);
		print "<td>Enter the librarian's name</td>\n";
		print "</tr>\n";
		print "<!--  E M A I L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Email address</td>\n);
		print qq(<td align="left"><input type="text" name="email" size="45" value="$librarianEmailAddress[0]"></td>\n);
		print "<td>What is their email address?</td>\n";
		print "</tr>\n";
		print "<!--  T E L E P H O N E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Telephone number</td>\n);
		print qq(<td align="left">\n);
		print qq(<input type="text" name="area" size="10" width="10" maxlength="10" value="$librarianTelephoneArea[0]">\n);
		print qq(<input type="text" name="start" size="10" maxlength="10" value="$librarianTelephoneStart[0]">\n);
		print qq(<input type="text" name="end" size="10" maxlength="10" value="$librarianTelephoneEnd[0]">\n);
		print qq(</td>\n);
		print "<td>Enter the telephone number?</td>\n";
		print "</tr>\n";
		print "<!--  U R L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">URL</td>\n);
		print qq(<td align="left"><input type="text" name="url" size="45" value="$librarianURL[0]"></td>\n);
		print "<td>What is the URL of their home page?</td>\n";
		print "</tr>\n";
		print "<!--  D I S C I P L I N E S  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Disciplines</td>\n);
		print qq(<td align="left">\n);
		
		# process every discipline id
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
		
			# check to see if the reference was Previously Selected
			my $ps = 0;
			for $m (@I4LibrariansIDs) { if ($disciplineIDs[$i] eq $m) { $ps = 1; last; } }

			if ($ps) {
			
				print qq(<input type="checkbox" name="disciplineIDs" value="$disciplineIDs[$i]" checked>$disciplineNames[$i]<br>\n);
				
			}
			
			else {
			
				print qq(<input type="checkbox" name="disciplineIDs" value="$disciplineIDs[$i]">$disciplineNames[$i]<br>\n);
				
			}
			
		}
			
		print qq(</td>\n);
		print "<td>Select the disciplines.</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Edit"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}

}
	
	
sub updateLibrarians {

	# get the input
	my $id            = $input->param('id');
	my $name          = $input->param('name');
	my $email         = $input->param('email');
	my $area          = $input->param('area');
	my $start         = $input->param('start');
	my $end           = $input->param('end');
	my $url           = $input->param('url');
	my @disciplineIDs = $input->param('disciplineIDs');
	
	# create the query and update the database
	my $q = qq(update librarians set name = '$name',
	                        email_address = '$email',
	                       telephone_area = '$area',
	                      telephone_start = '$start',
	                        telephone_end = '$end',
	                                  url = '$url'
	                  where librarian_id  = '$id');
	&prepareAndExecuteSQL ($q);
	
	# delete any old item links 4 librarians
	$q = qq(delete from items4librarians where librarian_id = '$id');
	&prepareAndExecuteSQL ($q);
	
	# update items for disclines
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		$q = qq(INSERT INTO items4librarians (discipline_id, librarian_id) values ('$disciplineIDs[$i]', '$id'));
		&prepareAndExecuteSQL($q);
	
	}

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (91, 1);
	
}


###################
# journals admin  #
###################

sub displayJournalMenu {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (118, 1);

    $q = "SELECT count(*) as conto from etexts";
    &prepareAndExecuteSQL($q);
	
    $row=$gSth->fetchrow_hashref;
    my $conto = $row->{conto};
     
    print qq(L'archivio contiene <b>$conto</b> Ricerche); 
	
	print qq(<ol>);
	print qq(<li><a href="./?cmd=displayJournalInputForm">Create a $gElectronicJournals item</a>);
	print qq(<li><a href="./?cmd=displayJournalFindForm">Find and then edit or delete a $gElectronicJournals item</a>);
	print qq(<li><a href="./?cmd=editJournal">Edit a $gElectronicJournals item</a>);
	print qq(<li><a href="./?cmd=deleteJournal">Delete a $gElectronicJournals item</a>);
	print qq(</ol>);
	
}
	

sub displayJournalInputForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (119, 1);
	
	# display the input form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="createJournal">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print qq(</tr>\n);
	print "<!--  F O R G I E N  K E Y  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">F Key</td>\n);
	print qq(<td align="left"><input type="text" name="fkey" size="45"></td>\n);
	print "<td>Foreign key</td>\n";
	print "</tr>\n";
	print "<!--  N A M E  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">$gElectronicJournals</td>\n);
	print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
	print "<td>Enter a $gElectronicJournals term</td>\n";
	print "</tr>\n";
	print "<!--  U R L  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">URL</td>\n);
	print qq(<td align="left"><input type="text" name="url" size="45"></td>\n);
	print "<td>What is the URL?</td>\n";
	print "</tr>\n";
	print "<!--  L C D -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">LCD</td>\n);
	print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
	print "<td>LCD Resource?</td>\n";
	print "</tr>\n";
	print "<!--  D E S C R I P T I O N  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Description</td>\n);
	print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="45"></textarea>\n);
	print "<td>Enter a scope note</td>\n";
	print "</tr>\n";
	
	# get and display all the disciplines
	&displayAllDisciplines;
	
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Create"> \n);
	print qq(<input type="reset" value="Reset">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}


sub createJournal {

	# get the input
	my $name          = $gDBhandle->quote($input->param('name'));
	my $url           = $input->param('url');
	my $note          = $gDBhandle->quote($input->param('note'));
	my @disciplineIDs = $input->param('disciplineIDs');
	my $lcd           = $input->param('lcd');
	my $fkey          = $input->param('fkey');
	
	# INSERT ERROR CHECKING HERE!
	
	# get today's date
	my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));
	
	# get a new sequence
	my $sequence = getNewSequence();
	
	# create a query to update the journal and update it
	my $q = qq{INSERT INTO etexts (etext_id, etext_name, etext_url, etext_note, etext_date, etext_lcd, etext_fkey)
	           VALUES ($sequence, $name, '$url', $note, '$today', '$lcd', '$fkey')};
	&prepareAndExecuteSQL($q);
		
	# find the record just added
	$q = qq(SELECT * FROM etexts WHERE etext_id = '$sequence');
	&findAllJournals($q);
	
	# update discipline descriptions
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		$q = qq(INSERT INTO items4DisEtexts (discipline_id, etext_id)
		        VALUES ('$disciplineIDs[$i]', '$journalIDs[0]'));
		&prepareAndExecuteSQL($q);
		
	}
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (120, 1);
	
	# display it for confirmation
	&displayTabledJournalOutput;
	
}
	

sub displayTabledJournalOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>$gElectronicJournals</b></td>\n);
	print qq(<td align="left"><b>Date</b></td>\n);
	print "<td><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#journalIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$journalIDs[$i]</td>\n);
		print qq(<td align="left"><a href="$journalURLs[$i]">$journalNames[$i]</a></td>\n);
		print qq(<td align="left">$journalDates[$i]</td>\n);
		print qq(<td><a href="./?cmd=editJournal&id=$journalIDs[$i]">Edit</a> or <a href="./?cmd=deleteJournal&id=$journalIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		
	}
		
	# end table
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayJournalFindForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (121, 1);
	
	# display the search form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="displayJournalSearchResults">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print "</tr>\n";
	print "<!--  O P E R A T O R  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Operator</td>\n);
	print qq(<td align="left">\n);
	print qq(<select name="searchOperator">\n);
	print qq(<option value="=">is\n);
	print qq(<option value="like" selected>like\n);
	print "</select>\n";
	print "</td>\n";
	print "<td>Select an operator</td>\n";
	print "</tr>\n";
	print "<!--  S E A R C H  S T R I N G  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Search string</td>\n);
	print qq(<td align="left">\n);
	print qq(<input type="text" name="searchString" value="%">\n);
	print "</td>";
	print "<td>Enter a query term</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Search"> \n);
	print qq(<input type="reset" value="Reset">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayJournalSearchResults {

	# get the input
	my $searchOperator = $input->param('searchOperator');
	my $searchString = $input->param('searchString');
	
	# INSERT ERROR CHECKING HERE!
	
	# create a query and execute it
	my $q = qq(SELECT *
	           FROM etexts
	           WHERE etext_name $searchOperator "$searchString"
	           ORDER BY etext_name);
	&findAllJournals($q);

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (122, 1);
	
	# display the results
	&displayTabledJournalOutput;
	
}
	

sub deleteJournal {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (123, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteJournal">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Delete"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the journal from the journal table
		my $q = qq(DELETE FROM etexts where etext_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(DELETE FROM items4etexts where etext_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(DELETE FROM items4DisEtexts where etext_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (124, 1);
	
	}

}
	
sub editJournal {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (125, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editJournal">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Edit"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# find the record to edit
		my $q = qq(select * from etexts where etext_id = "$id");
		&findAllJournals($q);

		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (126, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updateJournal">\n);
		print qq(<input type="hidden" name="id" value="$journalIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$journalIDs[0]</td>\n);
		print "<td>Record number</td>\n";
		print "</tr>\n";
		print "<!--  D A T E  -->";
		print "<tr>\n";
		print qq(<td align="right">Date</td>\n);
		print qq(<td align="left">$journalDates[0]</td>\n);
		print "<td>Last modified</td>\n";
		print "</tr>\n";
		print "<!--  F O R G I E N  K E Y  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">F Key</td>\n);
		print qq(<td align="left"><input type="text" name="fkey" size="45" value="$journalFKeys[0]"></td>\n);
		print "<td>Foreign key</td>\n";
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">$gElectronicJournals</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$journalNames[0]"></td>\n);
		print "<td>Enter a $gElectronicJournals term</td>\n";
		print "</tr>\n";
		print "<!--  U R L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">URL</td>\n);
		print qq(<td align="left"><input type="text" name="url" size="45" value="$journalURLs[0]"></td>\n);
		print "<td>What is the URL?</td>\n";
		print "</tr>\n";
		print "<!--  L C D -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">LCD</td>\n);
		
		if ($journalLCDs[0]) {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1" checked></td>\n);
		}
		else {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
		}
		
		print "<td>LCD Resource?</td>\n";
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="45">$journalNotes[0]</textarea>\n);
		print "<td>Enter a scope note</td>\n";
		print "</tr>\n";
	
		# get and display all the previouslyu selected disciplines
		&displayAllSelectedDisciplines ($id, "items4DisEtexts", "etext_id");
	
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Edit"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}

}
	
	
sub updateJournal {

	# get the input
	my $id            = $input->param('id');
	my $name          = $gDBhandle->quote($input->param('name'));
	my $url           = $input->param('url');
	my $note          = $gDBhandle->quote($input->param('note'));
	my @disciplineIDs = $input->param('disciplineIDs');
	my $lcd           = $input->param('lcd');
	my $fkey          = $input->param('fkey');
	
	# get today's date
	my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));
	
	# create the query and update the journal
	my $q = qq(UPDATE etexts
	           SET etext_name = $name,
	               etext_url  = '$url',
	               etext_note = $note,
	               etext_date = '$today',
	               etext_lcd  = '$lcd',
	               etext_fkey = '$fkey'
	           WHERE etext_id = '$id');
	&prepareAndExecuteSQL ($q);
	
	# delete any old join relationships
	$q = qq(DELETE FROM items4DisEtexts WHERE etext_id = '$id');
	&prepareAndExecuteSQL ($q);
	
	# update items for disclines
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		$q = qq{INSERT INTO items4DisEtexts (discipline_id, etext_id)
		        VALUES ('$disciplineIDs[$i]', '$id')};
		&prepareAndExecuteSQL($q);
		
	}

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (127, 1);
	
}


###############
# help admin  #
###############

sub setSimpleHelp {
	
	# read the contents of the form
	my $id        = $input->param(help_id);
	my $helpTitle = $gDBhandle->quote($input->param(help_title));
	my $helpText  = $gDBhandle->quote($input->param(help_text));
		
	# save the help text
	my $q = qq (update help_simple set help_title = $helpTitle,
	                                   help_text  = $helpText
	                                where help_id = "$id");
	&prepareAndExecuteSQL ($q);
			
	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (60, 1);
	
	print "<blockquote>\n";
	print "Title: " . $input->param(help_title) . "<br>";
	print "Text: ".  $input->param(help_text);
	print "</blockquote>\n";
	
	}
	
	
sub customizeSimpleHelp {

	# get the selected discipline-specific id
	my $id = $input->param('help');
		
	if (! $id) {
		
		# start the output
		print $output->header();

		# start the html
		&displaySimpleHelpMessage (58, 1);
	
		# find all the help texts
		my $q = qq(select * from help_simple order by help_title);
		&findAllSimpleHelp($q);
		
		# print the list of help texts
		print "<ol>\n";
		for ($i = 0; $i <= $#simpleHelpID; $i++) {
			print qq (<li><a href="./?cmd=customizeSimpleHelp&help=$simpleHelpID[$i]">$simpleHelpTitle[$i]</a> (#$simpleHelpID[$i])\n);
			}
		print "</ol>\n";
		
		}
		
	else {
		
		# start the output
		print $output->header();

		# start the html
		&displaySimpleHelpMessage (59, 1);
	
		# get this message of the day
		$q = qq (select * from help_simple where help_id = '$id');
		&findAllSimpleHelp($q);
		
		# start the form
		print "<center>\n";
		print $output->startform(-method => 'POST', -action => './');
		print $output->hidden(-name => 'cmd',  -value => 'setSimpleHelp');
		print $output->hidden(-name => 'help_id',  -default => "$id");

		print "<table border=1>\n";
		print qq(<tr valign="top">);
		print "<td align=right><b>Field</b></td>\n";
		print "<td><b>Selection</b></td>\n";
		print "<td><b>Description</b></td>\n";
		print "</tr>\n";
		
		print qq(<tr valign="top">);
		print "<td align=right>Title</td>";
		print "<td>";
		print $output->textfield(-name => 'help_title', -size => '50', -default => "$simpleHelpTitle[0]");
		print "</td>";
		print "<td>What is the name of this Simple Help text?</td>";
		print "</tr>";
		
		print qq(<tr valign="top">);
		print "<td align=right>Help text</td>";
		print "<td>";
		print qq(<textarea name="help_text" cols="50" rows="20" wrap="virtual">$simpleHelpText[0]</textarea>);
		print "</td>";
		print "<td>Enter the help text here.</td>";
		print "</tr>";
		
		print "</table>\n";
		print "<p>";
		print $output->submit(-name => 'submit', -value => 'Edit');              
		print $output->reset(-name => 'Reset', -value => 'Reset');              
		print "</p>\n";
		print "<center>\n";
		print $output->endform;	
		}
	}


#####################
# discipline admin  #
#####################

sub displayAllSelectedDisciplines {

	# get the id, join table, and field
	my $id = @_[0];
	my $table = @_[1];
	my $field = @_[2];

	# get all the disciplines for later use
	my $q = "select * from disciplines order by discipline_name";
	&findAllDisciplines($q);

	# find the linked disciplines
	$q = qq(select discipline_id
		    from $table
		    where $field = '$id');
	&findItems4DisJoins($q);
		
	print "<!--  D I S C I P L I N E S  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Disciplines</td>\n);
	print qq(<td align="left">\n);

	# process every discipline id
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
		
		# check to see if the reference was Previously Selected
		my $ps = 0;
		for $m (@I4DisJoinIDs) { if ($disciplineIDs[$i] eq $m) { $ps = 1; last; } }

		if ($ps) {
			
			print qq(<input type="checkbox" name="disciplineIDs" value="$disciplineIDs[$i]" checked>$disciplineNames[$i]<br>\n);
				
			}
			
		else {
			
			print qq(<input type="checkbox" name="disciplineIDs" value="$disciplineIDs[$i]">$disciplineNames[$i]<br>\n);
				
			}
			
		}
			
	print qq(</td>\n);
	print "<td>Select the disciplines.</td>\n";
	print "</tr>\n";

	}
	
	
sub displayAllDisciplines {

	# get all the disciplines for later use
	my $q = "select * from disciplines order by discipline_name";
	&findAllDisciplines($q);

	print "<!--  D I S C I P L I N E S  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Disciplines</td>\n);
	print qq(<td align="left">\n);
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
		print qq(<input type="checkbox" name="disciplineIDs" value="$disciplineIDs[$i]">$disciplineNames[$i]<br>\n);
		}
	print qq(</td>\n);
	print "<td>Select the disciplines.</td>\n";
	print "</tr>\n";

	}
	
	
sub displayDisciplinesMenu {

	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (92, 1);
	
	print qq(<ol>);
	print qq(<li><a href="./?cmd=displayDisciplinesInputForm">Create discipline</a>);
	print qq(<li><a href="./?cmd=displayDisciplinesFindForm">Find and then edit or delete a discipline</a>);
	#print qq(<li><a href="./?cmd=editDisciplines">Edit discipline</a>);
	#print qq(<li><a href="./?cmd=deleteDisciplines">Delete discipline</a>);
	print qq(</ol>);
	
	}
	

sub displayDisciplinesInputForm {

	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (93, 1);
	
	# display the input form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="createDisciplines">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print qq(</tr>\n);
	print "<!--  N A M E  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Disciplines</td>\n);
	print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
	print "<td>Enter a discipline term</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Create"> \n);
	print qq(<input type="reset" value="Reset">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
	}


sub createDisciplines {

	# get the input
	my $name = $gDBhandle->quote($input->param('name'));
	
	# INSERT ERROR CHECKING HERE!
	
	# get a new sequence
	my $sequence = getNewSequence();
	
	# create a query to update the database and update it
	my $q = qq{INSERT INTO disciplines (discipline_id, discipline_name) VALUES ($sequence, $name)};
	&prepareAndExecuteSQL($q);
		
	# find the record just added
	$q = qq(SELECT * FROM disciplines WHERE discipline_id = $sequence);
	&findAllDisciplines($q);
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (94, 1);
	
	# display it for confirmation
	&displayTabledDisciplinesOutput;
	
}
	

sub displayTabledDisciplinesOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>Disciplines</b></td>\n);
	print "<td><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$disciplineIDs[$i]</td>\n);
		print qq(<td align="left">$disciplineNames[$i]</td>\n);
		print qq(<td><a href="./?cmd=editDisciplines&id=$disciplineIDs[$i]">Edit</a> or <a href="./?cmd=deleteDisciplines&id=$disciplineIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		
	}
	
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayDisciplinesFindForm {

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (95, 1);
	
	# display the search form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="displayDisciplinesSearchResults">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print "</tr>\n";
	print "<!--  O P E R A T O R  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Operator</td>\n);
	print qq(<td align="left">\n);
	print qq(<select name="searchOperator">\n);
	print qq(<option value="=">is\n);
	print qq(<option value="like" selected>like\n);
	print "</select>\n";
	print "</td>\n";
	print "<td>Select an operator</td>\n";
	print "</tr>\n";
	print "<!--  S E A R C H  S T R I N G  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Search string</td>\n);
	print qq(<td align="left">\n);
	print qq(<input type="text" name="searchString" value="%">\n);
	print "</td>";
	print "<td>Enter a query term</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Search"> \n);
	print qq(<input type="reset" value="Reset">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayDisciplinesSearchResults {

	# get the input
	my $searchOperator = $input->param('searchOperator');
	my $searchString = $input->param('searchString');
	
	# INSERT ERROR CHECKING HERE!
	
	# create a query and execute it
	my $q = qq(SELECT *
	           FROM disciplines
	           WHERE discipline_name $searchOperator "$searchString"
	           ORDER BY discipline_name);
	&findAllDisciplines($q);

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (96, 1);
	
	# display the results
	&displayTabledDisciplinesOutput;
	
}
	

sub deleteDisciplines {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (97, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteDisciplines">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Delete"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the discipline from the discipline table
		my $q = qq(delete from disciplines where discipline_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		#$q = qq(delete from items4disciplines where discipline_id = '$id');
		#&prepareAndExecuteSQL($q);
		
		# delete default profile (call number ranges) from the default profiles table
		$q = qq(DELETE FROM defaultProfiles WHERE discipline_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (98, 1);
	
	}

}
	
sub editDisciplines {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (99, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editDisciplines">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Edit"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# find the record to edit
		my $q = qq(select * from disciplines where discipline_id = "$id");
		&findAllDisciplines($q);

		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (100, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updateDisciplines">\n);
		print qq(<input type="hidden" name="id" value="$disciplineIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$disciplineIDs[0]</td>\n);
		print "<td>Record number</td>\n";
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Disciplines</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$disciplineNames[0]"></td>\n);
		print "<td>Enter a discipline term</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Edit"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}

}
	
	
sub updateDisciplines {

	# get the input
	my $id   = $input->param('id');
	my $name = $gDBhandle->quote($input->param('name'));
	
	# create the query and update the database
	my $q = qq(UPDATE disciplines SET discipline_name = $name WHERE discipline_id  = '$id');
	&prepareAndExecuteSQL ($q);

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (101, 1);
	
	
}
	

#####################
# discipline views  #
#####################

sub processCombination {

	# get the input
	my $IDs         = @_[0];
	my $defaults    = @_[1];
	my $URLs        = @_[2];
	my $names       = @_[3];
	my $combination = @_[4];
	
	# branch according to the view
	if ($combination eq 'defaults') {
		print "<h4>Default links</h4>\n<ol>";
		for ($i = 0; $i <= $#$IDs; $i++) {
			my $ps = 0;
			for ($j = 0; $j <= $#$defaults; $j++) { if ($IDs->[$i] eq $defaults->[$j]) { $ps = 1; last; } }
			if ($ps) { print qq(<li><a href="$URLs->[$i]">$names->[$i]</a>\n);	}
		}
		print "</ol>";
	}
	
	elsif ($combination eq 'non-defaults') {
		print "<h4>Non-default links</h4>\n<ol>";
		for ($i = 0; $i <= $#$IDs; $i++) {
			my $ps = 0;
			for ($j = 0; $j <= $#$defaults; $j++) { if ($IDs->[$i] eq $defaults->[$j]) { $ps = 1; last; } }
			if (! $ps) { print qq(<li><a href="$URLs->[$i]">$names->[$i]</a>\n);	}
		}
		print "</ol>";
	}
	
	elsif ($combination eq 'grouped') {
		print "<h4>Default links</h4>\n<ol>";
		for ($i = 0; $i <= $#$IDs; $i++) {
			my $ps = 0;
			for ($j = 0; $j <= $#$defaults; $j++) { if ($IDs->[$i] eq $defaults->[$j]) { $ps = 1; last; } }
			if ($ps) { print qq(<li><a href="$URLs->[$i]">$names->[$i]</a>\n);	}
		}
		print "</ol>";
		print "<h4>Non-default links</h4>\n<ol>";
		for ($i = 0; $i <= $#$IDs; $i++) {
			my $ps = 0;
			for ($j = 0; $j <= $#$defaults; $j++) { if ($IDs->[$i] eq $defaults->[$j]) { $ps = 1; last; } }
			if (! $ps) { print qq(<li><a href="$URLs->[$i]">$names->[$i]</a>\n);	}
		}
		print "</ol>";
	}
	
	elsif ($combination eq 'alphabetical') {
		print "<h4>Alphabetical list</h4>\n<ol>";
		for ($i = 0; $i <= $#$IDs; $i++) {
			my $ps = 0;
			for ($j = 0; $j <= $#$defaults; $j++) { if ($IDs->[$i] eq $defaults->[$j]) { $ps = 1; last; } }
			if ($ps) { print qq(<li><a href="$URLs->[$i]">$names->[$i]</a> <font color=red>*</font>\n);	}
			else { print qq(<li><a href="$URLs->[$i]">$names->[$i]</a>\n);	}
		}
		print "</ol>";
	}
	
	else { &returnError ("Programmer error; Unknown combination ($combination). ") }
	
}


sub displayDisciplineView {

	# read the contents of the form
	my $id          = $input->param(disciplineID);
	my @sections    = $input->param(sections);
	my $combination = $input->param(combination);
	
	# get the discipline ID's name
	$q = qq(select * from disciplines where discipline_id = $id);
	&findAllDisciplines($q);
	
	# get today
	my $today = strftime ("%m/%d/%Y", localtime(parsedate ('now', NOW)));

	# start the output
	print $output->header();

	# start the html
	&displaySimpleHelpMessage (211, 1);
	print "<h2>$disciplineNames[0] as of $today</h2>";
	
	# process each section
	foreach $s (@sections) {

		if ($s eq 'libraries') {
			
			# find all the resources
			$q = qq(select * from libraries order by libraries_name);
			&findAllLibraries($q);
			$q = qq(select * from defaultLibraries where discipline_id = "$id");
			&findDefaultResources($q, "libraries_id");
			
			# display a header
			print "<h3>Libraries links</h3>";
			
			# process the appropriate combination
			&processCombination (\@librariesIDs, \@defaultIDs, \@librariesURLs, \@librariesNames, $combination);
			
			}
			
		elsif ($s eq 'university') {
		
			# find all university resoruces
			$q = qq(select * from university order by university_name);
			&findAllUniversity($q);
			$q = qq(select * from defaultUniversity where discipline_id = "$id");
			&findDefaultResources($q, "university_id");
			
			# display a header
			print "<h3>University links</h3>";
			
			# process the appropriate combination
			&processCombination (\@universityIDs, \@defaultIDs, \@universityURLs, \@universityNames, $combination);
			
			}
			
		elsif ($s eq 'quickSearches') {
		
			# find all quick search resoruces
			$q = qq(select * from qsearches order by qsearch_name);
			&findAllQSearches($q);
			$q = qq(select * from defaultQseaches where discipline_id = "$id");
			&findDefaultResources($q, "qsearch_id");
			
			# display a header
			print "<h3>Quick Searches</h3>";
			
			# process the appropriate combination
			&processCombination (\@qSearchIDs, \@defaultIDs, \@qSearchURLs, \@qSearchNames, $combination);
			
			}
		elsif ($s eq 'references') {
		
			# find all reference shelf resoruces for this discipline
			$q = qq(select reference.reference_id, reference.reference_name,
             		reference.reference_url, reference.reference_note
             		from reference, items4DisReference
             		where items4DisReference.discipline_id = $id
             		and
             		items4DisReference.reference_id = reference.reference_id
             		order by reference.reference_name);
			&findAllReferences($q);
			$q = qq(select * from defaultReferences where discipline_id = "$id");
			&findDefaultResources($q, "reference_id");
			
			# display a header
			print "<h3>Reference Shelf</h3>";
			
			# process the appropriate combination
			&processCombination (\@referenceIDs, \@defaultIDs, \@referenceURLs, \@referenceNames, $combination);
			
			}
			
		elsif ($s eq 'bibDatabases') {
		
			# find all bibliographic database resoruces for this discipline
			$q = qq(select bib_databases.bib_database_id, bib_databases.bib_database_name,
             		bib_databases.bib_database_url, bib_databases.bib_database_note
             		from bib_databases, items4DisBibdatabases
             		where items4DisBibdatabases.discipline_id = $id
             		and
             		items4DisBibdatabases.bib_database_id = bib_databases.bib_database_id
             		order by bib_databases.bib_database_name);
			&findAllDatabases($q);
			$q = qq(select * from defaultBibdatabases where discipline_id = "$id");
			&findDefaultResources($q, "bib_database_id");
			
			# display a header
			print "<h3>Bibliographic databases</h3>";
			
			# process the appropriate combination
			&processCombination (\@databaseIDs, \@defaultIDs, \@databaseURLs, \@databaseNames, $combination);
			
			}
			
		elsif ($s eq 'ejournals') {

			# find all electronic journals resoruces for this discipline
			$q = qq (select etexts.etext_id, etexts.etext_name,
             		etexts.etext_url, etexts.etext_note
             		from etexts, items4DisEtexts
             		where items4DisEtexts.discipline_id = $id
            		and
             		items4DisEtexts.etext_id = etexts.etext_id
             		order by etexts.etext_name);
            &findAllJournals($q);
			$q = qq(select * from defaultEtexts where discipline_id = "$id");
			&findDefaultResources($q, "etext_id");
						
			# display a header
			print "<h3>Electronic journals</h3>";
			
			# process the appropriate combination
			&processCombination (\@journalIDs, \@defaultIDs, \@journalURLs, \@journalNames, $combination);
			
			}
			
		else {
			print "<p>Programmer error: unknown section ($s). Call Eric.</p>"
			}

	}
		
}


sub displayDisciplineViewsMenu {

	# read all the discipline 
	$q = "select * from disciplines order by discipline_name";
	&findAllDisciplines($q);
	
	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (210, 1);
	
	# start the form
	print qq(<ol>);
	print qq(<form method=GET action="./?">);
	print qq(<input type=hidden name=cmd value=displayDisciplineView>);
	
	# display a menu of all disciplines
	print qq(<p><li>Select a discipline.</p>);
	print "<select name=disciplineID size=1>\n";
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
		print qq (<option value="$disciplineIDs[$i]">$disciplineNames[$i]\n);
		}
	print "</select>\n";
	
	# which sections do they want displayed?
	print qq(<p><li>Which sections do you want in your output?</p>);
	print qq(<ul>);
	print qq(<li><input type=checkbox name=sections value=libraries>Library links);
	print qq(<li><input type=checkbox name=sections value=university>University links);

	# check for quick searches
	if ($gShowQuickSearches) {

		print qq(<li><input type=checkbox name=sections value=quickSearches>Quick Searches);
		
	}
	
	print qq(<li><input type=checkbox name=sections value=references>Reference Shelf);
	print qq(<li><input type=checkbox name=sections value=bibDatabases checked>Bibliographic databases);
	print qq(<li><input type=checkbox name=sections value=ejournals checked>Electronic Journals);
	print qq(</ul>);
		
	# which sections do they want displayed?
	print qq(<p><li>What combination of recommended/non-recommended resources do you want?</p>);
	print qq(<ul>);
	print qq(<li><input type=radio name=combination value=defaults checked>Just the recommended resources);
	print qq(<li><input type=radio name=combination value=non-defaults>Just the non-recommended resources);
	print qq(<li><input type=radio name=combination value=grouped>Grouped list of all resources);
	print qq(<li><input type=radio name=combination value=alphabetical>Alphabetical list of all resources);
	print qq(</ul>);

	# end the form
	print qq(<p><li><input type=submit value="Create report"> <input type=reset></p>);
	print qq(</form>);
	print qq(</ol>);
	
	}


#######################
# discipine profiles  #
#######################


sub editDisciplineProfiles {

	# get the discipline id
	my $id          = $input->param('id');
	my $profileID   = $input->param('profileID');
	my $lowerBounds = $input->param('lower_bounds');
	my $upperBounds = $input->param('upper_bounds');

	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (246, 1);

	# check for a discipline id
	if (! $id) {
	
		
		# get all the disciplines
		my $q = "select * from disciplines order by discipline_name";
		&findAllDisciplines($q);

		# display a list of disciplines
		print qq(<form action="./" method="GET");
		print "<input type=hidden name=cmd value=editDisciplineProfiles>";
		print "<select name=id>";
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
		
			print qq(<option value="$disciplineIDs[$i]">$disciplineNames[$i]\n);
			
		}
		print qq(</select>\n);
		print "<input type=submit>\n";
		print "</form>";
		
		# graceful exit
		&gracefulExit;
		
	}
	
	# check for profile id
	if ($profileID) {
	
		# create and execute a DELETE command
		my $q = qq(DELETE FROM defaultProfiles WHERE defaultProfile_id = '$profileID');
		&prepareAndExecuteSQL ($q);
	
	}
	
	# check for lower bounds, assuming there is an upper bounds
	if ($lowerBounds) {
	
		# get a new sequence
		my $sequence = getNewSequence();
		
		# create and execute an INSERT statement
		my $q = qq[INSERT INTO defaultProfiles
		           (defaultProfile_id, discipline_id, lower_bounds, upper_bounds)
		           VALUES
		           ('$sequence', '$id', '$lowerBounds', '$upperBounds')];
		&prepareAndExecuteSQL ($q);
		
	}
	
	# get the discipline id's name
	my $q = "select * from disciplines where discipline_id = '$id'";
	&findAllDisciplines($q);

	print "<p>Editing the profiles for the discipline <strong>$disciplineNames[0]</strong>.</p>";
	
	# display the form
	print qq(<form action="./" method="GET");
	print "<input type=hidden name=cmd value=editDisciplineProfiles>";
	print "<input type=hidden name=id value=$disciplineIDs[0]>";
	print "<table border=1>";
	print "<tr>";
	print "<td align=right><B>Item</B></td>";
	print "<td><B>Value</B></td>";
	print "<td><B>Description</B></td>";
	print "<tr>";
	print "<td align=right>Lower bounds</td>";
	print "<td><input name=lower_bounds></td>";
	print "<td>Enter the lowest call number.</td>";
	print "</tr>";
	print "<tr>";
	print "<td align=right>Upper bounds</td>";
	print "<td><input name=upper_bounds></td>";
	print "<td>Enter the highest call number.</td>";
	print "</tr>";
	print "</tr>";
	print "</table>";
	print "<p><input type=submit></p>";
	print "</form>";
	
	# find the previously created profiles
	$q = "SELECT * FROM defaultProfiles WHERE discipline_id = '$id' ORDER BY lower_bounds";
	&findAllDefaultProfiles($q);
	
	# check for previously created profiles
	if ($#defaultProfileIDs > -1) {
	
		# list previously created profiles and allow them to be deleted
		print "Previously created profiles for $disciplineNames[0].";
		print "<ol>";
		for ($i = 0; $i <= $#defaultProfileIDs; $i++) {
		
			print qq{<li>$lowerBounds[$i] - $upperBounds[$i] (<a href="./?cmd=editDisciplineProfiles&id=$id&profileID=$defaultProfileIDs[$i]">Delete</a>)};
		
		}
		print "</ol>";
		
	}
	
}


#####################
# static html pages #
#####################

sub displayDisciplinePagesMenu {

	# check for host
	if (! $CONFIGURATIONS{'gRemoteDisciplinePagesHost'}) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (243, 1);
		
		# quit
		&gracefulExit;
		
	}
	
	# check for username
	if (! $CONFIGURATIONS{'gRemoteDisciplinePagesUsername'}) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (241, 1);
		
		# quit
		&gracefulExit;
		
	}
	
	# check for password
	if (! $CONFIGURATIONS{'gRemoteDisciplinePagesPassword'}) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (242, 1);
		
		# quit
		&gracefulExit;
		
	}
	
	# check for root
	if (! $CONFIGURATIONS{'gRemoteDisciplinePagesRoot'}) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (245, 1);
		
		# quit
		&gracefulExit;
		
	}
	
	# check for htdocs
	if (! $CONFIGURATIONS{'gRemoteDisciplinePagesHTML'}) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (244, 1);
		
		# quit
		&gracefulExit;
		
	}
	
	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (207, 1);
	
	print "<ol>";
	print "<li><a href=./?cmd=createDisciplinePages>Write sottocategorie page(s)</a>";
	print "<li><a href=./?cmd=writeAlphabeticLists>Write alphabetic lists</a>";
	print "<li><a href=./?cmd=writeDisciplineIndexFile>Write index.html file</a>";
	print "</ol>";
	
}
	
sub writeAlphabeticLists {

	# start the output
	print $output->header(-expires => '-1d');

	# check for submit button
	if (! $input->param('submit')) {
	
		# find the record just added
		$q = qq(select * from templates_static order by template_static_name);
		&findAllStaticTemplates($q);
		
		# start the html
		&displaySimpleHelpMessage (207, 1);
		
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="writeAlphabeticLists">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">Template</td>\n);
		print qq(<td align="left"><select name=template_id>);
		
		for ($i = 0; $i <= $#templateStaticIDs; $i++) {
		
			print qq(<option value=$templateStaticIDs[$i]>$templateStaticNames[$i]);
			
		}
		
		print qq(</select></td>\n);
		print "<td>Select a template</td>\n";
		print "</tr>\n";
		print "<tr valign=top>\n";
		print qq(<td align="right">Resources</td>\n);
		print qq(<td align="left">);
		print "<input type=checkbox name=resource_types value=library_links>$gLibraryLinks<br>";
		print "<input type=checkbox name=resource_types value=university_links>$gUniversityLinks<br>";
		print "<input type=checkbox name=resource_types value=reference_shelf>$gReferenceShelf<br>";
		print "<input type=checkbox name=resource_types value=bib_databases>$gBibliographicDatabaseLinks<br>";
		print "<input type=checkbox name=resource_types value=ejournals>$gElectronicJournals";
		print qq(</td>\n);
		print "<td>Select resource types</td>\n";
		print qq(</tr>\n);
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" name=submit value="Write"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}
	
	else {

		# get my input
		my $id            = $input->param('template_id');
		my @resourceTypes = $input->param('resource_types');

		# scope sum variables
		my $title;
		my $resourceList;
		my $outfile;
		my $q;
		
		# get the template
		$q = qq(SELECT *
		        FROM templates_static
		        WHERE template_static_id = '$id');
		&findAllStaticTemplates($q);
		
		# process every resource type
		for ($i = 0; $i <= $#resourceTypes; $i++) {
		
			$resourceList = '<ul>';
			
			# check type
			if ($resourceTypes[$i] eq 'reference_shelf') {
			
				# initialize the title
				$title = $gReferenceShelf;
				
				# create an outfile name
				$outfile = '00-' . &mungeDisciplineName ($gReferenceShelf) . '.html';

				# create necessary sql
				$q = qq (SELECT * FROM reference ORDER BY reference_name);
				&findAllReferences ($q);
				
				for ($j=0; $j <= $#referenceIDs; $j++) {
				
					$resourceList .= qq(<li><b><a href="$referenceURLs[$j]">$referenceNames[$j]</a></b> &nbsp;  &lt; &nbsp; $referenceURLs[$i] &nbsp; &gt; );
					if ($referenceNotes[$j]) { $resourceList .= qq( <br> $referenceNotes[$j]); }
					if ($referenceFKeys[$j]) { $resourceList .= qq( (<a href='$gMarion$referenceFKeys[$j]'>full record</a>)); }
					$resourceList .= "\n";
					
				}
								
			}
			
			elsif ($resourceTypes[$i] eq 'bib_databases') {
			
				# initialize the title
				$title = $gBibliographicDatabaseLinks;
				
				# create an outfile name
				$outfile = '00-' . &mungeDisciplineName ($gBibliographicDatabaseLinks) . '.html';

				# create necessary sql
				$q = qq(select * from bib_databases order by bib_database_name);
				&findAllDatabases($q);
				
				for ($j=0; $j <= $#databaseIDs; $j++) {
				
					$resourceList .= qq(<li><a href="$databaseURLs[$j]">$databaseNames[$j]</a>);
					if ($databaseNotes[$j]) { $resourceList .= qq( <br> $databaseNotes[$j]); }
					if ($databaseFKeys[$j]) { $resourceList .= qq( (<a href='$gMarion$databaseFKeys[$j]'>full record</a>)); }
					$resourceList .= "\n";
					
				}
								
			}
			
			elsif ($resourceTypes[$i] eq 'ejournals') {
			
				# initialize the title
				$title = $gElectronicJournals;
				
				# create an outfile name
				$outfile = '00-' . &mungeDisciplineName ($gElectronicJournals) . '.html';

				# create necessary sql
				$q = qq(select * from etexts order by etext_name);
				&findAllJournals($q);
				
				for ($j=0; $j <= $#journalIDs; $j++) {
				
					$resourceList .= qq(<li><b><a href="$journalURLs[$j]">$journalNames[$j]</a></b> &nbsp;  &lt; $journalURLs[$j] &nbsp;&gt;);
					if ($journalNotes[$j]) { $resourceList .= qq( <br> $journalNotes[$j]); }
					if ($journalFKeys[$j]) { $resourceList .= qq( (<a href='$gMarion$journalFKeys[$j]'>full record</a>)); }
					$resourceList .= "\n";
					
				}

								
			}
			
			elsif ($resourceTypes[$i] eq 'library_links') {
			
				# initialize the title
				$title = $gLibraryLinks;
				
				# create an outfile name
				$outfile = '00-' . &mungeDisciplineName ($gLibraryLinks) . '.html';

				# create necessary sql
				$q = "select * from libraries order by libraries_name";
				&findAllLibraries ($q);
				
				for ($j=0; $j <= $#librariesIDs; $j++) {
				
					$resourceList .= qq(<li><a href="$librariesURLs[$j]">$librariesNames[$j]</a>);
					if ($librariesNotes[$j]) { $resourceList .= qq( <br> $librariesNotes[$j]); }
					if ($librariesFKeys[$j]) { $resourceList .= qq( (<a href='$gMarion$librariesFKeys[$j]'>full record</a>)); }
					$resourceList .= "\n";
					
				}

								
			}
			
			elsif ($resourceTypes[$i] eq 'university_links') {
			
				# initialize the title
				$title = $gUniversityLinks;
				
				# create an outfile name
				$outfile = '00-' . &mungeDisciplineName ($gUniversityLinks) . '.html';

				# create necessary sql
				$q = "select * from university order by university_name";
				&findAllUniversity ($q);
					
				for ($j=0; $j <= $#universityIDs; $j++) {
				
					$resourceList .= qq(<li><a href="$universityURLs[$j]">$universityNames[$j]</a>);
					if ($universityNotes[$j]) { $resourceList .= qq( <br> $universityNotes[$j]); }
					if ($universityFKeys[$j]) { $resourceList .= qq( (<a href='$gMarion$universityFKeys[$j]'>full record</a>)); }
					$resourceList .= "\n";
					
				}

								
			}
			
			else { &returnError ("Uknown value for resource type: ($resourceTypes[$i])") }
			
			# end the resoruce list
			$resourceList .= '</ul>';

			# fill up the token list
			%tokens = (
				       title        => $title,
				       resourceList => $resourceList				
	        );
	
			# open the output file
			open (OUTFILE, "> /tmp/$outfile");
			print OUTFILE &fillTemplate($templatesStatic[0], \%tokens);
			close OUTFILE;
	
			# move the file to its home
			&putFiles ($outfile);
	
			print "<p><a href=http://$CONFIGURATIONS{'gRemoteDisciplinePagesHost'}$CONFIGURATIONS{'gRemoteDisciplinePagesHTML'}/$outfile>http://$CONFIGURATIONS{'gRemoteDisciplinePagesHost'}$CONFIGURATIONS{'gRemoteDisciplinePagesHTML'}/$outfile</a></p>";
		
		}
		
	}
	
}
		

sub createDisciplinePages {

	# scope sum stuff
	my $q;
	
	# start the output
	print $output->header(-expires => '-1d');

	# check for submit button
	if (! $input->param('submit')) {

		# get all the disciplines
		$q = 'SELECT * FROM disciplines ORDER BY discipline_name';
		&findAllDisciplines($q);
	
		# get all the templates
		$q = 'SELECT * FROM templates_static ORDER BY template_static_name';
		&findAllStaticTemplates($q);
		
		# start the html
		&displaySimpleHelpMessage (207, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="createDisciplinePages">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">Template</td>\n);
		print qq(<td align="left"><select name=template_id>);
		
		for ($i = 0; $i <= $#templateStaticIDs; $i++) {
		
			print qq(<option value=$templateStaticIDs[$i]>$templateStaticNames[$i]);
			
		}
		
		print qq(</select></td>\n);
		print "<td>Select a template</td>\n";
		print "</tr>\n";
		print "<tr valign=top>\n";
		print qq(<td align="right">Disciplines</td>\n);
		print qq(<td align="left">);

		# process every discipline
		for ($i=0; $i <= $#disciplineIDs; $i++) {
		
			# display the discipline and checkbox
			print "<input type=checkbox name=disciplineIDs value=$disciplineIDs[$i]>$disciplineNames[$i]<br>";
				
		}

		print qq(</td>\n);
		print "<td>Select the disciplines</td>\n";
		print qq(</tr>\n);
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" name=submit value="Write"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";

	}
	
	else {

		# get the input
		my $id            = $input->param('template_id');
		my @disciplineIDs = $input->param('disciplineIDs');
		
		# scope sum variables
		my $disciplineTitle;
		my $referenceTitle;
		my $referenceList;
		my $bibDatabaseTitle;
		my $bibDatabaseList;
		my $ejournalTitle;
		my $ejournalList;
		
		# get the template
		$q = qq(SELECT *
		        FROM templates_static
		        WHERE template_static_id = '$id');
		&findAllStaticTemplates($q);
		
		# flush the output
		$| = 1;
	
		# start the html
		print "There are " . ($#disciplineIDs + 1) . " disciplines to process...";
		print "<ul>";
	
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
			# get the name of this discipline
			my $q = qq(select * from disciplines where discipline_id = "$disciplineIDs[$i]");
			&findAllDisciplines($q);
		
			# define the discipline's title
			$disciplineTitle = $disciplineNames[0];

			# find all the REFERENCE SHELF items for this discipline
			$q = qq (SELECT reference.*
               	     FROM reference, items4DisReference
                	 WHERE items4DisReference.discipline_id = '$disciplineIDs[$i]'
                	 AND items4DisReference.reference_id = reference.reference_id
                	 ORDER BY reference.reference_name);
			&findAllReferences ($q);
	    
			# create the reference list
	   		$referenceTitle = $gReferenceShelf;
	   		$referenceList = '<ul>';
	    	for ($j = 0; $j <= $#referenceIDs; $j++) {
	    
	    		$referenceList .= qq(<li><b><a href="$referenceURLs[$j]">$referenceNames[$j]</a></b> &nbsp;  &lt; $referenceURLs[$j]&nbsp;&gt; );
	    		if ($referenceNotes[$j]) { $referenceList .= " <br> $referenceNotes[$j]"; }
				if ($referenceFKeys[$j]) { $resourceList .= qq( (<a href='$gMarion$referenceFKeys[$j]'>full record</a>)); }
	    		$referenceList .= "\n";
	    	
	    	}
	    	$referenceList .= "</ul>\n";

			# find all the BIBLIOGRAPHIC DATABASE items for this discipline
			$q = qq (SELECT bib_databases.*
                     FROM bib_databases, items4DisBibdatabases
                     WHERE items4DisBibdatabases.discipline_id = '$disciplineIDs[$i]'
                     AND items4DisBibdatabases.bib_database_id = bib_databases.bib_database_id
                     ORDER BY bib_databases.bib_database_name);
			&findAllDatabases ($q);
	    
			# create the database list
	   		$bibDatabaseTitle = $gBibliographicDatabaseLinks;
	   		$bibDatabaseList = '<ul>';
	    	for ($j = 0; $j <= $#databaseIDs; $j++) {
	    
	    		$bibDatabaseList .= qq(<li><a href="$databaseURLs[$j]">$databaseNames[$j]</a>);
	    		if ($databaseNotes[$j]) { $bibDatabaseList .= " <br> $databaseNotes[$j]"; }
				if ($databaseFKeys[$j]) { $bibDatabaseList .= qq( (<a href='$gMarion$databaseFKeys[$j]'>full record</a>)); }
	    		$bibDatabaseList .= "\n";
	    	
	    	}
	    	$bibDatabaseList .= "</ul>\n";

			# find all the EJOURNAL items for this discipline
			$q = qq (SELECT etexts.*
                	 FROM etexts, items4DisEtexts
                	 WHERE items4DisEtexts.discipline_id = '$disciplineIDs[$i]'
                	 AND items4DisEtexts.etext_id = etexts.etext_id
                     ORDER BY etexts.etext_name);
			&findAllJournals ($q);
	    
			# create the journal list
	   		$ejournalTitle = $gElectronicJournals;
	   		$ejournalList = '<ul>';
	    	for ($j = 0; $j <= $#journalIDs; $j++) {
	    
	    		$ejournalList .= qq(<li><b><a href="$journalURLs[$j]">$journalNames[$j]</a></b> &nbsp;&lt; $journalURLs[$j]&nbsp;&gt;);
	    		if ($journalNotes[$j]) { $ejournalList .= " <br> $journalNotes[$j]"; }
				if ($journalFKeys[$j]) { $ejournalList .= qq( (<a href='$gMarion$ejournalFKeys[$j]'>full record</a>)); }
	    		$ejournalList .= "\n";
	    	
	    	}
	    	$ejournalList .= "</ul>\n";

			# fill up the token list
			%tokens = (
				       disciplineTitle  => $disciplineTitle,
				       referenceTitle   => $referenceTitle,
				       referenceList    => $referenceList,
				       bibDatabaseTitle => $bibDatabaseTitle,
				       bibDatabaseList  => $bibDatabaseList,
				       ejournalTitle    => $ejournalTitle,
				       ejournalList     => $ejournalList				       
	        );
	
			# open the output file
			$outfile = &mungeDisciplineName($disciplineTitle) . '.html';
			open (OUTFILE, "> /tmp/$outfile");
			print OUTFILE &fillTemplate($templatesStatic[0], \%tokens);
			close OUTFILE;
	
			# move the file to its home
			&putFiles ($outfile);
			
			# echo progress
			print "<li>$disciplineNames[0] &nbsp; <a href=http://$CONFIGURATIONS{'gRemoteDisciplinePagesHost'}$CONFIGURATIONS{'gRemoteDisciplinePagesHTML'}/$outfile>http://$CONFIGURATIONS{'gRemoteDisciplinePagesHost'}$CONFIGURATIONS{'gRemoteDisciplinePagesHTML'}/$outfile</a>";
		
		}	
	
		# done
		print "</ul>";
		print "Done.";

	}
		
}
	
	
sub mungeDisciplineName {

	# get the input
	my $f = @_[0];
	
	# translate funny characters to dashes
	$f =~ s/\W/\-/g ;
	
	# remove dash dash
	$f =~ s/\-\-/\-/g ;
	
	# make it lower case
	$f = lc($f);
	
	# done
	return $f;
	
}
	
	
sub writeDisciplineIndexFile {

	# scope sum stuff
	my $q;
	
	# start the output
	print $output->header(-expires => '-1d');

	# check for submit button
	if (! $input->param('submit')) {

		# get all the disciplines
		$q = 'select * from disciplines order by discipline_name';
		&findAllDisciplines($q);
	
		# get all the templates
		$q = 'select * from templates_static order by template_static_name';
		&findAllStaticTemplates($q);
		
		# start the html
		&displaySimpleHelpMessage (207, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="writeDisciplineIndexFile">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">Template</td>\n);
		print qq(<td align="left"><select name=template_id>);
		
		for ($i = 0; $i <= $#templateStaticIDs; $i++) {
		
			print qq(<option value=$templateStaticIDs[$i]>$templateStaticNames[$i]);
			
		}
		
		print qq(</select></td>\n);
		print "<td>Select a template</td>\n";
		print qq(</tr>\n);
		print "<tr>\n";
		print qq(<td align="right">File name</td>\n);
		print qq(<td align="left"><input name=filename value="index.html"></td>\n);
		print "<td>What files are read by default?</td>\n";
		print qq(</tr>\n);
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" name=submit value="Write"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";

	}
	
	else {

		# get the input
		my $id       = $input->param('template_id');
		my $filename = $input->param('filename');
		
		# scope sum variables
		my $resourceList;
		my $disciplineList;
		my $outfile = $filename;
				
		# get the template
		$q = qq(SELECT *
		        FROM templates_static
		        WHERE template_static_id = '$id');
		&findAllStaticTemplates($q);

		# get all the disciplines
		my $q = "select * from disciplines order by discipline_name";
		&findAllDisciplines($q);
	
		# create resource list
		$resourceList  = '<ul>';
		$resourceList .= '<li><a href=./00-' . &mungeDisciplineName ($gReferenceShelf) . ".html>$gReferenceShelf</a>\n";
		$resourceList .= '<li><a href=./00-' . &mungeDisciplineName ($gBibliographicDatabaseLinks) . ".html>$gBibliographicDatabaseLinks</a>\n";
		$resourceList .= '<li><a href=./00-' . &mungeDisciplineName ($gElectronicJournals) . ".html>$gElectronicJournals</a>\n";
		$resourceList .= '</ul>';
		
		# create discipline list
		$disciplineList  = '<ul>';
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
		
			# create filename
			my $f = &mungeDisciplineName ($disciplineNames[$i]) . '.html';
		
			# print every item
			$disciplineList .= qq(<li><a href="$f">$disciplineNames[$i]</a>\n);
		
		}
		$disciplineList .= '</ul>';

		# fill up the token list
		%tokens = (
				   resourceList   => $resourceList,
				   disciplineList => $disciplineList			       
	    );
	
		# save the file
		open (OUTFILE, "> /tmp/$outfile");
		print OUTFILE &fillTemplate($templatesStatic[0], \%tokens);
		close OUTFILE;
	
		# move the file to its home
		&putFiles ($outfile);
		
		# start the html
		&displaySimpleHelpMessage (239, 1);

		print "Done. <a href=http://$CONFIGURATIONS{'gRemoteDisciplinePagesHost'}$CONFIGURATIONS{'gRemoteDisciplinePagesHTML'}/$outfile>http://$CONFIGURATIONS{'gRemoteDisciplinePagesHost'}$CONFIGURATIONS{'gRemoteDisciplinePagesHTML'}/$outfile</a>";
	
	}
	
}
	

sub putFiles {

	# this routine comes from create.html.pl AND SHOULD BE MODULARIZED!!!
	
	# parameter list
   	my $outfile = @_[0]; 

	# flush out stream
   	$| = 1;

	# establish a new FTP conneceton 
   	$ftpStream=Net::FTP->new($CONFIGURATIONS{'gRemoteDisciplinePagesHost'}) ||
   		returnError ("Failed to open ftp connection at $CONFIGURATIONS{'gRemoteDisciplinePagesHost'}: $@\n"); 

	# login $user with $password
	$ftpStream->login($CONFIGURATIONS{'gRemoteDisciplinePagesUsername'}, $CONFIGURATIONS{'gRemoteDisciplinePagesPassword'}) ||
		returnError ("Failed to login to $CONFIGURATIONS{'gRemoteDisciplinePagesHost'}\n");

	# change directories
	$ftpStream->cwd($CONFIGURATIONS{'gRemoteDisciplinePagesRoot'}) ||
		returnError ("Failed to CHDIR to $CONFIGURATIONS{'gRemoteDisciplinePagesRoot'} on $CONFIGURATIONS{'gRemoteDisciplinePagesHost'} (remote)\n");

	# PUT files from local to remote
	$remoteFile = $outfile;
	$ftpStream->put("/tmp/$outfile", $remoteFile) ||
		returnError ("Failed to put $outfile on $CONFIGURATIONS{'gRemoteDisciplinePagesHost'}\n"); 

	# close FTP connection 
	$ftpStream->quit() ||
		returnError ("\n\nFailed to quit ftp connection\n");

	# clean up by removing temp_file 
	# `rm $outfile` || returnError ("Failed to remove temp_file $outfile on local host:$!.\n");
	
}


########################
# discipline defaults  #
########################

sub setDisciplineDefaults {
	
	# read the contents of the form
	my $id            = $input->param(disciplineID);
	my @librariesIDs  = $input->param(librariesIDs);
	my @universityIDs = $input->param(universityIDs);
	my @qSearchIDs    = $input->param(qSearchIDs);
	my @referenceIDs  = $input->param(referenceIDs);
	my @databaseIDs   = $input->param(databaseIDs);
	my @journalIDs    = $input->param(journalIDs);
			
	# delete old LIBRARIES data and update it accordingly
	my $q = qq(delete from defaultLibraries where discipline_id = "$id");
	&prepareAndExecuteSQL($q);
	for ($i = 0; $i <= $#librariesIDs; $i++) {
	
		$q = qq(INSERT INTO defaultLibraries (discipline_id, libraries_id) values ("$id", "$librariesIDs[$i]"));
		&prepareAndExecuteSQL($q);
		
	}

	# delete old UNIVERSITY data and update it accordingly
	my $q = qq(delete from defaultUniversity where discipline_id = "$id");
	&prepareAndExecuteSQL($q);
	for ($i = 0; $i <= $#universityIDs; $i++) {
	
		$q = qq(INSERT INTO defaultUniversity (discipline_id, university_id) values ("$id", "$universityIDs[$i]"));
		&prepareAndExecuteSQL($q);
		
	}

	# check for quick searches
	if ($gShowQuickSearches) {

		# delete old QUICK SEARCHES data and update it accordingly
		my $q = qq(delete from defaultQseaches where discipline_id = "$id");
		&prepareAndExecuteSQL($q);
		for ($i = 0; $i <= $#qSearchIDs; $i++) {
		
			$q = qq(INSERT INTO defaultQseaches (discipline_id, qsearch_id) values ("$id", "$qSearchIDs[$i]"));
			&prepareAndExecuteSQL($q);
			
		}
			
	}

	# delete old REFERENCE data and update it accordingly
	my $q = qq(delete from defaultReferences where discipline_id = "$id");
	&prepareAndExecuteSQL($q);
	for ($i = 0; $i <= $#referenceIDs; $i++) {
	
		$q = qq(INSERT INTO defaultReferences (discipline_id, reference_id) values ("$id", "$referenceIDs[$i]"));
		&prepareAndExecuteSQL($q);
		
	}

	# delete old REFERENCE data and update it accordingly
	my $q = qq(delete from defaultReferences where discipline_id = "$id");
	&prepareAndExecuteSQL($q);
	for ($i = 0; $i <= $#referenceIDs; $i++) {
	
		$q = qq(INSERT INTO defaultReferences (discipline_id, reference_id) values ("$id", "$referenceIDs[$i]"));
		&prepareAndExecuteSQL($q);
		
	}

	# delete old BIBLIOGRAPHIC DATABASES data and update it accordingly
	my $q = qq(delete from defaultBibdatabases where discipline_id = "$id");
	&prepareAndExecuteSQL($q);
	for ($i = 0; $i <= $#databaseIDs; $i++) {
	
		$q = qq(INSERT INTO defaultBibdatabases (discipline_id, bib_database_id) values ("$id", "$databaseIDs[$i]"));
		&prepareAndExecuteSQL($q);
		
	}

	# delete old JOURNALS data and update it accordingly
	my $q = qq(delete from defaultEtexts where discipline_id = "$id");
	&prepareAndExecuteSQL($q);
	for ($i = 0; $i <= $#journalIDs; $i++) {
	
		$q = qq(INSERT INTO defaultEtexts (discipline_id, etext_id) values ("$id", "$journalIDs[$i]"));
		&prepareAndExecuteSQL($q);
		
	}

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (107, 1);

}
	
	
sub customizeDisciplineDefaults {

	# get the selected discipline-specific id
	my $id = $input->param('id');
		
	if (! $id) {
					
		# read all the discipline MOTDs
		$q = "select * from disciplines order by discipline_name";
		&findAllDisciplines($q);
	
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (105, 1);
	
		# display a menu of all disciplines
		print "<ol>\n";
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
		
			print qq (<li><a href="./?cmd=customizeDisciplineDefaults&id=$disciplineIDs[$i]">$disciplineNames[$i]</a>\n);
			
		}
		
		print "</ol>\n";
		
	}
		
	else {
		
		# find all the disciplines
		$q = qq (select * from disciplines order by discipline_name);
		&findAllDisciplines($q);
				
		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (106, 1);
	
		# start form
		print $output->startform(-method => 'GET', -action => './');
		print $output->hidden(-name => 'cmd', -value => 'setDisciplineDefaults');

		# display a pop-up list of disciplines
		print "<h2>Disciplines</h2>\n";
		print qq(<select name="disciplineID">\n);
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
		
			if ($disciplineIDs[$i] eq $id) {
			
				print qq(<option value="$disciplineIDs[$i]" selected>$disciplineNames[$i]\n);
				
			}
			
			else {
			
				print qq(<option value="$disciplineIDs[$i]">$disciplineNames[$i]\n);
				
			}
						
		}
		
		print "</select>";	
			
		# get all the LIBRARIES resources and display them
		$q = qq(select * from libraries order by libraries_name);
		&findAllLibraries($q);
		$q = qq(select * from defaultLibraries where discipline_id = "$id");
		&findDefaultResources($q, "libraries_id");
		print "<h2>Libraries resources</h2>\n";
		print qq(<select name="librariesIDs" size=15 multiple>\n);
		for ($i = 0; $i <= $#librariesIDs; $i++) {
		
			my $ps = 0;
			for ($j = 0; $j <= $#defaultIDs; $j++) { if ($librariesIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
			if ($ps) {
			
				print qq(<option value="$librariesIDs[$i]" selected>$librariesNames[$i]\n);			
				
			}
			
			else {
			
				print qq(<option value="$librariesIDs[$i]">$librariesNames[$i]\n);			
				
			}
			
		}
		
		print "</select>";	
			
		# get all the UNIVERSITY resources and display them
		$q = qq(select * from university order by university_name);
		&findAllUniversity($q);
		$q = qq(select * from defaultUniversity where discipline_id = "$id");
		&findDefaultResources($q, "university_id");
		print "<h2>University resources</h2>\n";
		print qq(<select name="universityIDs" size=15 multiple>\n);
		for ($i = 0; $i <= $#universityIDs; $i++) {
		
			my $ps = 0;
			for ($j = 0; $j <= $#defaultIDs; $j++) { if ($universityIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
			if ($ps) {
			
				print qq(<option value="$universityIDs[$i]" selected>$universityNames[$i]\n);			
				
			}
			
			else {
				
				print qq(<option value="$universityIDs[$i]">$universityNames[$i]\n);			
				
			}
			
		}
		
		print "</select>";	
			
		# check for quick searches
		if ($gShowQuickSearches) {

			# get all the QUICK SEARCHES resources and display them
			$q = qq(select * from qsearches order by qsearch_name);
			&findAllQSearches($q);
			$q = qq(select * from defaultQseaches where discipline_id = "$id");
			&findDefaultResources($q, "qsearch_id");
			print "<h2>Quick searches</h2>\n";
			print qq(<select name="qSearchIDs" size=15 multiple>\n);
			for ($i = 0; $i <= $#qSearchIDs; $i++) {
			
				my $ps = 0;
				for ($j = 0; $j <= $#defaultIDs; $j++) { if ($qSearchIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
				if ($ps) {
				
					print qq(<option value="$qSearchIDs[$i]" selected>$qSearchNames[$i]\n);			
					
				}
					
				else {
				
					print qq(<option value="$qSearchIDs[$i]">$qSearchNames[$i]\n);			
					
				}
					
			}
				
			print "</select>";	
			
		}
		
		# get all the REFERENCE resources and display them
		$q = qq(select reference.reference_id, reference.reference_name,
             		reference.reference_url, reference.reference_note
             		from reference, items4DisReference
             		where items4DisReference.discipline_id = $id
             		and
             		items4DisReference.reference_id = reference.reference_id
             		order by reference.reference_name);
		&findAllReferences($q);
		$q = qq(select * from defaultReferences where discipline_id = "$id");
		&findDefaultResources($q, "reference_id");
		print "<h2>Reference resources</h2>\n";
		print qq(<select name="referenceIDs" size=15 multiple>\n);
		for ($i = 0; $i <= $#referenceIDs; $i++) {
		
			my $ps = 0;
			for ($j = 0; $j <= $#defaultIDs; $j++) { if ($referenceIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
			if ($ps) {
			
				print qq(<option value="$referenceIDs[$i]" selected>$referenceNames[$i]\n);			
				
			}
			
			else {
				
				print qq(<option value="$referenceIDs[$i]">$referenceNames[$i]\n);			
				
			}
			
		}
		
		print "</select>";	
			
		# get all the BIBLIOGRAPHIC DATABASES resources and display them
		$q = qq(select bib_databases.bib_database_id, bib_databases.bib_database_name,
             		bib_databases.bib_database_url, bib_databases.bib_database_note
             		from bib_databases, items4DisBibdatabases
             		where items4DisBibdatabases.discipline_id = $id
             		and
             		items4DisBibdatabases.bib_database_id = bib_databases.bib_database_id
             		order by bib_databases.bib_database_name);
		&findAllDatabases($q);
		$q = qq(select * from defaultBibdatabases where discipline_id = "$id");
		&findDefaultResources($q, "bib_database_id");
		print "<h2>Database resources</h2>\n";
		print qq(<select name="databaseIDs" size=15 multiple>\n);
		for ($i = 0; $i <= $#databaseIDs; $i++) {
		
			my $ps = 0;
			for ($j = 0; $j <= $#defaultIDs; $j++) { if ($databaseIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
			if ($ps) {
			
				print qq(<option value="$databaseIDs[$i]" selected>$databaseNames[$i]\n);			
				
			}
			else {
			
				print qq(<option value="$databaseIDs[$i]">$databaseNames[$i]\n);			
				
			}
		
		}
		
		print "</select>";	
			
		# get all the JOURNALS resources and display them
		$q = qq(select etexts.etext_id, etexts.etext_name,
             		etexts.etext_url, etexts.etext_note
             		from etexts, items4DisEtexts
             		where items4DisEtexts.discipline_id = $id
            		and
             		items4DisEtexts.etext_id = etexts.etext_id
             		order by etexts.etext_name);
		&findAllJournals($q);
		$q = qq(select * from defaultEtexts where discipline_id = "$id");
		&findDefaultResources($q, "etext_id");
		print "<h2>Journal resources</h2>\n";
		print qq(<select name="journalIDs" size=15 multiple>\n);
		for ($i = 0; $i <= $#journalIDs; $i++) {
		
			my $ps = 0;
			for ($j = 0; $j <= $#defaultIDs; $j++) { if ($journalIDs[$i] eq $defaultIDs[$j]) { $ps = 1; last; } }
			if ($ps) {
			
				print qq(<option value="$journalIDs[$i]" selected>$journalNames[$i]\n);			
				
			}
			
			else {
			
				print qq(<option value="$journalIDs[$i]">$journalNames[$i]\n);			
				
			}
		}
		
		print "</select>";	
			
		# end the form
		print "<p>";
		print $output->submit(-name => 'submit', -value => 'Edit');              
		print $output->reset(-name => 'Reset', -value => 'Reset');              
		print "</p>\n";
		print $output->endform;
		
	}

}


####################
# discipline motd  #
####################

sub setDisciplineMOTD {
	
	# read the contents of the form
	my $m = $gDBhandle->quote($input->param(dmotd));
	my $id = $input->param(id);
		
	# save the motd
	my $q = qq (update disciplines set motd_text = $m where discipline_id = "$id");
	&prepareAndExecuteSQL ($q);
			
	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (104, 1);
	
	# display the message
	print $input->param(dmotd);
	}
	
	
sub customizeDisciplineMOTD {

	# get the selected discipline-specific id
	my $id = $input->param('id');
		
	if (! $id) {
		
		# read all the discipline MOTDs
		$q = "select * from disciplines order by discipline_name";
		&findAllDisciplines($q);
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (102, 1);
	
		# display a menu of all disciplines
		print "<ol>\n";
		for ($i = 0; $i <= $#disciplineIDs; $i++) {
			print qq (<li><a href="./?cmd=customizeDisciplineMOTD&id=$disciplineIDs[$i]">$disciplineNames[$i]</a>\n);
			}
		print "</ol>\n";
		
		}
		
	else {
		
		# get this message of the day
		$q = qq (select * from disciplines where discipline_id = '$id');
		&findAllDisciplines($q);
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (103, 1);
	
		# start the form
		print "<center>\n";
		print $output->startform(-method => 'GET', -action => './');
		print $output->hidden(-name => 'cmd',  -value => 'setDisciplineMOTD');
		print $output->hidden(-name => 'id',  -value => "$id");
		print qq (<textarea rows="13" cols="65" wrap="virtual" name="dmotd">$disciplineMOTDs[0]</textarea>);
		print "<p>\n";
		print $output->submit(-name => 'submit', -value => 'Edit');              
		print $output->reset(-name => 'Reset', -value => 'Reset');              
		print "</p>\n";
		print $output->endform;	
		print "</center>\n";
		}
	}


###################
# databases admin #
###################

sub displayDatabaseMenu {

	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (138, 1);
	
	print qq(<ol>);
	print qq(<li><a href="./?cmd=displayDatabaseInputForm">Create a $gBibliographicDatabaseLinks item</a>);
	print qq(<li><a href="./?cmd=displayDatabaseFindForm">Find and then edit or delete a $gBibliographicDatabaseLinks item</a>);
	print qq(<li><a href="./?cmd=editDatabase">Edit a $gBibliographicDatabaseLinks item</a>);
	print qq(<li><a href="./?cmd=deleteDatabase">Delete a $gBibliographicDatabaseLinks item</a>);
	print qq(</ol>);
	
}
	

sub displayDatabaseInputForm {

	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (139, 1);
	
	# display the input form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="createDatabase">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print qq(</tr>\n);
	print "<!--  F O R G I E N  K E Y  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">F Key</td>\n);
	print qq(<td align="left"><input type="text" name="fkey" size="45"></td>\n);
	print "<td>Foreign key</td>\n";
	print "</tr>\n";
	print "<!--  N A M E  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">$gBibliographicDatabaseLinks</td>\n);
	print qq(<td align="left"><input type="text" name="name" size="45"></td>\n);
	print "<td>Enter a $gBibliographicDatabaseLinks term</td>\n";
	print "</tr>\n";
	print "<!--  U R L  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">URL</td>\n);
	print qq(<td align="left"><input type="text" name="url" size="45"></td>\n);
	print "<td>What is the URL?</td>\n";
	print "</tr>\n";
	print "<!--  L C D -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">LCD</td>\n);
	print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
	print "<td>LCD Resource?</td>\n";
	print "</tr>\n";
	print "<!--  D E S C R I P T I O N  -->";
	print qq(<tr valign="top">\n);
	print qq(<td align="right">Description</td>\n);
	print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="45"></textarea>\n);
	print "<td>Enter a scope note</td>\n";
	print "</tr>\n";
	
	# get and display all the disciplines
	&displayAllDisciplines;
	
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Create"> \n);
	print qq(<input type="reset" value="Reset">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
	}


sub createDatabase {

	# get the input
	my $name          = $gDBhandle->quote($input->param('name'));
	my $url           = $gDBhandle->quote($input->param('url'));
	my $note          = $gDBhandle->quote($input->param('note'));
	my @disciplineIDs = $input->param('disciplineIDs');
	my $lcd           = $input->param('lcd');
	my $fkey          = $input->param('fkey');
	
	# INSERT ERROR CHECKING HERE!
	
	# get today's date
	my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));
	
	# get a new sequence
	my $sequence = getNewSequence();
	
	# create a query to update the database and update it
	my $q = qq{INSERT INTO bib_databases (bib_database_id, bib_database_name, bib_database_url, bib_database_note, bib_database_date, bib_database_lcd, bib_database_fkey)
	           VALUES ($sequence, $name, $url, $note, '$today', '$lcd', '$fkey')};
	&prepareAndExecuteSQL($q);
		
	# find the record just added
	$q = qq(SELECT * FROM bib_databases WHERE bib_database_id = '$sequence');
	&findAllDatabases($q);
	
	# update discipline descriptions
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		$q = qq{INSERT INTO items4DisBibdatabases (discipline_id, bib_database_id)
		        VALUES ($disciplineIDs[$i], $databaseIDs[0])};
		&prepareAndExecuteSQL($q);
		
	}
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (140, 1);
	
	# display it for confirmation
	&displayTabledDatabaseOutput;
	
}
	

sub displayTabledDatabaseOutput {

	# display the search results table
	print "<center>";
	print "<p>";
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>ID</b></td>\n);
	print qq(<td align="left"><b>$gBibliographicDatabaseLinks</b></td>\n);
	print qq(<td align="left"><b>Date</b></td>\n);
	print "<td><b>Action</b></td>\n";
	print qq(</tr>\n);
	print "<!--  V A L U E S  -->";
	for ($i = 0; $i <= $#databaseIDs; $i++) {
	
		print "<tr>\n";
		print qq(<td align="right">$databaseIDs[$i]</td>\n);
		print qq(<td align="left"><a href="$databaseURLs[$i]">$databaseNames[$i]</a></td>\n);
		print qq(<td align="left">$databaseDates[$i]</td>\n);
		print qq(<td><a href="./?cmd=editDatabase&id=$databaseIDs[$i]">Edit</a> or <a href="./?cmd=deleteDatabase&id=$databaseIDs[$i]">Delete</a></td>\n);
		print "</tr>\n";
		
	}
		
	print "</table>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayDatabaseFindForm {

	# start the output
	print $output->header();
	
	# start the html
	&displaySimpleHelpMessage (141, 1);
	
	# display the search form
	print "<center>";
	print "<p>";
	print qq(<form method="GET" action="./">\n);
	print qq(<input type="hidden" name="cmd" value="displayDatabaseSearchResults">\n);
	print qq(<table border="1">\n);
	print "<!--  B A N N E R  -->";
	print "<tr>\n";
	print qq(<td align="right"><b>Item</b></td>\n);
	print qq(<td align="left"><b>Selection</b></td>\n);
	print "<td><b>Description</b></td>\n";
	print "</tr>\n";
	print "<!--  O P E R A T O R  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Operator</td>\n);
	print qq(<td align="left">\n);
	print qq(<select name="searchOperator">\n);
	print qq(<option value="=">is\n);
	print qq(<option value="like" selected>like\n);
	print "</select>\n";
	print "</td>\n";
	print "<td>Select an operator</td>\n";
	print "</tr>\n";
	print "<!--  S E A R C H  S T R I N G  -->\n";
	print qq (<tr valign="top">\n);
	print qq(<td align="right">Search string</td>\n);
	print qq(<td align="left">\n);
	print qq(<input type="text" name="searchString" value="%">\n);
	print "</td>";
	print "<td>Enter a query term</td>\n";
	print "</tr>\n";
	print "</table>\n";
	print "</p>\n";
	print "<p>\n";
	print "<!--  B U T T O N S  -->\n";
	print qq(<input type="submit" value="Search"> \n);
	print qq(<input type="reset" value="Reset">\n);
	print "</form>\n";
	print "</p>\n";
	print "</center>\n";
	
}
	

sub displayDatabaseSearchResults {

	# get the input
	my $searchOperator = $input->param('searchOperator');
	my $searchString = $input->param('searchString');
	
	# INSERT ERROR CHECKING HERE!
	
	# create a query and execute it
	my $q = qq(SELECT *
	           FROM bib_databases
	           WHERE bib_database_name $searchOperator "$searchString"
	           ORDER BY bib_database_name);
	&findAllDatabases($q);

	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (142, 1);
	
	# display the results
	&displayTabledDatabaseOutput;
	
}
	

sub deleteDatabase {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (143, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="deleteDatabase">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Delete"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# delete the database from the database table
		my $q = qq(delete from bib_databases where bib_database_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(delete from items4bibdatabases where bib_database_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# delete any links from the join table; clean up
		$q = qq(delete from items4DisBibdatabases where bib_database_id = '$id');
		&prepareAndExecuteSQL($q);
		
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (144, 1);
	
	}

}
	
sub editDatabase {

	# get the input
	my $id = $input->param('id');

	# check for id's existance
	if (! $id) {
	
		# start the output
		print $output->header();
	
		# start the html
		&displaySimpleHelpMessage (145, 1);
	
		# display an input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="editDatabase">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left"><input type="text" name="id"></td>\n);
		print "<td>Enter a record ID</td>\n";
		print "</tr>\n";
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Edit"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
	
	}

	else {
	
		# find the record to edit
		my $q = qq(SELECT * FROM bib_databases WHERE bib_database_id = '$id');
		&findAllDatabases($q);

		# start the output
		print $output->header(-expires => '-1d');
	
		# start the html
		&displaySimpleHelpMessage (146, 1);
	
		# display the input form
		print "<center>";
		print "<p>";
		print qq(<form method="GET" action="./">\n);
		print qq(<input type="hidden" name="cmd" value="updateDatabase">\n);
		print qq(<input type="hidden" name="id" value="$databaseIDs[0]">\n);
		print qq(<table border="1">\n);
		print "<!--  B A N N E R  -->";
		print "<tr>\n";
		print qq(<td align="right"><b>Item</b></td>\n);
		print qq(<td align="left"><b>Selection</b></td>\n);
		print "<td><b>Description</b></td>\n";
		print qq(</tr>\n);
		print "<!--  I N P U T  -->";
		print "<tr>\n";
		print qq(<td align="right">ID</td>\n);
		print qq(<td align="left">$databaseIDs[0]</td>\n);
		print "<td>Record number</td>\n";
		print "</tr>\n";
		print "<!--  D A T E  -->";
		print "<tr>\n";
		print qq(<td align="right">Date</td>\n);
		print qq(<td align="left">$databaseDates[0]</td>\n);
		print "<td>Last modified</td>\n";
		print "</tr>\n";
		print "<!--  F O R G I E N  K E Y  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">F Key</td>\n);
		print qq(<td align="left"><input type="text" name="fkey" size="45" value="$databaseFKeys[0]"></td>\n);
		print "<td>Foreign key</td>\n";
		print "</tr>\n";
		print "<!--  N A M E  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">$gBibliographicDatabaseLinks</td>\n);
		print qq(<td align="left"><input type="text" name="name" size="45" value="$databaseNames[0]"></td>\n);
		print "<td>Enter a $gBibliographicDatabaseLinks term</td>\n";
		print "</tr>\n";
		print "<!--  U R L  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">URL</td>\n);
		print qq(<td align="left"><input type="text" name="url" size="45" value="$databaseURLs[0]"></td>\n);
		print "<td>What is the URL?</td>\n";
		print "</tr>\n";
		print "<!--  L C D -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">LCD</td>\n);
		
		if ($databaseLCDs[0]) {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1" checked></td>\n);
		}
		else {
			print qq(<td align="left"><input type="checkbox" name="lcd" value="1"></td>\n);
		}
		
		print "<td>LCD Resource?</td>\n";
		print "</tr>\n";
		print "<!--  D E S C R I P T I O N  -->";
		print qq(<tr valign="top">\n);
		print qq(<td align="right">Description</td>\n);
		print qq(<td align="left"><textarea name="note" wrap="virtual" rows="4" cols="45">$databaseNotes[0]</textarea>\n);
		print "<td>Enter a scope note</td>\n";
		print "</tr>\n";
	
		# get and display all the previouslyu selected disciplines
		&displayAllSelectedDisciplines ($id, "items4DisBibdatabases", "bib_database_id");
	
		print "</table>\n";
		print "</p>\n";
		print "<p>\n";
		print "<!--  B U T T O N S  -->\n";
		print qq(<input type="submit" value="Edit"> \n);
		print qq(<input type="reset" value="Reset">\n);
		print "</form>\n";
		print "</p>\n";
		print "</center>\n";
		
	}

}
	
	
sub updateDatabase {

	# get the input
	my $id   = $input->param('id');
	my $name = $gDBhandle->quote($input->param('name'));
	my $url  = $gDBhandle->quote($input->param('url'));
	my $note = $gDBhandle->quote($input->param('note'));
	my @disciplineIDs = $input->param('disciplineIDs');
	my $lcd           = $input->param('lcd');
	my $fkey          = $input->param('fkey');
	
	# get today's date
	my $today =	strftime ("%Y-%m-%d", localtime(parsedate ('now', NOW)));
	
	# create the query and update the database
	my $q = qq(UPDATE bib_databases
	           SET bib_database_name = $name,
	               bib_database_url  = $url,
	               bib_database_note = $note,
	               bib_database_date = '$today',
	               bib_database_lcd  = '$lcd',
	               bib_database_fkey = '$fkey'
	           WHERE bib_database_id = '$id');
	&prepareAndExecuteSQL ($q);
	
	# delete any old join relationships
	$q = qq(DELETE FROM items4DisBibdatabases WHERE bib_database_id = '$id');
	&prepareAndExecuteSQL ($q);
	
	# update items for disclines
	for ($i = 0; $i <= $#disciplineIDs; $i++) {
	
		$q = qq(INSERT INTO items4DisBibdatabases (discipline_id, bib_database_id)
		        VALUES ('$disciplineIDs[$i]', $id));
		&prepareAndExecuteSQL($q);
		
	}
	
	# start the output
	print $output->header(-expires => '-1d');
	
	# start the html
	&displaySimpleHelpMessage (147, 1);
	
}
	

#########################
# banner, motd, footer  #
#########################

sub customizeBanner {

	# get submit button
	my $submit = $input->param('submit');
	
	# start the output
	print $output->header();
	
	# check for submit
	if (! $submit) {

		# start the html
		&displaySimpleHelpMessage (54, 1);

		# output the form
		print "<center>\n";
		print $output->startform(-method => 'GET', -action => './');
		print $output->hidden(-name => 'cmd',  -value => 'customizeBanner');
		print qq (<textarea rows="13" cols="65" wrap="virtual" name="gBanner">$gBanner</textarea>);
		print "<p>\n";
		print $output->submit(-name => 'submit', -value => 'Edit');              
		print $output->reset(-name => 'Reset', -value => 'Reset');              
		print "</p>\n";
		print "</center>\n";
		print $output->endform;	

	}
	
	else {
	
		# get the global message
		my $gBanner = $gDBhandle->quote($input->param('gBanner'));
		
		# update the database
		my $q = "UPDATE preferences SET banner = $gBanner";
		&prepareAndExecuteSQL ($q);
		
		# start the html
		&displaySimpleHelpMessage (55, 1);
		
		# echo the input
		print $input->param('gBanner');
		
	}
	
}

	
sub customizeMOTD {

	# get submit button
	my $submit = $input->param('submit');
	
	# start the output
	print $output->header();
	
	# check for submit
	if (! $submit) {
	
		# start the html
		&displaySimpleHelpMessage (56, 1);

		# output the form
		print "<center>\n";
		print $output->startform(-method => 'GET', -action => './');
		print $output->hidden(-name => 'cmd',  -value => 'customizeMOTD');
		print qq (<textarea rows="13" cols="65" wrap="virtual" name="gGlobalMessage">$gGlobalMessage</textarea>);
		print "<p>\n";
		print $output->submit(-name => 'submit', -value => 'Edit');
		print ' ';              
		print $output->reset(-name => 'Reset', -value => 'Reset');              
		print "</p>\n";
		print "</center>\n";
		print $output->endform;	
	
	}
	
	else {
	
		# get the global message
		my $gGlobalMessage = $gDBhandle->quote($input->param('gGlobalMessage'));
		
		# update the database
		my $q = "UPDATE preferences SET global_message = $gGlobalMessage";
		&prepareAndExecuteSQL ($q);
		
		# start the html
		&displaySimpleHelpMessage (57, 1);
		
		# echo the input
		print $input->param('gGlobalMessage');
		
	}

}


sub customizeFooter {

	# get submit button
	my $submit = $input->param('submit');
	
	# start the output
	print $output->header();
	
	# check for submit
	if (! $submit) {

		# start the html
		&displaySimpleHelpMessage (54, 1);

		# output the form
		print "<center>\n";
		print $output->startform(-method => 'GET', -action => './');
		print $output->hidden(-name => 'cmd',  -value => 'customizeFooter');
		print qq (<textarea rows="13" cols="65" wrap="virtual" name="gFooter">$gFooter</textarea>);
		print "<p>\n";
		print $output->submit(-name => 'submit', -value => 'Edit');
		print ' ';         
		print $output->reset(-name => 'Reset', -value => 'Reset');              
		print "</p>\n";
		print "</center>\n";
		print $output->endform;	

	}
	
	else {
	
		# get the global message
		my $gFooter = $gDBhandle->quote($input->param('gFooter'));
		
		# update the database
		my $q = "UPDATE preferences SET footer = $gFooter";
		&prepareAndExecuteSQL ($q);
		
		# start the html
		&displaySimpleHelpMessage (55, 1);
		
		# echo the input
		print $input->param('gFooter');
		
	}
	
}


#############
# guestbook #
#############

sub setGuestbook {
		
	# intilize the input
	my $name       = $gDBhandle->quote($input->param('name'));
	my $email      = $gDBhandle->quote($input->param('email'));
	my $canContact = $input->param('can_contact');
	
	# calculate today's date
	my $today = strftime ("%Y/%m/%d", localtime(parsedate ("0 days ago", NOW)));
	
	# save the guest's name, etc.
	my $q = qq(insert into guestbook (name, email, can_contact, date_visited) values ($name, $email, '$canContact', '$today'));
	&prepareAndExecuteSQL ($q);
	
}

sub signGuestbook {

	# print a generic header
	print $output->header(-expires => '-1d');

	# display the help message
	&displaySimpleHelpMessage(209, 1);
		
	# start the form
	print $output->startform(-method => 'GET', -action => './');
	print $output->hidden(-name => 'cmd',  -value => 'setGuestbook');

	print "<center>\n";
	print "<table border=1>\n";
	print "<tr>\n";
	print "<td align=right><b>Item</b></td>\n";
	print "<td><b>Selection</b></td>\n";
	print "<td><b>Description</b></td>\n";
	print "</tr>\n";
	
	# name
	print "<tr valign=top>\n";
	print "<td align=\"right\">\n";
	print "Name\n";
	print "</td>\n";
	print "<td>\n";
	print $output->textfield(-name => 'name');
	print "</td>\n";
	print "<td>\n";
	print qq(What is your name?);
	print "</td>\n";
	print "</tr>\n";
				
	# email address
	print "<tr valign=top>\n";
	print "<td align=\"right\">\n";
	print "Email address";
	print "</td>\n";
	print "<td>\n";
	print $output->textfield(-name => 'email');
	print "</td>\n";
	print "<td>\n";
	print qq(What is your email address?);
	print "</td>\n";
	print "</tr>\n";
				
	# can contact
	print "<tr valign=top>\n";
	print "<td align=\"right\">\n";
	print "Can contact\n";
	print "</td>\n";
	print "<td>\n";
	print qq (<input type="radio" name="can_contact" value="1" checked>Yes );
	print qq (<input type="radio" name="can_contact" value="0">No);
	print "</td>\n";
	print "<td>\n";
	print qq(Would you like to be made aware of significant improvements to MyLibrary\@NCState?);
	print "</td>\n";
	print "</tr>\n";
								
	# end the table
	print "</table>\n";
	print "</center>\n";

	# display the help message
	&displaySimpleHelpMessage(221, 0);
		
	# add a submit and reset button
	print "<center>\n";
	print "<p>\n";
	print $output->submit(-name => 'submit', -value => 'Continue');              
	print $output->reset(-name => 'Reset', -value => 'Reset');              
	print "</p>\n";
	print "</center>\n";

	# finish the form
	print $output->endform;	

}

#############################################################################
# Autoload methods go after =cut, and are processed by the autosplit program.

1;
__END__
# Below is the stub of documentation for your module. You better edit it!

=head1 NAME

MyLibrary - Perl extension for creating portals

=head1 SYNOPSIS

use MyLibrary;

or

perl -MMyLibrary -e 'print "$MyLibrary::VERSION\n"'

=head1 DESCRIPTION

MyLibrary.pm is a (large) Perl module used to create user-oriented, customizable interfaces to sets of Internet resources -- portals. As of this writting (December 13, 2000), the internals of the module are poorly documented. If they were better documented, then you would be able to more easily write scripts against the modules. As it stands now, you will have to download and install the MyLibrary-scripts from the following URL:

	http://hegel.lib.ncsu.edu/development/mylibrary/

At the very least, you must learn how to create a configuration file for any scripts, including the MyLibrary-scripts, that use the MyLibrary module. This is described in the next section, CONFIGURATION.

=head1 CONFIGURATION

Any scripts that use the MyLibrary module must initialize the underlying database, and quite possibly a number of other things. By feeding the name of a configuration file to the module, these things will be taken care of for you like this:

	my $config = "/usr/local/etc/mylibrary.cfg";
	&MyLibrary::readConfig ("$config");
	&MyLibrary::initalizeDBIO();

The result will be the creation of a number of internal, global variables used by the module.

A configuration file is made up of case-sensitive name/value pairs. Lines begining with hash marks (#) are comments. Blank lines are ignored. The files must contain the following names in order to initialize database I/O:

=over 4

=item 1

database - The name of the database containing the data to access. Example:

	database = mylibrary

=item 2

dbhost - The name of the computer where the database resides. If the database resides on the same computer where the scripts are being executed, then the name of dbhost should be localhost. Example:

	dbhost = localhost

=item 3

username - The name of the user who will be reading and writing to the database. Example:

	username = mylibrary

=item 4

password - The password of username. Example:

	password = suprsecrit

=item 5

dbDriver - The name of the database driver needed by the Perl DBI interface. As of this version of MyLibrary.pm (version 2.50), this value must always be mysql. Example:

	dbDriver = mysql

=back

If you plan to use the MyLibrary module to write CGI scripts, which is what it was originally written to do, then you need to tell the module where the CGI scripts reside on your file system. To do this you need two additional name/value pairs:

=over 4

=item 1

gDocsRoot - This is the name of your HTTP server's root document directory. It is the path to the directory where your HTTP documents reside. Do not use a trailing slash. Example:

	gDocsRoot = /usr/local/apache/htdocs

=item 2

gRelativePath - The name of the directory, under gDocsRoot, where the CGI script is saved. Again, do not use any trailing slashes. Example:

	gRelativePath = /development/mylibrary/sandbox

=back

The MyLibrary module has the ability to create sets of static HTML pages based on HTML templates and the content of the underlying database. Once created, these files are saved (PUT) on the local (or a remote) file system via FTP. In order to implement this feature, configuration files must contain the following five name/value pairs:

=over 4

=item 1

gRemoteDisciplinePagesHost - The name of the host where files will be saved. This can be the local host, but it still must be fully qualified. Example:

	gRemoteDisciplinePagesHost = my.example.com

=item 2

gRemoteDisciplinePagesUsername - The name of the user that will be initiating the FTP process. Example:

	gRemoteDisciplinePagesUsername = mylibrary

=item 3

gRemoteDisciplinePagesPassword - The password of gRemoteDisciplinePagesUsername. Example:

	gRemoteDisciplinePagesPassword = reallySuprsecrit

=item 4

gRemoteDisciplinePagesRoot - The full path name on gRemoteDisciplinePagesHost where the static files will be saved. As before, do not include a trailing slash. Example:

	gRemoteDisciplinePagesRoot = /usr/local/apache/htdocs/development/disciplines

=item 5

gRemoteDisciplinePagesHTML - The path, relative to gRemoteDisciplinePagesHost's HTTP server document root, where the files will be available via a URL. This value will almost always be a subsection of gRemoteDisciplinePagesRoot. Example:

	gRemoteDisciplinePagesHTML = /development/disciplines

=back

There is one other possible name/value pair. It is an NCSU-ism denoting the use of the NC State University WRAP authentication protocol. If your institution is not using WRAP, then you can ignore this:

=over 4

=item 1

gUsingWrap - A one (1) or a zero (0) denoting whether or not you are implementing WRAP. Most places can ignore this option or turn WRAP off by specifiying a zero. Example:

	gUsingWrap = 1

=back

Here is a sample configuration file:

	database = mylibrary
	username = mylibrary
	password = kewlStuf
	dbhost = localhost
	dbDriver = mysql
	gDocsRoot = /usr/local/apache/htdocs
	gRelativePath = /development/mylibrary/sandbox
	gRemoteDisciplinePagesHost = my.example.edu
	gRemoteDisciplinePagesUsername = billy
	gRemoteDisciplinePagesPassword = bobbob	
	gRemoteDisciplinePagesRoot = /usr/local/apache/htdocs/disciplines	
	gRemoteDisciplinePagesHTML = /disciplines
	gUsingWrap = 1

Here are few helpful hints concerning configuration files. First of all, leave a trail behind you by liberally adding comments. Remember, comments are lines begining with hash (#) marks.

Second, by creating multiple configuration files and specifying them in scripts, you can host multiple instances of MyLibrary databases without duplicating a whole lot of code.

Third, since configuration files contain username/password combinations, set the ownership of configuration files so they are only readable by a select few, notably the user running your scripts.

=head1 AUTHOR

	Eric Lease Morgan
	NCSU Libraries
	Box 7111, Room 2110,
	Raleigh, NC 27695-7111, USA

	eric_morgan@ncsu.edu
	http://www.lib.ncsu.edu/staff/morgan/

=head1 SEE ALSO

This documentation is woefully inadequate. More information should be available at:

	http://hegel.lib.ncsu.edu/development/mylibrary/

=cut
