[Mapbender-commits] r2388 - branches/2.5/http/extensions

svn_mapbender at osgeo.org svn_mapbender at osgeo.org
Wed Apr 16 09:40:55 EDT 2008


Author: christoph
Date: 2008-04-16 09:40:55 -0400 (Wed, 16 Apr 2008)
New Revision: 2388

Added:
   branches/2.5/http/extensions/jquery.ajaxmanager.js
Log:
jquery ajax manager, see http://www.protofunc.com/scripts/jquery/ajaxManager/

Added: branches/2.5/http/extensions/jquery.ajaxmanager.js
===================================================================
--- branches/2.5/http/extensions/jquery.ajaxmanager.js	                        (rev 0)
+++ branches/2.5/http/extensions/jquery.ajaxmanager.js	2008-04-16 13:40:55 UTC (rev 2388)
@@ -0,0 +1,165 @@
+/**
+ * @author Administrator
+ */
+(function($) {
+    $.extend({
+        manageAjax: function(o){
+          o = $.extend({manageType: 'normal',maxReq: 0, blockSameRequest: false},o);
+          return new $.ajaxManager(o);
+        },
+        ajaxManager: function(o){
+            this.opt = o;
+            this.queue = [];
+        }
+	});
+    $.extend(
+        $.ajaxManager.prototype,
+        {
+            add: function(o){
+                 var quLen = this.queue.length, s = this.opt, q = this.queue, self = this,i,j;
+                 var cD = (o.data && typeof o.data != "string")?$.param(o.data):o.data;
+                 if(s.blockSameRequest){
+                    var toPrevent = false;
+                    for (var i = 0;i<quLen; i++){
+                        if(q[i] && q[i].data === cD && q[i].url === o.url && q[i].type === o.type) {
+                            toPrevent = true;
+                            break;
+                        }
+                    }
+                    if(toPrevent)
+                        return false;
+                 }
+                 q[ quLen ] = {
+            		fnError: o.error,
+            		fnSuccess: o.success,
+            		fnComplete: o.complete,
+                    fnAbort: o.abort,
+            		error: [],
+            		success: [],
+            		complete: [],
+            		done: false,
+            		queued: false,
+                    data: cD,
+                    url: o.url,
+                    type: o.type,
+                    xhr: null
+            	};
+                
+                o.error = function(){if(q[ quLen ]) q[ quLen ].error = arguments; };
+            	o.success = function(){if(q[ quLen ]) q[ quLen ].success = arguments; };
+                o.abort = function(){if(q[ quLen ]) q[ quLen ].abort = arguments; };
+                function startCallbacks(num){
+                    if ( q[ num ].fnError ) q[ num ].fnError.apply( $, q[ num ].error );
+        			if ( q[ num ].fnSuccess ) q[ num ].fnSuccess.apply( $, q[ num ].success );
+        			if ( q[ num ].fnComplete ) q[ num ].fnComplete.apply( $, q[ num ].complete );
+        			self.abort(num,true);
+                }
+                
+            	o.complete = function(){
+            		if(!q[ quLen ])
+                        return;
+                    q[ quLen ].complete = arguments;
+            		q[ quLen ].done = true;
+                    switch (s.manageType) {
+                      case 'sync':
+                        if (quLen === 0 || !q[ quLen-1 ]){
+                            var curQLen = q.length;
+                			for ( i = quLen; i < curQLen; i++ ) {
+                                if(q[i]){
+                                    if(q[i].done) 
+                                        startCallbacks(i)
+                                    else
+                                        break;
+                                }
+                                
+                			}
+                        }
+                        break;
+                        case 'queue':
+                        if (quLen === 0 || !q[ quLen-1 ]){
+                            var curQLen = q.length;
+                			for ( i = 0, j = 0; i < curQLen; i++ ) {
+                                if(q[i] && q[i].queued){
+                                    q[i].xhr = jQuery.ajax(q[i].xhr);
+                                    q[i].queued = false;
+                                    break;
+                                }
+                			}
+                        }
+                        startCallbacks(quLen);
+                        break;
+                      case 'abortOld':
+                        startCallbacks(quLen);
+                        for ( i = quLen; i >= 0; i-- ) {
+                            if(q[i]){
+                                self.abort(i);
+                            }
+            			}
+                        break;
+                      default:
+                        startCallbacks(quLen);
+                        break;
+                    }
+            	};
+                
+                if(s.maxReq){
+                    if(s.manageType != 'queue') {
+                        for (i = quLen, j = 0; i >= 0; i--) {
+            				if(j >= s.maxReq)
+                                this.abort(i);   
+                            if(q[i]){
+                                j++;
+                            }   
+            			}
+                    } else {
+                        for (i = 0, j = 0; i <= quLen && !q[quLen].queued; i++) {
+                            if(q[i] && !q[i].queued)
+                                j++;
+                            if(j > s.maxReq)
+                                q[quLen].queued = true;
+            			}
+                    }
+                }
+                q[ quLen ].xhr = (q[quLen].queued)?o:jQuery.ajax(o);
+                return quLen;
+            },
+            cleanUp: function(){
+               this.queue = [];
+            },
+            abort: function(num,completed){
+               var qLen = this.queue.length, s = this.opt, q = this.queue, self = this,i;
+               function del(num){
+                   if(!q[num])
+                       return;
+                   (!completed && q[num].fnAbort) && q[num].fnAbort.apply($,[num]);
+                   if(!q[num])
+                       return;
+                   if(q[num].xhr){
+                      if (typeof q[num].xhr.abort != 'undefined') 
+                          q[num].xhr.abort();
+                      if (typeof q[num].xhr.close != 'undefined') 
+                          q[num].xhr.close();
+                      q[num].xhr = null;
+                   }  
+                    q[num] = null;
+               }
+               if(!num && num !== 0){
+                   for (i = 0; i < qLen; i++){
+                       del(i);
+                   }
+                   this.cleanUp();
+               } else {
+                   del(num);
+                   var allowCleaning = true;
+                   for (i = qLen; i >= 0; i--){
+                       if(q[i]){
+                            allowCleaning = false;
+                            break;
+                       }
+                   }
+                   if (allowCleaning) this.cleanUp(); 
+               }
+            }
+        }
+	);
+})(jQuery);
\ No newline at end of file



More information about the Mapbender_commits mailing list