(function($){
	$.prototype.ajaxSubmit = function() {
		if( $( this ).attr( 'ajaxsubmit' ) == 'true' ) {
			return $( this );
		}
		
		var start = arguments[1] || null;
		var callback = arguments[0] || null;
		
		function binder( e ) {
			var form = $( this );

			if( form.attr('tagName').toLowerCase() != 'form' ) {
				alert( 'Only form allowed' );
				return false;
			}
			
			if( start && typeof start == 'function' ) {
				var start_result = start();
				if( start_result === false )
					return false;
			}
			
			if( form.attr( 'submiting' ) == 'true' ) {
				return false;
			}
			
			switch( form.attr('enctype') ) {
				case 'multipart/form-data':
					var iframeName = 'auto_iframe_' + Math.floor( Math.random() * 99999 );
					var iframe = $( '<iframe style="display:none" src="about:blank" id="' + iframeName + '" name="' + iframeName + '"></iframe>' ).
						appendTo( document.body );

					form.attr( 'target', iframeName );
					form.attr( 'submiting', 'true' );
					
					iframe.load(function() {
						var _document = this.contentWindow.document;
						if( _document.location.href != 'about:blank' ) {
							form.removeAttr( 'target' );
							form.removeAttr( 'submiting' );
							
							if( callback && typeof callback == 'function' ) {
								try {
									callback( _document.body.innerHTML, form );
								} catch(e) {
								
								}
							}
							
							iframe.remove();
						}
					});

					return true;
				break;
				default:
					Query.add( form.attr('action'), form.serialize(), function( content ) {
						form.removeAttr( 'submiting' );
						
						if( callback && typeof callback == 'function' ) {
							try{
								callback( content, form );
							} catch(e) {
								
							}
						}
					});
					
					return false;
				break;
			}			
		}
		
		$( this ).attr( 'ajaxsubmit', 'true' );
		$( this ).unbind( 'submit', binder ).bind( 'submit', binder );
		
		return $( this );
	}
})(jQuery);