module("ajax", { teardown: moduleTeardown });

// Safari 3 randomly crashes when running these tests,
// but only in the full suite - you can run just the Ajax
// tests and they'll pass
//if ( !jQuery.browser.safari ) {

if ( !isLocal ) {

test("jQuery.ajax() - success callbacks", function() {
	expect( 8 );

	jQuery.ajaxSetup({ timeout: 0 });

	stop();

	jQuery('#foo').ajaxStart(function(){
		ok( true, "ajaxStart" );
	}).ajaxStop(function(){
		ok( true, "ajaxStop" );
		start();
	}).ajaxSend(function(){
		ok( true, "ajaxSend" );
	}).ajaxComplete(function(){
		ok( true, "ajaxComplete" );
	}).ajaxError(function(){
		ok( false, "ajaxError" );
	}).ajaxSuccess(function(){
		ok( true, "ajaxSuccess" );
	});

	jQuery.ajax({
		url: url("data/name.html"),
		beforeSend: function(){ ok(true, "beforeSend"); },
		success: function(){ ok(true, "success"); },
		error: function(){ ok(false, "error"); },
		complete: function(){ ok(true, "complete"); }
	});
});

test("jQuery.ajax() - success callbacks - (url, options) syntax", function() {
	expect( 8 );

	jQuery.ajaxSetup({ timeout: 0 });

	stop();

	setTimeout(function(){
		jQuery('#foo').ajaxStart(function(){
			ok( true, "ajaxStart" );
		}).ajaxStop(function(){
			ok( true, "ajaxStop" );
			start();
		}).ajaxSend(function(){
			ok( true, "ajaxSend" );
		}).ajaxComplete(function(){
			ok( true, "ajaxComplete" );
		}).ajaxError(function(){
			ok( false, "ajaxError" );
		}).ajaxSuccess(function(){
			ok( true, "ajaxSuccess" );
		});

		jQuery.ajax( url("data/name.html") , {
			beforeSend: function(){ ok(true, "beforeSend"); },
			success: function(){ ok(true, "success"); },
			error: function(){ ok(false, "error"); },
			complete: function(){ ok(true, "complete"); }
		});
	}, 13);
});

test("jQuery.ajax() - success callbacks (late binding)", function() {
	expect( 8 );

	jQuery.ajaxSetup({ timeout: 0 });

	stop();

	setTimeout(function(){
		jQuery('#foo').ajaxStart(function(){
			ok( true, "ajaxStart" );
		}).ajaxStop(function(){
			ok( true, "ajaxStop" );
			start();
		}).ajaxSend(function(){
			ok( true, "ajaxSend" );
		}).ajaxComplete(function(){
			ok( true, "ajaxComplete" );
		}).ajaxError(function(){
			ok( false, "ajaxError" );
		}).ajaxSuccess(function(){
			ok( true, "ajaxSuccess" );
		});

		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: function(){ ok(true, "beforeSend"); }
		})
			.complete(function(){ ok(true, "complete"); })
			.success(function(){ ok(true, "success"); })
			.error(function(){ ok(false, "error"); });
	}, 13);
});

test("jQuery.ajax() - success callbacks (oncomplete binding)", function() {
	expect( 8 );

	jQuery.ajaxSetup({ timeout: 0 });

	stop();

	setTimeout(function(){
		jQuery('#foo').ajaxStart(function(){
			ok( true, "ajaxStart" );
		}).ajaxStop(function(){
			ok( true, "ajaxStop" );
		}).ajaxSend(function(){
			ok( true, "ajaxSend" );
		}).ajaxComplete(function(){
			ok( true, "ajaxComplete" );
		}).ajaxError(function(){
			ok( false, "ajaxError" );
		}).ajaxSuccess(function(){
			ok( true, "ajaxSuccess" );
		});

		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: function(){ ok(true, "beforeSend"); },
			complete: function(xhr) {
				xhr
				.complete(function(){ ok(true, "complete"); })
				.success(function(){ ok(true, "success"); })
				.error(function(){ ok(false, "error"); })
				.complete(function(){ start(); });
			}
		});
	}, 13);
});

test("jQuery.ajax() - success callbacks (very late binding)", function() {
	expect( 8 );

	jQuery.ajaxSetup({ timeout: 0 });

	stop();

	setTimeout(function(){
		jQuery('#foo').ajaxStart(function(){
			ok( true, "ajaxStart" );
		}).ajaxStop(function(){
			ok( true, "ajaxStop" );
		}).ajaxSend(function(){
			ok( true, "ajaxSend" );
		}).ajaxComplete(function(){
			ok( true, "ajaxComplete" );
		}).ajaxError(function(){
			ok( false, "ajaxError" );
		}).ajaxSuccess(function(){
			ok( true, "ajaxSuccess" );
		});

		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: function(){ ok(true, "beforeSend"); },
			complete: function(xhr) {
				setTimeout (function() {
					xhr
					.complete(function(){ ok(true, "complete"); })
					.success(function(){ ok(true, "success"); })
					.error(function(){ ok(false, "error"); })
					.complete(function(){ start(); });
				},100);
			}
		});
	}, 13);
});

test("jQuery.ajax() - success callbacks (order)", function() {
	expect( 1 );

	jQuery.ajaxSetup({ timeout: 0 });

	stop();

	var testString = "";

	setTimeout(function(){
		jQuery.ajax({
			url: url("data/name.html"),
			success: function( _1 , _2 , xhr ) {
				xhr.success(function() {
					xhr.success(function() {
						testString += "E";
					});
					testString += "D";
				});
				testString += "A";
			},
			complete: function() {
				strictEqual(testString, "ABCDE", "Proper order");
				start();
			}
		}).success(function() {
			testString += "B";
		}).success(function() {
			testString += "C";
		});
	}, 13);
});

test("jQuery.ajax() - error callbacks", function() {
	expect( 8 );
	stop();

	jQuery('#foo').ajaxStart(function(){
		ok( true, "ajaxStart" );
	}).ajaxStop(function(){
		ok( true, "ajaxStop" );
		start();
	}).ajaxSend(function(){
		ok( true, "ajaxSend" );
	}).ajaxComplete(function(){
		ok( true, "ajaxComplete" );
	}).ajaxError(function(){
		ok( true, "ajaxError" );
	}).ajaxSuccess(function(){
		ok( false, "ajaxSuccess" );
	});

	jQuery.ajaxSetup({ timeout: 500 });

	jQuery.ajax({
		url: url("data/name.php?wait=5"),
		beforeSend: function(){ ok(true, "beforeSend"); },
		success: function(){ ok(false, "success"); },
		error: function(){ ok(true, "error"); },
		complete: function(){ ok(true, "complete"); }
	});
});

test( "jQuery.ajax - multiple method signatures introduced in 1.5 ( #8107)", function() {

	expect( 4 );

	stop();

	jQuery.when(
		jQuery.ajax().success(function() { ok( true, 'With no arguments' ); }),
		jQuery.ajax('data/name.html').success(function() { ok( true, 'With only string URL argument' ); }),
		jQuery.ajax('data/name.html', {} ).success(function() { ok( true, 'With string URL param and map' ); }),
		jQuery.ajax({ url: 'data/name.html'} ).success(function() { ok( true, 'With only map' ); })
	).then( start, start );

});

test("jQuery.ajax() - textStatus and errorThrown values", function() {

	var nb = 2;

	expect( 2 * nb );
	stop();

	function startN() {
		if ( !( --nb ) ) {
			start();
		}
	}

	/*
	Safari 3.x returns "OK" instead of "Not Found"
	Safari 4.x doesn't have this issue so the test should be re-instated once
	we drop support for 3.x

	jQuery.ajax({
		url: url("data/nonExistingURL"),
		error: function( _ , textStatus , errorThrown ){
			strictEqual( textStatus, "error", "textStatus is 'error' for 404" );
			strictEqual( errorThrown, "Not Found", "errorThrown is 'Not Found' for 404");
			startN();
		}
	});
	*/

	jQuery.ajax({
		url: url("data/name.php?wait=5"),
		error: function( _ , textStatus , errorThrown ){
			strictEqual( textStatus, "abort", "textStatus is 'abort' for abort" );
			strictEqual( errorThrown, "abort", "errorThrown is 'abort' for abort");
			startN();
		}
	}).abort();

	jQuery.ajax({
		url: url("data/name.php?wait=5"),
		error: function( _ , textStatus , errorThrown ){
			strictEqual( textStatus, "mystatus", "textStatus is 'mystatus' for abort('mystatus')" );
			strictEqual( errorThrown, "mystatus", "errorThrown is 'mystatus' for abort('mystatus')");
			startN();
		}
	}).abort( "mystatus" );
});

