function formValidator(form, elements)
{
	var v = new KcmsFormValidator(form);
	
	if (jQuery.isArray(elements))
	{
		for (var i=0; i < elements.length; i++)
		{
			v.elements(elements[i]);
		}
	}
}


function formSubmitValidate(aFormSel, aUrl, aSuccess, aSubmit)
{
	var form = $('form'+aFormSel);
	if (!aUrl) aUrl = document.location.href;
	
	form.submit(function()
	{
		if (aSubmit != null)
		{
			if (!aSubmit(form)) return;
		}
		
		try
		{
			var jqa = $.ajax({
				url: aUrl,
				type: 'POST',
				data: $(this).serialize(),
				dataType: 'json',
				success: function(aData)
				{
					var ret = true;
					
					if (aSuccess != null) ret = aSuccess(aData);
					
					if (ret)
					{
						var fill_form = $('#fill_form', form);
						
						fill_form.html('');
						$('input', form).parent().removeClass('error');
						$('.result_ok', form).addClass('hidden');
						
						if (aData.result)
						{
							$('.form_body', form).addClass('hidden');
							$('.result_ok', form).removeClass('hidden');
						}
						else if (aData.errors)
						{
							fill_form.addClass('visible');
							for (var pref in aData.errors)
							{
								var v = aData.errors[pref];
								if (v)
								{
									var msg, label, info, gr;
									for (var field in v)
									{
										msg = v[field];
										label = $('label[for="'+pref+field+'"]', form).html();
										gr = $('label[for="'+pref+field+'"]', form).data('group');
										if (typeof gr == 'string' && gr != '') label = gr+' '+label;
										if (!label) label = field;
										
										$('#'+pref+field, form).parent().addClass('error');
										fill_form.append('<strong><a href="#'+pref+field+'">'+label+'</a>'+' '+msg+'</strong>');
									}
								}
							}
						}
					}
					
					if (aSuccess != null) ret = aSuccess(aData, true);
				}
			});
		}
		catch (E)
		{
			alert('Exception: '+E.description+' ('+E.err+')');
		}
		
		return false;
	})
}
