/*
 * Form Special Controller
 * Copyright (c) 2010  Oliver Astrologo
 * Dual licensed under MIT and GPL.
 * @author  Oliver Astrologo
 * @version 1.0
 */
;
(function ($) {
    //var postItId;
    $.fn.extend({
        //pass the options variable to the function  
        FormController: function (options) {
            //Set the default values, use comma to separate the settings, example:  
            var defaults = {
                // Classe del box messaggio
                messageClass: 'div.message',
                // Classe dell'indicatore loader
                loaderClass: 'div.ajax-loader',
                // Classe del gruppo di form da nascondere dopo il submit
                formGroupClass: 'div.form-group',
                // Suffisso #ID del label di errore
                errorLabelClass: '.error-input-msg',
                // Classe della label di errore
                errorLabelIdSuffix: '-msg'
            }
            var options = $.extend(defaults, options);
            var forms = this;
            if (forms.length > 0) {
                forms.each(function () {
                    var ajaxForm = $(this);
                    ajaxForm.find(options.errorLabelClass).html('').hide();
                    var responseMessage = ajaxForm.find(options.messageClass);
                    if ($.trim(responseMessage.html()) == '') responseMessage.hide();
                    var ajaxLoader = ajaxForm.find(options.loaderClass);
                    var formGroup = ajaxForm.find(options.formGroupClass);
                    var postUrl = ajaxForm.attr('action');
                    var submitButton = ajaxForm.find("input[type='submit']");
                    ajaxForm.submit(function () {
                        processFormData();
                        return false;
                    });
                    var processFormData = function () {
                        var postData = ajaxForm.serialize();
                        $.ajax({
                            type: 'POST',
                            dataType: 'json',
                            cache: false,
                            beforeSend: showRequest,
                            error: showError,
                            url: postUrl,
                            data: postData,
                            success: function (data) {
                                searchResponse(data);
                            }
                        });
                    }
                    var searchResponse = function (data) {
                        resetForm();
                        var responseStatus = data.responseStatus;
                        if (responseStatus == 'OK') {
                            formGroup.hide();
                            responseMessage.html(data.message).addClass('success').show(); // fadeIn
                            jQuery('html, body').animate({
                                scrollTop: jQuery(ajaxForm).offset().top - 50
                            }, 1000);
                        } else {
                            var errorsArray = data.errors;
                            $.each(errorsArray, function (index, value) {								
                                $('#' + data.form_prefix + index).addClass('error');
                                $('#' + data.form_prefix + index + options.errorLabelIdSuffix).html(value).show(); // fadeIn
                            });
                            responseMessage.html(data.message).addClass('error').show(); // fadeIn
                            jQuery('html, body').animate({
                                scrollTop: jQuery(ajaxForm).offset().top - 50
                            }, 1000);
                        }
                    }
                    var showRequest = function () {
                        submitButton.attr('disabled', 'true');
                        $('body').addClass('wait');
                        ajaxLoader.show();
                    }
                    var showError = function (XMLHttpRequest, textStatus, errorThrown) {
                        resetForm();
                        alert('Spiacenti ma al momento non è possibile inviare i dati.');
                    }
                    var resetForm = function () {
                        submitButton.removeAttr('disabled', 'true');
                        $('body').removeClass('wait');
                        ajaxLoader.hide();
                        ajaxForm.find('input,select,textarea').removeClass('error');
                        ajaxForm.find(options.errorLabelClass).html('').hide();
                        responseMessage.html('').removeClass('error,success').hide();
                    }
                });
            }
        }
    });
})(jQuery);