test("jQuery.ajax() - responseText on error", function() {

	expect( 1 );

	stop();

	jQuery.ajax({
		url: url("data/errorWithText.php"),
		error: function(xhr) {
			strictEqual( xhr.responseText , "plain text message" , "Test jqXHR.responseText is filled for HTTP errors" );
		},
		complete: function() {
			start();
		}
	});
});

test(".ajax() - retry with jQuery.ajax( this )", function() {

	expect( 1 );

	stop();

	var firstTime = 1;

	jQuery.ajax({
		url: url("data/errorWithText.php"),
		error: function() {
			if ( firstTime ) {
				firstTime = 0;
				jQuery.ajax( this );
			} else {
				ok( true , "Test retrying with jQuery.ajax(this) works" );
				start();
			}
		}
	});

});

test(".ajax() - headers" , function() {

	expect( 4 );

	stop();

	jQuery('#foo').ajaxSend(function( evt, xhr ) {
		xhr.setRequestHeader( "ajax-send", "test" );
	});

	var requestHeaders = {
			siMPle: "value",
			"SometHing-elsE": "other value",
			OthEr: "something else"
		},
		list = [],
		i;

	for( i in requestHeaders ) {
		list.push( i );
	}
	list.push( "ajax-send" );

	jQuery.ajax(url("data/headers.php?keys="+list.join( "_" ) ), {

		headers: requestHeaders,
		success: function( data , _ , xhr ) {
			var tmp = [];
			for ( i in requestHeaders ) {
				tmp.push( i , ": " , requestHeaders[ i ] , "\n" );
			}
			tmp.push(  "ajax-send: test\n" );
			tmp = tmp.join( "" );

			strictEqual( data , tmp , "Headers were sent" );
			strictEqual( xhr.getResponseHeader( "Sample-Header" ) , "Hello World" , "Sample header received" );
			if ( jQuery.browser.mozilla ) {
				ok( true, "Firefox doesn't support empty headers" );
			} else {
				strictEqual( xhr.getResponseHeader( "Empty-Header" ) , "" , "Empty header received" );
			}
			strictEqual( xhr.getResponseHeader( "Sample-Header2" ) , "Hello World 2" , "Second sample header received" );
		},
		error: function(){ ok(false, "error"); }

	}).then( start, start );

});

test(".ajax() - Accept header" , function() {

	expect( 1 );

	stop();

	jQuery.ajax(url("data/headers.php?keys=accept"), {
		headers: {
			Accept: "very wrong accept value"
		},
		beforeSend: function( xhr ) {
			xhr.setRequestHeader( "Accept", "*/*" );
		},
		success: function( data ) {
			strictEqual( data , "accept: */*\n" , "Test Accept header is set to last value provided" );
			start();
		},
		error: function(){ ok(false, "error"); }
	});

});

test(".ajax() - contentType" , function() {

	expect( 2 );

	stop();

	var count = 2;

	function restart() {
		if ( ! --count ) {
			start();
		}
	}

	jQuery.ajax(url("data/headers.php?keys=content-type" ), {
		contentType: "test",
		success: function( data ) {
			strictEqual( data , "content-type: test\n" , "Test content-type is sent when options.contentType is set" );
		},
		complete: function() {
			restart();
		}
	});

	jQuery.ajax(url("data/headers.php?keys=content-type" ), {
		contentType: false,
		success: function( data ) {
			strictEqual( data , "content-type: \n" , "Test content-type is not sent when options.contentType===false" );
		},
		complete: function() {
			restart();
		}
	});

});

test(".ajax() - protocol-less urls", function() {
	expect(1);

	jQuery.ajax({
		url: "//somedomain.com",
		beforeSend: function( xhr, settings ) {
			equals(settings.url, location.protocol + "//somedomain.com", "Make sure that the protocol is added.");
			return false;
		}
	});
});

test(".ajax() - hash", function() {
	expect(3);

	jQuery.ajax({
		url: "data/name.html#foo",
		beforeSend: function( xhr, settings ) {
			equals(settings.url, "data/name.html", "Make sure that the URL is trimmed.");
			return false;
		}
	});

	jQuery.ajax({
		url: "data/name.html?abc#foo",
		beforeSend: function( xhr, settings ) {
		equals(settings.url, "data/name.html?abc", "Make sure that the URL is trimmed.");
			return false;
		}
	});

	jQuery.ajax({
		url: "data/name.html?abc#foo",
		data: { "test": 123 },
		beforeSend: function( xhr, settings ) {
			equals(settings.url, "data/name.html?abc&test=123", "Make sure that the URL is trimmed.");
			return false;
		}
	});
});

test("jQuery ajax - cross-domain detection", function() {

	expect( 5 );

	var loc = document.location,
		otherPort = loc.port === 666 ? 667 : 666,
		otherProtocol = loc.protocol === "http:" ? "https:" : "http:";

	jQuery.ajax({
		dataType: "jsonp",
		url: otherProtocol + "//" + loc.host,
		beforeSend: function( _ , s ) {
			ok( s.crossDomain , "Test different protocols are detected as cross-domain" );
			return false;
		}
	});

	jQuery.ajax({
		url: 'app:/path',
		beforeSend: function( _ , s ) {
			ok( s.crossDomain , "Adobe AIR app:/ URL detected as cross-domain" );
			return false;
		}
	});

	jQuery.ajax({
		dataType: "jsonp",
		url: loc.protocol + '//somewebsitethatdoesnotexist-656329477541.com:' + ( loc.port || 80 ),
		beforeSend: function( _ , s ) {
			ok( s.crossDomain , "Test different hostnames are detected as cross-domain" );
			return false;
		}
	});

	jQuery.ajax({
		dataType: "jsonp",
		url: loc.protocol + "//" + loc.hostname + ":" + otherPort,
		beforeSend: function( _ , s ) {
			ok( s.crossDomain , "Test different ports are detected as cross-domain" );
			return false;
		}
	});

	jQuery.ajax({
		dataType: "jsonp",
		url: loc.protocol + "//" + loc.host,
		crossDomain: true,
		beforeSend: function( _ , s ) {
			ok( s.crossDomain , "Test forced crossDomain is detected as cross-domain" );
			return false;
		}
	});

});

test(".load() - 404 error callbacks", function() {
	expect( 6 );
	stop();

	jQuery('#foo').ajaxStart(function(){
		ok( true, "ajaxStart" );
	}).ajaxStop(function(){
		ok( true, "ajaxStop" );
		start();
	}).ajaxSend(function(){
		ok( true, "ajaxSend" );
	}).ajaxComplete(function(){
		ok( true, "ajaxComplete" );
	}).ajaxError(function(){
		ok( true, "ajaxError" );
	}).ajaxSuccess(function(){
		ok( false, "ajaxSuccess" );
	});

	jQuery("<div/>").load("data/404.html", function(){
		ok(true, "complete");
	});
});

test("jQuery.ajax() - abort", function() {
	expect( 8 );
	stop();

	jQuery('#foo').ajaxStart(function(){
		ok( true, "ajaxStart" );
	}).ajaxStop(function(){
		ok( true, "ajaxStop" );
		start();
	}).ajaxSend(function(){
		ok( true, "ajaxSend" );
	}).ajaxComplete(function(){
		ok( true, "ajaxComplete" );
	});

	var xhr = jQuery.ajax({
		url: url("data/name.php?wait=5"),
		beforeSend: function(){ ok(true, "beforeSend"); },
		complete: function(){ ok(true, "complete"); }
	});

	equals( xhr.readyState, 1, "XHR readyState indicates successful dispatch" );

	xhr.abort();
	equals( xhr.readyState, 0, "XHR readyState indicates successful abortion" );
});

