function x_validate_form(form) {
	var element;
	var i;
	var success_func = false;
	var fail_func = false;
	var ajax_func;
	if (arguments.length > 1) {
		success_func = arguments[1]; 
	}
	if (arguments.length > 2) {
		fail_func = arguments[2]; 
	}
	for (i = 0; i < form.elements.length, element = form.elements[i]; i++) {
		if (element.offsetWidth == 0) {
			continue;
		}
		$(element).removeClass('x-form-error');
	}
	form.disabled = true; 
	if (form.method.toLowerCase() == 'post') {
		ajax_func = $.post;
	} else {
		ajax_func = $.get;
	}
	ajax_func('/form_validator.php', $(form).serialize(), function(data, status){
		var result = true;
		if (data && !data['error']) {
			if (data !== true) {
				var messages = [];
				var i;
				var f;
	            var focused = false;
				for (i = 0; i < data.length; i++) {
					if ($.inArray(data[i].message, messages) < 0) {
						messages.push(data[i].message);
	                }
					f = form.elements[data[i].field];
					if (f) {
						$(f).addClass('x-form-error');
	                    if (!focused) {
	                    	$(f).focus();
	                    	f.scrollIntoView();
	                        focused = true;
	                    }
					}
				}
				if (messages.length) {
					alert(messages.join('\n'));
				}
				if (fail_func) {
					fail_func(form);
				}
			} else {
				form.disabled = false; 
				if (success_func) {
					success_func(form);
				} else { 
					form.submit();
				}
				return;
			}
		} 
		form.disabled = false; 
	}, 'json');
	return false;
}

function x_error(message) {
	if ($('#x_error').length == 0) {
		$(document.body).append('<div id="x_error"></div>');
	}
	$('#x_error').html(message);
	$('#x_error').block({
		message: message,
		timeout: 2000
	});
}

$(document).ready(function()
{
	$('textarea').keyup(function(e)
	{
		var maxlength = parseInt($(this).attr('maxlength'));
		if (maxlength > 0) {
			var val = $(this).val(); 
			if (val.length > maxlength) {
				$(this).val(val.substring(0, maxlength));
			}
		}
	});
});
