function validateForm(form)
{
	form = $(form);
	
	form.validation = new Form.Validator.Inline(form, { onFormValidate:formSubmit, scrollToErrorsOnSubmit:false } );
}
function formSubmit(isValid, form)
{	
	if(isValid) form.submit();
}

function initForm(form, callback, target)
{
	form = $(form);
	
	form.callback = callback;
	if(target) form.target = target;
	form.validation = new Form.Validator(form, { onFormValidate:submitForm } );
}
function submitForm(isValid, form, submitEvent)
{
	if(!isValid) return;
	
	var request = new Request( {url:form.action, method:'post', link:'ignore', isSuccess:function(){return false}, noCache:true, onFailure:callFormCallback} );
	if(form.callback)
		request.xhr.callback = form.callback;
	request.xhr.form = form;
	request.send(extractFormParameters(form));
}
function callFormCallback(xhr)
{ 		
	if(xhr.form.target.length)
	{
		var target = $(xhr.form.target);
		if(target)
			target.innerHTML = xhr.responseText;
	}
	if(xhr.callback)
		xhr.callback(xhr);		
}
function extractFormParameters(form)
{
	var form = $(form);	var parameters = new Array();
	
	for (var i = 0; i < form.elements.length; i++ )
	{
		el = form.elements[i];
		if (!el.type)
			continue;
		switch(el.type.toLowerCase())
		{
			case 'text':
			case 'password':
			case 'textarea':
			case 'hidden':
			case 'submit':
				parameters.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(el.value));
				break;
			case 'select-one':
				var value = '';
				var opt;
				if (el.selectedIndex >= 0)
				{
					opt = el.options[el.selectedIndex];
					value = opt.value || opt.text;
				}
				parameters.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(value));
				break;
			case 'select-multiple':
				for (var j = 0; j < el.length; j++)
				{
					if (el.options[j].selected)
					{
						value = el.options[j].value || el.options[j].text;
						parameters.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(value));
					}
				}
				break;
			case 'checkbox':
			case 'radio':
				if (el.checked)
					parameters.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(el.value));
				break;
			default:
			break;
		}
	}
	return parameters.join('&');
}
