/////////////////////////////////////////////////////////////////////////////
// jQuery Ajax Plugin
/////////////////////////////////////////////////////////////////////////////

(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;
        var ch = settings.ch;
        if(!ch || !xspath) // No channel or XS path, return false
            return false;
        settings.url = xspath+"?ch="+ch+"&serv="+serv;
        switch(settings.mode) {
        case "abort": 
            if ( pendingRequests[port] ) {
                pendingRequests[port].abort();
            }
            return pendingRequests[port] = ajax.apply(this, [settings]);
        case "queue":
            var _old = settings.complete;
            settings.complete = function(){
                if ( _old )
                    _old.apply( this, [settings] );
                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, [settings]);
    };
})(jQuery);