import cgi
import records

MAX_RECORDS = 20

def compute_form(key, value):
	ret = '<FORM METHOD="POST" ACTION="search.cgi">\n'
	ret = ret + 'Search <SELECT NAME="key">\n'
	if key is None or key == "":
		key = "title"
	for k in records.record_keys + records.author_keys:
		if k == key:
			selected = " SELECTED"
		else:
			selected = ""
		ret = ret + '<OPTION VALUE="' + k + '"' + selected + '>' + \
			records.key_names[k] + "\n"
	ret = ret + '</SELECT>\n'
	ret = ret + 'for <INPUT TYPE="text" NAME="value" VALUE="' + \
		cgi.escape(value, 1==1) + '" SIZE="20">\n'
	ret = ret + '<INPUT TYPE="submit" VALUE="Go!">\n'
	ret = ret + '</FORM>\n'
	return ret

def get_list(recs, keys, start, end):
	print_authors = 0==1
	header = ""
	ret = "<TABLE>\n"
	for k in keys:
		if k in records.author_keys:
			print_authors = 1
		if k in records.key_names:
			header = header + '<TH ALIGN="LEFT">' + records.key_names[k] + "</TH>"
		else:
			header = header + "<TH></TH>"
	ret = ret + "<TR><TD></TD>" + header + "</TR>\n"

	for index in range(start, end):
		# print initial line for record
		rec = recs[index]
		line = ""
		authors = rec['authors']
		for key in keys:
			field = ""
			if key in records.author_keys:
				if len(authors) > 0 and key in authors[0]:
					field = authors[0][key]
			elif key in rec:
				field = rec[key]
			line = line + '<TD VALIGN="TOP">' + field + "</TD>"
		ret = ret + '<TR><TD VALIGN="TOP" ALIGN="RIGHT"><B>' + str(index + 1)\
			+ '.</B></TD>'+ line\
			+ '<TD VALIGN="TOP"><A HREF="search.cgi?id=' + str(rec['id'])\
			+ '">More...</A></TD></TR>\n'

		# print subsequent lines
		if print_authors and len(authors) > 1:
			for i in range(1, len(authors)):
				line = ""
				for key in keys:
					field = ""
					if key in records.author_keys:
						if key in authors[i]:
							field = authors[i][key]
					line = line + '<TD VALIGN="TOP">' + field + "</TD>"
				ret = ret + "<TR><TD></TD>" + line + "</TR>\n"
	ret = ret + "</TABLE>\n"
	return ret

def to_parm(parm):
	return cgi.escape(parm, 1==1).replace('&', '%26').replace('+', '%2B').replace(' ', '+')

def get_more(key, value, start, label):
	return '<A HREF="search.cgi?key=' + to_parm(key) \
		+ '&value=' + to_parm(value) \
		+ '&start=' + str(start + 1) \
		+ '">' + label + '</A>\n'

def get_nav(key, value, start, end, max):
	if start <> 0 or end <> max:
		ret = '<CENTER>\n'
		if start <> 0:
			prev = start - MAX_RECORDS
			if prev < 0:
				prev = 0
			ret = ret + get_more(key, value, prev, "Previous " + str(MAX_RECORDS))
		if end <> max:
			next = min(MAX_RECORDS, max - end)
			ret = ret + get_more(key, value, end, "Next " + str(next))
		ret = ret + '</CENTER>\n'
		return ret
	else:
		return ""

def compute_result(key, value, start):
	result = records.search(key, cgi.escape(value, 1==1))

	start = min(start, len(result))
	end = min(start + MAX_RECORDS, len(result))

	if start <> 0 or end <> len(result):
		count_text = "Records " + str(start + 1) + " to " + \
			str(end) + " of the " + str(len(result)) + " records"
	elif end == 0:
		count_text = "No records were"
	elif len(result) == 1:
		count_text = "One record was"
	else:
		count_text = str(len(result)) + " records were"
	count_text = count_text + " found containing `" + cgi.escape(value) + \
		"' in the `" + records.key_names[key] + "' field."


	ret = "<P>" + count_text + "</P>\n"

	ret = ret + get_nav(key, value, start, end, len(result))

	if len(result) > 0:
		ret = ret + get_list(result, ['title', 'name', 'date'], start, end)

	ret = ret + get_nav(key, value, start, end, len(result))

	return ret

def find(id):
	recs = records.Records()
	while recs.hasNext():
		rec = recs.next()
		if 'id' in rec and rec['id'] == id:
			return rec
	return None

def compute_fields(rec):
	ret = "<TABLE>\n"
	cols = len(records.author_keys)
	for key in records.record_keys:
		if key in rec:
			ret = ret + '<TR><TD ALIGN="RIGHT" VALIGN="TOP"><B>' + \
				records.key_names[key] + ':</B></TD><TD COLSPAN="' \
				+ str(cols) + '">' + rec[key] + "</TD></TR>\n"
	if 'authors' in rec:
		ret = ret + '<TR><TD ALIGN="RIGHT" VALIGN="TOP"><B>Authors:</B></TD>\n'
		for key in records.author_keys:
			ret = ret + '    <TD><B>' + records.key_names[key] + '</B></TD>\n'
		ret = ret + '  </TR>\n'
		for auth in rec['authors']:
			ret = ret + '  <TR><TD></TD>\n'
			for key in records.author_keys:
				if key in auth:
					ret = ret + '    <TD>' + auth[key] + '</TD>\n'
				else:
					ret = ret + '    <TD></TD>\n'
			ret = ret + '  </TR>\n'
	ret = ret + "</TABLE>\n"
	return ret

def output_template(template, result, key, value):
	file = open(template)
	while 1==1:
		line = file.readline()
		if line == "":
			return
		elif line[0] == "#":
			if line == "#FORM\n":
				print compute_form(key, value),
			elif line == "#RESULT\n":
				print result,
			else:
				print line,
		else:
			print line,

def main():
	print "Content-type: text/html"
	print ""
	form = cgi.FieldStorage()
	if form.has_key("key") and form.has_key("value"):
		key = form["key"].value
		value = form["value"].value
		if form.has_key("start"):
			try:
				start = int(form["start"].value) - 1
				if start < 0:
					start = 0
			except ValueError:
				start = 0
		else:
			start = 0
		result = compute_result(key, value, start)
		output_template("template-result.html", result, key, value)
	elif form.has_key("id"):
		try:
			id = int(form["id"].value)
		except ValueError:
			output_template("template-form.html", "", "", "")
			return

		record = find(id)
		if record is None:
			output_template("template-form.html", "", "", "")
		else:
			result = compute_fields(record)
			output_template("template-more.html", result, "", "")
	else:
		output_template("template-form.html", "", "", "")