test("Ajax events with context", function() {
	expect(14);

	stop();
	var context = document.createElement("div");

	function event(e){
		equals( this, context, e.type );
	}

	function callback(msg){
		return function(){
			equals( this, context, "context is preserved on callback " + msg );
		};
	}

	function nocallback(msg){
		return function(){
			equals( typeof this.url, "string", "context is settings on callback " + msg );
		};
	}

	jQuery('#foo').add(context)
			.ajaxSend(event)
			.ajaxComplete(event)
			.ajaxError(event)
			.ajaxSuccess(event);

	jQuery.ajax({
		url: url("data/name.html"),
		beforeSend: callback("beforeSend"),
		success: callback("success"),
		error: callback("error"),
		complete:function(){
			callback("complete").call(this);

			jQuery.ajax({
				url: url("data/404.html"),
				context: context,
				beforeSend: callback("beforeSend"),
				error: callback("error"),
				complete: function(){
					callback("complete").call(this);

					jQuery('#foo').add(context).unbind();

					jQuery.ajax({
						url: url("data/404.html"),
						beforeSend: nocallback("beforeSend"),
						error: nocallback("error"),
						complete: function(){
							nocallback("complete").call(this);
							start();
						}
					});
				}
			});
		},
		context:context
	});
});

test("jQuery.ajax context modification", function() {
	expect(1);

	stop();

	var obj = {};

	jQuery.ajax({
		url: url("data/name.html"),
		context: obj,
		beforeSend: function(){
			this.test = "foo";
		},
		complete: function() {
			start();
		}
	});

	equals( obj.test, "foo", "Make sure the original object is maintained." );
});

test("jQuery.ajax context modification through ajaxSetup", function() {
	expect(4);

	stop();

	var obj = {};

	jQuery.ajaxSetup({
		context: obj
	});

	strictEqual( jQuery.ajaxSettings.context, obj, "Make sure the context is properly set in ajaxSettings." );

	jQuery.ajax({
		url: url("data/name.html"),
		complete: function() {
			strictEqual( this, obj, "Make sure the original object is maintained." );
			jQuery.ajax({
				url: url("data/name.html"),
				context: {},
				complete: function() {
					ok( this !== obj, "Make sure overidding context is possible." );
					jQuery.ajaxSetup({
						context: false
					});
					jQuery.ajax({
						url: url("data/name.html"),
						beforeSend: function(){
							this.test = "foo2";
						},
						complete: function() {
							ok( this !== obj, "Make sure unsetting context is possible." );
							start();
						}
					});
				}
			});
		}
	});
});

test("jQuery.ajax() - disabled globals", function() {
	expect( 3 );
	stop();

	jQuery('#foo').ajaxStart(function(){
		ok( false, "ajaxStart" );
	}).ajaxStop(function(){
		ok( false, "ajaxStop" );
	}).ajaxSend(function(){
		ok( false, "ajaxSend" );
	}).ajaxComplete(function(){
		ok( false, "ajaxComplete" );
	}).ajaxError(function(){
		ok( false, "ajaxError" );
	}).ajaxSuccess(function(){
		ok( false, "ajaxSuccess" );
	});

	jQuery.ajax({
		global: false,
		url: url("data/name.html"),
		beforeSend: function(){ ok(true, "beforeSend"); },
		success: function(){ ok(true, "success"); },
		error: function(){ ok(false, "error"); },
		complete: function(){
		  ok(true, "complete");
		  setTimeout(function(){ start(); }, 13);
		}
	});
});

test("jQuery.ajax - xml: non-namespace elements inside namespaced elements", function() {
	expect(3);
	stop();
	jQuery.ajax({
	  url: url("data/with_fries.xml"),
	  dataType: "xml",
	  success: function(resp) {
		equals( jQuery("properties", resp).length, 1, 'properties in responseXML' );
		equals( jQuery("jsconf", resp).length, 1, 'jsconf in responseXML' );
		equals( jQuery("thing", resp).length, 2, 'things in responseXML' );
		start();
	  }
	});
});

test("jQuery.ajax - xml: non-namespace elements inside namespaced elements (over JSONP)", function() {
	expect(3);
	stop();
	jQuery.ajax({
	  url: url("data/with_fries_over_jsonp.php"),
	  dataType: "jsonp xml",
	  success: function(resp) {
		equals( jQuery("properties", resp).length, 1, 'properties in responseXML' );
		equals( jQuery("jsconf", resp).length, 1, 'jsconf in responseXML' );
		equals( jQuery("thing", resp).length, 2, 'things in responseXML' );
		start();
	  },
	  error: function(_1,_2,error) {
		ok( false, error );
		start();
	  }
	});
});

test("jQuery.ajax - HEAD requests", function() {
	expect(2);

	stop();
	jQuery.ajax({
		url: url("data/name.html"),
		type: "HEAD",
		success: function(data, status, xhr){
			var h = xhr.getAllResponseHeaders();
			ok( /Date/i.test(h), 'No Date in HEAD response' );

			jQuery.ajax({
				url: url("data/name.html"),
				data: { whip_it: "good" },
				type: "HEAD",
				success: function(data, status, xhr){
					var h = xhr.getAllResponseHeaders();
					ok( /Date/i.test(h), 'No Date in HEAD response with data' );
					start();
				}
			});
		}
	});

});

test("jQuery.ajax - beforeSend", function() {
	expect(1);
	stop();

	var check = false;

	jQuery.ajaxSetup({ timeout: 0 });

	jQuery.ajax({
		url: url("data/name.html"),
		beforeSend: function(xml) {
			check = true;
		},
		success: function(data) {
			ok( check, "check beforeSend was executed" );
			start();
		}
	});
});

test("jQuery.ajax - beforeSend, cancel request (#2688)", function() {
	expect(2);
	var request = jQuery.ajax({
		url: url("data/name.html"),
		beforeSend: function() {
			ok( true, "beforeSend got called, canceling" );
			return false;
		},
		success: function() {
			ok( false, "request didn't get canceled" );
		},
		complete: function() {
			ok( false, "request didn't get canceled" );
		},
		error: function() {
			ok( false, "request didn't get canceled" );
		}
	});
	ok( request === false, "canceled request must return false instead of XMLHttpRequest instance" );
});

test("jQuery.ajax - beforeSend, cancel request manually", function() {
	expect(2);
	var request = jQuery.ajax({
		url: url("data/name.html"),
		beforeSend: function(xhr) {
			ok( true, "beforeSend got called, canceling" );
			xhr.abort();
		},
		success: function() {
			ok( false, "request didn't get canceled" );
		},
		complete: function() {
			ok( false, "request didn't get canceled" );
		},
		error: function() {
			ok( false, "request didn't get canceled" );
		}
	});
	ok( request === false, "canceled request must return false instead of XMLHttpRequest instance" );
});

window.foobar = null;
window.testFoo = undefined;

test("jQuery.ajax - dataType html", function() {
	expect(5);
	stop();

	var verifyEvaluation = function() {
		equals( testFoo, "foo", 'Check if script was evaluated for datatype html' );
		equals( foobar, "bar", 'Check if script src was evaluated for datatype html' );

		start();
	};

	jQuery.ajax({
	  dataType: "html",
	  url: url("data/test.html"),
	  success: function(data) {
		jQuery("#ap").html(data);
		ok( data.match(/^html text/), 'Check content for datatype html' );
		setTimeout(verifyEvaluation, 600);
	  }
	});
});

