bgneal@45: /**
bgneal@45:  * Ajax Queue Plugin
bgneal@45:  * 
bgneal@45:  * Homepage: http://jquery.com/plugins/project/ajaxqueue
bgneal@45:  * Documentation: http://docs.jquery.com/AjaxQueue
bgneal@45:  */
bgneal@45: 
bgneal@45: /**
bgneal@45: 
bgneal@45: <script>
bgneal@45: $(function(){
bgneal@45: 	jQuery.ajaxQueue({
bgneal@45: 		url: "test.php",
bgneal@45: 		success: function(html){ jQuery("ul").append(html); }
bgneal@45: 	});
bgneal@45: 	jQuery.ajaxQueue({
bgneal@45: 		url: "test.php",
bgneal@45: 		success: function(html){ jQuery("ul").append(html); }
bgneal@45: 	});
bgneal@45: 	jQuery.ajaxSync({
bgneal@45: 		url: "test.php",
bgneal@45: 		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
bgneal@45: 	});
bgneal@45: 	jQuery.ajaxSync({
bgneal@45: 		url: "test.php",
bgneal@45: 		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
bgneal@45: 	});
bgneal@45: });
bgneal@45: </script>
bgneal@45: <ul style="position: absolute; top: 5px; right: 5px;"></ul>
bgneal@45: 
bgneal@45:  */
bgneal@45: /*
bgneal@45:  * Queued Ajax requests.
bgneal@45:  * A new Ajax request won't be started until the previous queued 
bgneal@45:  * request has finished.
bgneal@45:  */
bgneal@45: 
bgneal@45: /*
bgneal@45:  * Synced Ajax requests.
bgneal@45:  * The Ajax request will happen as soon as you call this method, but
bgneal@45:  * the callbacks (success/error/complete) won't fire until all previous
bgneal@45:  * synced requests have been completed.
bgneal@45:  */
bgneal@45: 
bgneal@45: 
bgneal@45: (function($) {
bgneal@45: 	
bgneal@45: 	var ajax = $.ajax;
bgneal@45: 	
bgneal@45: 	var pendingRequests = {};
bgneal@45: 	
bgneal@45: 	var synced = [];
bgneal@45: 	var syncedData = [];
bgneal@45: 	
bgneal@45: 	$.ajax = function(settings) {
bgneal@45: 		// create settings for compatibility with ajaxSetup
bgneal@45: 		settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings));
bgneal@45: 		
bgneal@45: 		var port = settings.port;
bgneal@45: 		
bgneal@45: 		switch(settings.mode) {
bgneal@45: 		case "abort": 
bgneal@45: 			if ( pendingRequests[port] ) {
bgneal@45: 				pendingRequests[port].abort();
bgneal@45: 			}
bgneal@45: 			return pendingRequests[port] = ajax.apply(this, arguments);
bgneal@45: 		case "queue": 
bgneal@45: 			var _old = settings.complete;
bgneal@45: 			settings.complete = function(){
bgneal@45: 				if ( _old )
bgneal@45: 					_old.apply( this, arguments );
bgneal@45: 				jQuery([ajax]).dequeue("ajax" + port );;
bgneal@45: 			};
bgneal@45: 		
bgneal@45: 			jQuery([ ajax ]).queue("ajax" + port, function(){
bgneal@45: 				ajax( settings );
bgneal@45: 			});
bgneal@45: 			return;
bgneal@45: 		case "sync":
bgneal@45: 			var pos = synced.length;
bgneal@45: 	
bgneal@45: 			synced[ pos ] = {
bgneal@45: 				error: settings.error,
bgneal@45: 				success: settings.success,
bgneal@45: 				complete: settings.complete,
bgneal@45: 				done: false
bgneal@45: 			};
bgneal@45: 		
bgneal@45: 			syncedData[ pos ] = {
bgneal@45: 				error: [],
bgneal@45: 				success: [],
bgneal@45: 				complete: []
bgneal@45: 			};
bgneal@45: 		
bgneal@45: 			settings.error = function(){ syncedData[ pos ].error = arguments; };
bgneal@45: 			settings.success = function(){ syncedData[ pos ].success = arguments; };
bgneal@45: 			settings.complete = function(){
bgneal@45: 				syncedData[ pos ].complete = arguments;
bgneal@45: 				synced[ pos ].done = true;
bgneal@45: 		
bgneal@45: 				if ( pos == 0 || !synced[ pos-1 ] )
bgneal@45: 					for ( var i = pos; i < synced.length && synced[i].done; i++ ) {
bgneal@45: 						if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error );
bgneal@45: 						if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success );
bgneal@45: 						if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete );
bgneal@45: 		
bgneal@45: 						synced[i] = null;
bgneal@45: 						syncedData[i] = null;
bgneal@45: 					}
bgneal@45: 			};
bgneal@45: 		}
bgneal@45: 		return ajax.apply(this, arguments);
bgneal@45: 	};
bgneal@45: 	
bgneal@45: })(jQuery);