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, "success 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 );
});

}

//}
