// Filter types (CHANGE IN FILTER.PL):
var f_at = 1;
var f_textonly = 2;
var f_textarea = 3;
var f_texthtml = 4;
var f_email = 6;
var f_url = 7;
var f_number = 8;

// Form input types (CHANGE IN STD_FORM.PL):
var i_text = 0;
var i_pw = 1;
var i_textarea = 2;
var i_listbox = 3;
var i_checkbox = 4;
var i_checklist = 5;
var i_radio = 6;
var i_phone = 7;
var i_file = 8;
var i_hidden = 9;
var i_static = 10;
var i_line = 11;
var i_submit = 12;

var g_form_error = 0;

function is_null(num)
{
	return (!num || num == 0 || num == 'NaN');
}

function form_error(f, d, msg)
{
	window.status = '';

	if (window.scroll) window.scroll(0, 0);
	if (f.elements[d[3]].focus) f.elements[d[3]].focus();
	if (window.scroll) window.scrollBy(0, 20);

	alert(msg+":\n\n      \""+d[2].toUpperCase()+"\"");

	g_form_error = 1;
}

function remove_edge_space(str)
{
	for (var x = 0; x < str.length; x++)
	{
		if (str.charAt(x) != ' ' && str.charAt(x) != "\n") break;
	}

	for (var y = (str.length - 1); y >= 0; y--)
	{
		if (str.charAt(y) != ' ' && str.charAt(y) != "\n") break;
	}

	if (x > y) return ''; else return str.substring(x, y + 1);
}

function filter_at(f, d)
{
	var prev_is_at = 0;
	var str = f.elements[d[3]].value;

	for (var x = 0; x < str.length; x++)
	{
		if (str.charAt(x) == '@')
		{
			if (x <= 0)
			{
				form_error(f, d, 'This field cannot begin with "@"');

				return;
			}

			if (x >= (str.length - 1))
			{
				form_error(f, d, 'This field cannot end with "@"');

				return;
			}

			if (prev_is_at)
			{
				form_error(f, d, 'Two consecutive @\'s are not allowed in this field');

				return;
			}

			prev_is_at = 1;
		}
		else prev_is_at = 0;
	}
}

function remove_lines(str)
{
	for (var x = 0; x < str.length; x++)
	{
		if (str.charAt(x) == "\n") str = str.substring(0, x - 1)+' '+str.substring(x + 1, str.length);
	}

	return remove_edge_space(str);
}

function filter_length(f, d)
{
	if (d[6] && is_null(f.elements[d[3]].value))
	{
		form_error(f, d, 'Please complete this field');

		return;
	}

	var s = '';

	if (f.elements[d[3]].value && f.elements[d[3]].value.length < d[4])
	{
		if (d[4] != 1) s = 's';

		form_error(f, d, 'Please enter at least '+d[4]+' character'+s+' in this field');

		return;
	}

	s = '';

	if (d[5] && f.elements[d[3]].value.length > d[5])
	{
		if (d[5] != 1) s = 's';

		form_error(f, d, 'Please enter no more than '+d[5]+' character'+s+' in this field');
	}
}

function filter_text(f, d)
{
	var str = f.elements[d[3]].value;

	for (var x = 0; x < str.length; x++)
	{
		if (isNaN(parseInt(str.charAt(x), 36)) && str.charAt(x) != '-' && str.charAt(x) != '_')
		{
			form_error(f, d, "This field must contain only letters, numbers,\nhyphens (-), and underscores (_)");

			return;
		}
	}
}

function check_field(f, d)
{
	if (d[0] == i_listbox)
	{
		var num_selected = 0;

		if (f.elements[d[3]].selectedIndex >= 0)
		{
			var any_val = 0;

			for (var x = 0; x < f.elements[d[3]].length && x < 5; x++)
			{
				if (!is_null(f.elements[d[3]].options[x].value))
				{
					any_val = 1;
					break;
				}
			}

			for (var x = 0; x < f.elements[d[3]].length; x++)
			{
				if (f.elements[d[3]].options[x].selected)
				{
					if (any_val)
					{
						if (!is_null(f.elements[d[3]].options[x].value)) num_selected++;
					}
					else
					{
						if (!is_null(f.elements[d[3]].options[x].text)) num_selected++;
					}
				}
			}
		}

		if (num_selected <= 0 && d[6])
		{
			form_error(f, d, 'Please complete this field');

			return;
		}

		if (num_selected >= 0 && num_selected < d[4])
		{
			var s = 's';

			if (d[4] == 1) s = '';

			form_error(f, d, 'Please select at least '+d[4]+' item'+s+' in this field');

			return;
		}

		if (num_selected >= 0 && num_selected > d[5])
		{
			var s = 's';

			if (d[5] == 1) s = '';

			form_error(f, d, 'Please select no more than '+d[5]+' item'+s+' in this field');
		}

		return;
	}
	else if (d[0] == i_checkbox || d[0] == i_checklist)
	{
		return;
	}
	else if (d[0] == i_radio)
	{
		if (d[6])
		{
			var is_checked = 0;

			for (var x = d[3]; x < f.elements.length; x++)
			{
				if (f.elements[x].name != f.elements[d[3]].name)
				{
					break;
				}

				if (f.elements[x].checked)
				{
					is_checked = 1;

					break;
				}
			}

			if (!is_checked) form_error(f, d, "Please complete this field");
		}

		return;
	}

	f.elements[d[3]].value = remove_edge_space(f.elements[d[3]].value);

	if (d[1] == f_at)
	{
		filter_at(f, d);
		if (g_form_error) return;

		f.elements[d[3]].value = remove_lines(f.elements[d[3]].value);

		filter_length(f, d);
	}
	else if (d[1] == f_textonly)
	{
		filter_text(f, d);
		if (g_form_error) return;

		filter_length(f, d);
	}
	else if (d[1] == f_textarea)
	{
		if (d[6] && is_null(f.elements[d[3]].value)) form_error(f, d, 'Please complete this field');
	}
	else if (d[1] == f_texthtml || d[1] == f_email || d[1] == f_url)
	{
		filter_length(f, d);
	}
	else if (d[1] == f_number)
	{
//		f.elements[d[3]].value = parseInt(f.elements[d[3]].value);
		f.elements[d[3]].value = f.elements[d[3]].value.replace(/[^0-9]/g, '');

		if (is_null(f.elements[d[3]].value))
		{
			f.elements[d[3]].value = '';
		}

		filter_length(f, d);
	}
}

function check_form(f, form_fields)
{
	window.status = 'Checking form data...';

	g_form_error = 0;

	eval("var len = "+form_fields+".length");

	for (var x = 0; x < len; x++)
	{
		eval("var field = "+form_fields+"[x]");

		if (field)
		{
			for (var y = 0; y < f.elements.length; y++)
			{
				if (field[3] == y || field[3] == f.elements[y].name)
				{
					field[3] = y;

					break;
				}
			}

			check_field(f, field);

			if (g_form_error)
			{
				return false;
			}
		}
	}

	window.status = '';

	return true;
}
