"use strict";

var TOL_OK						= "OK";
var tol_ajax_event_object		= null;
var tol_error_box_object		= null;
var tol_information_box_object	= null;
var tol_ignore_ajax_errors		= true;
var tol_total_ajax_requests		= 0;
var tol_drag_drop_files			= null;
var tol_use_w2ui_messages		= false;

var TOL_PI				= 3.1415926535897;
var TOL_2PI				= TOL_PI * 2;
var TOL_2PI_2			= TOL_2PI / 2;
var TOL_2PI_4			= TOL_2PI / 4;
var TOL_DEGREES_1		= (TOL_PI * 2) / 360 * 1;
var TOL_DEGREES_10		= (TOL_PI * 2) / 360 * 10;
var TOL_DEGREES_15		= (TOL_PI / 4);
var TOL_DEGREES_30		= TOL_PI / 4;
var TOL_DEGREES_45		= TOL_PI / 4;
var TOL_DEGREES_90		= TOL_PI / 2;
var TOL_DEGREES_180		= TOL_PI;
var TOL_DEGREES_270		= TOL_PI * 1.5;
var TOL_DEGREES_360		= TOL_PI * 2;
var TOL_PRECISION		= 0.00001;
var TOL_EARTH_RADIUS_KM	= 6372.797560856;

function tol_number_of_bytes_to_string(p_value)
{
	var multiplier = Math.pow(2, 50);

	var result = p_value / multiplier;

	if (result >= 1)
	{
		return tol_round(result, 1) + "PB";
	}

	multiplier = Math.pow(2, 40);

	result = p_value / multiplier;

	if (result >= 1)
	{
		return tol_round(result, 1) + "TB";
	}

	multiplier = Math.pow(2, 30);

	result = p_value / multiplier;

	if (result >= 1)
	{
		return tol_round(result, 1) + "GB";
	}

	multiplier = Math.pow(2, 20);

	result = p_value / multiplier;

	if (result >= 1)
	{
		return tol_round(result, 1) + "MB";
	}

	multiplier = Math.pow(2, 10);

	result = p_value / multiplier;

	if (result >= 1)
	{
		return tol_round(result, 1) + "KB";
	}

	return p_value + "B";
}

function tol_clone(p_value)
{
	return JSON.parse(JSON.stringify(p_value));
}

function tol_truncate(p_value, p_decimals)
{
	var tmp_value = p_value * Math.pow(10, p_decimals);

	if (tmp_value < 0)
	{
		return Math.ceil(tmp_value) / Math.pow(10, p_decimals);
	}
	else
	{
		return Math.floor(tmp_value) / Math.pow(10, p_decimals);
	}
}

function tol_to_bool_string(p_value)
{
	if (p_value == undefined)
	{
		p_value = false;
	}

	if (p_value == null)
	{
		p_value = false;
	}

	if (p_value)
	{
		return "true";
	}
	else
	{
		return "false";
	}
}

function tol_clear_array_name(p_array_name)
{
	eval(p_array_name + " = [];");
}

function tol_push_to_array_name(p_array_name, p_value)
{
	var pointer_to_array = eval(p_array_name);

	if (pointer_to_array == null)
	{
		return;
	}

	pointer_to_array.push(p_value);
}

function tol_serialise_array(p_array)
{
	if (p_array == undefined)
	{
		p_array = tol_array();
	}

	if (p_array == null)
	{
		p_array = tol_array();
	}

	var tmp_array = tol_array();

	for (var i = 0; i < p_array.length; i++)
	{
		tmp_array.push(tol_url_encode(p_array[i]));
	}

	return tol_array_to_string(tmp_array, "|");
}

function tol_timeout(p_milliseconds, p_function)
{
	setTimeout(p_function, p_milliseconds);
}

function tol_is_input(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name);

	if (jo.is("input"))
	{
		return true;
	}

	if (jo.is("select"))
	{
		return true;
	}

	if (jo.is("textarea"))
	{
		return true;
	}

	return false;
}

function tol_to_alphabet(p_value)
{
	var result = "";

	var total		= Math.floor(p_value / 26);
	var remainder	= 65 + (p_value % 26);

	if (total > 0)
	{
		result += String.fromCharCode(65 + (total - 1));
	}

	result += String.fromCharCode(remainder);

	return result;
}

function tol_to_bool(p_value)
{
	if (p_value == "0")
	{
		return false;
	}

	if (p_value == "1")
	{
		return true;
	}

	return (p_value == true);
}

function tol_refresh()
{
	tol_reload();
}

function tol_reload()
{
	window.location.reload(true);
}

function tol_total_elements(p_variable)
{
	if (p_variable == undefined)
	{
		return 0;
	}

	if (p_variable == null)
	{
		return 0;
	}

	var total = 0;

	for (var i in p_variable)
	{
		total++;
	}

	return total;
}

function tol_error(p_message)
{
	tol_information();

	if (tol_use_w2ui_messages)
	{
		if (p_message == undefined)
		{
			return;
		}

		if (p_message == null)
		{
			return;
		}

		w2alert("<span style=\"color: red; font-weight: bold;\">" + p_message + "</span>", "Error");
	}
	else
	{
		if (p_message == undefined)
		{
			tol_fade_out("#tol_error_box");
		}
		else
		{
			tol_set_html("#tol_error_box", p_message);

			tol_fade_in("#tol_error_box");
		}
	}
}

function tol_hide_messages()
{
	if (tol_use_w2ui_messages)
	{
		return;
	}

	tol_fade_out("#tol_error_box");
	tol_fade_out("#tol_information_box");
}

function tol_console(p_message)
{
	if (p_message == undefined)
	{
		p_message = null;
	}

	if (p_message == null)
	{
		p_message = "";
	}

	if (p_message == "")
	{
		console.log(tol_sql_date_time());
	}
	else
	{
		console.log(tol_sql_date_time() + ": " + p_message);
	}
}

function tol_information(p_message, p_date_time)
{
	if (p_date_time == undefined)
	{
		p_date_time = false;
	}

	if (p_date_time)
	{
		p_message = tol_sql_date_time() + ": " + p_message;
	}

	if (tol_use_w2ui_messages)
	{
		if (p_message == undefined)
		{
			return;
		}

		if (p_message == null)
		{
			return;
		}

		w2alert(p_message, "Information");
	}
	else
	{
		if (p_message == undefined)
		{
			tol_fade_out("#tol_information_box");
		}
		else
		{
			tol_set_html("#tol_information_box", p_message);

			tol_fade_in("#tol_information_box");
		}
	}
}

function tol_ends_with(p_value, p_substring)
{
	if (p_value == undefined)
	{
		return false;
	}

	if (p_substring == undefined)
	{
		return false;
	}

	if (p_value == null && p_substring == null)
	{
		return true;
	}

	var pos = p_value.length - p_substring.length;

	if (pos < 0)
	{
		return false;
	}

	var s = p_value.substr(pos);

	if (s == p_substring)
	{
		return true;
	}
	else
	{
		return false;
	}
}

function tol_contains_property(p_object, p_property_name)
{
	return (p_property_name in p_object);
}

function tol_contains(p_value, p_substring)
{
	if (p_value == undefined)
	{
		return false;
	}

	if (p_substring == undefined)
	{
		return false;
	}

	if (p_value == null && p_substring == null)
	{
		return true;
	}

	if (tol_is_string(p_value))
	{
		var i = p_value.indexOf(p_substring, 0);

		return (i > -1);
	}

	if (tol_is_array(p_value))
	{
		for (var i = 0; i < p_value.length; i++)
		{
			if (p_value[i] == p_substring)
			{
				return true;
			}
		}

		return false;
	}

	return (p_substring in p_value);
}

function tol_map_contains(p_object, p_value)
{
	if (p_object == undefined)
	{
		return false;
	}

	if (p_object == null)
	{
		return false;
	}

	return (p_value in p_object);
}

function tol_push_if_not_blank(p_array, p_value)
{
	if (!tol_blank(p_value))
	{
		p_array.push(p_value);
	}

	return p_array;
}

function tol_array_to_object(p_array, p_key_field, p_value_field)
{
	var obj = tol_object();

	if (tol_is_array(p_array))
	{
		if (p_value_field == undefined)
		{
			for (var i = 0; i < p_array.length; i++)
			{
				var row = p_array[i];

				if (row[p_key_field] == undefined)
				{
					return null;
				}

				obj[row[p_key_field]] = row;
			}
		}
		else
		{
			for (var i = 0; i < p_array.length; i++)
			{
				var row = p_array[i];

				if (row[p_key_field] == undefined)
				{
					return null;
				}

				if (row[p_value_field] == undefined)
				{
					return null;
				}

				obj[row[p_key_field]] = row[p_value_field];
			}
		}

		return obj;
	}

	if (tol_is_map(p_array))
	{
		if (p_value_field == undefined)
		{
			for (var i in p_array)
			{
				var row = p_array[i];

				if (row[p_key_field] == undefined)
				{
					return null;
				}

				obj[row[p_key_field]] = row;
			}
		}
		else
		{
			for (var i in p_array)
			{
				var row = p_array[i];

				if (row[p_key_field] == undefined)
				{
					return null;
				}

				if (row[p_value_field] == undefined)
				{
					return null;
				}

				obj[row[p_key_field]] = row[p_value_field];
			}
		}

		return obj;
	}

	return null;
}

function tol_round(p_value, p_decimals, p_pad)
{
	if (p_pad == undefined)
	{
		p_pad = false;
	}

	var tmp_value = p_value * Math.pow(10, p_decimals);

	tmp_value = Math.round(tmp_value);

	tmp_value /= Math.pow(10, p_decimals);

	if (p_pad)
	{
		return tmp_value.toFixed(p_decimals);
	}
	else
	{
		return tmp_value;
	}
}

function tol_degrees_to_radians(p_degrees)
{
	return p_degrees * TOL_DEGREES_1;
}

function tol_utc_offset()
{
	var d = new Date();

	return tol_minutes_to_hours(d.getTimezoneOffset());
}

function tol_days_to_milliseconds(p_days)
{
	return p_days * 24 * 60 * 60 * 1000;
}

function tol_hours_to_milliseconds(p_hours)
{
	return p_hours * 60 * 60 * 1000;
}

function tol_minutes_to_milliseconds(p_minutes)
{
	return p_minutes * 60 * 1000;
}

function tol_minutes_to_hours(p_minutes)
{
	return p_minutes / 60;
}

function tol_seconds_to_milliseconds(p_minutes)
{
	return p_seconds * 1000;
}

