(function($) {
    var
    MV_current = null,
    MV_settings = null,
    MV_defaults = {
        response : null,
        controller : null,
        action : null,
        redirect : true,
        reload : false,
        resetOnSuccess : true,
        setErrors : function(target, fielderrors, subseterrors) {
            if (fielderrors) {
                for (field in fielderrors) {
                    target.find('[name=' + field + ']').parent().addClass('error').after('<div class="errorMsg">' + fielderrors[field] + '</div>');
                }
            }
            if (subseterrors) {
                var row, l;
                for (subset in subseterrors) {
    //                  for (row = 0, l = subseterrors[subset].length; row < l; row++ ) {
                    for (row in subseterrors[subset]) {
                        for (field in subseterrors[subset][row].data) {
                            target.find(':name(' + [subset, row, field].join(',') + ')').parent().addClass('error')
                        }
                    }
                }
            }
        },
        extraData : null//object, array or function
    },
    MF_closeonerror = function(error) {
        MV_current = null;
        $.loadingIndicator.stop();          
        if (confirm("  Error" + (error? ': ' + error : '') + "\nReload page?")) 
            $.reloadPage('');   
            
    },    
    
    MF_submit = function (target, settings) {
        if (MV_current) {
            $.showmessage('error', $.translate('allready_pressed', 'general.error'), true, 5000);
            return false;
        }
        MV_current = target;
        MV_settings = settings;
        var data = {};
        $(target).find('input[type=hidden], input[type=text], input[type=password], textarea, select').each(function() {
            name = $(this).attr('name');
            if (name) {
                val = $(this).val();
                data[name] = val? val : '';
            }
        });
        $(target).find('input[type=radio]:checked').each(function() {
            name = $(this).attr('name');
            if (name) {
                val = $(this).val();
                data[name] = val? val : '';
            }
        });
        $(target).find('input[type=checkbox]:checked').each(function() {
            name = $(this).attr('name');
            if (name) {
                val = $(this).val();
                data[name] = val? val : '';
            }
        });

        if (MV_settings.extraData)
            data = $.extend({}, data, $.isFunction(MV_settings.extraData)? MV_settings.extraData.call() : MV_settings.extraData);

        $.json(MV_settings.controller, MV_settings.action, data, function(j, status) {
            if (!MV_current) {
                reportError('Jsonform submit completed without MV_current', j);
                MF_closeonerror($.translate('system_error', 'general.error'));
                return;
            }

            if (j.fielderrors || j.subseterrors) {
                if (typeof MV_settings.setErrors == 'function')
                    MV_settings.setErrors(MV_current, j.fielderrors || null, j.subseterrors || null);
                status = 'errors';
            } else if (status == 'success') {
                if (MV_settings.redirect && j.redirect) {
                    document.location = j.redirect;
                    return;
                } else if (MV_settings.reload) {
                    $.reloadPage(null);
                    return ;
                }
                else if (MV_settings.resetOnSuccess)
                    target.reset();
            }

            if ($.isFunction(MV_settings.response))
                MV_settings.response.call(this, status, j);
            MV_current = null;
        });
        target.find('.error').removeClass('error');
        target.find('.errorMsg').remove();        

    };

    $.fn.jsonform = function(options){
        return this.each(function() {
            var target = $(this), s = $.extend({}, MV_defaults, options);
            if ($(target).get(0).tagName.toLowerCase() == 'form') {
                target.bind('submit', {settings: s }, function(e) {
                     e.preventDefault();
                     MF_submit($(this), e.data.settings);
                });
            }
        });
    };
})(jQuery);

