//=================================================================================================
function frmFormReady(ID)
{
	var 
		focusable = ["text", "textarea", "checkbox", "radio", "select-one"],
		form = document.getElementByName("frmForm_" + ID),
		divMessage = Html.get("divMessage");

	try
	{
		if (divMessage && divMessage.style.display != "none")
			return;

		for (var i = 0; i < form.elements.length; i++)
		{
			var element = form.elements[i];

			if (focusable.contains(element.type) && element.wrong && !element.disabled)
			{
				if (typeof (element.select) != "undefined")
					element.select();

				if (typeof (element.focus) != "undefined")
					element.focus();

				return;
			}
		}

		for (var i = 0; i < form.elements.length; i++)
		{
			var element = form.elements[i];

			if (focusable.contains(element.type) && !element.disabled)
			{
				if (typeof (element.select) != "undefined")
					element.select();

				if (typeof (element.focus) != "undefined")
					element.focus();

				return;
			}
		}
	}
	catch (e)
	{
	}
}
//=================================================================================================
function formSetError(element, text)
{
	var 
		ID = parseInt(String(element.id).split("_")[1]),
		div = Html.get("divError_" + ID);

	element.wrong = true;

	if (div)
	{
		if (div.tagName == "TR")
			div.getElementsByTagName("TD")[0].innerHTML = text.htmlEncode();
		else
			div.innerHTML = text.htmlEncode();

		if (div.tagName == "TD")
			div.parentNode.style.display = "block";
		else
			div.style.display = "block";
	}
}
//-------------------------------------------------------------------------------------------------
function formHideError(element)
{
	var 
		ID = parseInt(String(element.id).split("_")[1]),
		div = Html.get("divError_" + ID);

	element.wrong = false;

	if (div)
	{
		if (div.tagName == "TD")
			div.parentNode.style.display = "none";
		else
			div.style.display = "none";
	}
}
//-------------------------------------------------------------------------------------------------
function formMessage(ID, replacement)
{
	var message = getMessage(ID);

	if (message == null)
		return replacement[Languages.current];
	else
		return message.text;
}
//-------------------------------------------------------------------------------------------------
function formCheckElement(element)
{
	if (!element.id.startsWith("fldID_") || element.id.indexOf("ffvID_") > -1 || element.fieldtype == ftHidden)
		return false;

	var error = false;

	if (!element.disabled)
	{
		var fieldtype = element.fieldtype;

		if (fieldtype < 0 && element.type == "checkbox")
			fieldtype = ftCheckBox;

		switch (fieldtype)
		{
			case ftCheckBox:
			{
				if (element.mandatory && !element.checked)
				{
					error = true;
					formSetError(element, formMessage(13, mandatory));
				}
				else
					formHideError(element);

				break;
			}
			case ftRadioButtons:
			{
				if (element.mandatory)
				{
					var 
						checkedAny = false,
						radiobuttons = document.getElementsByName(element.id);

					for (var k = 0; k < radiobuttons.length && !checkedAny; k++)
						if (radiobuttons[k].checked)
							checkedAny = true;

					if (!checkedAny)
					{
						error = true;
						formSetError(element, formMessage(13, mandatory));
					}
					else
						formHideError(element);
				}

				break;
			}
			case ftCheckBoxGroup:
			{
				var 
					checkCount = 0,
					checkboxes = document.getElementsByName(element.id);

				for (var k = 0; k < checkboxes.length; k++)
					if (checkboxes[k].checked)
						checkCount++;

				if (element.mandatory && checkCount == 0)
				{
					error = true;
					formSetError(element, formMessage(13, mandatory));
				}
				else if (element.maxAnswers != null && checkCount > element.maxAnswers)
				{
					var message = formMessage(15, maxAnswers);

					message = message.replace("[MAXANSWERS]", element.maxAnswers);

					error = true;
					formSetError(element, message);
				}
				else
					formHideError(element);

				break;
			}
			default:
				{
					if (element.mandatory && !element.value)
					{
						error = true;
						formSetError(element, formMessage(13, mandatory));
					}
					else if (element.fieldtype == ftEmailInput)
					{
						var expr = new RegExp("^" + element.regExp + "$");

						if (element.value && !expr.test(element.value))
						{
							error = true;
							formSetError(element, eMailInvalid[Languages.current]);
						}
						else
							formHideError(element);
					}
					else if (element.fieldtype == ftWebInput)
					{
						var expr = new RegExp("^" + element.regExp + "$");

						if (element.value && !expr.test(element.value))
						{
							error = true;
							formSetError(element, webAddresInvalid[Languages.current]);
						}
						else
							formHideError(element);
					}
					else if (typeof (element.regExp) != "undefined" && String(element.value) != "")
					{
						var expr = new RegExp("^" + element.regExp + "$");

						if (element.value && !expr.test(element.value))
						{
							error = true;
							formSetError(element, formMessage(14, wrongValue));
						}
						else
							formHideError(element);
					}
					else
						formHideError(element);
				}
		}
	}
	else
		formHideError(element);

	return error;
}
//-------------------------------------------------------------------------------------------------
function frmFormCheck(sender, ffcID)
{
	var errors = 0;

	for (var i = 0; i < sender.fields.length; i++)
	{
		if (sender.fields[i].ffcID == ffcID && formCheckElement(sender.fields[i]))
			errors++;
	}

	var challenge = sender.elements["recaptcha_response_field"];

	if (sender.reqCaptcha && challenge && challenge.value == "")
	{
		alert(getMessage("Recaptcha.Mandatory"));
		challenge.focus();

		return false;
	}

	if (errors > 0)
	{
		frmFormReady(String(sender.name).split("_")[1]);

		event.returnValue = false;
		return false;
	}
	else
		return true;
}
//-------------------------------------------------------------------------------------------------
function frmFormSubmit(sender, event)
{
	var errors = 0;

	if (sender)
	{
		for (var i = 0; i < sender.elements.length; i++)
		{
			if (formCheckElement(sender.elements[i]))
				errors++;
		}

		var challenge = sender.elements["recaptcha_response_field"];

		if (sender.reqCaptcha && challenge && challenge.value == "")
		{
			alert(getMessage("Recaptcha.Mandatory"));
			challenge.focus();

			return false;
		}
	}

	if (errors > 0)
	{
		frmFormReady(String(sender.name).split("_")[1]);

		event.returnValue = false;
		return false;
	}
	else
		return true;
}
//=================================================================================================
function frmFormReset(sender, event)
{
	if (sender)
	{
		for (var i = 0; i < sender.elements.length; i++)
		{
			var element = sender.elements[i];

			if (element.id.startsWith("fldID_") && element.type != "hidden")
			{
				if (element.type == "checkbox" || element.type == "radio")
					element.checked = false;
				else
					element.value = "";

				formHideError(element);
			}
		}
	}

	return false;
}
//-------------------------------------------------------------------------------------------------
function formBack(ID)
{
	document.location.href = new Url().add("back", ID);
}
//=================================================================================================
function checkUnique(sender, event)
{
	var 
		url = new Url("misc/default/checkUnique.aspx"),
		form = sender.form;

	form.notFilled = [];
	form.requested = sender;

	url = url.add("frmID", form.ID);
	url = url.add("req", sender.ID);

	for (var i = 0; i < form.unique.length; i++)
	{
		var field = form.unique[i];

		if (field.value)
			url = url.add(field.id + "_" + field.fieldtype, field.value);
		else
			form.notFilled.add(field);
	}

	Xml.create(url, null, function anonymous(HTTP)
	{
		gottenUnique(HTTP, form.ID, sender.ID);
	});
}
//-------------------------------------------------------------------------------------------------
function gottenUnique(HTTP, frmID, fldID)
{
	var xml = HTTP.responseXML;

	if (HTTP.status != 200)
	{
		alertWin(HTTP.responseText);
		return;
	}

	//	Xml.show( xml );

	var 
		form = document.getElementByName("frmForm_" + frmID),
		field = null;

	if (form.notFilled.length == 1)
		updateUnique(xml, form.notFilled[0]);
	else if (form.notFilled.length == 0)
	{
		for (var i = 0; i < form.unique.length; i++)
		{
			var unique = form.unique[i];

			switch (unique.fieldtype)
			{
				case ftRadioButtons:
				case ftSelect:
					if (unique.ID != fldID)
						updateUnique(xml, unique);

					break;
			}
		}
	}
}
//=================================================================================================
function disableValue(field, value)
{
	switch (field.fieldtype)
	{
		case ftRadioButtons:
			field.value = null;
			value.checked = false;

			Html.get("rbFfv_" + value.ID).style.display = "none";
			break;
		case ftSelect:
			if (Array.contains(field.childNodes, value))
				field.removeChild(value);

			break;
	}
}
//-------------------------------------------------------------------------------------------------
function enableValue(field, value)
{
	switch (field.fieldtype)
	{
		case ftRadioButtons:
			Html.get("rbFfv_" + value.ID).style.display = "";
			break;
		case ftSelect:
			if (!Array.contains(field.childNodes, value))
			{
				var 
					index = field.values.indexOf(value),
					next = null;

				for (var i = index + 1; i < field.values.length && next == null; i++)
				{
					if (Array.contains(field.childNodes, field.values[i]))
						next = field.values[i];
				}

				if (next == null)
					field.appendChild(value);
				else
					field.insertBefore(value, next);
			}

			break;
	}
}
//-------------------------------------------------------------------------------------------------
function updateUnique(xml, field)
{
	if (!field)
		return;

	switch (field.fieldtype)
	{
		case ftRadioButtons:
			for (var i = 0; i < field.values.length; i++)
			{
				var 
					value = field.values[i],
					xPath = "root/form/combos/combo/value[@ID = " + field.ID + " and . = " + value.ID + "]",
					node = Xml.selectSingleNode(xml, xPath);

				if (node != null)
					disableValue(field, value);
				else
					enableValue(field, value);
			}

			break;
		case ftSelect:
			var width = Element.getStyle(field, "width");

			if (width)
				field.style.width = "";

			for (var i = 0; i < field.values.length; i++)
			{
				var 
					value = field.values[i],
					xPath = "root/form/combos/combo/value[@ID = " + field.ID + " and . = " + value.ID + "]",
					node = Xml.selectSingleNode(xml, xPath);

				if (node != null)
					disableValue(field, value);
				else
					enableValue(field, value);
			}

			field.style.width = width;

			break;
		default:
			// date/time fields...
			break;
	}
}
//=================================================================================================
function ffcDisabledChange(sender, event, onChange)
{
	var 
		ID = parseInt(sender.id.split("_")[1]),
		tbody = Html.get("ffcID_" + ID);

	if (tbody != null)
	{
		if (!isChildOf(tbody, sender))
			tbody.disabled = !sender.checked;

		var 
			elements = sender.form.elements,
			labels = tbody.getElementsByTagName("LABEL");

		for (var i = 0; i < elements.length; i++)
		{
			if (!String(elements[i].id).startsWith("ffcDisabled") && isChildOf(tbody, elements[i]))
			{
				elements[i].disabled = !sender.checked;

				if (elements[i].disabled)
					formHideError(elements[i]);
			}
		}

		for (var i = 0; i < labels.length; i++)
			labels[i].disabled = !sender.checked;
	}

	if (typeof (onChange) == "function")
		onChange(sender, event);
}
//=================================================================================================
function intInputChange(sender, event, onChange)
{
	try
	{
		var value = convert(sender.value, dtInteger);

		fldChange(sender, event, onChange);
	}
	catch (error)
	{
		if (error.description)
			alert(error.description);
		else if (error.message)
			alert(error.message);
		else
			alert(error);

		event.returnValue = false;
		return false;
	}

	if (typeof (onChange) == "function")
		onChange(sender, event);
}
//=================================================================================================
function floatInputChange(sender, event, onChange)
{
	try
	{
		var value = convert(sender.value, dtDouble);

		fldChange(sender, event, onChange);
	}
	catch (error)
	{
		if (error.description)
			alert(error.description);
		else if (error.message)
			alert(error.message);
		else
			alert(error);

		event.returnValue = false;
		return false;
	}
}
//=================================================================================================
function rbClick(sender, event, onChange)
{
	if (sender.wasChecked)
		sender.checked = false;
	else
	{
		var radiobuttons = document.getElementsByName(sender.name);

		for (var i = 0; i < radiobuttons.length; i++)
			radiobuttons[i].wasChecked = false;
	}

	sender.wasChecked = sender.checked;

	var element = Html.get(sender.name);

	if (!sender.checked)
		element.value = null;
	else
		element.value = sender.value;

	fldChange(element, event, onChange);
}
//=================================================================================================
function checkGroup(sender, event, onChange)
{
	var 
		field = Html.get(sender.name),
		IDs = sender.id.split(/_/gi),
		fldID = IDs[1],
		ffvID = IDs[3],
		count = 0,
		checks = document.getElementsByName(sender.name);

	for (var i = 0; i < checks.length; i++)
	{
		if (checks[i].checked)
			count++;
	}

	fldChange(sender, event, onChange);
}
//=================================================================================================
function formSelectChange(sender, valueID)
{
	var 
		ID = String(sender.name).split("_")[1],
		divError = Html.get("divError_" + ID);

	if (divError)
	{
		if (sender.value == valueID)
			divError.style.display = "";
		else
			divError.style.display = "none";
	}
}
//=================================================================================================
function fldChange(sender, event, onChange)
{
	formCheckElement(sender, event);

	if (typeof (onChange) == "function")
		onChange(sender, event);

	if (sender.unique)
		checkUnique(sender, event);
}
//=================================================================================================
var 
	ftInput = 1,
	ftHidden = 2,
	ftIntInput = 3,
	ftFloatInput = 4,
	ftDateTimeInput = 5,
	ftDateInput = 6,
	ftTimeInput = 7,
	ftEmailInput = 8,
	ftWebInput = 9,
	ftTextArea = 10,
	ftRadioButtons = 11,
	ftSelect = 12,
	ftCheckBox = 13,
	ftCheckBoxGroup = 14,
	ftFileInput = 15,
	ftLabel = 16;
//=================================================================================================