function tol_utc_date(p_milliseconds)
{
	var d = null;

	if (p_milliseconds == undefined)
	{
		d = new Date();
	}
	else
	{
		if (p_milliseconds instanceof Date)
		{
			d = p_milliseconds;
		}
		else
		{
			if (p_milliseconds instanceof String)
			{
				d = tol_sql_date_time_to_date(p_milliseconds);
			}
			else
			{
				d = new Date(p_milliseconds);
			}
		}
	}

	var utc = new Date();

	utc.setDate(d.getUTCDate());
	utc.setFullYear(d.getUTCFullYear());
	utc.setMonth(d.getUTCMonth());
	utc.setHours(d.getUTCHours());
	utc.setMinutes(d.getUTCMinutes());
	utc.setSeconds(d.getUTCSeconds());
	utc.setMilliseconds(d.getUTCMilliseconds());

	return utc;
}

function tol_milliseconds_to_sql_date_time(p_milliseconds)
{
	var d = null;

	if (p_milliseconds == undefined)
	{
		d = new Date();
	}
	else
	{
		d = new Date(p_milliseconds);
	}

	return tol_date_to_sql_date_time(d);
}

function tol_date_plus_hours(p_date, p_hours)
{
	return tol_date_plus_milliseconds(p_date, p_hours * 60 * 60 * 1000);
}

function tol_date_plus_minutes(p_date, p_minutes)
{
	return tol_date_plus_milliseconds(p_date, p_minutes * 60 * 1000);
}

function tol_date_plus_seconds(p_date, p_seconds)
{
	return tol_date_plus_milliseconds(p_date, p_seconds * 1000);
}

function tol_date_plus_milliseconds(p_date, p_milliseconds)
{
	var t = p_date.getTime() + p_milliseconds;

	var d = new Date(t);

	return d;
}

function tol_sql_date_time()
{
	var d = new Date();

	return tol_date_to_sql_date_time();
}

function tol_sql_date_time_to_date(p_string)
{
	var yyyy	= p_string.substr(0, 4) * 1;
	var mm		= p_string.substr(5, 2) * 1;
	var dd		= p_string.substr(8, 2) * 1;
	var hh		= p_string.substr(11, 2) * 1;
	var mi		= p_string.substr(14, 2) * 1;
	var ss		= p_string.substr(17, 2) * 1;

	var d = new Date();

	try
	{
		d.setFullYear(yyyy);
		d.setMonth(mm - 1);
		d.setDate(dd);
		d.setHours(hh);
		d.setMinutes(mi);
		d.setSeconds(ss);
	}
	catch (e)
	{
		return null;
	}

	return d;
}

function tol_date_to_dd_mm_yyyy_hh_mm_ss(p_date, p_format)
{
	if (p_format == undefined)
	{
		p_format = "DMY";
	}

	if (p_format != "MDY")
	{
		p_format = "DMY";
	}

	if (p_date == null)
	{
		p_date = new Date();
	}

	var dd		= p_date.getDate();
	var mm		= p_date.getMonth() + 1;
	var yyyy	= p_date.getFullYear();
	var hh		= p_date.getHours();
	var mi		= p_date.getMinutes();
	var ss		= p_date.getSeconds();

	if (dd < 10)
	{
		dd = "0" + dd;
	}

	if (mm < 10)
	{
		mm = "0" + mm;
	}

	if (hh < 10)
	{
		hh = "0" + hh;
	}

	if (mi < 10)
	{
		mi = "0" + mi;
	}

	if (ss < 10)
	{
		ss = "0" + ss;
	}

	if (p_format == "DMY")
	{
		return dd + "/" + mm + "/" + yyyy + " " + hh + ":" + mi + ":" + ss;
	}

	if (p_format == "MDY")
	{
		return mm + "/" + dd + "/" + yyyy + " " + hh + ":" + mi + ":" + ss;
	}

	return yyyy + "/" + mm + "/" + dd + " " + hh + ":" + mi + ":" + ss;
}

function tol_date_to_sql_date_time(p_date)
{
	if (p_date == undefined)
	{
		p_date = new Date();
	}

	var dd		= p_date.getDate();
	var mm		= p_date.getMonth() + 1;
	var yyyy	= p_date.getFullYear();
	var hh		= p_date.getHours();
	var mi		= p_date.getMinutes();
	var ss		= p_date.getSeconds();

	if (dd < 10)
	{
		dd = "0" + dd;
	}

	if (mm < 10)
	{
		mm = "0" + mm;
	}

	if (hh < 10)
	{
		hh = "0" + hh;
	}

	if (mi < 10)
	{
		mi = "0" + mi;
	}

	if (ss < 10)
	{
		ss = "0" + ss;
	}

	return yyyy + "/" + mm + "/" + dd + " " + hh + ":" + mi + ":" + ss;
}

function tol_date_to_sql_date(p_date)
{
	if (p_date == undefined)
	{
		p_date = new Date();
	}

	var dd		= p_date.getDate();
	var mm		= p_date.getMonth() + 1;
	var yyyy	= p_date.getFullYear();

	if (dd < 10)
	{
		dd = "0" + dd;
	}

	if (mm < 10)
	{
		mm = "0" + mm;
	}

	return yyyy + "/" + mm + "/" + dd;
}

function tol_date_to_formatted_date(p_date, p_date_format)
{
	if (p_date == undefined || p_date == null)
	{
		p_date = new Date();
	}

	if (p_date_format == undefined)
	{
		p_date_format = "DMY";
	}

	var dd		= p_date.getDate();
	var mm		= p_date.getMonth() + 1;
	var yyyy	= p_date.getFullYear();

	if (dd < 10)
	{
		dd = "0" + dd;
	}

	if (mm < 10)
	{
		mm = "0" + mm;
	}

	if (p_date_format == "YMD")
	{
		return yyyy + "/" + mm + "/" + dd;
	}

	if (p_date_format == "MDY")
	{
		return mm + "/" + dd + "/" + yyyy;
	}

	if (p_date_format == "DMY")
	{
		return dd + "/" + mm + "/" + yyyy;
	}
}

function tol_date_to_sql_time(p_date, p_exclude_seconds)
{
	if (p_date == undefined)
	{
		p_date = new Date();
	}

	if (p_exclude_seconds == undefined)
	{
		p_exclude_seconds = false;
	}

	var hh		= p_date.getHours();
	var mi		= p_date.getMinutes();
	var ss		= p_date.getSeconds();

	if (hh < 10)
	{
		hh = "0" + hh;
	}

	if (mi < 10)
	{
		mi = "0" + mi;
	}

	if (ss < 10)
	{
		ss = "0" + ss;
	}

	if (p_exclude_seconds)
	{
		return hh + ":" + mi;
	}
	else
	{
		return hh + ":" + mi + ":" + ss;
	}
}

function tol_time_to_sql_time(p_time)
{
	var c = tol_components(p_time, ":");

	var hh	= 99;
	var mi	= 99;
	var ss	= 99;

	if (c.length == 2)
	{
		hh = c[0] * 1;
		mi = c[1] * 1;
		ss = 0;
	}

	if (c.length == 3)
	{
		hh = c[0] * 1;
		mi = c[1] * 1;
		ss = c[2] * 1;
	}

	if (hh > 23 || hh < 0)
	{
		tol_error("Invalid Time: " + p_time);

		return null;
	}

	if (mi > 59 || mi < 0)
	{
		tol_error("Invalid Time: " + p_time);

		return null;
	}

	if (ss > 59 || ss < 0)
	{
		tol_error("Invalid Time: " + p_time);

		return null;
	}

	if (hh < 10)
	{
		hh = "0" + hh;
	}

	if (mi < 10)
	{
		mi = "0" + mi;
	}

	if (ss < 10)
	{
		ss = "0" + ss;
	}

	return hh + ":" + mi + ":" + ss;
}

function tol_formatted_date_time_to_sql_date_time(p_formatted_date_time, p_date_format)
{
	if (p_formatted_date_time == undefined || p_formatted_date_time == null)
	{
		tol_error("Invalid date/time");

		return null;
	}

	if (p_formatted_date_time.length != 19)
	{
		tol_error("Invalid Date/Time: " + p_formatted_date_time);

		return null;
	}

	if (p_date_format == undefined)
	{
		p_date_format = "DMY";
	}

	if (p_date_format != "DMY" &&
		p_date_format != "MDY" &&
		p_date_format != "YMD")
	{
		tol_error("Invalid Date Format: " + p_date_format);
	}

	var yyyy	= 0;
	var mm		= 0;
	var dd		= 0;
	var hh		= 0;
	var mi		= 0;
	var ss		= 0;

	if (p_date_format == "DMY")
	{
		dd		= p_string.substr(0, 2) * 1;
		mm		= p_string.substr(3, 2) * 1;
		yyyy	= p_string.substr(6, 4) * 1;
	}

	if (p_date_format == "MDY")
	{
		mm		= p_string.substr(0, 2) * 1;
		dd		= p_string.substr(3, 2) * 1;
		yyyy	= p_string.substr(6, 4) * 1;
	}

	if (p_date_format == "YMD")
	{
		yyyy	= p_string.substr(0, 4) * 1;
		mm		= p_string.substr(5, 2) * 1;
		dd		= p_string.substr(8, 2) * 1;
	}

	hh		= p_string.substr(11, 2) * 1;
	mi		= p_string.substr(14, 2) * 1;
	ss		= p_string.substr(17, 2) * 1;

	var d = new Date();

	d.setFullYear(yyyy);
	d.setMonth(mm - 1);
	d.setDate(dd);
	d.setHours(hh);
	d.setMinutes(mi);
	d.setSeconds(ss);

	return tol_date_to_sql_date_time(d);
}

