1 <html><head><title>Roo/util/Observable.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/*
4 * Copyright(c) 2006-2007, Ext JS, LLC.
6 * Originally Released Under LGPL - original licence link has changed is not relivant.
9 * <script type="text/javascript">
13 * @class Roo.util.Observable
14 * Base class that provides a common interface for publishing events. Subclasses are expected to
15 * to have a property "events" with all the events defined.<br>
17 * <pre><code>
18 Employee = function(name){
21 "fired" : true,
22 "quit" : true
25 Roo.extend(Employee, Roo.util.Observable);
26 </code></pre>
27 * @param {Object} config properties to use (incuding events / listeners)
30 </span><span class="jsdoc-var">Roo.util.Observable </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">){
32 </span><span class="jsdoc-var">cfg </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">|| {};
33 </span><span class="jsdoc-var">this.addEvents</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.events </span><span class="jsdoc-syntax">|| {});
34 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.events</span><span class="jsdoc-syntax">) {
35 </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">cfg.events</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// make sure
36 </span><span class="jsdoc-syntax">}
38 </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
40 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.listeners</span><span class="jsdoc-syntax">){
41 </span><span class="jsdoc-var">this.on</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.listeners</span><span class="jsdoc-syntax">);
42 </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">this.listeners</span><span class="jsdoc-syntax">;
45 </span><span class="jsdoc-var">Roo.util.Observable.prototype </span><span class="jsdoc-syntax">= {
46 </span><span class="jsdoc-comment">/**
47 * @cfg {Object} listeners list of events and functions to call for this object,
49 * <pre><code>
51 'click' : function(e) {
56 </code></pre>
61 * Fires the specified event with the passed parameters (minus the event name).
62 * @param {String} eventName
63 * @param {Object...} args Variable number of parameters are passed to handlers
64 * @return {Boolean} returns false if any of the handlers return false otherwise it returns true
66 </span><span class="jsdoc-var">fireEvent </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
67 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ce </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">[0]</span><span class="jsdoc-var">.toLowerCase</span><span class="jsdoc-syntax">()];
68 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">ce </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">"object"</span><span class="jsdoc-syntax">){
69 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">ce.fire.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ce</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Array.prototype.slice.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">, 1));
70 }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
71 </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
75 </span><span class="jsdoc-comment">// private
76 </span><span class="jsdoc-var">filterOptRe </span><span class="jsdoc-syntax">: /^(?:scope|delay|buffer|single)$/,
78 </span><span class="jsdoc-comment">/**
79 * Appends an event handler to this component
80 * @param {String} eventName The type of event to listen for
81 * @param {Function} handler The method the event invokes
82 * @param {Object} scope (optional) The scope in which to execute the handler
83 * function. The handler function's "this" context.
84 * @param {Object} options (optional) An object containing handler configuration
85 * properties. This may contain any of the following properties:<ul>
86 * <li>scope {Object} The scope in which to execute the handler function. The handler function's "this" context.</li>
87 * <li>delay {Number} The number of milliseconds to delay the invocation of the handler after te event fires.</li>
88 * <li>single {Boolean} True to add a handler to handle just the next firing of the event, and then remove itself.</li>
89 * <li>buffer {Number} Causes the handler to be scheduled to run in an {@link Roo.util.DelayedTask} delayed
90 * by the specified number of milliseconds. If the event fires again within that time, the original
91 * handler is <em>not</em> invoked, but the new handler is scheduled in its place.</li>
92 * </ul><br>
94 * <b>Combining Options</b><br>
95 * Using the options argument, it is possible to combine different types of listeners:<br>
97 * A normalized, delayed, one-time listener that auto stops the event and passes a custom argument (forumId)
98 <pre><code>
99 el.on('click', this.onClick, this, {
104 </code></pre>
106 * <b>Attaching multiple handlers in 1 call</b><br>
107 * The method also allows for a single argument to be passed which is a config object containing properties
108 * which specify multiple handlers.
109 * <pre><code>
117 fn: this.onMouseOver,
125 </code></pre>
127 * Or a shorthand syntax which passes the same scope object to all handlers:
128 <pre><code>
130 'click': this.onClick,
131 'mouseover': this.onMouseOver,
132 'mouseout': this.onMouseOut,
135 </code></pre>
137 </span><span class="jsdoc-var">addListener </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">eventName</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">){
138 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">eventName </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">"object"</span><span class="jsdoc-syntax">){
139 </span><span class="jsdoc-var">o </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">eventName</span><span class="jsdoc-syntax">;
140 </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">e </span><span class="jsdoc-keyword">in </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">){
141 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.filterOptRe.test</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)){
142 </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
144 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">] == </span><span class="jsdoc-string">"function"</span><span class="jsdoc-syntax">){
145 </span><span class="jsdoc-comment">// shared options
146 </span><span class="jsdoc-var">this.addListener</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">], </span><span class="jsdoc-var">o.scope</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">);
147 }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
148 </span><span class="jsdoc-comment">// individual options
149 </span><span class="jsdoc-var">this.addListener</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.scope</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">]);
152 </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
154 </span><span class="jsdoc-var">o </span><span class="jsdoc-syntax">= (!</span><span class="jsdoc-var">o </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">o </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">"boolean"</span><span class="jsdoc-syntax">) ? {} : </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">;
155 </span><span class="jsdoc-var">eventName </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">eventName.toLowerCase</span><span class="jsdoc-syntax">();
156 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ce </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">eventName</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
157 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">ce </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">"boolean"</span><span class="jsdoc-syntax">){
158 </span><span class="jsdoc-var">ce </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.util.Event</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">eventName</span><span class="jsdoc-syntax">);
159 </span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">eventName</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">ce</span><span class="jsdoc-syntax">;
161 </span><span class="jsdoc-var">ce.addListener</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">);
164 </span><span class="jsdoc-comment">/**
166 * @param {String} eventName The type of event to listen for
167 * @param {Function} handler The handler to remove
168 * @param {Object} scope (optional) The scope (this object) for the handler
170 </span><span class="jsdoc-var">removeListener </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">eventName</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
171 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ce </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">eventName.toLowerCase</span><span class="jsdoc-syntax">()];
172 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">ce </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">"object"</span><span class="jsdoc-syntax">){
173 </span><span class="jsdoc-var">ce.removeListener</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">);
177 </span><span class="jsdoc-comment">/**
178 * Removes all listeners for this object
180 </span><span class="jsdoc-var">purgeListeners </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
181 </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">evt </span><span class="jsdoc-keyword">in </span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">){
182 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">evt</span><span class="jsdoc-syntax">] == </span><span class="jsdoc-string">"object"</span><span class="jsdoc-syntax">){
183 </span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">evt</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.clearListeners</span><span class="jsdoc-syntax">();
188 </span><span class="jsdoc-var">relayEvents </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">events</span><span class="jsdoc-syntax">){
189 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">createHandler </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ename</span><span class="jsdoc-syntax">){
190 </span><span class="jsdoc-keyword">return function</span><span class="jsdoc-syntax">(){
191 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.fireEvent.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.combine</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ename</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Array.prototype.slice.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">, 0)));
194 </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0, </span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">events.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">< </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++){
195 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ename </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">events</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
196 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">ename</span><span class="jsdoc-syntax">]){ </span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">ename</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">; };
197 </span><span class="jsdoc-var">o.on</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ename</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">createHandler</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ename</span><span class="jsdoc-syntax">), </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
201 </span><span class="jsdoc-comment">/**
202 * Used to define events on this Observable
203 * @param {Object} object The object with the events defined
205 </span><span class="jsdoc-var">addEvents </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">){
206 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">){
207 </span><span class="jsdoc-var">this.events </span><span class="jsdoc-syntax">= {};
209 </span><span class="jsdoc-var">Roo.applyIf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">);
212 </span><span class="jsdoc-comment">/**
213 * Checks to see if this object has any listeners for a specified event
214 * @param {String} eventName The name of the event to check for
215 * @return {Boolean} True if the event is being listened for, else false
217 </span><span class="jsdoc-var">hasListener </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">eventName</span><span class="jsdoc-syntax">){
218 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">e </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.events</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">eventName</span><span class="jsdoc-syntax">];
219 </span><span class="jsdoc-keyword">return typeof </span><span class="jsdoc-var">e </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">"object" </span><span class="jsdoc-syntax">&& </span><span class="jsdoc-var">e.listeners.length </span><span class="jsdoc-syntax">> 0;
222 </span><span class="jsdoc-comment">/**
223 * Appends an event handler to this element (shorthand for addListener)
224 * @param {String} eventName The type of event to listen for
225 * @param {Function} handler The method the event invokes
226 * @param {Object} scope (optional) The scope in which to execute the handler
227 * function. The handler function's "this" context.
228 * @param {Object} options (optional)
231 </span><span class="jsdoc-var">Roo.util.Observable.prototype.on </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.util.Observable.prototype.addListener</span><span class="jsdoc-syntax">;
232 </span><span class="jsdoc-comment">/**
233 * Removes a listener (shorthand for removeListener)
234 * @param {String} eventName The type of event to listen for
235 * @param {Function} handler The handler to remove
236 * @param {Object} scope (optional) The scope (this object) for the handler
239 </span><span class="jsdoc-var">Roo.util.Observable.prototype.un </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.util.Observable.prototype.removeListener</span><span class="jsdoc-syntax">;
241 </span><span class="jsdoc-comment">/**
242 * Starts capture on the specified Observable. All events will be passed
243 * to the supplied function with the event name + standard signature of the event
244 * <b>before</b> the event is fired. If the supplied function returns false,
245 * the event will not fire.
246 * @param {Observable} o The Observable to capture
247 * @param {Function} fn The function to call
248 * @param {Object} scope (optional) The scope (this object) for the fn
251 </span><span class="jsdoc-var">Roo.util.Observable.capture </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
252 </span><span class="jsdoc-var">o.fireEvent </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">o.fireEvent.createInterceptor</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">);
255 </span><span class="jsdoc-comment">/**
256 * Removes <b>all</b> added captures from the Observable.
257 * @param {Observable} o The Observable to release
260 </span><span class="jsdoc-var">Roo.util.Observable.releaseCapture </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">){
261 </span><span class="jsdoc-var">o.fireEvent </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.util.Observable.prototype.fireEvent</span><span class="jsdoc-syntax">;
264 (</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
266 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">createBuffered </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">h</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
267 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">task </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.util.DelayedTask</span><span class="jsdoc-syntax">();
268 </span><span class="jsdoc-keyword">return function</span><span class="jsdoc-syntax">(){
269 </span><span class="jsdoc-var">task.delay</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o.buffer</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">h</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Array.prototype.slice.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">, 0));
273 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">createSingle </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">h</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
274 </span><span class="jsdoc-keyword">return function</span><span class="jsdoc-syntax">(){
275 </span><span class="jsdoc-var">e.removeListener</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">);
276 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">h.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">);
280 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">createDelayed </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">h</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
281 </span><span class="jsdoc-keyword">return function</span><span class="jsdoc-syntax">(){
282 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">args </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Array.prototype.slice.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">, 0);
283 </span><span class="jsdoc-var">setTimeout</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
284 </span><span class="jsdoc-var">h.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">args</span><span class="jsdoc-syntax">);
285 }, </span><span class="jsdoc-var">o.delay </span><span class="jsdoc-syntax">|| 10);
289 </span><span class="jsdoc-var">Roo.util.Event </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">obj</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">){
290 </span><span class="jsdoc-var">this.name </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">;
291 </span><span class="jsdoc-var">this.obj </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">obj</span><span class="jsdoc-syntax">;
292 </span><span class="jsdoc-var">this.listeners </span><span class="jsdoc-syntax">= [];
295 </span><span class="jsdoc-var">Roo.util.Event.prototype </span><span class="jsdoc-syntax">= {
296 </span><span class="jsdoc-var">addListener </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">options</span><span class="jsdoc-syntax">){
297 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">o </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">options </span><span class="jsdoc-syntax">|| {};
298 </span><span class="jsdoc-var">scope </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">scope </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this.obj</span><span class="jsdoc-syntax">;
299 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.isListening</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">)){
300 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">l </span><span class="jsdoc-syntax">= {</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">options</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">};
301 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">h </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">;
302 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o.delay</span><span class="jsdoc-syntax">){
303 </span><span class="jsdoc-var">h </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">createDelayed</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">h</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">);
305 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o.single</span><span class="jsdoc-syntax">){
306 </span><span class="jsdoc-var">h </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">createSingle</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">h</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">);
308 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o.buffer</span><span class="jsdoc-syntax">){
309 </span><span class="jsdoc-var">h </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">createBuffered</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">h</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">);
311 </span><span class="jsdoc-var">l.fireFn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">h</span><span class="jsdoc-syntax">;
312 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.firing</span><span class="jsdoc-syntax">){ </span><span class="jsdoc-comment">// if we are currently firing this event, don't disturb the listener loop
313 </span><span class="jsdoc-var">this.listeners.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">);
314 }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
315 </span><span class="jsdoc-var">this.listeners </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.listeners.slice</span><span class="jsdoc-syntax">(0);
316 </span><span class="jsdoc-var">this.listeners.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">);
321 </span><span class="jsdoc-var">findListener </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
322 </span><span class="jsdoc-var">scope </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">scope </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this.obj</span><span class="jsdoc-syntax">;
323 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ls </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.listeners</span><span class="jsdoc-syntax">;
324 </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0, </span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ls.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">< </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++){
325 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">l </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ls</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
326 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">l.fn </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">fn </span><span class="jsdoc-syntax">&& </span><span class="jsdoc-var">l.scope </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
327 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">;
330 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">-1;
333 </span><span class="jsdoc-var">isListening </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
334 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.findListener</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">) != -1;
337 </span><span class="jsdoc-var">removeListener </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
338 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">;
339 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">((</span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.findListener</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">)) != -1){
340 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.firing</span><span class="jsdoc-syntax">){
341 </span><span class="jsdoc-var">this.listeners.splice</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">, 1);
342 }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
343 </span><span class="jsdoc-var">this.listeners </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.listeners.slice</span><span class="jsdoc-syntax">(0);
344 </span><span class="jsdoc-var">this.listeners.splice</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">, 1);
346 </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
348 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
351 </span><span class="jsdoc-var">clearListeners </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
352 </span><span class="jsdoc-var">this.listeners </span><span class="jsdoc-syntax">= [];
355 </span><span class="jsdoc-var">fire </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
356 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ls </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.listeners</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ls.length</span><span class="jsdoc-syntax">;
357 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">> 0){
358 </span><span class="jsdoc-var">this.firing </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
359 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">args </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Array.prototype.slice.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">, 0);
360 </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">< </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++){
361 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">l </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ls</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
362 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">l.fireFn.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">l.scope</span><span class="jsdoc-syntax">||</span><span class="jsdoc-var">this.obj</span><span class="jsdoc-syntax">||</span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">args</span><span class="jsdoc-syntax">) === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
363 </span><span class="jsdoc-var">this.firing </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
364 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
367 </span><span class="jsdoc-var">this.firing </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
369 </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
372 })();</span></code></body></html>