(function( $ ) {
    
    $.fn.ajaxform = function( method ) {

		// Default settings.
	    var settings = {
	        'onSuccess': undefined
	    };

	    // Public methods.
	    var methods = {
	        init : function( options ) {
	            // Loop through the elements.
	            return this.each(function() {
	                // Merge the default settings and the supplied options.
	                if ( options ) {
	                    $.extend( settings, options );
	                }

	                // When a submit button is clicked.
	                $(this).find('button[type=submit], a.button.ajax-submit, a.radio.ajax-submit').each(function() {
	                //$(this).find('a.button').each(function() {
	                    $(this).unbind('click').click(function() {
	                        var form = $(this).closest('form');
	                        var formData = getDataAsArray($(this));

	                        if( form.attr('method') == 'post' ) {
	                            $.post(
	                                form.attr('action'),
	                                formData,
	                                function(data) {
	                                    onSuccess(formData, data);
	                                }
	                            );
	                        } else {
	                            $.get(
	                                form.attr('action'),
	                                formData,
	                                function(data) {
	                                    onSuccess(formData, data);
	                                }
	                            );
	                        }

	                        return false;
	                    });
	                });
	            });
	        }
	    };

	    // Callback when the ajax request is finished.
	    var onSuccess = function( requestData, returnData ) {
	        if(typeof settings['onSuccess'] === 'function') {
	            settings['onSuccess'].apply(
	                this,
	                [{
	                    requestData:requestData,
	                    returnData:returnData
	                }]
	            );
	        }
	    }

	    // Get the formdata.
	    var getDataAsArray = function( buttonClicked ) {
	        var form = buttonClicked.closest('form');
        
	        var items = form.serializeArray();
	        var data = {};
	        for( var i = 0; i < items.length; i++ ) {
	            data[items[i].name] = items[i].value;
	        }

	        var buttonName = buttonClicked.attr('name');
	        var buttonValue = buttonClicked.attr('value');

	        if(buttonName != undefined) {
	            data[buttonName] = buttonValue;
	        }
	        return data;
	    }
	
		// Request handler.
		if ( methods[method] ) {
            return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.ajaxform' );
        }
        
        return false;
    };
})( jQuery );