function tol_formatted_date_to_sql_date(p_formatted_date, p_date_format)
{
	if (p_formatted_date == undefined || p_formatted_date == null)
	{
		tol_error("Invalid Date");

		return null;
	}

	if (p_formatted_date.length != 10)
	{
		tol_error("Invalid Date: " + p_formatted_date);

		return null;
	}

	if (p_date_format == undefined)
	{
		p_date_format = "DMY";
	}

	if (p_date_format != "DMY" &&
		p_date_format != "MDY" &&
		p_date_format != "YMD")
	{
		tol_error("Invalid Date Format: " + p_date_format);
	}

	var yyyy	= 0;
	var mm		= 0;
	var dd		= 0;

	if (p_date_format == "DMY")
	{
		dd		= p_formatted_date.substr(0, 2) * 1;
		mm		= p_formatted_date.substr(3, 2) * 1;
		yyyy	= p_formatted_date.substr(6, 4) * 1;
	}

	if (p_date_format == "MDY")
	{
		mm		= p_formatted_date.substr(0, 2) * 1;
		dd		= p_formatted_date.substr(3, 2) * 1;
		yyyy	= p_formatted_date.substr(6, 4) * 1;
	}

	if (p_date_format == "YMD")
	{
		yyyy	= p_formatted_date.substr(0, 4) * 1;
		mm		= p_formatted_date.substr(5, 2) * 1;
		dd		= p_formatted_date.substr(8, 2) * 1;
	}

	if (yyyy == 0 || mm == 0 || dd == 0)
	{
		tol_error("Invalid Date: " + p_formatted_date);

		return null;
	}

	var d = new Date();

	d.setFullYear(yyyy);
	d.setMonth(mm - 1);
	d.setDate(dd);
	d.setHours(0);
	d.setMinutes(0);
	d.setSeconds(0);

	return tol_date_to_sql_date(d);
}

function tol_set_cookie(p_name, p_value, p_date)
{
	if (p_date == undefined)
	{
		p_date = new Date();

		p_date.setTime(p_date.getTime() + tol_days_to_milliseconds(30));
	}

	p_value = tol_url_encode(p_value);

	var domain = tol_domain();

	var cookie_string = p_name + "=" + p_value + ";path=/;domain=." + domain;

	if (p_date != null)
	{
		cookie_string += ";expires=" + p_date.toUTCString();
	}

	document.cookie = cookie_string;
}

function tol_delete_cookie(p_name)
{
	var cookie_value = tol_get_cookie(p_name);

	if (cookie_value == null)
	{
		return;
	}

	var expiry_date = new Date(0);

	tol_set_cookie(p_name, cookie_value, expiry_date);
}

function tol_get_cookie(p_name)
{
	var cookies = tol_get_cookies();

	if (cookies[p_name] != undefined)
	{
		return cookies[p_name];
	}

	return null;
}

function tol_get_cookies()
{
	var cookies = tol_object();

	var cookies_unparsed = tol_components(document.cookie, ";");

	for (var i in cookies_unparsed)
	{
		var cookie_components = tol_components(cookies_unparsed[i], "=");

		if (cookie_components.length != 2)
		{
			continue;
		}

		var cookie_key		= tol_trim(cookie_components[0]);
		var cookie_value	= tol_url_decode(tol_trim(cookie_components[1]));

		cookies[cookie_key] = cookie_value;
	}

	return cookies;
}

function tol_domain(p_url)
{
	var host;

	if (p_url == undefined)
	{
		host = tol_host();
	}
	else
	{
		host = tol_extract_host(p_url);
	}

	var host_components = tol_components(host, ".");

	if (host_components.length < 3)
	{
		return host;
	}

	var domain = host_components[host_components.length - 2] + "." + host_components[host_components.length - 1];

	return domain;
}

function tol_extract_host(p_url)
{
	if (p_url == undefined)
	{
		return tol_host();
	}

	var url_without_prefix	= tol_right(p_url, "//");
	var host_without_path	= tol_left(url_without_prefix, "/");
	var host_without_port	= tol_left(host_without_path, ":");

	return host_without_port;
}

function tol_set_attribute(p_jquery_name, p_attribute, p_value)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	jo.attr(p_attribute, p_value);
}

function tol_set_width(p_jquery_name, p_width)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	jo.width(p_width);
}

function tol_viewport_width()
{
	return $(window).width();
}

function tol_viewport_height()
{
	return window.innerHeight ? window.innerHeight : $(window).height();
}

function tol_function_object(p_function_name, p_strict)
{
	if (p_strict == undefined)
	{
		p_strict = false;
	}

	if (p_strict == null)
	{
		p_strict = false;
	}

	var function_object = window[p_function_name];

	if (function_object == undefined)
	{
		if (p_strict)
		{
			tol_error("tol_function_object: " + p_function_name + " isn't a function");
		}

		return null;
	}

	return function_object;
}

function tol_jquery_object(p_variable, p_strict)
{
	if (p_strict == undefined)
	{
		p_strict = false;
	}

	if (p_strict == null)
	{
		p_strict = false;
	}

	if (p_variable == null)
	{
		if (p_strict)
		{
			tol_error("tol_jquery_object: p_variable is null");
		}

		return null;
	}

	if (tol_is_jquery_object(p_variable, p_strict))
	{
		return p_variable;
	}
	else
	{
		var jo = $(p_variable);

		if (tol_is_jquery_object(jo, true))
		{
			return jo;
		}
		else
		{
			if (p_strict)
			{
				tol_error("tol_jquery_object: " + p_variable + " isn't a jquery object");

				return null;
			}
			else
			{
				return jo;
			}
		}
	}
}

function tol_is_jquery_string(p_value)
{
	if (p_value == undefined)
	{
		return false;
	}

	if (p_value == null)
	{
		return false;
	}

	if (!tol_is_string(p_value))
	{
		return false;
	}

	var v = $(p_value);

	var tmp = typeof v.jquery;

	if (tmp == "udefined")
	{
		return false;
	}
	else
	{
		if (v.length == 0)
		{
			return false;
		}

		return true;
	}
}

function tol_is_jquery_object(p_variable, p_strict)
{
	if (p_strict == undefined)
	{
		p_strict = false;
	}

	if (p_strict == null)
	{
		p_strict = false;
	}

	if (p_variable == null)
	{
		return false;
	}

//	if (tol_is_string(p_variable))
//	{
//		p_variable = $(p_variable);
//	}

	if (typeof p_variable.jquery != 'undefined')
	{
		if (p_strict)
		{
			if (p_variable.length == 0)
			{
				return false;
			}
		}

		return true;
	}

	return false;
}

function tol_submit_form_ajax(p_form_id, p_finished_function)
{
	var form_object = tol_jquery_object(p_form_id, true);

	if (p_finished_function == undefined)
	{
		tol_error("tol_form_submit_ajax: please specify a callback function");

		return;
	}

	var options = tol_array();

	options["success"] = function(p_response_text, p_status_text)
	{
		if (p_finished_function != undefined)
		{
			p_finished_function(p_response_text, p_status_text);
		}
	};

	options["iframe"] = true;

	form_object.ajaxForm(options);

	tol_submit_form(form_object);
}

function tol_upload_file(p_url, p_file_input_id, p_finished_function, p_parameters)
{
	if (p_finished_function == undefined)
	{
		tol_error("tol_upload_file: please specify a callback function");

		return;
	}

	var jo = tol_jquery_object(p_file_input_id, true);

	var body_object = tol_jquery_object("body");

	body_object.append('<form style="display: none;" action="' + p_url + '" method="post" id="tol_upload_file_form" enctype="multipart/form-data"><input type="text" name="text" value="text" /></form>');

	var original_object = jo.parent();

	jo.appendTo("#tol_upload_file_form");

	var form_object = $("#tol_upload_file_form");

	if (p_parameters != undefined)
	{
		for (var i in p_parameters)
		{
			form_object.append('<input type="hidden" name="' + i + '" value="' + p_parameters[i] + '">');
		}
	}

	var options = tol_array();

	options["success"] = function(p_response_text, p_status_text)
	{
		if (p_finished_function != undefined)
		{
			p_finished_function(p_response_text, p_status_text);
		}

		jo.appendTo(original_object);

		form_object.remove();
	};

	options["failure"] = function(p_response_text, p_status_text)
	{
		tol_error("file upload failed: " + p_status_text);

		form_object.remove();
	};

	$('#tol_upload_file_form').ajaxForm(options);

	tol_submit_form(form_object);
}

function tol_to_yes_no(p_boolean)
{
	if (p_boolean)
	{
		return "Yes";
	}
	else
	{
		return "No";
	}
}

function tol_host()
{
	return window.location.host;
}

function tol_trim(p_string)
{
	return tol_ltrim(tol_rtrim(p_string));
}
 
function tol_ltrim(p_string)
{
	if (p_string.replace)
	{
		return p_string.replace(/^\s+/,"");
	}
	else
	{
		return p_string;
	}
}
 
function tol_rtrim(p_string)
{
	if (p_string == undefined)
	{
		return "";
	}

	if (tol_is_array(p_string))
	{
		return p_string;
	}

	if (p_string.replace)
	{
		return p_string.replace(/\s+$/, "");
	}
	else
	{
		return p_string;
	}
}

function tol_table_row_mouseover(p_row, p_class_name, p_remove_classes)
{
	p_row = tol_jquery_object(p_row);

	if (p_remove_classes == undefined)
	{
		p_remove_classes = true;
	}

	// Loop through all the row's cells adding the highlight class

	var cells = p_row.children();

	p_row.addClass(p_class_name);

	p_row.attr("tol_old_class_name", p_class_name);

	cells.each(function()
	{
		// Clear any existing classes (i.e. 'odd' or 'even') first
		if (p_remove_classes)
		{
			this.tol_old_class_name = $(this).attr('className');

			$(this).removeClass();
		}

		$(this).addClass(p_class_name);
	});

	// Reverse the highlight effect on the mouseout event

	p_row.bind("mouseout", function()
	{
		p_row.removeClass(p_class_name);

		p_row.addClass(p_row.attr("tol_old_class_name"));

		cells.each(function()
		{
		// Restores the removed ('odd' or 'even') classes
			$(this).removeClass(p_class_name);

			if (p_remove_classes)
			{
				$(this).addClass(this.tol_old_class_name);
			}
		})
	});
}

function tol_popup(p_source_element, p_target_element, p_popup_element, p_top, p_left, p_fast)
{
	p_source_element	= tol_jquery_object(p_source_element);
	p_target_element	= tol_jquery_object(p_target_element);

	if (p_popup_element == null)
	{
		p_popup_element = p_target_element;
	}

	p_popup_element = tol_jquery_object(p_popup_element);

	if (p_top == null)
	{
		p_top = -5;
	}

	if (p_left == null)
	{
		p_left = 80;
	}

	if (p_fast == null)
	{
		p_fast = true;
	}

	var pos = p_source_element.position();

	p_popup_element.css(
	{
		"position": "absolute",
		"top": pos.top + p_top,
		"left": pos.left + p_left
	});

	if (p_popup_element != p_target_element)
	{
		tol_set_html(p_popup_element, tol_get_html(p_target_element));
	}

	tol_fade_in(p_popup_element, p_fast);

	p_source_element.bind("mouseout", function()
	{
		tol_hide(p_popup_element);
	});
}

