/**

 * Ajax Queue Plugin

 * 

 * Homepage: http://jquery.com/plugins/project/ajaxqueue

 * Documentation: http://docs.jquery.com/AjaxQueue

 */



/**



<script>

$(function(){

	jQuery.ajaxQueue({

		url: "test.php",

		success: function(html){ jQuery("ul").append(html); }

	});

	jQuery.ajaxQueue({

		url: "test.php",

		success: function(html){ jQuery("ul").append(html); }

	});

	jQuery.ajaxSync({

		url: "test.php",

		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }

	});

	jQuery.ajaxSync({

		url: "test.php",

		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }

	});

});

</script>

<ul style="position: absolute; top: 5px; right: 5px;"></ul>



 */

/*

 * Queued Ajax requests.

 * A new Ajax request won't be started until the previous queued 

 * request has finished.

 */



/*

 * Synced Ajax requests.

 * The Ajax request will happen as soon as you call this method, but

 * the callbacks (success/error/complete) won't fire until all previous

 * synced requests have been completed.

 */





(function($) {

	

	var ajax = $.ajax;

	

	var pendingRequests = {};

	

	var synced = [];

	var syncedData = [];

	

	$.ajax = function(settings) {

		// create settings for compatibility with ajaxSetup

		settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings));

		

		var port = settings.port;

		

		switch(settings.mode) {

		case "abort": 

			if ( pendingRequests[port] ) {

				pendingRequests[port].abort();

			}

			return pendingRequests[port] = ajax.apply(this, arguments);

		case "queue": 

			var _old = settings.complete;

			settings.complete = function(){

				if ( _old )

					_old.apply( this, arguments );

				jQuery([ajax]).dequeue("ajax" + port );;

			};

		

			jQuery([ ajax ]).queue("ajax" + port, function(){

				ajax( settings );

			});

			return;

		case "sync":

			var pos = synced.length;

	

			synced[ pos ] = {

				error: settings.error,

				success: settings.success,

				complete: settings.complete,

				done: false

			};

		

			syncedData[ pos ] = {

				error: [],

				success: [],

				complete: []

			};

		

			settings.error = function(){ syncedData[ pos ].error = arguments; };

			settings.success = function(){ syncedData[ pos ].success = arguments; };

			settings.complete = function(){

				syncedData[ pos ].complete = arguments;

				synced[ pos ].done = true;

		

				if ( pos == 0 || !synced[ pos-1 ] )

					for ( var i = pos; i < synced.length && synced[i].done; i++ ) {

						if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error );

						if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success );

						if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete );

		

						synced[i] = null;

						syncedData[i] = null;

					}

			};

		}

		return ajax.apply(this, arguments);

	};

	

})(jQuery);
