/**
 * 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);