function tol_hide(p_jquery_name, p_function)
{
	var jo = tol_jquery_object(p_jquery_name);

	if (p_function == undefined)
	{
		jo.css("display", "none");
//		jo.hide();
	}
	else
	{
		jo.hide("fast", p_function);
	}
}

function tol_show(p_jquery_name, p_function)
{
	var jo = tol_jquery_object(p_jquery_name);

	if (p_function == undefined)
	{
		jo.css("display", "");
//		jo.show();
	}
	else
	{
		jo.show("fast", p_function);
	}
}

function tol_scroll_to(p_jquery_name, p_milliseconds)
{
	if (p_milliseconds == undefined)
	{
		p_milliseconds = 1000;
	}

	var jo = tol_jquery_object(p_jquery_name);

//	$.scrollTo(p_jquery_name, p_milliseconds, null);
	$.scrollTo(jo, p_milliseconds, null);
}

function tol_scroll_up(p_object, p_distance)
{
	var jo = tol_jquery_object(p_object);

	var scrolltop = jo.scrollTop();

	scrolltop -= p_distance;

	if (scrolltop < 0)
	{
		scrolltop = 0;
	}

	jo.scrollTop(scrolltop);
}

function tol_scroll_down(p_object, p_distance)
{
	var jo = tol_jquery_object(p_object);

	var scrolltop = jo.scrollTop();

	scrolltop += p_distance;

	jo.scrollTop(scrolltop);
}

function tol_scroll_top(p_object)
{
	var jo = tol_jquery_object(p_object);

	jo.scrollTop(0);
}

function tol_scroll_end(p_object)
{
	var jo = tol_jquery_object(p_object);

	jo.scrollTop(999999);
}

function tol_replace(p_value, p_old_value, p_new_value)
{
	var reg = new RegExp(p_old_value, "g");

	return p_value.replace(reg, p_new_value);
}

function tol_remove(p_object)
{
	var jo = tol_jquery_object(p_object);

	jo.remove();
}

function tol_remove(p_value, p_old_value)
{
	if (tol_is_array(p_value))
	{
		if (tol_is_map(p_value))
		{
			var new_array = tol_array();

			for (var i in p_value)
			{
				var tmp_value = p_value[i];

				if (tmp_value != p_old_value)
				{
					new_array[i] = tmp_value;
				}
			}

			return new_array;
		}
		else
		{
			var new_array = tol_array();

			for (var i in p_value)
			{
				var tmp_value = p_value[i];

				if (tmp_value != p_old_value)
				{
					new_array.push(tmp_value);
				}
			}

			return new_array;
		}
	}
	else
	{
		return tol_replace(p_value, p_old_value, "");
	}
}

function tol_is_valid_phone(p_phone_number)
{
	if (p_phone_number == null)
	{
		return false;
	}

	var valid_characters	= "0123456789+ -";
	var is_valid			= true;

	var c;

	for (i = 0; i < p_phone_number.length; i++) 
	{
		c = p_phone_number.charAt(i); 

		if (valid_characters.indexOf(c) == -1) 
		{
			is_valid = false;

			break;
		}
	}

	return is_valid;
}

function tol_is_numeric(p_value)
{
	if (p_value == null)
	{
		return false;
	}

	var valid_characters	= "0123456789";
	var is_valid			= true;

	var c;

	for (i = 0; i < p_value.length; i++) 
	{
		c = p_value.charAt(i); 

		if (valid_characters.indexOf(c) == -1) 
		{
			is_valid = false;

			break;
		}
	}

	return is_valid;
}

function tol_mouse_pointer()
{
	document.body.style.cursor = "default";
}

function tol_mouse_default()
{
	document.body.style.cursor = "default";
}

function tol_mouse_hand()
{
	document.body.style.cursor = "pointer";
}

function tol_mouse_wait()
{
	document.body.style.cursor = "wait";
}

function tol_dd_mm_yyyy_to_date(p_value)
{
	if (tol_blank(p_value))
	{
		return false;
	}

	var components = tol_components(p_value, "/");

	if (components.length != 3)
	{
		return false;
	}

	var d = new Date();

	var day		= components[0] * 1;
	var month	= (components[1] * 1) - 1;
	var year	= components[2] * 1;

	if (year < 100)
	{
		year += 2000;
	}

	if (day < 1 || day > 31)
	{
		return false;
	}

	if (month < 0 || month > 11)
	{
		return false;
	}

	if (year < 1900 || year > 2200)
	{
		return false;
	}

	try
	{
		d.setDate(day);
		d.setMonth(month);
		d.setFullYear(year);
	}
	catch (e)
	{
		return false;
	}

	if (d.getMonth() != month)
	{
		return false;
	}

	return d;
}

function tol_alert(p_text)
{
	p_text = p_text.replace(/&nbsp;/g, '\xa0');

	alert(p_text);
}

function tol_attributes(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	var attrs		= jo[0].attributes;
	var attributes	= tol_array();

	for (var i = 0; i < attrs.length; i++)
	{
		attributes[attrs[i].nodeName] = attrs[i].nodeValue;
	}

	return attributes;
}

function tol_is_checkbox(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	if (jo == null)
	{
		return false;
	}

	var type = jo.attr("type");

	if (type == "checkbox")
	{
		return true;
	}
	else
	{
		return false;
	}
}

function tol_bool_to_sql(p_value)
{
	if (p_value == undefined)
	{
		return 0;
	}

	if (p_value == null)
	{
		return 0;
	}

	if (p_value)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

function tol_to_string(p_value, p_key_value_delimiter, p_row_delimiter, p_url_encode)
{
	if (p_key_value_delimiter == undefined)
	{
		p_key_value_delimiter = ":";
	}

	if (p_row_delimiter == undefined)
	{
		p_row_delimiter = "&";
	}

	if (p_url_encode == undefined)
	{
		p_url_encode = true;
	}

	if (p_url_encode == null)
	{
		p_url_encode = true;
	}

	if (p_value instanceof Date)
	{
		var day			= p_value.getDate();
		var month		= p_value.getMonth() + 1;
		var year		= p_value.getFullYear();
		var hour		= p_value.getHours();
		var minute		= p_value.getMinutes();
		var second		= p_value.getSeconds();
		var millisecond	= p_value.getMilliseconds();

		if (day < 10)
		{
			day = "0" + day;
		}

		if (month < 10)
		{
			month = "0" + month;
		}

		if (hour < 10)
		{
			hour = "0" + hour;
		}

		if (minute < 10)
		{
			minute = "0" + minute;
		}

		if (second < 10)
		{
			second = "0" + second;
		}

		if (millisecond < 10)
		{
			millisecond = "00" + millisecond;
		}
		else
		{
			if (millisecond < 100)
			{
				millisecond = "0" + millisecond;
			}
		}

		return year + "/" + month + "/" + day + " " + hour + ":" + minute + ":" + second + "." + millisecond;
	}

	if (p_key_value_delimiter == null)
	{
		p_key_value_delimiter = ":";
	}

	if (p_row_delimiter == null)
	{
		p_row_delimiter = "&";
	}

	var string = "";

	for (var key in p_value)
	{
		if (string.length > 0)
		{
			string += p_row_delimiter;
		}

		if (p_url_encode)
		{
			string += tol_url_encode(key) + p_key_value_delimiter + tol_url_encode(p_value[key]);
		}
		else
		{
			string += key + p_key_value_delimiter + p_value[key];
		}
	}

	return string;
}

function tol_form_hidden_parameters(p_jquery_name)
{
	var parameters = tol_array();

	jo = tol_jquery_object(p_jquery_name + " input:hidden");

	jo.each(function(index, object)
	{
		parameters[object.name] = tol_value('#' + object.name);
	}
	);

	return parameters;
}

function tol_form_parameters(p_jquery_name)
{
	var parameters = tol_array();

	var jo = tol_jquery_object(p_jquery_name + " input:text");

	jo.each(function(index, object)
	{
		parameters[object.name] = object.value;
	}
	);

	var jo = tol_jquery_object(p_jquery_name + " input:password");

	jo.each(function(index, object)
	{
		parameters[object.name] = object.value;
	}
	);

	var jo = tol_jquery_object(p_jquery_name + " input:radio");

	jo.each(function(index, object)
	{
		parameters[object.name] = tol_radiobutton_value(object.name);
	}
	);

	jo = tol_jquery_object(p_jquery_name + " input:checkbox");

	jo.each(function(index, object)
	{
		parameters[object.name] = tol_checkbox_value('#' + object.name.replace("[]", ""));
	}
	);

	jo = tol_jquery_object(p_jquery_name + " input:file");

	jo.each(function(index, object)
	{
		parameters[object.name] = tol_value('#' + object.name);
	}
	);

	jo = tol_jquery_object(p_jquery_name + " input:hidden");

	jo.each(function(index, object)
	{
		parameters[object.name] = tol_value('#' + object.name, false);
	}
	);

	jo = tol_jquery_object(p_jquery_name + " select");

	jo.each(function(index, object)
	{
		parameters[object.name] = tol_value('#' + object.name.replace("[]", ""));
	}
	);

	jo = tol_jquery_object(p_jquery_name);

	jo.find("textarea").each(function()
	{
		parameters[$(this).attr("name")] = $(this).val();
	});

	return parameters;
}

function tol_check_all(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name + " input:checkbox");

	jo.each(function(index, object)
	{
		object.checked = true;
	}
	);
}

function tol_uncheck_all(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name + " input:checkbox");

	jo.each(function(index, object)
	{
		object.checked = false;
	}
	);
}

function tol_is_checked(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name + ":checked");

	if (jo == null)
	{
		return false;
	}
	else
	{
		return true;
	}
}

function tol_is_unchecked(p_jquery_name)
{
	return !tol_is_checked(p_jquery_name);
}

function tol_set_colour(p_jquery_name, p_colour)
{
	tol_set_css(p_jquery_name, "color", p_colour);
}

function tol_set_css(p_jquery_name, p_style, p_value)
{
	var jo = tol_jquery_object(p_jquery_name);

	if (tol_is_jquery_object(jo))
	{
		jo.css(p_style, p_value);
	}
}

function tol_get_css(p_jquery_name, p_style)
{
	var jo = tol_jquery_object(p_jquery_name);

	return jo.css(p_style);
}

function tol_javascript_object(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	if (jo != null)
	{
		return jo[0];
	}

	return null;
}