test("serialize()", function() {
	expect(5);

	// Add html5 elements only for serialize because selector can't yet find them on non-html5 browsers
	jQuery("#search").after(
		'<input type="email" id="html5email" name="email" value="dave@jquery.com" />'+
		'<input type="number" id="html5number" name="number" value="43" />'
	);

	equals( jQuery('#form').serialize(),
		"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&select5=3",
		'Check form serialization as query string');

	equals( jQuery('#form :input').serialize(),
		"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&select5=3",
		'Check input serialization as query string');

	equals( jQuery('#testForm').serialize(),
		'T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=',
		'Check form serialization as query string');

	equals( jQuery('#testForm :input').serialize(),
		'T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=',
		'Check input serialization as query string');

	equals( jQuery('#form, #testForm').serialize(),
		"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&select5=3&T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
		'Multiple form serialization as query string');

  /* Temporarily disabled. Opera 10 has problems with form serialization.
	equals( jQuery('#form, #testForm :input').serialize(),
		"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
		'Mixed form/input serialization as query string');
	*/
	jQuery("#html5email, #html5number").remove();
});

test("jQuery.param()", function() {
	expect(24);

	equals( !jQuery.ajaxSettings.traditional, true, "traditional flag, falsy by default" );

	var params = {foo:"bar", baz:42, quux:"All your base are belong to us"};
	equals( jQuery.param(params), "foo=bar&baz=42&quux=All+your+base+are+belong+to+us", "simple" );

	params = {someName: [1, 2, 3], regularThing: "blah" };
	equals( jQuery.param(params), "someName%5B%5D=1&someName%5B%5D=2&someName%5B%5D=3&regularThing=blah", "with array" );

	params = {foo: ['a', 'b', 'c']};
	equals( jQuery.param(params), "foo%5B%5D=a&foo%5B%5D=b&foo%5B%5D=c", "with array of strings" );

	params = {foo: ["baz", 42, "All your base are belong to us"] };
	equals( jQuery.param(params), "foo%5B%5D=baz&foo%5B%5D=42&foo%5B%5D=All+your+base+are+belong+to+us", "more array" );

	params = {foo: { bar: 'baz', beep: 42, quux: 'All your base are belong to us' } };
	equals( jQuery.param(params), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All+your+base+are+belong+to+us", "even more arrays" );

	params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
	equals( decodeURIComponent( jQuery.param(params) ), "a[]=1&a[]=2&b[c]=3&b[d][]=4&b[d][]=5&b[e][x][]=6&b[e][y]=7&b[e][z][]=8&b[e][z][]=9&b[f]=true&b[g]=false&b[h]=undefined&i[]=10&i[]=11&j=true&k=false&l[]=undefined&l[]=0&m=cowboy+hat?", "huge structure" );

	params = { a: [ 0, [ 1, 2 ], [ 3, [ 4, 5 ], [ 6 ] ], { b: [ 7, [ 8, 9 ], [ { c: 10, d: 11 } ], [ [ 12 ] ], [ [ [ 13 ] ] ], { e: { f: { g: [ 14, [ 15 ] ] } } }, 16 ] }, 17 ] };
	equals( decodeURIComponent( jQuery.param(params) ), "a[]=0&a[1][]=1&a[1][]=2&a[2][]=3&a[2][1][]=4&a[2][1][]=5&a[2][2][]=6&a[3][b][]=7&a[3][b][1][]=8&a[3][b][1][]=9&a[3][b][2][0][c]=10&a[3][b][2][0][d]=11&a[3][b][3][0][]=12&a[3][b][4][0][0][]=13&a[3][b][5][e][f][g][]=14&a[3][b][5][e][f][g][1][]=15&a[3][b][]=16&a[]=17", "nested arrays" );

	params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
	equals( jQuery.param(params,true), "a=1&a=2&b=%5Bobject+Object%5D&i=10&i=11&j=true&k=false&l=undefined&l=0&m=cowboy+hat%3F", "huge structure, forced traditional" );

	equals( decodeURIComponent( jQuery.param({ a: [1,2,3], 'b[]': [4,5,6], 'c[d]': [7,8,9], e: { f: [10], g: [11,12], h: 13 } }) ), "a[]=1&a[]=2&a[]=3&b[]=4&b[]=5&b[]=6&c[d][]=7&c[d][]=8&c[d][]=9&e[f][]=10&e[g][]=11&e[g][]=12&e[h]=13", "Make sure params are not double-encoded." );

	// Make sure empty arrays and objects are handled #6481
	equals( jQuery.param({"foo": {"bar": []} }), "foo%5Bbar%5D=", "Empty array param" );
	equals( jQuery.param({"foo": {"bar": [], foo: 1} }), "foo%5Bbar%5D=&foo%5Bfoo%5D=1", "Empty array param" );
	equals( jQuery.param({"foo": {"bar": {}} }), "foo%5Bbar%5D=", "Empty object param" );

	// #7945
	equals( jQuery.param({"jquery": "1.4.2"}), "jquery=1.4.2", "Check that object with a jQuery property get serialized correctly" );

	jQuery.ajaxSetup({ traditional: true });

	var params = {foo:"bar", baz:42, quux:"All your base are belong to us"};
	equals( jQuery.param(params), "foo=bar&baz=42&quux=All+your+base+are+belong+to+us", "simple" );

	params = {someName: [1, 2, 3], regularThing: "blah" };
	equals( jQuery.param(params), "someName=1&someName=2&someName=3&regularThing=blah", "with array" );

	params = {foo: ['a', 'b', 'c']};
	equals( jQuery.param(params), "foo=a&foo=b&foo=c", "with array of strings" );

	params = {"foo[]":["baz", 42, "All your base are belong to us"]};
	equals( jQuery.param(params), "foo%5B%5D=baz&foo%5B%5D=42&foo%5B%5D=All+your+base+are+belong+to+us", "more array" );

	params = {"foo[bar]":"baz", "foo[beep]":42, "foo[quux]":"All your base are belong to us"};
	equals( jQuery.param(params), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All+your+base+are+belong+to+us", "even more arrays" );

	params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
	equals( jQuery.param(params), "a=1&a=2&b=%5Bobject+Object%5D&i=10&i=11&j=true&k=false&l=undefined&l=0&m=cowboy+hat%3F", "huge structure" );

	params = { a: [ 0, [ 1, 2 ], [ 3, [ 4, 5 ], [ 6 ] ], { b: [ 7, [ 8, 9 ], [ { c: 10, d: 11 } ], [ [ 12 ] ], [ [ [ 13 ] ] ], { e: { f: { g: [ 14, [ 15 ] ] } } }, 16 ] }, 17 ] };
	equals( jQuery.param(params), "a=0&a=1%2C2&a=3%2C4%2C5%2C6&a=%5Bobject+Object%5D&a=17", "nested arrays (not possible when jQuery.param.traditional == true)" );

	params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
	equals( decodeURIComponent( jQuery.param(params,false) ), "a[]=1&a[]=2&b[c]=3&b[d][]=4&b[d][]=5&b[e][x][]=6&b[e][y]=7&b[e][z][]=8&b[e][z][]=9&b[f]=true&b[g]=false&b[h]=undefined&i[]=10&i[]=11&j=true&k=false&l[]=undefined&l[]=0&m=cowboy+hat?", "huge structure, forced not traditional" );

	params = { param1: null };
	equals( jQuery.param(params,false), "param1=null", "Make sure that null params aren't traversed." );

	params = {'test': {'length': 3, 'foo': 'bar'} };
	equals( jQuery.param( params, false ), "test%5Blength%5D=3&test%5Bfoo%5D=bar", "Sub-object with a length property" );
});

test("synchronous request", function() {
	expect(1);
	ok( /^{ "data"/.test( jQuery.ajax({url: url("data/json_obj.js"), dataType: "text", async: false}).responseText ), "check returned text" );
});

test("synchronous request with callbacks", function() {
	expect(2);
	var result;
	jQuery.ajax({url: url("data/json_obj.js"), async: false, dataType: "text", success: function(data) { ok(true, "sucess callback executed"); result = data; } });
	ok( /^{ "data"/.test( result ), "check returned text" );
});

test("pass-through request object", function() {
	expect(8);
	stop();

	var target = "data/name.html";
	var successCount = 0;
	var errorCount = 0;
	var errorEx = "";
	var success = function() {
		successCount++;
	};
	jQuery("#foo").ajaxError(function (e, xml, s, ex) {
		errorCount++;
		errorEx += ": " + xml.status;
	});
	jQuery("#foo").one('ajaxStop', function () {
		equals(successCount, 5, "Check all ajax calls successful");
		equals(errorCount, 0, "Check no ajax errors (status" + errorEx + ")");
		jQuery("#foo").unbind('ajaxError');

		start();
	});

	ok( jQuery.get(url(target), success), "get" );
	ok( jQuery.post(url(target), success), "post" );
	ok( jQuery.getScript(url("data/test.js"), success), "script" );
	ok( jQuery.getJSON(url("data/json_obj.js"), success), "json" );
	ok( jQuery.ajax({url: url(target), success: success}), "generic" );
});

test("ajax cache", function () {
	expect(18);

	stop();

	var count = 0;

	jQuery("#firstp").bind("ajaxSuccess", function (e, xml, s) {
		var re = /_=(.*?)(&|$)/g;
		var oldOne = null;
		for (var i = 0; i < 6; i++) {
			var ret = re.exec(s.url);
			if (!ret) {
				break;
			}
			oldOne = ret[1];
		}
		equals(i, 1, "Test to make sure only one 'no-cache' parameter is there");
		ok(oldOne != "tobereplaced555", "Test to be sure parameter (if it was there) was replaced");
		if(++count == 6)
			start();
	});

	ok( jQuery.ajax({url: "data/text.php", cache:false}), "test with no parameters" );
	ok( jQuery.ajax({url: "data/text.php?pizza=true", cache:false}), "test with 1 parameter" );
	ok( jQuery.ajax({url: "data/text.php?_=tobereplaced555", cache:false}), "test with _= parameter" );
	ok( jQuery.ajax({url: "data/text.php?pizza=true&_=tobereplaced555", cache:false}), "test with 1 parameter plus _= one" );
	ok( jQuery.ajax({url: "data/text.php?_=tobereplaced555&tv=false", cache:false}), "test with 1 parameter plus _= one before it" );
	ok( jQuery.ajax({url: "data/text.php?name=David&_=tobereplaced555&washere=true", cache:false}), "test with 2 parameters surrounding _= one" );
});

/*
 * Test disabled.
 * The assertions expect that the passed-in object will be modified,
 * which shouldn't be the case. Fixes #5439.
test("global ajaxSettings", function() {
	expect(2);

	var tmp = jQuery.extend({}, jQuery.ajaxSettings);
	var orig = { url: "data/with_fries.xml" };
	var t;

	jQuery.ajaxSetup({ data: {foo: 'bar', bar: 'BAR'} });

	t = jQuery.extend({}, orig);
	t.data = {};
	jQuery.ajax(t);
	ok( t.url.indexOf('foo') > -1 && t.url.indexOf('bar') > -1, "Check extending {}" );

	t = jQuery.extend({}, orig);
	t.data = { zoo: 'a', ping: 'b' };
	jQuery.ajax(t);
	ok( t.url.indexOf('ping') > -1 && t.url.indexOf('zoo') > -1 && t.url.indexOf('foo') > -1 && t.url.indexOf('bar') > -1, "Check extending { zoo: 'a', ping: 'b' }" );

	jQuery.ajaxSettings = tmp;
});
*/

test("load(String)", function() {
	expect(1);
	stop(); // check if load can be called with only url
	jQuery('#first').load("data/name.html", start);
});

test("load('url selector')", function() {
	expect(1);
	stop(); // check if load can be called with only url
	jQuery('#first').load("data/test3.html div.user", function(){
		equals( jQuery(this).children("div").length, 2, "Verify that specific elements were injected" );
		start();
	});
});

test("load(String, Function) with ajaxSetup on dataType json, see #2046", function() {
	expect(1);
	stop();
	jQuery.ajaxSetup({ dataType: "json" });
	jQuery("#first").ajaxComplete(function (e, xml, s) {
		equals( s.dataType, "html", "Verify the load() dataType was html" );
		jQuery("#first").unbind("ajaxComplete");
		jQuery.ajaxSetup({ dataType: "" });
		start();
	});
	jQuery('#first').load("data/test3.html");
});

test("load(String, Function) - simple: inject text into DOM", function() {
	expect(2);
	stop();
	jQuery('#first').load(url("data/name.html"), function() {
		ok( /^ERROR/.test(jQuery('#first').text()), 'Check if content was injected into the DOM' );
		start();
	});
});

test("load(String, Function) - check scripts", function() {
	expect(7);
	stop();

	var verifyEvaluation = function() {
		equals( foobar, "bar", 'Check if script src was evaluated after load' );
		equals( jQuery('#ap').html(), 'bar', 'Check if script evaluation has modified DOM');

		start();
	};
	jQuery('#first').load(url('data/test.html'), function() {
		ok( jQuery('#first').html().match(/^html text/), 'Check content after loading html' );
		equals( jQuery('#foo').html(), 'foo', 'Check if script evaluation has modified DOM');
		equals( testFoo, "foo", 'Check if script was evaluated after load' );
		setTimeout(verifyEvaluation, 600);
	});
});

test("load(String, Function) - check file with only a script tag", function() {
	expect(3);
	stop();

	jQuery('#first').load(url('data/test2.html'), function() {
		equals( jQuery('#foo').html(), 'foo', 'Check if script evaluation has modified DOM');
		equals( testFoo, "foo", 'Check if script was evaluated after load' );

		start();
	});
});

test("load(String, Function) - dataFilter in ajaxSettings", function() {
	expect(2);
	stop();
	jQuery.ajaxSetup({ dataFilter: function() { return "Hello World"; } });
	var div = jQuery("<div/>").load(url("data/name.html"), function(responseText) {
		strictEqual( div.html(), "Hello World" , "Test div was filled with filtered data" );
		strictEqual( responseText, "Hello World" , "Test callback receives filtered data" );
		jQuery.ajaxSetup({ dataFilter: 0 });
		start();
	});
});

test("load(String, Object, Function)", function() {
	expect(2);
	stop();

	jQuery('<div />').load(url('data/params_html.php'), { foo:3, bar:'ok' }, function() {
		var $post = jQuery(this).find('#post');
		equals( $post.find('#foo').text(), '3', 'Check if a hash of data is passed correctly');
		equals( $post.find('#bar').text(), 'ok', 'Check if a hash of data is passed correctly');
		start();
	});
});

test("load(String, String, Function)", function() {
	expect(2);
	stop();

	jQuery('<div />').load(url('data/params_html.php'), 'foo=3&bar=ok', function() {
		var $get = jQuery(this).find('#get');
		equals( $get.find('#foo').text(), '3', 'Check if a string of data is passed correctly');
		equals( $get.find('#bar').text(), 'ok', 'Check if a	 of data is passed correctly');
		start();
	});
});

test("jQuery.get(String, Function) - data in ajaxSettings (#8277)", function() {
	expect(1);
	stop();
	jQuery.ajaxSetup({
		data: "helloworld"
	});
	jQuery.get(url('data/echoQuery.php'), function(data) {
		ok( /helloworld$/.test( data ), 'Data from ajaxSettings was used');
		jQuery.ajaxSetup({
			data: null
		});
		start();
	});
});

test("jQuery.get(String, Hash, Function) - parse xml and use text() on nodes", function() {
	expect(2);
	stop();
	jQuery.get(url('data/dashboard.xml'), function(xml) {
		var content = [];
		jQuery('tab', xml).each(function() {
			content.push(jQuery(this).text());
		});
		equals( content[0], 'blabla', 'Check first tab');
		equals( content[1], 'blublu', 'Check second tab');
		start();
	});
});

test("jQuery.getScript(String, Function) - with callback", function() {
	expect(3);
	stop();
	jQuery.getScript(url("data/test.js"), function( data, _, jqXHR ) {
		equals( foobar, "bar", 'Check if script was evaluated' );
		strictEqual( data, jqXHR.responseText, "Same-domain script requests returns the source of the script (#8082)" );
		setTimeout(start, 100);
	});
});

test("jQuery.getScript(String, Function) - no callback", function() {
	expect(1);
	stop();
	jQuery.getScript(url("data/test.js"), function(){
		start();
	});
});

jQuery.each( [ "Same Domain", "Cross Domain" ] , function( crossDomain , label ) {

	test("jQuery.ajax() - JSONP, " + label, function() {
		expect(20);

		var count = 0;
		function plus(){ if ( ++count == 18 ) start(); }

		stop();

		jQuery.ajax({
			url: "data/jsonp.php",
			dataType: "jsonp",
			crossDomain: crossDomain,
			success: function(data){
				ok( data.data, "JSON results returned (GET, no callback)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, no callback)" );
				plus();
			}
		});

		jQuery.ajax({
			url: "data/jsonp.php?callback=?",
			dataType: "jsonp",
			crossDomain: crossDomain,
			success: function(data){
				ok( data.data, "JSON results returned (GET, url callback)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, url callback)" );
				plus();
			}
		});

		jQuery.ajax({
			url: "data/jsonp.php",
			dataType: "jsonp",
			crossDomain: crossDomain,
			data: "callback=?",
			success: function(data){
				ok( data.data, "JSON results returned (GET, data callback)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, data callback)" );
				plus();
			}
		});

		jQuery.ajax({
			url: "data/jsonp.php?callback=??",
			dataType: "jsonp",
			crossDomain: crossDomain,
			success: function(data){
				ok( data.data, "JSON results returned (GET, url context-free callback)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, url context-free callback)" );
				plus();
			}
		});

		jQuery.ajax({
			url: "data/jsonp.php",
			dataType: "jsonp",
			crossDomain: crossDomain,
			data: "callback=??",
			success: function(data){
				ok( data.data, "JSON results returned (GET, data context-free callback)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, data context-free callback)" );
				plus();
			}
		});

		jQuery.ajax({
			url: "data/jsonp.php/??",
			dataType: "jsonp",
			crossDomain: crossDomain,
			success: function(data){
				ok( data.data, "JSON results returned (GET, REST-like)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, REST-like)" );
				plus();
			}
		});

		jQuery.ajax({
			url: "data/jsonp.php/???json=1",
			dataType: "jsonp",
			crossDomain: crossDomain,
			success: function(data){
				strictEqual( jQuery.type(data), "array", "JSON results returned (GET, REST-like with param)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, REST-like with param)" );
				plus();
			}
		});

		jQuery.ajax({
			url: "data/jsonp.php",
			dataType: "jsonp",
			crossDomain: crossDomain,
			jsonp: "callback",
			success: function(data){
				ok( data.data, "JSON results returned (GET, data obj callback)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, data obj callback)" );
				plus();
			}
		});

		window.jsonpResults = function(data) {
			ok( data.data, "JSON results returned (GET, custom callback function)" );
			window.jsonpResults = undefined;
			plus();
		};

		jQuery.ajax({
			url: "data/jsonp.php",
			dataType: "jsonp",
			crossDomain: crossDomain,
			jsonpCallback: "jsonpResults",
			success: function(data){
				ok( data.data, "JSON results returned (GET, custom callback name)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, custom callback name)" );
				plus();
			}
		});

		jQuery.ajax({
			url: "data/jsonp.php",
			dataType: "jsonp",
			crossDomain: crossDomain,
			jsonpCallback: "functionToCleanUp",
			success: function(data){
				ok( data.data, "JSON results returned (GET, custom callback name to be cleaned up)" );
				strictEqual( window.functionToCleanUp, undefined, "Callback was removed (GET, custom callback name to be cleaned up)" );
				plus();
				var xhr;
				jQuery.ajax({
					url: "data/jsonp.php",
					dataType: "jsonp",
					crossDomain: crossDomain,
					jsonpCallback: "functionToCleanUp",
					beforeSend: function( jqXHR ) {
						xhr = jqXHR;
						return false;
					}
				});
				xhr.error(function() {
					ok( true, "Ajax error JSON (GET, custom callback name to be cleaned up)" );
					strictEqual( window.functionToCleanUp, undefined, "Callback was removed after early abort (GET, custom callback name to be cleaned up)" );
					plus();
				});
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, custom callback name to be cleaned up)" );
				plus();
			}
		});

		jQuery.ajax({
			type: "POST",
			url: "data/jsonp.php",
			dataType: "jsonp",
			crossDomain: crossDomain,
			success: function(data){
				ok( data.data, "JSON results returned (POST, no callback)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, data obj callback)" );
				plus();
			}
		});

		jQuery.ajax({
			type: "POST",
			url: "data/jsonp.php",
			data: "callback=?",
			dataType: "jsonp",
			crossDomain: crossDomain,
			success: function(data){
				ok( data.data, "JSON results returned (POST, data callback)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (POST, data callback)" );
				plus();
			}
		});

		jQuery.ajax({
			type: "POST",
			url: "data/jsonp.php",
			jsonp: "callback",
			dataType: "jsonp",
			crossDomain: crossDomain,
			success: function(data){
				ok( data.data, "JSON results returned (POST, data obj callback)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (POST, data obj callback)" );
				plus();
			}
		});

		//#7578
		jQuery.ajax({
			url: "data/jsonp.php",
			dataType: "jsonp",
			crossDomain: crossDomain,
			beforeSend: function(){
				strictEqual( this.cache, false, "cache must be false on JSON request" );
				plus();
				return false;
			}
		});

		jQuery.ajax({
			url: "data/jsonp.php?callback=XXX",
			dataType: "jsonp",
			jsonp: false,
			jsonpCallback: "XXX",
			crossDomain: crossDomain,
			beforeSend: function() {
				ok( /^data\/jsonp.php\?callback=XXX&_=\d+$/.test( this.url ) ,
					"The URL wasn't messed with (GET, custom callback name with no url manipulation)" );
				plus();
			},
			success: function(data){
				ok( data.data, "JSON results returned (GET, custom callback name with no url manipulation)" );
				plus();
			},
			error: function(data){
				ok( false, "Ajax error JSON (GET, custom callback name with no url manipulation)" );
				plus();
			}
		});

	});
});

test("jQuery.ajax() - script, Remote", function() {
	expect(2);

	var base = window.location.href.replace(/[^\/]*$/, "");

	stop();

	jQuery.ajax({
		url: base + "data/test.js",
		dataType: "script",
		success: function(data){
			ok( foobar, "Script results returned (GET, no callback)" );
			start();
		}
	});
});

test("jQuery.ajax() - script, Remote with POST", function() {
	expect(3);

	var base = window.location.href.replace(/[^\/]*$/, "");

	stop();

	jQuery.ajax({
		url: base + "data/test.js",
		type: "POST",
		dataType: "script",
		success: function(data, status){
			ok( foobar, "Script results returned (POST, no callback)" );
			equals( status, "success", "Script results returned (POST, no callback)" );
			start();
		},
		error: function(xhr) {
			ok( false, "ajax error, status code: " + xhr.status );
			start();
		}
	});
});

test("jQuery.ajax() - script, Remote with scheme-less URL", function() {
	expect(2);

	var base = window.location.href.replace(/[^\/]*$/, "");
	base = base.replace(/^.*?\/\//, "//");

	stop();

	jQuery.ajax({
		url: base + "data/test.js",
		dataType: "script",
		success: function(data){
			ok( foobar, "Script results returned (GET, no callback)" );
			start();
		}
	});
});

test("jQuery.ajax() - malformed JSON", function() {
	expect(2);

	stop();

	jQuery.ajax({
		url: "data/badjson.js",
		dataType: "json",
		success: function(){
			ok( false, "Success." );
			start();
		},
		error: function(xhr, msg, detailedMsg) {
			equals( "parsererror", msg, "A parse error occurred." );
			ok( /^Invalid JSON/.test(detailedMsg), "Detailed parsererror message provided" );
	  		start();
		}
	});
});

test("jQuery.ajax() - script by content-type", function() {
	expect(2);

	stop();

	jQuery.when(

		jQuery.ajax({
			url: "data/script.php",
			data: { header: "script" }
		}),

		jQuery.ajax({
			url: "data/script.php",
			data: { header: "ecma" }
		})

	).then( start, start );
});

test("jQuery.ajax() - json by content-type", function() {
	expect(5);

	stop();

	jQuery.ajax({
		url: "data/json.php",
		data: { header: "json", json: "array" },
		success: function( json ) {
	  		ok( json.length >= 2, "Check length");
	  		equals( json[0].name, 'John', 'Check JSON: first, name' );
	  		equals( json[0].age, 21, 'Check JSON: first, age' );
	  		equals( json[1].name, 'Peter', 'Check JSON: second, name' );
	  		equals( json[1].age, 25, 'Check JSON: second, age' );
	  		start();
		}
	});
});

test("jQuery.ajax() - json by content-type disabled with options", function() {
	expect(6);

	stop();

	jQuery.ajax({
		url: url("data/json.php"),
		data: { header: "json", json: "array" },
		contents: {
			json: false
		},
		success: function( text ) {
			equals( typeof text , "string" , "json wasn't auto-determined" );
			var json = jQuery.parseJSON( text );
	  		ok( json.length >= 2, "Check length");
	  		equals( json[0].name, 'John', 'Check JSON: first, name' );
	  		equals( json[0].age, 21, 'Check JSON: first, age' );
	  		equals( json[1].name, 'Peter', 'Check JSON: second, name' );
	  		equals( json[1].age, 25, 'Check JSON: second, age' );
	  		start();
		}
	});
});

test("jQuery.getJSON(String, Hash, Function) - JSON array", function() {
	expect(5);
	stop();
	jQuery.getJSON(url("data/json.php"), {json: "array"}, function(json) {
	  ok( json.length >= 2, "Check length");
	  equals( json[0].name, 'John', 'Check JSON: first, name' );
	  equals( json[0].age, 21, 'Check JSON: first, age' );
	  equals( json[1].name, 'Peter', 'Check JSON: second, name' );
	  equals( json[1].age, 25, 'Check JSON: second, age' );
	  start();
	});
});

test("jQuery.getJSON(String, Function) - JSON object", function() {
	expect(2);
	stop();
	jQuery.getJSON(url("data/json.php"), function(json) {
	  if (json && json.data) {
		  equals( json.data.lang, 'en', 'Check JSON: lang' );
		  equals( json.data.length, 25, 'Check JSON: length' );
	  }
	  start();
	});
});

test("jQuery.getJSON - Using Native JSON", function() {
	expect(2);

	var old = window.JSON;
	JSON = {
		parse: function(str){
			ok( true, "Verifying that parse method was run" );
			return true;
		}
	};

	stop();
	jQuery.getJSON(url("data/json.php"), function(json) {
		window.JSON = old;
		equals( json, true, "Verifying return value" );
		start();
	});
});

test("jQuery.getJSON(String, Function) - JSON object with absolute url to local content", function() {
	expect(2);

	var base = window.location.href.replace(/[^\/]*$/, "");

	stop();
	jQuery.getJSON(url(base + "data/json.php"), function(json) {
	  equals( json.data.lang, 'en', 'Check JSON: lang' );
	  equals( json.data.length, 25, 'Check JSON: length' );
	  start();
	});
});

test("jQuery.post - data", 3, function() {
	stop();

	jQuery.when(
		jQuery.post( url( "data/name.php" ), { xml: "5-2", length: 3 }, function( xml ) {
			jQuery( 'math', xml ).each( function() {
				equals( jQuery( 'calculation', this ).text(), '5-2', 'Check for XML' );
				equals( jQuery( 'result', this ).text(), '3', 'Check for XML' );
			});
		}),

		jQuery.ajax({
			url: url('data/echoData.php'),
			type: "POST",
			data: {
				'test': {
					'length': 7,
						'foo': 'bar'
				}
			},
			success: function( data ) {
				strictEqual( data, 'test%5Blength%5D=7&test%5Bfoo%5D=bar', 'Check if a sub-object with a length param is serialized correctly');
			}
		})
	).then( start, start );

});

test("jQuery.post(String, Hash, Function) - simple with xml", function() {
	expect(4);
	stop();
	var done = 0;

	jQuery.post(url("data/name.php"), {xml: "5-2"}, function(xml){
	  jQuery('math', xml).each(function() {
			equals( jQuery('calculation', this).text(), '5-2', 'Check for XML' );
			equals( jQuery('result', this).text(), '3', 'Check for XML' );
		 });
	  if ( ++done === 2 ) start();
	});

	jQuery.post(url("data/name.php?xml=5-2"), {}, function(xml){
	  jQuery('math', xml).each(function() {
			equals( jQuery('calculation', this).text(), '5-2', 'Check for XML' );
			equals( jQuery('result', this).text(), '3', 'Check for XML' );
		 });
	  if ( ++done === 2 ) start();
	});
});

test("jQuery.ajaxSetup({timeout: Number}) - with global timeout", function() {
	stop();

	var passed = 0;

	jQuery.ajaxSetup({timeout: 1000});

	var pass = function() {
		passed++;
		if ( passed == 2 ) {
			ok( true, 'Check local and global callbacks after timeout' );
			jQuery('#main').unbind("ajaxError");
			start();
		}
	};

	var fail = function(a,b,c) {
		ok( false, 'Check for timeout failed ' + a + ' ' + b );
		start();
	};

	jQuery('#main').ajaxError(pass);

	jQuery.ajax({
	  type: "GET",
	  url: url("data/name.php?wait=5"),
	  error: pass,
	  success: fail
	});

	// reset timeout
	jQuery.ajaxSetup({timeout: 0});
});

test("jQuery.ajaxSetup({timeout: Number}) with localtimeout", function() {
	stop();
	jQuery.ajaxSetup({timeout: 50});

	jQuery.ajax({
	  type: "GET",
	  timeout: 15000,
	  url: url("data/name.php?wait=1"),
	  error: function() {
		   ok( false, 'Check for local timeout failed' );
		   start();
	  },
	  success: function() {
		ok( true, 'Check for local timeout' );
		start();
	  }
	});

	// reset timeout
	jQuery.ajaxSetup({timeout: 0});
});

test("jQuery.ajax - simple get", function() {
	expect(1);
	stop();
	jQuery.ajax({
	  type: "GET",
	  url: url("data/name.php?name=foo"),
	  success: function(msg){
		equals( msg, 'bar', 'Check for GET' );
		start();
	  }
	});
});

test("jQuery.ajax - simple post", function() {
	expect(1);
	stop();
	jQuery.ajax({
	  type: "POST",
	  url: url("data/name.php"),
	  data: "name=peter",
	  success: function(msg){
		equals( msg, 'pan', 'Check for POST' );
		start();
	  }
	});
});

test("ajaxSetup()", function() {
	expect(1);
	stop();
	jQuery.ajaxSetup({
		url: url("data/name.php?name=foo"),
		success: function(msg){
			equals( msg, 'bar', 'Check for GET' );
			start();
		}
	});
	jQuery.ajax();
});

/*
test("custom timeout does not set error message when timeout occurs, see #970", function() {
	stop();
	jQuery.ajax({
		url: "data/name.php?wait=1",
		timeout: 500,
		error: function(request, status) {
			ok( status != null, "status shouldn't be null in error handler" );
			equals( "timeout", status );
			start();
		}
	});
});
*/

test("data option: evaluate function values (#2806)", function() {
	stop();
	jQuery.ajax({
		url: "data/echoQuery.php",
		data: {
			key: function() {
				return "value";
			}
		},
		success: function(result) {
			equals( result, "key=value" );
			start();
		}
	});
});

test("data option: empty bodies for non-GET requests", function() {
	stop();
	jQuery.ajax({
		url: "data/echoData.php",
		data: undefined,
		type: "post",
		success: function(result) {
			equals( result, "" );
			start();
		}
	});
});

var ifModifiedNow = new Date();

jQuery.each( { " (cache)": true, " (no cache)": false }, function( label, cache ) {

	test("jQuery.ajax - If-Modified-Since support" + label, function() {
		expect( 3 );

		stop();

		var url = "data/if_modified_since.php?ts=" + ifModifiedNow++;

		jQuery.ajax({
			url: url,
			ifModified: true,
			cache: cache,
			success: function(data, status) {
				equals(status, "success" );

				jQuery.ajax({
					url: url,
					ifModified: true,
					cache: cache,
					success: function(data, status) {
						if ( data === "FAIL" ) {
							ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
							ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
						} else {
							equals(status, "notmodified");
							ok(data == null, "response body should be empty");
						}
						start();
			        },
					error: function() {
						// Do this because opera simply refuses to implement 304 handling :(
						// A feature-driven way of detecting this would be appreciated
						// See: http://gist.github.com/599419
						ok(jQuery.browser.opera, "error");
						ok(jQuery.browser.opera, "error");
						start();
					}
				});
			},
			error: function() {
				equals(false, "error");
				// Do this because opera simply refuses to implement 304 handling :(
				// A feature-driven way of detecting this would be appreciated
				// See: http://gist.github.com/599419
				ok(jQuery.browser.opera, "error");
				start();
			}
		});
	});

	test("jQuery.ajax - Etag support" + label, function() {
		expect( 3 );

		stop();

		var url = "data/etag.php?ts=" + ifModifiedNow++;

		jQuery.ajax({
			url: url,
			ifModified: true,
			cache: cache,
			success: function(data, status) {
				equals(status, "success" );

				jQuery.ajax({
					url: url,
					ifModified: true,
					cache: cache,
					success: function(data, status) {
						if ( data === "FAIL" ) {
							ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
							ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
						} else {
							equals(status, "notmodified");
							ok(data == null, "response body should be empty");
						}
						start();
			        },
			        error: function() {
						// Do this because opera simply refuses to implement 304 handling :(
						// A feature-driven way of detecting this would be appreciated
						// See: http://gist.github.com/599419
						ok(jQuery.browser.opera, "error");
						ok(jQuery.browser.opera, "error");
						start();
					}
				});
			},
			error: function() {
				// Do this because opera simply refuses to implement 304 handling :(
				// A feature-driven way of detecting this would be appreciated
				// See: http://gist.github.com/599419
				ok(jQuery.browser.opera, "error");
				start();
			}
		});
	});
});

test("jQuery ajax - failing cross-domain", function() {

	expect( 2 );

	stop();

	var i = 2;

	jQuery.ajax({
		url: 'http://somewebsitethatdoesnotexist-67864863574657654.com',
		success: function(){ ok( false , "success" ); },
		error: function(xhr,_,e){ ok( true , "file not found: " + xhr.status + " => " + e ); },
		complete: function() { if ( ! --i ) start(); }
	});

	jQuery.ajax({
		url: 'http://www.google.com',
		success: function(){ ok( false , "success" ); },
		error: function(xhr,_,e){ ok( true , "access denied: " + xhr.status + " => " + e ); },
		complete: function() { if ( ! --i ) start(); }
	});

});

test("jQuery ajax - atom+xml", function() {

	stop();

	jQuery.ajax({
		url: url( 'data/atom+xml.php' ),
		success: function(){ ok( true , "success" ); },
		error: function(){ ok( false , "error" ); },
		complete: function() { start(); }
	});

});

test( "jQuery.ajax - Location object as url (#7531)", 1, function () {
	var success = false;
	try {
		var xhr = jQuery.ajax({ url: window.location });
		success = true;
		xhr.abort();
	} catch (e) {}

	ok( success, "document.location did not generate exception" );
});

test( "jQuery.ajax - statusCode" , function() {

	var count = 12;

	expect( 20 );
	stop();

	function countComplete() {
		if ( ! --count ) {
			start();
		}
	}

	function createStatusCodes( name , isSuccess ) {
		name = "Test " + name + " " + ( isSuccess ? "success" : "error" );
		return {
			200: function() {
				ok( isSuccess , name );
			},
			404: function() {
				ok( ! isSuccess , name );
			}
		};
	}

	jQuery.each( {
		"data/name.html": true,
		"data/someFileThatDoesNotExist.html": false
	} , function( uri , isSuccess ) {

		jQuery.ajax( url( uri ) , {
			statusCode: createStatusCodes( "in options" , isSuccess ),
			complete: countComplete
		});

		jQuery.ajax( url( uri ) , {
			complete: countComplete
		}).statusCode( createStatusCodes( "immediately with method" , isSuccess ) );

		jQuery.ajax( url( uri ) , {
			complete: function(jqXHR) {
				jqXHR.statusCode( createStatusCodes( "on complete" , isSuccess ) );
				countComplete();
			}
		});

		jQuery.ajax( url( uri ) , {
			complete: function(jqXHR) {
				setTimeout( function() {
					jqXHR.statusCode( createStatusCodes( "very late binding" , isSuccess ) );
					countComplete();
				} , 100 );
			}
		});

		jQuery.ajax( url( uri ) , {
			statusCode: createStatusCodes( "all (options)" , isSuccess ),
			complete: function(jqXHR) {
				jqXHR.statusCode( createStatusCodes( "all (on complete)" , isSuccess ) );
				setTimeout( function() {
					jqXHR.statusCode( createStatusCodes( "all (very late binding)" , isSuccess ) );
					countComplete();
				} , 100 );
			}
		}).statusCode( createStatusCodes( "all (immediately with method)" , isSuccess ) );

		var testString = "";

		jQuery.ajax( url( uri ), {
			success: function( a , b , jqXHR ) {
				ok( isSuccess , "success" );
				var statusCode = {};
				statusCode[ jqXHR.status ] = function() {
					testString += "B";
				};
				jqXHR.statusCode( statusCode );
				testString += "A";
			},
			error: function( jqXHR ) {
				ok( ! isSuccess , "error" );
				var statusCode = {};
				statusCode[ jqXHR.status ] = function() {
					testString += "B";
				};
				jqXHR.statusCode( statusCode );
				testString += "A";
			},
			complete: function() {
				strictEqual( testString , "AB" , "Test statusCode callbacks are ordered like " +
						( isSuccess ? "success" :  "error" ) + " callbacks" );
				countComplete();
			}
		} );

	});
});

test("jQuery.ajax - transitive conversions", function() {

	expect( 8 );

	stop();

	jQuery.when(

		jQuery.ajax( url("data/json.php") , {
			converters: {
				"json myJson": function( data ) {
					ok( true , "converter called" );
					return data;
				}
			},
			dataType: "myJson",
			success: function() {
				ok( true , "Transitive conversion worked" );
				strictEqual( this.dataTypes[0] , "text" , "response was retrieved as text" );
				strictEqual( this.dataTypes[1] , "myjson" , "request expected myjson dataType" );
			}
		}),

		jQuery.ajax( url("data/json.php") , {
			converters: {
				"json myJson": function( data ) {
					ok( true , "converter called (*)" );
					return data;
				}
			},
			contents: false, /* headers are wrong so we ignore them */
			dataType: "* myJson",
			success: function() {
				ok( true , "Transitive conversion worked (*)" );
				strictEqual( this.dataTypes[0] , "text" , "response was retrieved as text (*)" );
				strictEqual( this.dataTypes[1] , "myjson" , "request expected myjson dataType (*)" );
			}
		})

	).then( start , start );

});

test("jQuery.ajax - overrideMimeType", function() {

	expect( 2 );

	stop();

	jQuery.when(

		jQuery.ajax( url("data/json.php") , {
			beforeSend: function( xhr ) {
				xhr.overrideMimeType( "application/json" );
			},
			success: function( json ) {
				ok( json.data , "Mimetype overriden using beforeSend" );
			}
		}),

		jQuery.ajax( url("data/json.php") , {
			mimeType: "application/json",
			success: function( json ) {
				ok( json.data , "Mimetype overriden using mimeType option" );
			}
		})

	).then( start , start );

});

test("jQuery.ajax - abort in prefilter", function() {

	expect( 1 );

	jQuery.ajaxPrefilter(function( options, _, jqXHR ) {
		if ( options.abortInPrefilter ) {
			jqXHR.abort();
		}
	});

	strictEqual( jQuery.ajax({
		abortInPrefilter: true,
		error: function() {
			ok( false, "error callback called" );
		}
	}), false, "Request was properly aborted early by the prefilter" );

});

test("jQuery.ajax - active counter", function() {
    ok( jQuery.active == 0, "ajax active counter should be zero: " + jQuery.active );
});

}

//}