//=================================================================================================
function frmFormReady( ID )
{
	var
		focusable  = ["text", "textarea", "checkbox", "radio", "select-one"], 
		form       = document.getElementByName("frmForm_" + ID ), 
		divMessage = document.getElementById("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 = document.getElementById("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 = document.getElementById("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 )
	{
		switch ( element.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 frmFormSubmit( sender, event )
{
	var
		errors = 0;
	
	if ( sender )
		for ( var i = 0; i < sender.elements.length; i++ )
			if ( formCheckElement( sender.elements[i] ) )
				errors++;
	
	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 ffcDisabledChange( sender, event, onChange )
{
	var
		ID    = parseInt( sender.id.split("_")[1] ), 
		tbody = document.getElementById("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 );
		
		formCheckElement( sender, event );
	}
	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 );
		
		formCheckElement( sender, event );
	}
	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 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 = document.getElementById( sender.name );
	
	formCheckElement( element, event );
	
	if ( typeof( onChange ) == "function")
		onChange( sender, event );
}
//=================================================================================================
function checkGroup( sender, event, onChange )
{
	var
		field  = document.getElementById( 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++;
	
	formCheckElement( field, event );
	
	if ( typeof( onChange ) == "function")
		onChange( sender, event );
}
//=================================================================================================
function formSelectChange( sender, valueID )
{
	var
		ID       = String( sender.name ).split("_")[1], 
		divError = document.getElementById("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 );
}
//=================================================================================================
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;
//=================================================================================================