function tol_focus(p_jquery_name, p_function)
{
	if (p_function == undefined)
	{
		p_function = null;
	}

	var jo = tol_jquery_object(p_jquery_name);

	if (tol_is_jquery_object(jo))
	{
		if (p_function == null)
		{
			jo.focus();
		}
		else
		{
			jo.focus(p_function);
		}

		return;
	}

	jo = tol_jquery_object(p_jquery_name + " input");

	if (tol_is_jquery_object(jo))
	{
		if (p_function == null)
		{
			jo.focus();
		}
		else
		{
			jo.focus(p_function);
		}

		return;
	}
}

function tol_block_ui(p_message)
{
	if (tol_blank(p_message))
	{
		$.blockUI();
	}
	else
	{
		$.blockUI({ message: '<div style="padding: 10px;">' + p_message + '</div>' });
	}
}

function tol_unblock_ui()
{
	$.unblockUI();
}

function tol_attribute(p_jquery_name, p_attribute)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	return jo.attr(p_attribute);
}

function tol_hidden_value(p_jquery_name)
{
	return tol_value(p_jquery_name, false);
}

function tol_value(p_jquery_name, p_ignore_hidden)
{
	if (p_ignore_hidden == undefined)
	{
		p_ignore_hidden = true;
	}

	var jo = tol_jquery_object(p_jquery_name, false);

	if (jo == null)
	{
		return "";
	}

	if (tol_is_checkbox(jo))
	{
		return tol_checkbox_value(jo);
	}

	if (p_ignore_hidden)
	{
		if (tol_is_hidden(jo))
		{
			return "";
		}
	}

	if (tol_is_input(jo))
	{
		return tol_rtrim(jo.val());
	}

	return tol_get_html(jo);
}

function tol_radiobutton_value(p_element_name)
{
	var jo = tol_jquery_object("input[name=" + p_element_name + "]", true);

	var is_checked = jo.is(':checked');

	if (!is_checked)
	{
		return null;
	}

	return $("input[name=" + p_element_name + "]:checked").val();
}

function tol_checkbox_value(p_jquery_name)
{
	// Checkbox values with [] in the name currently throw exceptions
	try 
	{
		var jo = tol_jquery_object(p_jquery_name, true);

		if (tol_is_hidden(jo))
		{
			return false;
		}
	}
	catch(e)
	{
		return false;
	}

	var c = jo.attr("checked");

	if (c == null)
	{
		return false;
	}

	if (c == "checked")
	{
		return true;
	}

	return c;
}

function tol_set_value(p_jquery_name, p_value)
{
	if (p_value == null)
	{
		p_value = "";
	}

	var jo = tol_jquery_object(p_jquery_name, true);

	if (tol_is_checkbox(jo))
	{
		if (p_value)
		{
			if (p_value == "0" || p_value == "false")
			{
				jo.attr("checked", false);
			}
			else
			{
				jo.attr("checked", true);
			}
		}
		else
		{
			jo.attr("checked", false);
		}

		return;
	}

	if (tol_is_input(jo))
	{
		jo.val(p_value);
	}
	else
	{
		tol_set_html(jo, p_value);
	}
}

function tol_numeric(p_value)
{
	if (p_value == null)
	{
		return 0;
	}

	var tmp = parseInt(p_value, 10);

	if (isNaN(tmp))
	{
		return 0;
	}

	return tmp;
}

function tol_numeric_value(p_jquery_name)
{
	return tol_numeric(tol_value(p_jquery_name));
}

function tol_append_html(p_jquery_name, p_value, p_only_if_not_empty)
{
	if (p_only_if_not_empty == undefined)
	{
		p_only_if_not_empty = false;
	}

	if (p_value == null)
	{
		p_value = "";
	}

	var jo = tol_jquery_object(p_jquery_name, true);

	if (p_only_if_not_empty)
	{
		var h = jo.html();

		if (h.length == 0)
		{
			return jo;
		}
	}

	jo.append(p_value);

	return jo;
}

function tol_set_html(p_jquery_name, p_value, p_show_or_hide)
{
	if (p_value == null)
	{
		p_value = "";
	}

	var jo = tol_jquery_object(p_jquery_name, true);

	jo.html(p_value);

	if (p_show_or_hide != undefined)
	{
		if (p_value == "")
		{
			tol_hide(jo);
		}
		else
		{
			tol_show(jo);
		}
	}

	return jo;
}

function tol_position_footer(p_footer_jo, p_window_height)
{
	tol_set_css(p_footer_jo, "position", "relative");
	tol_set_css(p_footer_jo, "bottom", "0");

	var b = tol_jquery_object("body");
	var c = p_footer_jo.height();

	if ((b.height() + c) <= p_window_height)
	{
		tol_set_css(p_footer_jo, "position", "absolute");
	}

	tol_fade_in(p_footer_jo);
}

function tol_position_at_bottom(p_jquery_name)
{
	var footer_jo = tol_jquery_object(p_jquery_name);

	if (footer_jo != null)
	{
		tol_position_footer(footer_jo, tol_window_height());
	}
}

function tol_distance_to_footer(p_jquery_name, p_footer_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name);

	var distance = tol_window_height() - jo.offset().top;

	if (p_footer_jquery_name != undefined)
	{
		var footer_jo = tol_jquery_object(p_footer_jquery_name);

		distance -= footer_jo.height();
	}

	return distance;
}

function tol_window_height()
{
	return $(window).height();
}

function tol_get_html(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	return tol_rtrim(jo.html());
}

function tol_html(p_jquery_name)
{

/**
	OBSOLETE - use tol_get_html
*/

	return tol_get_html(p_jquery_name);
}

function tol_numeric_html(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	return tol_numeric(jo.html());
}

function tol_is_hidden(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	return jo.is(":hidden");
}

function tol_is_visible(p_jquery_name)
{
	return !tol_is_hidden(p_jquery_name);
}

function tol_toggle_visible(p_jquery_name, p_function)
{
	if (tol_is_hidden(p_jquery_name))
	{
		if (p_function == undefined)
		{
			tol_fade_in(p_jquery_name);
		}
		else
		{
			tol_fade_in(p_jquery_name, p_function);
		}
	}
	else
	{
		if (p_function == undefined)
		{
			tol_fade_out(p_jquery_name);
		}
		else
		{
			tol_fade_out(p_jquery_name, p_function);
		}
	}
}

function tol_fade_in(p_jquery_name, p_function)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	if (p_function != undefined)
	{
		jo.animate({opacity: "show"}, "fast", p_function);
	}
	else
	{
		jo.animate({opacity: "show"}, "fast");
	}
}

function tol_fade_out(p_jquery_name, p_function)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	if (p_function != undefined)
	{
		jo.animate({opacity: "hide"}, "fast", p_function);
	}
	else
	{
		jo.animate({opacity: "hide"}, "fast");
	}
}

function tol_blank(p_value)
{
	if (p_value == undefined)
	{
		return true;
	}

	if (p_value == null)
	{
		return true;
	}

	if (p_value == "")
	{
		return true;
	}

	return false;
}

function tol_clear_select(p_jquery_name, p_leave_first)
{
	if (p_leave_first == undefined)
	{
		p_leave_first = false;
	}

	var jo = tol_jquery_object(p_jquery_name, true);

	if (p_leave_first)
	{
		var c = jo.children();

		var first = true;

		c.each(function()
		{
			if (first)
			{
				first = false;
			}
			else
			{
				var cjo = tol_jquery_object(this, true);

				cjo.remove();
			}
		});
	}
	else
	{
		jo.empty();
	}
}

function tol_set_select_options(p_jquery_name, p_array, p_select_value, p_leave_first)
{
	if (p_select_value == undefined)
	{
		p_select_value = null;
	}

	if (p_leave_first == undefined)
	{
		p_leave_first = false;
	}

	tol_clear_select(p_jquery_name, p_leave_first);

	var jo = tol_jquery_object(p_jquery_name, true);

//	var tmp = jo[0];

	for (var i in p_array)
	{
		var key		= i;
		var value	= p_array[key];

		if (!tol_is_string(value))
		{
			for (var j in value)
			{
				key		= j;
				value	= value[j];

				break;
			}
		}

		if (!tol_is_string(value))
		{
			continue;
		}

		value = value.replace(/&nbsp;/g, '\xa0');

//		var option = document.createElement("option");
//
//		option.value	= key;
//		option.text		= value;
//
//		tmp.add(option);

		jo.append($('<option>',
		{
			value: key,
			text: value
		}));
	}

	tol_select_option(p_jquery_name, p_select_value);
}

function tol_select_text(p_jquery_name)
{
	return $(p_jquery_name + " :selected").text();
}

function tol_select_option(p_jquery_name, p_value)
{
	tol_console("tol_select_option: " + p_value);

	var jo = tol_jquery_object(p_jquery_name, true);

	if (p_value != null)
	{
		jo.val(p_value);
	}
	else
	{
		var option = tol_jquery_object(p_jquery_name + " option:first");

		jo.val(option.val());
	}

	jo.change();
}

function tol_json_decode(p_object)
{
	return JSON.parse(p_object);
}

function tol_json_encode(p_object)
{
	return JSON.stringify(p_object);
}

function tol_redirect(p_location, p_parameters)
{
	if (tol_blank(p_location))
	{
		p_location = "/";
	}

	if (tol_is_array(p_parameters))
	{
		p_parameters = tol_map_to_parameters(p_parameters);

		p_location += "?" + p_parameters;
	}

	window.location = p_location;
}

function tol_form_result(p_url, p_parameters, p_jquery_name)
{
	if (p_jquery_name == null)
	{
		p_jquery_name = "#message";
	}

	var jo = tol_jquery_object(p_jquery_name, true);

	tol_fade_in(jo);

	var result = tol_post_result(p_url, p_parameters);

	tol_set_html(jo, result.message);

	if (result.status == TOL_OK)
	{
		return result;
	}
	else
	{
		if (result.field != "")
		{
			tol_focus("#" + result.field);
		}

		return false;
	}
}

function tol_left(p_string, p_substring)
{
	var index = p_string.indexOf(p_substring);

	if (index == -1)
	{
		return p_string;
	}

	return p_string.substring(0, index);
}

function tol_right(p_string, p_substring)
{
	var index = p_string.indexOf(p_substring);

	if (index == -1)
	{
		return p_string;
	}

	return p_string.substring(index + p_substring.length);
}

function tol_get_result(p_url, p_parameters, p_callback)
{
	return new tol_ajax_result(tol_get_request(p_url, p_parameters, p_callback));
}

