﻿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 () {

	var request_object = ajax_object (this);
	var parameters = new ajax_parameters;
	
	this.return_field = blank;

	/******/
	
	this.add_parameters = function (name, value) {
		parameters.add (name, value);
	}// add_parameters;
	
	/********/
	
	this.parse_script = function (response_text) {
		var script;
		while (script = response_text.match (/<script.*?>([\S\s]+?)<\/script>/m)) {
			eval (script [1]);
			response_text = response_text.replace (script [0], blank);
		}// while;
		return response_text;
	}// parse_script;
	
	/********/
	
	this.replace_list = function (callback, list) {
		var parent = callback.parentNode;
		parent.innerHTML = parent.innerHTML.replace (/\n/g, blank).replace (/<select(.+?)>.*<\/select>/i, "<select $1>" + list + "</select>");
	}// replace_list;
	
	/********/
	
	this.replace_row = function (callback, row) {
		var placeholder = document.createElement ("div");
		document.body.appendChild (placeholder);
		placeholder.innerHTML = "<table id='placeholder' style='position:absolute;visibility:hidden;left:0;top:0;'>" + row + "</table>";
		placeholder = document.getElementById ("placeholder");
		while (callback.rows.length > 0) {
			callback.deleteRow (0);
		}// while;
		for (var i = 0; i < placeholder.rows.length; i++) {
			callback.appendChild (placeholder.rows [i]);
		}// for;
		placeholder.parentNode.removeChild (placeholder);
		return false;
	}// replace_row;
	
	/********/
	
	this.callback_handler = function (data) {
		if (request_object.readyState != 4) return;
		document.body.style.cursor = blank;
		var owner = request_object.owner;
		var response = owner.parse_script (request_object.responseText);
		if ((!request_object.allow_nulls) && (response.trim () == blank)) return;
		if (request_object.callback != undefined) {
			switch (request_object.callback.nodeName) {
				case "SELECT": owner.replace_list (request_object.callback, response); break;
				case "TBODY": owner.replace_row (request_object.callback, response); break;
				default: request_object.callback.innerHTML = response;
			}// switch;
		}// if;
		if (request_object.return_field) request_object.return_field.value = response;
	}// load_code;
	
	/******/
	
	this.send = function (destination, options) {
		document.body.style.cursor = "wait";
		if (options != undefined) {
			request_object.callback = document.getElementById (options ["callback"]);
			request_object.allow_nulls = (options ["allow_nulls"] == true)
		}// if;
		request_object.onreadystatechange = this.callback_handler;
		request_object.owner = this;
		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;
		if (name == "return_field") this.return_field = record.value;
		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_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.getAttribute ("datafield") == undefined) continue;
		field_name = form_element.getAttribute ("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 += "  " + 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 ajax_data (destination, parameters, options) {
	var ajax = new ajax_handler ();
	if (options != undefined) {
		if (options ["form"] == true) get_form_values (ajax);
		if (options ["callback"] != undefined) ajax.add_parameters ("callback", options ["callback"])
	}// if;
	with (ajax) {
		if (parameters != undefined) {
			for (var i = 0; i < parameters.length; i++) {
				add_parameters (parameters [i].name, parameters [i].value);
			}// for;
		}// if;
		send (destination, options);
	}// with
	return false;
}// ajax_data;

/********/
