comparison gis_gui/lib/jquery.livequery.js @ 63:7f008e782563

add gui files to product via FileSystemSite
author casties
date Fri, 05 Nov 2010 18:52:55 +0100
parents
children
comparison
equal deleted inserted replaced
62:3905385c8854 63:7f008e782563
1 /*! Copyright (c) 2008 Brandon Aaron (http://brandonaaron.net)
2 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
3 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
4 *
5 * Version: 1.0.3
6 * Requires jQuery 1.1.3+
7 * Docs: http://docs.jquery.com/Plugins/livequery
8 */
9
10 (function($) {
11
12 $.extend($.fn, {
13 livequery: function(type, fn, fn2) {
14 var self = this, q;
15
16 // Handle different call patterns
17 if ($.isFunction(type))
18 fn2 = fn, fn = type, type = undefined;
19
20 // See if Live Query already exists
21 $.each( $.livequery.queries, function(i, query) {
22 if ( self.selector == query.selector && self.context == query.context &&
23 type == query.type && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid) )
24 // Found the query, exit the each loop
25 return (q = query) && false;
26 });
27
28 // Create new Live Query if it wasn't found
29 q = q || new $.livequery(this.selector, this.context, type, fn, fn2);
30
31 // Make sure it is running
32 q.stopped = false;
33
34 // Run it immediately for the first time
35 q.run();
36
37 // Contnue the chain
38 return this;
39 },
40
41 expire: function(type, fn, fn2) {
42 var self = this;
43
44 // Handle different call patterns
45 if ($.isFunction(type))
46 fn2 = fn, fn = type, type = undefined;
47
48 // Find the Live Query based on arguments and stop it
49 $.each( $.livequery.queries, function(i, query) {
50 if ( self.selector == query.selector && self.context == query.context &&
51 (!type || type == query.type) && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid) && !this.stopped )
52 $.livequery.stop(query.id);
53 });
54
55 // Continue the chain
56 return this;
57 }
58 });
59
60 $.livequery = function(selector, context, type, fn, fn2) {
61 this.selector = selector;
62 this.context = context || document;
63 this.type = type;
64 this.fn = fn;
65 this.fn2 = fn2;
66 this.elements = [];
67 this.stopped = false;
68
69 // The id is the index of the Live Query in $.livequery.queries
70 this.id = $.livequery.queries.push(this)-1;
71
72 // Mark the functions for matching later on
73 fn.$lqguid = fn.$lqguid || $.livequery.guid++;
74 if (fn2) fn2.$lqguid = fn2.$lqguid || $.livequery.guid++;
75
76 // Return the Live Query
77 return this;
78 };
79
80 $.livequery.prototype = {
81 stop: function() {
82 var query = this;
83
84 if ( this.type )
85 // Unbind all bound events
86 this.elements.unbind(this.type, this.fn);
87 else if (this.fn2)
88 // Call the second function for all matched elements
89 this.elements.each(function(i, el) {
90 query.fn2.apply(el);
91 });
92
93 // Clear out matched elements
94 this.elements = [];
95
96 // Stop the Live Query from running until restarted
97 this.stopped = true;
98 },
99
100 run: function() {
101 // Short-circuit if stopped
102 if ( this.stopped ) return;
103 var query = this;
104
105 var oEls = this.elements,
106 els = $(this.selector, this.context),
107 nEls = els.not(oEls);
108
109 // Set elements to the latest set of matched elements
110 this.elements = els;
111
112 if (this.type) {
113 // Bind events to newly matched elements
114 nEls.bind(this.type, this.fn);
115
116 // Unbind events to elements no longer matched
117 if (oEls.length > 0)
118 $.each(oEls, function(i, el) {
119 if ( $.inArray(el, els) < 0 )
120 $.event.remove(el, query.type, query.fn);
121 });
122 }
123 else {
124 // Call the first function for newly matched elements
125 nEls.each(function() {
126 query.fn.apply(this);
127 });
128
129 // Call the second function for elements no longer matched
130 if ( this.fn2 && oEls.length > 0 )
131 $.each(oEls, function(i, el) {
132 if ( $.inArray(el, els) < 0 )
133 query.fn2.apply(el);
134 });
135 }
136 }
137 };
138
139 $.extend($.livequery, {
140 guid: 0,
141 queries: [],
142 queue: [],
143 running: false,
144 timeout: null,
145
146 checkQueue: function() {
147 if ( $.livequery.running && $.livequery.queue.length ) {
148 var length = $.livequery.queue.length;
149 // Run each Live Query currently in the queue
150 while ( length-- )
151 $.livequery.queries[ $.livequery.queue.shift() ].run();
152 }
153 },
154
155 pause: function() {
156 // Don't run anymore Live Queries until restarted
157 $.livequery.running = false;
158 },
159
160 play: function() {
161 // Restart Live Queries
162 $.livequery.running = true;
163 // Request a run of the Live Queries
164 $.livequery.run();
165 },
166
167 registerPlugin: function() {
168 $.each( arguments, function(i,n) {
169 // Short-circuit if the method doesn't exist
170 if (!$.fn[n]) return;
171
172 // Save a reference to the original method
173 var old = $.fn[n];
174
175 // Create a new method
176 $.fn[n] = function() {
177 // Call the original method
178 var r = old.apply(this, arguments);
179
180 // Request a run of the Live Queries
181 $.livequery.run();
182
183 // Return the original methods result
184 return r;
185 }
186 });
187 },
188
189 run: function(id) {
190 if (id != undefined) {
191 // Put the particular Live Query in the queue if it doesn't already exist
192 if ( $.inArray(id, $.livequery.queue) < 0 )
193 $.livequery.queue.push( id );
194 }
195 else
196 // Put each Live Query in the queue if it doesn't already exist
197 $.each( $.livequery.queries, function(id) {
198 if ( $.inArray(id, $.livequery.queue) < 0 )
199 $.livequery.queue.push( id );
200 });
201
202 // Clear timeout if it already exists
203 if ($.livequery.timeout) clearTimeout($.livequery.timeout);
204 // Create a timeout to check the queue and actually run the Live Queries
205 $.livequery.timeout = setTimeout($.livequery.checkQueue, 20);
206 },
207
208 stop: function(id) {
209 if (id != undefined)
210 // Stop are particular Live Query
211 $.livequery.queries[ id ].stop();
212 else
213 // Stop all Live Queries
214 $.each( $.livequery.queries, function(id) {
215 $.livequery.queries[ id ].stop();
216 });
217 }
218 });
219
220 // Register core DOM manipulation methods
221 $.livequery.registerPlugin('append', 'prepend', 'after', 'before', 'wrap', 'attr', 'removeAttr', 'addClass', 'removeClass', 'toggleClass', 'empty', 'remove');
222
223 // Run Live Queries when the Document is ready
224 $(function() { $.livequery.play(); });
225
226
227 // Save a reference to the original init method
228 var init = $.prototype.init;
229
230 // Create a new init method that exposes two new properties: selector and context
231 $.prototype.init = function(a,c) {
232 // Call the original init and save the result
233 var r = init.apply(this, arguments);
234
235 // Copy over properties if they exist already
236 if (a && a.selector)
237 r.context = a.context, r.selector = a.selector;
238
239 // Set properties
240 if ( typeof a == 'string' )
241 r.context = c || document, r.selector = a;
242
243 // Return the result
244 return r;
245 };
246
247 // Give the init function the jQuery prototype for later instantiation (needed after Rev 4091)
248 $.prototype.init.prototype = $.prototype;
249
250 })(jQuery);