function tol_get_request(p_url, p_parameters, p_callback, p_error_callback)
{
	tol_total_ajax_requests++;

	if (tol_is_jquery_string("#tol_working_icon"))
	{
		tol_fade_in("#tol_working_icon");
	}

	tol_hide_messages();

	var async = false;

	if (p_callback == undefined)
	{
		p_callback = null;
	}

	if (p_error_callback == undefined)
	{
		p_error_callback = null;
	}

	if (p_callback != null)
	{
		async = true;
	}

	var random_string = Math.random() + "" + Math.random() + "" + Math.random();

	if (p_parameters == undefined)
	{
		p_parameters = tol_array();
	}

	if (p_parameters == null)
	{
		p_parameters = tol_array();
	}

	if (tol_is_array(p_parameters))
	{
		p_parameters["tol_fp"]								= tol_get_fingerprint();
		p_parameters["tol_random_prevent_caching_12345"]	= random_string;
	}
	else
	{
		p_parameters = "&tol_fp=" + tol_get_fingerprint();
		p_parameters += "&tol_random_prevent_caching_12345=" + random_string;
	}

	if (tol_is_array(p_parameters))
	{
		p_parameters = tol_map_to_parameters(p_parameters);

		p_url += "?" + p_parameters;
	}

	if (async)
	{
		var success_functions = tol_array();

		success_functions.push(function()
		{
			tol_total_ajax_requests--;

			if (tol_total_ajax_requests <= 0)
			{
				tol_total_ajax_requests = 0;

				if (tol_is_jquery_string("#tol_working_icon"))
				{
					tol_fade_out("#tol_working_icon");
				}
			}
		});

		success_functions.push(p_callback);

		$.ajax(
		{
			url: p_url,
			async: true,
			dataType: "text",
			success: success_functions,
			error:  function() 
			{
				tol_total_ajax_requests--;

				if (tol_total_ajax_requests <= 0)
				{
					tol_total_ajax_requests = 0;

					if (tol_is_jquery_string("#tol_working_icon"))
					{
						tol_fade_out("#tol_working_icon");
					}
				}

				if (!tol_ignore_ajax_errors)
				{
					tol_error("tol_get_request: ajax failed: " + p_url);
				}

				if (p_error_callback != null)
				{
					p_error_callback.call();
				}
			}
		});
	}
	else
	{
		if (tol_ajax_event_object != null)
		{
			tol_ajax_event_object.ajax_start();
		}

		var html = $.ajax(
		{
			url: p_url,
			async: false,
			dataType: "text",
			error:  function() 
			{
				if (!tol_ignore_ajax_errors)
				{
					tol_error("tol_get_request: ajax failed: " + p_url);
				}
			}
		}).responseText;

		tol_total_ajax_requests--;

		if (tol_total_ajax_requests <= 0)
		{
			tol_total_ajax_requests = 0;

			if (tol_is_jquery_string("#tol_working_icon"))
			{
				tol_fade_out("#tol_working_icon");
			}
		}

		if (tol_ajax_event_object != null)
		{
			tol_ajax_event_object.ajax_end();
		}

		return tol_rtrim(html);
	}
}

function tol_post_request(p_url, p_parameters, p_callback)
{
	tol_total_ajax_requests++;

	if (tol_is_jquery_string("#tol_working_icon"))
	{
		tol_fade_in("#tol_working_icon");
	}

	tol_hide_messages();

	var async = false;

	if (p_callback == undefined)
	{
		p_callback = null;
	}

	if (p_callback != null)
	{
		async = true;
	}

	if (p_parameters == undefined)
	{
		p_parameters = tol_array();
	}

	if (p_parameters == null)
	{
		p_parameters = tol_array();
	}

	var random_string = Math.random() + "" + Math.random() + "" + Math.random();

	if (tol_is_array(p_parameters))
	{
		p_parameters["tol_fp"]								= tol_get_fingerprint();
		p_parameters["tol_random_prevent_caching_12345"]	= random_string;
	}

	var parameters = tol_map_to_parameters(p_parameters);

	if (parameters == null)
	{
		p_parameters = "&tol_fp=" + tol_get_fingerprint();
		p_parameters += "&tol_random_prevent_caching_12345=" + random_string;
	}

	if (async)
	{
		var success_functions = tol_array();

		success_functions.push(function()
		{
			tol_total_ajax_requests--;

			if (tol_total_ajax_requests <= 0)
			{
				tol_total_ajax_requests = 0;

				if (tol_is_jquery_string("#tol_working_icon"))
				{
					tol_fade_out("#tol_working_icon");
				}
			}
		});

		success_functions.push(p_callback);

		$.ajax(
		{
			type: "POST",
			url: p_url,
			data: parameters,
			async: true,
			success: success_functions,
			error:  function()
			{
				tol_total_ajax_requests--;

				if (tol_total_ajax_requests <= 0)
				{
					tol_total_ajax_requests = 0;

					if (tol_is_jquery_string("#tol_working_icon"))
					{
						tol_fade_out("#tol_working_icon");
					}
				}

				if (!tol_ignore_ajax_errors)
				{
					tol_error("tol_get_request: ajax failed: " + p_url);
				}
			}
		});
	}
	else
	{
		if (tol_ajax_event_object != null)
		{
			tol_ajax_event_object.ajax_start();
		}

		var html = $.ajax(
		{
			type: "POST",
			url: p_url,
			data: parameters,
			async: false,
			error: function()
			{
				if (!tol_ignore_ajax_errors)
				{
					tol_error("tol_post_request: ajax failed: " + p_url);
				}
			}
		}).responseText;

		tol_total_ajax_requests--;

		if (tol_total_ajax_requests <= 0)
		{
			tol_total_ajax_requests = 0;

			if (tol_is_jquery_string("#tol_working_icon"))
			{
				tol_fade_out("#tol_working_icon");
			}
		}

		if (tol_ajax_event_object != null)
		{
			tol_ajax_event_object.ajax_end();
		}

		return tol_rtrim(html);
	}
}

function tol_json_get_request(p_url, p_parameters)
{
	return tol_json_decode(tol_get_request(p_url, p_parameters));
}

function tol_post_result(p_url, p_parameters)
{
	return new tol_ajax_result(tol_post_request(p_url, p_parameters));
}

function tol_json_post_request(p_url, p_parameters)
{
	return tol_json_decode(tol_post_request(p_url, p_parameters));
}

function tol_list(p_url, p_parameters)
{
	var contents	= tol_get_request(p_url, p_parameters);
	var components	= tol_components(contents, "\n");

	var list = tol_array();

	for (var i = 0; i < components.length; i++)
	{
		var ccomponents = tol_components(components[i], "|");

		if (ccomponents.length == 2)
		{
			list[ccomponents[0]] = ccomponents[1];
		}
	}

	return list;
}

function tol_object_properties(p_object)
{
	var properties = tol_array();

	for (var i in p_object)
	{
		properties.push(i);
	}

	return properties;
}

function tol_array_to_string(p_array, p_delimiter)
{
	if (p_array == null)
	{
		return null;
	}

	if (p_delimiter == null)
	{
		p_delimiter = " ";
	}

	return p_array.join(p_delimiter);
}

function tol_components(p_string, p_delimiter)
{
	if (p_string == null)
	{
		return null;
	}

	if (tol_blank(p_delimiter))
	{
		p_delimiter = " ";
	}

	return p_string.split(p_delimiter);
}

function tol_to_map(p_string)
{
	if (p_string == null)
	{
		return tol_array();
	}

	if (p_string == "")
	{
		return tol_array();
	}

	var components = tol_components(p_string, "&");

	var key_array = tol_array();

	for (var i = 0; i < components.length; i++)
	{
		var record = components[i];

		var record_components = tol_components(record, ":");

		key_array[tol_url_decode(record_components[0])] = tol_url_decode(record_components[1]);
	}

	return key_array;
}

function tol_url_decode(p_string)
{
	if (p_string == undefined)
	{
		return "";
	}

	if (p_string == null)
	{
		return "";
	}

	p_string = tol_rtrim(p_string);

	try
	{
		return decodeURIComponent(p_string);
	}
	catch (e)
	{
		p_string = unescape(p_string);
	}

	try
	{
		return decodeURIComponent(p_string);
	}
	catch (e)
	{
//		alert(e.message);
	}

	return p_string;
}

function tol_url_encode(p_string)
{
	if (p_string == undefined)
	{
		return "";
	}

	if (p_string == null)
	{
		return "";
	}

	if (tol_is_array(p_string))
	{
		p_string = tol_to_string(p_string);
	}

	p_string = tol_rtrim(p_string);

	try
	{
		return encodeURIComponent(p_string);
	}
	catch (e)
	{
	}

	return p_string;
}

function tol_map_to_parameters(p_key_array)
{
	var parameters_array = tol_array();

	for (var key in p_key_array)
	{
		var value = tol_url_encode(p_key_array[key]);

		parameters_array.push(key + "=" + value);
	}

	return tol_array_to_string(parameters_array, "&");
}

function tol_is_array(p_object)
{
	if (p_object == null)
	{
		return false;
	}

	if (p_object.constructor == Array)
	{
		return true;
	}
	else
	{
		return false;
	}
}

function tol_is_map(p_object)
{
	if (!tol_is_array(p_object))
	{
		tol_error("isn't an array");

		return false;
	}

	var counter = 0;

	for (var i in p_object)
	{
		if (i != counter)
		{
			return true;
		}

		counter++;
	}

	return false;
}

function tol_is_string(p_object)
{
	if (p_object == undefined)
	{
		return false;
	}

	var type = typeof p_object;

	if (type == 'string')
	{
		return true;
	}

	return false;
}

