Form = {

	/**
	 * Submit a form with an ajax request.
	 * @author leo
	 */
	ajaxSubmit: function(settings) {
		var base = this;
		
		if (settings.form == undefined) {
			return false;
		}
		
		var $form = settings.form;
		if (!($form instanceof $)) {
			$form = $($form);
		}
		
		settings = $.extend({
			url: $form.attr('action'), 
			data: $form.serialize(),
            success: function(data, textStatus, jqXHR) {
                switch (data.status) {
                    case 'success':
                        // beforeSuccess handler
                        if (settings.beforeSuccess != undefined) {
                            settings.beforeSuccess(data, textStatus, jqXHR);
                        }

                        // Clear old form errors
                        base.clearErrors($form);

                        if (data.action != undefined) {
                            // Execute action
                            try {
                                eval(data.action);
                            } catch (e) {
                                window.console.log(e);
                                alert('Ajax failure!');
                            }
                        } else if (data.html != undefined) {
                            if (settings.target != undefined) {
                                var $target = settings.target;
                                if (!($target instanceof $)) {
                                    $target = $($target);
                                }

                                // Update target element
                                $target.replaceWith(data.html);
                            }
                        }

                        // afterSuccess handler
                        if (settings.afterSuccess != undefined) {
                            settings.afterSuccess(data, textStatus, jqXHR);
                        }
                        break;

                    case 'failed':
                        // beforeFail handler
                        if (settings.beforeFail != undefined) {
                            settings.beforeFail(data, textStatus, jqXHR);
                        }

                        // Clear old form errors
                        base.clearErrors($form);

                        // Highlight form errors
                        for (var k in data.errors) {
                            var fieldName = k;
                            var errorMessage = data.errors[k];
                            var $formrow = $form.find('input[name="' + fieldName + '"]').closest('.formfield');

                            // Add error class and message span
                            $formrow.addClass('error');
                            $('<span class="message">' + errorMessage + '</span>')
                                .css({ display: 'none' })
                                .appendTo($formrow)
                                .fadeIn('fast');
                        }

                        // afterFail handler
                        if (settings.afterFail != undefined) {
                            settings.afterFail(data, textStatus, jqXHR);
                        }
                        break;
                }
			},
			error: function(jqXHR, textStatus, errorThrown) {
                // beforeError handler
                if (settings.beforeError != undefined) {
                    settings.beforeError(data, textStatus, jqXHR);
                }

                alert('There was an error while processing your request. Please contact the administrator.');

                // afterError handler
                if (settings.afterError != undefined) {
                    settings.afterError(data, textStatus, jqXHR);
                }
			}
		}, settings);
		
		// Do the request
		Ajax.request(settings);
		
		return false;
	}, 
	
	/**
	 * Clears all form error highlighting for given form
	 * @author leo
	 */
	clearErrors: function(form) {
		var $form = form;
		if (!(form instanceof jQuery)) {
			$form = $(form);
		}
		
		// Clear error class and remove message span
		$form.find('.formfield').removeClass('error').find('.message').remove();
	}

};

