// Fake xhr
jqXHR = {
	readyState: 0,

	// Tworzenie w razie potrzeby tablicy mieszającej nagłówków
	getResponseHeader: function( key ) {
		var match;
		if ( state === 2 ) {
			if ( !responseHeaders ) {
				responseHeaders = {};
				while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
					responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
				}
			}
			match = responseHeaders[ key.toLowerCase() ];
		}
		return match == null ? null : match;
	},

	// Nieprzetworzony łańcuch
	getAllResponseHeaders: function() {
		return state === 2 ? responseHeadersString : null;
	},

	// Buforowanie nagłówka
	setRequestHeader: function( name, value ) {
		var lname = name.toLowerCase();
		if ( !state ) {
			name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
			requestHeaders[ name ] = value;
		}
		return this;
	},

	// Przesłanianie nagłówka typu zawartości odpowiedzi
	overrideMimeType: function( type ) {
		if ( !state ) {
			s.mimeType = type;
		}
		return this;
	},

	// Wywołania zwrotne zależne od statusu
	statusCode: function( map ) {
		var code;
		if ( map ) {
			if ( state < 2 ) {
				for ( code in map ) {

					// "Leniwe" dodawanie nowego wywołania zwrotnego w sposób zachowujący stare wywołania
					statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
				}
			} else {

				// Wykonywanie odpowiednich wywołań zwrotnych
				jqXHR.always( map[ jqXHR.status ] );
			}
		}
		return this;
	},

	// Anulowanie żądania
	abort: function( statusText ) {
		var finalText = statusText || strAbort;
		if ( transport ) {
			transport.abort( finalText );
		}
		done( 0, finalText );
		return this;
	}
};