function tol_starts_with(p_string, p_value)
{
	if (p_string.indexOf(p_value) == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

function tol_submit_form(p_jquery_name)
{
	tol_hide_messages();

	var o = tol_jquery_object(p_jquery_name, true);

	o.submit();
}

function tol_clear_form(p_jquery_name)
{
	var form = tol_jquery_object(p_jquery_name, true);

	$(':input', form).each(function()
	{
		var type	= this.type;
		var tag		= this.tagName.toLowerCase();

		if (type == 'text' || type == 'password' || tag == 'textarea')
		{
			this.value = "";
		}
		else
		{
			if (type == 'checkbox' || type == 'radio')
			{
				this.checked = false;
			}
			else
			{ 
				if (tag == 'select') 
				{
					this.selectedIndex = "0";
				}
			}
		}
	});
}

function tol_has_class(p_jquery_name, p_class_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	return jo.hasClass(p_class_name);
}

function tol_add_class(p_jquery_name, p_class_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	if (!tol_has_class(p_jquery_name, p_class_name))
	{
		jo.addClass(p_class_name);
	}
}

function tol_remove_class(p_jquery_name, p_class_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	if (tol_has_class(p_jquery_name, p_class_name))
	{
		jo.removeClass(p_class_name);
	}
}

function tol_toggle_class(p_jquery_name, p_class_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	jo.toggleClass(p_class_name);
}

function tol_add_table_row(p_table_id, p_text, p_prepend)
{
	var jo_table	= tol_jquery_object(p_table_id, true);
	var rows		= tol_table_rows(jo_table);

	// Set up the object to append or prepend a row, appending if there are no rows already

	if (p_prepend == undefined)
	{
		p_prepend = false;
	}

	if (p_prepend == null)
	{
		p_prepend = false;
	}

	if (p_prepend && rows.length > 0)
	{
		jo_table.tol_add_row = function(p_text)
		{
			$(tol_jquery_object_id(this) + ' tr:first').before(p_text);
		}
	}
	else if (rows.length == 0)
	{
		jo_table.tol_add_row = function(p_text)
		{
			$(this).append(p_text);
		}
	}
	else 
	{
		jo_table.tol_add_row = function(p_text)
		{
			$(tol_jquery_object_id(this) + ' tr:last').after(p_text);
		}
	}
	
	// Add the row data

	var suffix = "";
	var prefix = "";

	if (tol_is_string(p_text))
	{
		if (p_text.slice(0, 3) != "<tr")
		{
			prefix = "<tr>";
			suffix = "</tr>";
		}

		jo_table.tol_add_row(prefix + p_text + suffix);
	}
	else if (tol_is_array(p_text))
	{
		if (p_text[0].slice(0, 3) != "<tr")
		{
			prefix = "<tr>";
			suffix = "</tr>";
		}

		jo_table.tol_add_row(prefix + p_text.join('') + suffix);
	}
}

function tol_jquery_object_id(p_value)
{
	var jo = tol_jquery_object(p_value, true);

	return "#" + jo.attr("id");
}

function tol_table_rows(p_table_id)
{
	// Returns an array of jquery row objects given a table
	var jo_table 	= tol_jquery_object(p_table_id, true);
	var rows		= $(tol_jquery_object_id(jo_table) + ' tr');
	var jo_rows 	= tol_array();

	$(rows).each(function()
	{
		jo_rows.push(tol_jquery_object(this));
	});

	return tol_jquery_object(jo_rows);
}

function tol_table_row_columns(p_row_id)
{
	// Returns an array of jquery column objects for the given table row
	var jo_row		= tol_jquery_object(p_row_id, true);
	var columns		= $(tol_jquery_object_id(jo_row) + ' td');
	var jo_columns 	= tol_array();

	$(columns).each(function()
	{
		jo_columns.push(tol_jquery_object(this));
	});

	return tol_jquery_object(jo_columns);
}

function tol_remove_table_row(p_row_id)
{
	var jo_row = tol_jquery_object(p_row_id, true);

	jo_row.remove();
}

function tol_renumber_table_rows(p_table_id, p_ignore)
{
	var offset = 0;

	if (p_ignore != null && tol_is_numeric(p_ignore)) 
	{
		offset = p_ignore;
	}

	var jo_table = tol_jquery_object(p_table_id, true);

	var tol_add_id = function(index)
	{
		if ((index + 1) > offset) 
		{
			this.attr("id", jo_table.attr("id") + "_" + (index - offset));
		}
	}

	tol_table_rows(jo_table).each(tol_add_id);
}

function tol_add_table_row_styles(p_table_id, p_class, p_alt_class, p_ignore)
{
	var t = tol_jquery_object(p_table_id, true);

	var offset = 0;

	if (p_ignore != null && tol_is_numeric(p_ignore))
	{
		offset = p_ignore;
	}

	tol_table_rows(t).each(function(index)
	{
		if ((index + 1) > offset) 
		{
			if ((p_alt_class != null) && (index % 2)) 
			{
				tol_add_class(this, p_alt_class);
			}
			else
			{
				tol_add_class(this, p_class);
			}
		}
	});
}

function tol_horizontal_slider(p_base_id, p_tabs, p_tab_width, p_next_id, p_previous_id)
{
    this.base_id        = tol_jquery_object(p_base_id, true);
    this.tabs           = p_tabs;
    this.tab_width      = p_tab_width;
	this.next_id		= null;
	this.previous_id	= null;
	this.scrolling		= false;

	if (p_next_id == undefined)
	{
		p_next_id = null;
	}

	if (p_previous_id == undefined)
	{
		p_previous_id = null;
	}

	if (p_next_id != null)
	{
	    this.next_id = tol_jquery_object(p_next_id, true);
	}

	if (p_previous_id != null)
	{
	    this.previous_id = tol_jquery_object(p_previous_id, true);
	}

    this.current_tab    = 0;
    this.jquery_object  = tol_jquery_object(this);

    var this_object = this;

    this.next = function()
    {
        this.scroll_to(++this.current_tab);
    }

    this.previous = function()
    {
        this.scroll_to(--this.current_tab);
    }

    this.scroll_to = function(p_tab_number, p_function)
    {
		if (this.scrolling)
		{
			return;
		}

		this.scrolling = true;

        this.jquery_object.trigger("tol_pre_slide");

        p_tab_number = p_tab_number * 1;

        if (p_tab_number >= this.tabs)
        {
            p_tab_number = this.tabs - 1;
        }

        if (p_tab_number < 0)
        {
            p_tab_number = 0;
        }

        this.current_tab = p_tab_number;

        var current_left    = this.base_id.position().left;
        var target_left     = this.current_tab * this.tab_width * -1;
        var relative_left   = target_left - current_left;

        var relative_left_string = "";

        if (relative_left < 0)
        {
            relative_left_string = "-=" + (relative_left * -1) + "px";
        }
        else
        {
            relative_left_string = "+=" + relative_left + "px";
        }

        this.base_id.animate({'left': relative_left_string}, 'slow', 'easeInOutExpo', function()
        {
            if (p_function != null)
            {
                p_function();
            }

            tol_jquery_object(this_object).trigger("tol_slide");

			this_object.scrolling = false;
        });

        this.update_buttons();
    }

    this.update_buttons = function()
    {
        if (this.current_tab == 0)
        {
			if (this.previous_id != null)
			{
	            tol_fade_out(this.previous_id);
			}

			if (this.next_id != null)
			{
	            tol_fade_in(this.next_id);
			}

            return;
        }

        if (this.current_tab == (this.tabs - 1))
        {
			if (this.next_id != null)
			{
	            tol_fade_out(this.next_id);
			}

			if (this.previous_id != null)
			{
	            tol_fade_in(this.previous_id);
			}

            return;
        }

		if (this.previous_id != null)
		{
	        tol_fade_in(this.previous_id);
		}

		if (this.next_id != null)
		{
	        tol_fade_in(this.next_id);
		}
    }

    this.add_pre_slide_event = function(p_function)
    {
        this.jquery_object.bind("tol_pre_slide", p_function);
    }

    this.add_slide_event = function(p_function)
    {
        this.jquery_object.bind("tol_slide", p_function);
    }

	if (this.next_id != null)
	{
	    this.next_id.hover(tol_mouse_hand, tol_mouse_default);
	    this.next_id.bind("click", function() { this_object.next(); });
	}

	if (this.previous_id != null)
	{
	    this.previous_id.hover(tol_mouse_hand, tol_mouse_default);
	    this.previous_id.bind("click", function() { this_object.previous(); });
	}

    this.update_buttons();

    // Prevent tab keys from interfering with the sliding
    $(document).ready(function()
    {

        // Track the tab key events on slider tabs (necessary for IE)
        $('input').addClass("idleField");

        $('input').focus(function() 
        {  
            $(this).removeClass("idleField").addClass("focusField");
        });

        $('input').blur(function() 
        {
            $(this).removeClass("focusField").addClass("idleField");  
//            if ($.trim(this.value) == '')
//            {
//                this.value = (this.defaultValue ? this.defaultValue : '');
//            }
        });
        
        // Kill the tab key so that it doesn't mess up the form sliding
        $('body').keydown(function(event) 
        { 
            if (event.keyCode == 9 || event.keyCode == 16) 
            {
                if ($('.focusField').attr("id") == $('span.slide_tab_' + this_object.current_tab + ' input:last').attr("id"))
                {        
                    event.preventDefault(); 
                    return false;
                }
            }
        });
    });
}

function tol_ajax_result(p_value, p_debug)
{
	if (p_value == undefined)
	{
		p_value = "status:FAILED\nmessage: " + tol_url_encode("tol_ajax_result: the ajax request failed");
	}

	if (p_debug == undefined)
	{
		p_debug = false;
	}

	if (!tol_is_string(p_value))
	{
		p_value = "status:FAILED\nmessage: " + tol_url_encode("tol_ajax_result: p_value must be a string");
	}

	if (!tol_contains(p_value, "status:"))
	{
		p_value = "status:FAILED\nmessage: " + tol_url_encode("tol_ajax_result: p_value must contain a tol status ajax string: " + p_value);
	}

//	if (!tol_contains(p_value, "message:"))
//	{
//		p_value = "status:FAILED\nmessage: " + tol_url_encode("tol_ajax_result: p_value must contain a tol message ajax string");
//	}

	this.message		= p_value;
	this.status			= TOL_OK;
	this.field			= "";
	this.tab			= 0;
	this.ajax			= "";
	this.request_url	= "";
	this.system_error	= false;

	try
	{
		var tol_row_parameters	= tol_components(p_value, "\n");

		var field_names = tol_array();

		for (var i = 0; i < tol_row_parameters.length; i++)
		{
			var tol_row = tol_row_parameters[i];

			if (p_debug)
			{
				tol_information(tol_row);
			}

			var tol_row_fields = tol_components(tol_row, ":");

			if (tol_row_fields.length == 2)
			{
				var field_name = tol_url_decode(tol_row_fields[0]);

//				eval("this." + field_name + " = \"" + tol_row_fields[1] + "\";");

				this[field_name] = tol_row_fields[1];

				field_names.push(field_name);
			}
		}

		for (var i = 0; i < field_names.length; i++)
		{
			var field_name = field_names[i];

			this[field_name] = tol_url_decode(this[field_name]);
		}

		this.message = tol_url_decode(this.message);
	}
	catch (e)
	{
		this.status		= false;
		this.message	= "tol_ajax_result: fatal error: " + e;
		this.field		= "";
		this.tab		= 0;
		this.ajax		= p_value;
	}

	if (this.system_error)
	{
		if (this.request_url != "")
		{
			this.message += ": " + this.request_url;
		}
	}

	if (this.status == TOL_OK)
	{
		this.status = true;
	}
	else
	{
		this.status = false;
	}
}

function tol_json_result(p_value, p_debug)
{
	if (p_value == undefined)
	{
		p_value = "{}";
	}

	if (p_debug == undefined)
	{
		p_debug = false;
	}

	if (!tol_is_string(p_value))
	{
		p_value = "{}";
	}

	var json_result = $.parseJSON(p_value);

	if (json_result.status == undefined)
	{
		json_result.status	= false;
		json_result.message = "tol_json_result: failed";
	}
	else
	{
		if (json_result.status == "success")
		{
			json_result.status = true;
		}
		else
		{
			json_result.status = false;
		}
	}

	if (json_result.field == undefined)
	{
		json_result.field = "";
	}

	if (json_result.field == null)
	{
		json_result.field = "";
	}

	return json_result;
}

function tol_array_values(p_array)
{
	return array_values(p_array);
}

function tol_auto_complete(p_jquery_name, p_data, p_function)
{
	if (!tol_is_array(p_data))
	{
		p_data = tol_json_array(p_data);
	}

	this.jo		= tol_jquery_object(p_jquery_name, true);
	this.data	= p_data;

	if (!tol_is_array(this.data))
	{
		tol_error("tol_auto_complete: " + p_jquery_name + ": data must be an array");

		return;
	}

	if (tol_is_map(this.data))
	{
		this.data = tol_array_values(this.data);
	}

	this.data = tol_remove(this.data, null);

	if (p_function == undefined)
	{
		p_function = null;
	}

	this.jo.autocomplete(this.data);

	this.func = p_function;

	if (p_function != null)
	{
		tol_set_property(this.jo, "tol_auto_complete_function", p_function);

		this.jo.result(function(event, data, formatted)
		{
			event.target.tol_auto_complete_function();
		});
	}
}

function tol_disable_auto_complete(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	jo.setOptions(
	{
		minChars: 99999
	});
}

function tol_set_property(p_jquery_name, p_property_name, p_property_value)
{
	var jquery_object = tol_jquery_object(p_jquery_name, true);

	var dom_object = jquery_object.get(0);

	dom_object[p_property_name] = p_property_value;
}

function tol_get_property(p_jquery_name, p_property_name)
{
	var jquery_object = tol_jquery_object(p_jquery_name, true);

	var dom_object = jquery_object.get(0);

	return dom_object[p_property_name];
}

function tol_object()
{
	var o = {};

	return o;
}

function tol_array()
{
	return new Array();
}

function tol_json_array(p_json_string)
{
	var a = tol_array();

	try
	{
		for (var i in p_json_string)
		{
			a[i] = p_json_string[i];
		}
	}
	catch (e)
	{
		tol_error("tol_json_array: Couldn't convert json string to array");

		return;
	}

	return a;
}

function tol_date_input(p_jquery_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	jo.datepicker(
	{
		dateFormat: 'dd/mm/yy',
		beforeShow: function(p_input)
		{
			tol_set_css("#ui-datepicker-div", "background-color", "white");
			tol_set_css("#ui-datepicker-div", "padding", "2px");

			return p_input;
		}
	});
}

function tol_table_alternate_rows(p_jquery_name, p_even_colour, p_odd_colour)
{
	var jo = tol_jquery_object(p_jquery_name, false);

	if (jo == null)
	{
		return;
	}

	jo.each(function(key, value)
	{
		var even_rows	= tol_jquery_object(value).find("tr:even");
		var odd_rows	= tol_jquery_object(value).find("tr:odd");

		tol_set_css(even_rows, "background-color", p_even_colour);
		tol_set_css(odd_rows, "background-color", p_odd_colour);
	});
}

function tol_ajax_event(p_jquery_name, p_html)
{
	this.jquery_name	= p_jquery_name;
	this.html			= p_html;

	this.ajax_start = function()
	{
		tol_set_html(this.jquery_name, this.html);
	}

	this.ajax_end = function()
	{
		tol_set_html(this.jquery_name);
	}

	tol_ajax_event_object = this;
}

function tol_random(p_range, p_to_integer)
{
	if (p_range == undefined)
	{
		p_range = 1;
	}

	if (p_to_integer == undefined)
	{
		p_to_integer = true;
	}

	if (p_to_integer)
	{
		return Math.floor(Math.random() * p_range);
	}
	else
	{
		return Math.random() * p_range;
	}
}

function tol_random_string(p_length)
{
	if (p_length == undefined)
	{
		p_length = 30;
	}

	var valid_values = "abcdefghijklmnopqrstuvwxyz0123456789";

	var value = "";

	for (var i = 0; i < p_length; i++)
	{
		value += valid_values.charAt(tol_random(valid_values.length, true));
	}

	return value;
}

function tol_random_sha1()
{
	var valid_values = "abcdef1234567890";

	var value = "";

	for (var i = 0; i < 40; i++)
	{
		value += valid_values.charAt(tol_random(valid_values.length, true));
	}

	return value;
}

function tol_get_fingerprint()
{
	try
	{
		return new Fingerprint().get();
	}
	catch (e)
	{
	}

	return 0;
}

function tol_add_event_listener(p_jquery_name, p_event_name, p_function_name, p_additional_parameters)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	var function_object = tol_function_object(p_function_name, true);

	if (function_object == null)
	{
		return;
	}

	if (p_additional_parameters == undefined)
	{
		p_additional_parameters = null;
	}

	jo.bind(p_event_name, function(event)
	{
		event.targetX = 0;
		event.targetY = 0;

		if (event.target != undefined)
		{
			var target_object = tol_jquery_object(event.target, true);

			if (target_object == null)
			{
				return;
			}

			var offset = target_object.offset();

			if (offset != null)
			{
				event.targetX = event.pageX - offset.left;
				event.targetY = event.pageY - offset.top;
			}
		}

		if (p_additional_parameters == null)
		{
			return function_object(event);
		}
		else
		{
			return function_object(event, p_additional_parameters);
		}
	});
}

function tol_remove_event_listener(p_jquery_name, p_event_name)
{
	var jo = tol_jquery_object(p_jquery_name, true);

	jo.unbind(p_event_name);
}

function tol_to_uppercase(p_value)
{
	if (p_value instanceof String)
	{
		return p_value.toUpperCase();
	}
	else
	{
		return p_value;
	}
}

function tol_to_lowercase(p_value)
{
	if (p_value instanceof String)
	{
		return p_value.toLowerCase();
	}
	else
	{
		return p_value;
	}
}

function tol_drag_drop_upload(p_jquery_name, p_url, p_callback)
{
	if (!window.FileReader)
	{
		return;
	}

	var parameters = tol_object();

	if (p_url != undefined)
	{
		parameters.url = p_url;
	}

	if (!parameters.url)
	{
		return;
	}

	if (p_callback != undefined)
	{
		parameters.callback = p_callback;
	}
	else
	{
		parameters.callback = null;
	}

	tol_add_event_listener(p_jquery_name, "drop", "tol_drag_drop_file_dropped", parameters);
	tol_add_event_listener(p_jquery_name, "dragover", "tol_drag_drop_drag_over");
	tol_add_event_listener(p_jquery_name, "dropcenter", "tol_drag_drop_drag_centre");
}

function tol_drag_drop_file_dropped(p_event, p_parameters)
{
	if (p_event.originalEvent.preventDefault)
	{
		p_event.originalEvent.preventDefault();
	}

	var data_transfer = p_event.originalEvent.dataTransfer;

	var text = data_transfer.getData("Text");

	if (text == null)
	{
		text = "";
	}

	if (text != "")
	{
		p_parameters.file = text;

		tol_drag_drop_read_end(null, p_parameters);
	}

	tol_drag_drop_files = tol_array();

	var files = data_transfer.files;

//	tol_console("tol_drag_drop_file_dropped: " + files.length);

	for (var i = 0; i < files.length; i++)
	{
	    var file = files[i];

//		tol_console("tol_drag_drop_file_dropped: file: " + file.name);

	    var reader = new FileReader();

		var parameters = tol_object();

		for (var j in p_parameters)
		{
			parameters[j] = p_parameters[j];
		}

		parameters.reader	= reader;
		parameters.file		= file;

		tol_add_event_listener(reader, "loadend", "tol_drag_drop_read_end", parameters);

		tol_drag_drop_files.push(parameters);
	}

	tol_drag_drop_process_file();

	return false;
}

function tol_drag_drop_process_file()
{
//	tol_console("tol_drag_drop_process_file");

	if (tol_drag_drop_files == undefined)
	{
		tol_drag_drop_files = null;

		return;
	}

	if (tol_drag_drop_files == null)
	{
		return;
	}

	if (!tol_is_array(tol_drag_drop_files))
	{
		tol_drag_drop_files = null;

		return;
	}

	if (tol_drag_drop_files.length == 0)
	{
		tol_drag_drop_files = null;

		return;
	}

	var parameters = tol_drag_drop_files.shift();

//	tol_console("tol_drag_drop_process_file: " + tol_drag_drop_files.length);
//	tol_console("tol_drag_drop_process_file: file: " + parameters.file.name);

    parameters.reader.readAsDataURL(parameters.file);
}

function tol_drag_drop_drag_over(p_event)
{
	if (p_event.originalEvent.preventDefault)
	{
		p_event.originalEvent.preventDefault();
	}

	return false;
}

function tol_drag_drop_drag_centre(p_event)
{
	if (p_event.originalEvent.preventDefault)
	{
		p_event.originalEvent.preventDefault();
	}

	return false;
}

function tol_drag_drop_read_end(p_event, p_parameters)
{
//	tol_console("tol_drag_drop_read_end: " + p_parameters.file.name);

	$.ajax({
		url: p_parameters.url,
		type: "POST",
		data: p_parameters.file,
		processData: false,
		success:  function()
		{
//			tol_console("success");

			if (p_parameters.callback != null)
			{
				if (tol_is_string(p_parameters.callback))
				{
					p_parameters.callback = tol_function_object(p_parameters.callback, true);
				}

				p_parameters.callback();
			}

			tol_drag_drop_process_file();
		}
	});
}

function tol_array_to_map(p_value)
{
	var m = tol_object();

	if (!tol_is_array(p_value))
	{
		return m;
	}

	for (var i = 0; i < p_value.length; i++)
	{
		var key = p_value[i];

		if (key == undefined)
		{
			continue;
		}

		if (tol_map_contains(m, key))
		{
			continue;
		}

		m[key] = key;
	}

	return m;
}