﻿var blank = "";

/********/

function form () {
	return document.forms [0];
}// form;

/********/

function ajax_object (parent_control) {
	var object;
	try {
		object = new XMLHttpRequest ();
	} catch (except) {
		try {
			object = new ActiveXObject ("Msxml2.XMLHTTP");
		} catch (except) {
			try {
				object = new ActiveXObject ("Microsoft.XMLHTTP");
			} catch (except) {
				return false;
			}// try
		}// try
	}// try
	object.ajax_handler = parent_control;
	return object;
}// ajax_object;

/********/

function ajax_parameters () {
	var items = [];

	/******/
	
	this.add = function (name, value) {
		items.push ({"name":name,"value":value});
	}// add;
	
	/******/
	
	this.indexOf = function (name) {
		for (var i = 0; i < items.length; i++) {
			if (items [i].name.equals (name)) return i;
		}// for;
		return -1;
	}// indexOf;
	
	/******/
	
	this.render = function () {
		var result = blank;
		var test_string = blank;
		for (var i = 0; i < items.length; i++) {
			if (!result.equals (blank)) result += "&";
			result += items [i].name + "=" + escape (items [i].value);
		}// for;
		return result;
	}// render;

	/******/
	
}// ajax_parameters;

/********/

function ajax_handler (callback_parameter) {

	var request_object = ajax_object (this);
	var callback = document.getElementById (callback_parameter);
	var parameters = new ajax_parameters;
	
	this.return_field = blank;
	this.return_message = blank;

	/******/
	
	this.add_parameters = function (name, value) {
		parameters.add (name, value);
	}// add_parameters;
	
	/******/
	
	this.callback_handler = function (data) {
		if (request_object.readyState != 4) return;
		document.body.style.cursor = blank;
		if (request_object.callback) {
			request_object.callback.innerHTML = request_object.responseText;
		} else {
			if (request_object.responseText != blank) {
				alert (request_object.responseText);
				return;
			}// if;
		}// if;
		if (request_object.return_message) alert (request_object.return_message);
		if (request_object.return_field) request_object.return_field.trigger = request_object.responseText;
	}// load_code;
	
	/******/
	
	this.send = function (destination) {
		document.body.style.cursor = "wait";
		if (callback) request_object.callback = callback;
		if (this.return_message) request_object.return_message = this.return_message;
		if (this.return_field) request_object.return_field = this.return_field;
		request_object.onreadystatechange = this.callback_handler;
		request_object.open ("post", destination, true);
		request_object.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
		request_object.send (parameters.render ());
	}// this.send;
	
	/******/
	
	this.set_value = function (record, name) {
		if (record.name.toLowerCase () != name) return false;
		switch (name) {
			case "return_field": this.return_field = record.value; break;
			case "return_message": this.return_message = record.value; break;
		}// switch;
		return true;
	}// set_value;
	
	/******/
	
}// ajax_handler;

/********/

function get_radio_value (control) {
	for (var i = 0; i < form ().elements.length; i++) {
		var form_control = form ().elements [i];
		if (form_control.name != control.name) continue;
		if (form_control.checked) return form_control.value;
	}// for;
	return blank;
}// get_radio_value;

/********/

function get_list_value (element) {
	if (element.selectedIndex == 0) return blank;
	return element.value;
}// get_list_value;

/********/

function get_field_value (element) {
	if (!element.type) return null;
	switch (element.type.toLowerCase ()) {
		case "text": return element.value;
		case "textarea": return element.innerText;
		case "hidden": return element.value;
		case "checkbox": return element.checked;
		case "radio": return get_radio_value (element);
		case "select-one": return get_list_value (element);
		// put other form types in here
	}// switch;
	return blank;
}// get_field_value;

/********/

function get_form_values (ajax_handler) {
	var field_name, field_value;
	for (var i = 0; i < form ().elements.length; i++) {
		var form_element = form ().elements [i];
		if (form_element == null) continue;
		if (form_element.datafield == undefined) continue;
		field_name = form_element.datafield;
		field_value = get_field_value (form_element);
		ajax_handler.add_parameters (field_name, field_value);
	}// form;
}// get_form_values;

/********/

function show_required_fields (field_list) {
	var message = blank;
	var tagline = "The following is a required field:\n\n";
	if (field_list.length > 1) tagline = "The following are required fields:\n\n";
	for (var i = 0; i < field_list.length; i++) {
		if (message != blank) message += "\n";
		message += "\t" + field_list [i];
	}// for;
	alert (tagline + message);
}// show_required_fields;

/********/

function required_fields_complete () {
	var field_value;
	var field_list = new Array;
	for (var i = 0; i < form ().elements.length; i++) {
		var form_element = form ().elements [i];
		if (form_element == null) continue;
		if (form_element.required == undefined) continue;
		field_value = get_field_value (form_element);
		if (field_value == blank) field_list.push (form_element.required);
	}// for;
	if (field_list.length == 0) return true;
	show_required_fields (field_list);
	return false;
}// required_fields_complete;

/********/

function set_ajax_data (destination, parameters) {
	var ajax = new ajax_handler ();
	get_form_values (ajax);
	with (ajax) {
		if (parameters != undefined) {
			for (var i = 0; i < parameters.length; i++) {
				if (set_value (parameters [i], "return_field")) continue;
				if (set_value (parameters [i], "return_message")) continue;
				add_parameters (parameters [i].name, parameters [i].value);
			}// for;
		}// if;
		send (destination);
	}// with;
	return false;
}// set_ajax_data;

/********/

function get_ajax_data (destination, parameters, callback) {
	var ajax = new ajax_handler (callback);
	with (ajax) {
		for (var i = 0; i < parameters.length; i++) {
			add_parameters (parameters [i].name, parameters [i].value);
		}// for;
		add_parameters ("callback", callback);
		send (destination);
	}// with
	return false;
}// get_ajax_data;

/********/