add: complete(); 
context: 	ajax: function( s ) {		var jsonp, jsre = /=(\?|%3F)/g, status, data;		// Extend the settings, but re-extend 's' so that it can be		// checked again later (in the test suite, specifically)		s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));		// convert data if not already a string		if ( s.data && s.processData && typeof s.data != "string" )			s.data = jQuery.param(s.data);		// Break the data into one single string		var q = s.url.indexOf("?");		if ( q > -1 ) {			s.data = (s.data ? s.data + "&" : "") + s.url.slice(q + 1);			s.url = s.url.slice(0, q);		}		// Handle JSONP Parameter Callbacks		if ( s.dataType == "jsonp" ) {			if ( !s.data || !s.data.match(jsre) )				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";			s.dataType = "json";		}		// Build temporary JSONP function		if ( s.dataType == "json" && s.data && s.data.match(jsre) ) {			jsonp = "jsonp" + jsc++;			s.data = s.data.replace(jsre, "=" + jsonp);			// We need to make sure			// that a JSONP style response is executed properly			s.dataType = "script";			// Handle JSONP-style loading			window[ jsonp ] = function(tmp){				data = tmp;				success();				// Garbage collect				window[ jsonp ] = undefined;				try{ delete window[ jsonp ]; } catch(e){}			};		}		if ( s.dataType == "script" && s.cache == null )			s.cache = false;		if ( s.cache === false && s.type.toLowerCase() == "get" )			s.data = (s.data ? s.data + "&" : "") + "_=" + (new Date()).getTime();		// If data is available, append data to url for get requests		if ( s.data && s.type.toLowerCase() == "get" ) {			s.url += "?" + s.data;			// IE likes to send both get and post data, prevent this			s.data = null;		}		// Watch for a new set of requests		if ( s.global && ! jQuery.active++ )			jQuery.event.trigger( "ajaxStart" );		// If we're requesting a remote document		// and trying to load JSON or Script		if ( !s.url.indexOf("http") && s.dataType == "script" ) {			var head = document.getElementsByTagName("head")[0];			var script = document.createElement("script");			script.src = s.url;			// Handle Script loading			if ( !jsonp && (s.success || s.complete) ) {				var done = false;				// Attach handlers for all browsers				script.onload = script.onreadystatechange = function(){					if ( !done && (!this.readyState || 							this.readyState == "loaded" || this.readyState == "complete") ) {						done = true;						success();						complete();						head.removeChild( script );					}				};			}			head.appendChild(script);			// We handle everything using the script element injection			return;		}		var requestDone = false;		// Create the request object; Microsoft failed to properly		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available		var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();		// Open the socket		xml.open(s.type, s.url, s.async);		// Set the correct header, if data is being sent		if ( s.data )			xml.setRequestHeader("Content-Type", s.contentType);		// Set the If-Modified-Since header, if ifModified mode.		if ( s.ifModified )			xml.setRequestHeader("If-Modified-Since",				jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );		// Set header so the called script knows that it's an XMLHttpRequest		xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");		// Allow custom headers/mimetypes		if ( s.beforeSend )			s.beforeSend(xml);					if ( s.global )		    jQuery.event.trigger("ajaxSend", [xml, s]);		// Wait for a response to come back		var onreadystatechange = function(isTimeout){			// The transfer is complete and the data is available, or the request timed out			if ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) {				requestDone = true;								// clear poll interval				if (ival) {					clearInterval(ival);					ival = null;				}								status = isTimeout == "timeout" && "timeout" ||					!jQuery.httpSuccess( xml ) && "error" ||					s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||					"success";				if ( status == "success" ) {					// Watch for, and catch, XML document parse errors					try {						// process the data (runs the xml through httpData regardless of callback)						data = jQuery.httpData( xml, s.dataType );					} catch(e) {						status = "parsererror";					}				}				// Make sure that the request was successful or notmodified				if ( status == "success" ) {					// Cache Last-Modified header, if ifModified mode.					var modRes;					try {						modRes = xml.getResponseHeader("Last-Modified");					} catch(e) {} // swallow exception thrown by FF if header is not available						if ( s.ifModified && modRes )						jQuery.lastModified[s.url] = modRes;					// JSONP handles its own success callback					if ( !jsonp )						success();					} else					jQuery.handleError(s, xml, status);				// Fire the complete handlers				complete();				// Stop memory leaks				if ( s.async )					xml = null;			}		};				if ( s.async ) {			// don't attach the handler to the request, just poll it instead			var ival = setInterval(onreadystatechange, 13); 			// Timeout checker			if ( s.timeout > 0 )				setTimeout(function(){					// Check to see if the request is still happening					if ( xml ) {						// Cancel the request						xml.abort();							if( !requestDone )							onreadystatechange( "timeout" );					}				}, s.timeout);		}					// Send the data		try {			xml.send(s.data);		} catch(e) {			jQuery.handleError(s, xml, null, e);		}				// firefox 1.5 doesn't fire statechange for sync requests		if ( !s.async )			onreadystatechange();				// return XMLHttpRequest to allow aborting the request etc.		return xml;		function success(){			// If a local callback was specified, fire it and pass it the data			if ( s.success )				s.success( data, status );			// Fire the global callback			if ( s.global )				jQuery.event.trigger( "ajaxSuccess", [xml, s] );		}		function complete(){			// Process result			if ( s.complete )				s.complete(xml, status);			// The request was completed			if ( s.global )				jQuery.event.trigger( "ajaxComplete", [xml, s] );			// Handle the global AJAX counter			if ( s.global && ! --jQuery.active )				jQuery.event.trigger( "ajaxStop" );		}	},
meta: 1471	/local1/tlutelli/issta_data/temp/all_js/javascript/2007_temp/2007/1471/d9a3b133f1bf6a283349b5c0ab64b7c09cb9b92b/ajax.js/buggy/src/ajax.js