fix error messages on invalid response to stores
[roojs1] / docs / src / Roo_data_Store.js.html
1 <html><head><title>Roo/data/Store.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">/*
2  * Based on:
3  * Ext JS Library 1.1.1
4  * Copyright(c) 2006-2007, Ext JS, LLC.
5  *
6  * Originally Released Under LGPL - original licence link has changed is not relivant.
7  *
8  * Fork - LGPL
9  * &lt;script type=&quot;text/javascript&quot;&gt;
10  */
11
12
13
14 /**
15  * @class Roo.data.Store
16  * @extends Roo.util.Observable
17  * The Store class encapsulates a client side cache of {@link Roo.data.Record} objects which provide input data
18  * for widgets such as the Roo.grid.Grid, or the Roo.form.ComboBox.&lt;br&gt;
19  * &lt;p&gt;
20  * A Store object uses an implementation of {@link Roo.data.DataProxy} to access a data object unless you call loadData() directly and pass in your data. The Store object
21  * has no knowledge of the format of the data returned by the Proxy.&lt;br&gt;
22  * &lt;p&gt;
23  * A Store object uses its configured implementation of {@link Roo.data.DataReader} to create {@link Roo.data.Record}
24  * instances from the data object. These records are cached and made available through accessor functions.
25  * @constructor
26  * Creates a new Store.
27  * @param {Object} config A config object containing the objects needed for the Store to access data,
28  * and read the data into Records.
29  */
30 </span><span class="jsdoc-var">Roo.data.Store </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">config</span><span class="jsdoc-syntax">){
31     </span><span class="jsdoc-var">this.data </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.util.MixedCollection</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">);
32     </span><span class="jsdoc-var">this.data.getKey </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">){
33         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">o.id</span><span class="jsdoc-syntax">;
34     };
35     </span><span class="jsdoc-var">this.baseParams </span><span class="jsdoc-syntax">= {};
36     </span><span class="jsdoc-comment">// private
37     </span><span class="jsdoc-var">this.paramNames </span><span class="jsdoc-syntax">= {
38         </span><span class="jsdoc-string">&quot;start&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;start&quot;</span><span class="jsdoc-syntax">,
39         </span><span class="jsdoc-string">&quot;limit&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;limit&quot;</span><span class="jsdoc-syntax">,
40         </span><span class="jsdoc-string">&quot;sort&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;sort&quot;</span><span class="jsdoc-syntax">,
41         </span><span class="jsdoc-string">&quot;dir&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;dir&quot;</span><span class="jsdoc-syntax">,
42         </span><span class="jsdoc-string">&quot;multisort&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;_multisort&quot;
43     </span><span class="jsdoc-syntax">};
44
45     </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">config </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">config.data</span><span class="jsdoc-syntax">){
46         </span><span class="jsdoc-var">this.inlineData </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">config.data</span><span class="jsdoc-syntax">;
47         </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">config.data</span><span class="jsdoc-syntax">;
48     }
49
50     </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">config</span><span class="jsdoc-syntax">);
51
52     </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.reader</span><span class="jsdoc-syntax">){ </span><span class="jsdoc-comment">// reader passed
53         </span><span class="jsdoc-var">this.reader </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.reader</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.data</span><span class="jsdoc-syntax">);
54         </span><span class="jsdoc-var">this.reader.xmodule </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.xmodule </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
55         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.recordType</span><span class="jsdoc-syntax">){
56             </span><span class="jsdoc-var">this.recordType </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.reader.recordType</span><span class="jsdoc-syntax">;
57         }
58         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.reader.onMetaChange</span><span class="jsdoc-syntax">){
59             </span><span class="jsdoc-var">this.reader.onMetaChange </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.onMetaChange.createDelegate</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
60         }
61     }
62
63     </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.recordType</span><span class="jsdoc-syntax">){
64         </span><span class="jsdoc-var">this.fields </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.recordType.prototype.fields</span><span class="jsdoc-syntax">;
65     }
66     </span><span class="jsdoc-var">this.modified </span><span class="jsdoc-syntax">= [];
67
68     </span><span class="jsdoc-var">this.addEvents</span><span class="jsdoc-syntax">({
69         </span><span class="jsdoc-comment">/**
70          * @event datachanged
71          * Fires when the data cache has changed, and a widget which is using this Store
72          * as a Record cache should refresh its view.
73          * @param {Store} this
74          */
75         </span><span class="jsdoc-var">datachanged </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
76         </span><span class="jsdoc-comment">/**
77          * @event metachange
78          * Fires when this store's reader provides new metadata (fields). This is currently only support for JsonReaders.
79          * @param {Store} this
80          * @param {Object} meta The JSON metadata
81          */
82         </span><span class="jsdoc-var">metachange </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
83         </span><span class="jsdoc-comment">/**
84          * @event add
85          * Fires when Records have been added to the Store
86          * @param {Store} this
87          * @param {Roo.data.Record[]} records The array of Records added
88          * @param {Number} index The index at which the record(s) were added
89          */
90         </span><span class="jsdoc-var">add </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
91         </span><span class="jsdoc-comment">/**
92          * @event remove
93          * Fires when a Record has been removed from the Store
94          * @param {Store} this
95          * @param {Roo.data.Record} record The Record that was removed
96          * @param {Number} index The index at which the record was removed
97          */
98         </span><span class="jsdoc-var">remove </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
99         </span><span class="jsdoc-comment">/**
100          * @event update
101          * Fires when a Record has been updated
102          * @param {Store} this
103          * @param {Roo.data.Record} record The Record that was updated
104          * @param {String} operation The update operation being performed.  Value may be one of:
105          * &lt;pre&gt;&lt;code&gt;
106  Roo.data.Record.EDIT
107  Roo.data.Record.REJECT
108  Roo.data.Record.COMMIT
109          * &lt;/code&gt;&lt;/pre&gt;
110          */
111         </span><span class="jsdoc-var">update </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
112         </span><span class="jsdoc-comment">/**
113          * @event clear
114          * Fires when the data cache has been cleared.
115          * @param {Store} this
116          */
117         </span><span class="jsdoc-var">clear </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
118         </span><span class="jsdoc-comment">/**
119          * @event beforeload
120          * Fires before a request is made for a new data object.  If the beforeload handler returns false
121          * the load action will be canceled.
122          * @param {Store} this
123          * @param {Object} options The loading options that were specified (see {@link #load} for details)
124          */
125         </span><span class="jsdoc-var">beforeload </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
126         </span><span class="jsdoc-comment">/**
127          * @event beforeloadadd
128          * Fires after a new set of Records has been loaded.
129          * @param {Store} this
130          * @param {Roo.data.Record[]} records The Records that were loaded
131          * @param {Object} options The loading options that were specified (see {@link #load} for details)
132          */
133         </span><span class="jsdoc-var">beforeloadadd </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
134         </span><span class="jsdoc-comment">/**
135          * @event load
136          * Fires after a new set of Records has been loaded, before they are added to the store.
137          * @param {Store} this
138          * @param {Roo.data.Record[]} records The Records that were loaded
139          * @param {Object} options The loading options that were specified (see {@link #load} for details)
140          * @params {Object} return from reader
141          */
142         </span><span class="jsdoc-var">load </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
143         </span><span class="jsdoc-comment">/**
144          * @event loadexception
145          * Fires if an exception occurs in the Proxy during loading.
146          * Called with the signature of the Proxy's &quot;loadexception&quot; event.
147          * If you return Json { data: [] , success: false, .... } then this will be thrown with the following args
148          * 
149          * @param {Proxy} 
150          * @param {Object} return from JsonData.reader() - success, totalRecords, records
151          * @param {Object} load options 
152          * @param {Object} jsonData from your request (normally this contains the Exception)
153          */
154         </span><span class="jsdoc-var">loadexception </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true
155     </span><span class="jsdoc-syntax">});
156
157     </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.proxy</span><span class="jsdoc-syntax">){
158         </span><span class="jsdoc-var">this.proxy </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.proxy</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.data</span><span class="jsdoc-syntax">);
159         </span><span class="jsdoc-var">this.proxy.xmodule </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.xmodule </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
160         </span><span class="jsdoc-var">this.relayEvents</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.proxy</span><span class="jsdoc-syntax">,  [</span><span class="jsdoc-string">&quot;loadexception&quot;</span><span class="jsdoc-syntax">]);
161     }
162     </span><span class="jsdoc-var">this.sortToggle </span><span class="jsdoc-syntax">= {};
163     </span><span class="jsdoc-var">this.sortOrder </span><span class="jsdoc-syntax">= []; </span><span class="jsdoc-comment">// array of order of sorting - updated by grid if multisort is enabled.
164
165     </span><span class="jsdoc-var">Roo.data.Store.superclass.constructor.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
166
167     </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.inlineData</span><span class="jsdoc-syntax">){
168         </span><span class="jsdoc-var">this.loadData</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.inlineData</span><span class="jsdoc-syntax">);
169         </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">this.inlineData</span><span class="jsdoc-syntax">;
170     }
171 };
172
173 </span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.data.Store</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.util.Observable</span><span class="jsdoc-syntax">, {
174      </span><span class="jsdoc-comment">/**
175     * @cfg {boolean} isLocal   flag if data is locally available (and can be always looked up
176     * without a remote query - used by combo/forms at present.
177     */
178
179     /**
180     * @cfg {Roo.data.DataProxy} proxy [required] The Proxy object which provides access to a data object.
181     */
182     /**
183     * @cfg {Array} data Inline data to be loaded when the store is initialized.
184     */
185     /**
186     * @cfg {Roo.data.DataReader} reader [required]  The Reader object which processes the data object and returns
187     * an Array of Roo.data.record objects which are cached keyed by their &lt;em&gt;id&lt;/em&gt; property.
188     */
189     /**
190     * @cfg {Object} baseParams An object containing properties which are to be sent as parameters
191     * on any HTTP request
192     */
193     /**
194     * @cfg {Object} sortInfo A config object in the format: {field: &quot;fieldName&quot;, direction: &quot;ASC|DESC&quot;}
195     */
196     /**
197     * @cfg {Boolean} multiSort enable multi column sorting (sort is based on the order of columns, remote only at present)
198     */
199     </span><span class="jsdoc-var">multiSort</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
200     </span><span class="jsdoc-comment">/**
201     * @cfg {boolean} remoteSort True if sorting is to be handled by requesting the Proxy to provide a refreshed
202     * version of the data object in sorted order, as opposed to sorting the Record cache in place (defaults to false).
203     */
204     </span><span class="jsdoc-var">remoteSort </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
205
206     </span><span class="jsdoc-comment">/**
207     * @cfg {boolean} pruneModifiedRecords True to clear all modified record information each time the store is
208      * loaded or when a record is removed. (defaults to false).
209     */
210     </span><span class="jsdoc-var">pruneModifiedRecords </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
211
212     </span><span class="jsdoc-comment">// private
213     </span><span class="jsdoc-var">lastOptions </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">,
214
215     </span><span class="jsdoc-comment">/**
216      * Add Records to the Store and fires the add event.
217      * @param {Roo.data.Record[]} records An Array of Roo.data.Record objects to add to the cache.
218      */
219     </span><span class="jsdoc-var">add </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">){
220         </span><span class="jsdoc-var">records </span><span class="jsdoc-syntax">= []</span><span class="jsdoc-var">.concat</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">);
221         </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">records.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++){
222             </span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
223         }
224         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.data.length</span><span class="jsdoc-syntax">;
225         </span><span class="jsdoc-var">this.data.addAll</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">);
226         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;add&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">);
227     },
228
229     </span><span class="jsdoc-comment">/**
230      * Remove a Record from the Store and fires the remove event.
231      * @param {Ext.data.Record} record The Roo.data.Record object to remove from the cache.
232      */
233     </span><span class="jsdoc-var">remove </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">){
234         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.data.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">);
235         </span><span class="jsdoc-var">this.data.removeAt</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">);
236
237         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.pruneModifiedRecords</span><span class="jsdoc-syntax">){
238             </span><span class="jsdoc-var">this.modified.remove</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">);
239         }
240         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;remove&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">);
241     },
242
243     </span><span class="jsdoc-comment">/**
244      * Remove all Records from the Store and fires the clear event.
245      */
246     </span><span class="jsdoc-var">removeAll </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
247         </span><span class="jsdoc-var">this.data.clear</span><span class="jsdoc-syntax">();
248         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.pruneModifiedRecords</span><span class="jsdoc-syntax">){
249             </span><span class="jsdoc-var">this.modified </span><span class="jsdoc-syntax">= [];
250         }
251         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;clear&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
252     },
253
254     </span><span class="jsdoc-comment">/**
255      * Inserts Records to the Store at the given index and fires the add event.
256      * @param {Number} index The start index at which to insert the passed Records.
257      * @param {Roo.data.Record[]} records An Array of Roo.data.Record objects to add to the cache.
258      */
259     </span><span class="jsdoc-var">insert </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">){
260         </span><span class="jsdoc-var">records </span><span class="jsdoc-syntax">= []</span><span class="jsdoc-var">.concat</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">);
261         </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">records.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++){
262             </span><span class="jsdoc-var">this.data.insert</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]);
263             </span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
264         }
265         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;add&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">);
266     },
267
268     </span><span class="jsdoc-comment">/**
269      * Get the index within the cache of the passed Record.
270      * @param {Roo.data.Record} record The Roo.data.Record object to to find.
271      * @return {Number} The index of the passed Record. Returns -1 if not found.
272      */
273     </span><span class="jsdoc-var">indexOf </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">){
274         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.data.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">);
275     },
276
277     </span><span class="jsdoc-comment">/**
278      * Get the index within the cache of the Record with the passed id.
279      * @param {String} id The id of the Record to find.
280      * @return {Number} The index of the Record. Returns -1 if not found.
281      */
282     </span><span class="jsdoc-var">indexOfId </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">){
283         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.data.indexOfKey</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">);
284     },
285
286     </span><span class="jsdoc-comment">/**
287      * Get the Record with the specified id.
288      * @param {String} id The id of the Record to find.
289      * @return {Roo.data.Record} The Record with the passed id. Returns undefined if not found.
290      */
291     </span><span class="jsdoc-var">getById </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">){
292         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.data.key</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">);
293     },
294
295     </span><span class="jsdoc-comment">/**
296      * Get the Record at the specified index.
297      * @param {Number} index The index of the Record to find.
298      * @return {Roo.data.Record} The Record at the passed index. Returns undefined if not found.
299      */
300     </span><span class="jsdoc-var">getAt </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">){
301         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.data.itemAt</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">);
302     },
303
304     </span><span class="jsdoc-comment">/**
305      * Returns a range of Records between specified indices.
306      * @param {Number} startIndex (optional) The starting index (defaults to 0)
307      * @param {Number} endIndex (optional) The ending index (defaults to the last Record in the Store)
308      * @return {Roo.data.Record[]} An array of Records
309      */
310     </span><span class="jsdoc-var">getRange </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">end</span><span class="jsdoc-syntax">){
311         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.data.getRange</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">end</span><span class="jsdoc-syntax">);
312     },
313
314     </span><span class="jsdoc-comment">// private
315     </span><span class="jsdoc-var">storeOptions </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">){
316         </span><span class="jsdoc-var">o </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">({}, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">);
317         </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">o.callback</span><span class="jsdoc-syntax">;
318         </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">o.scope</span><span class="jsdoc-syntax">;
319         </span><span class="jsdoc-var">this.lastOptions </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">;
320     },
321
322     </span><span class="jsdoc-comment">/**
323      * Loads the Record cache from the configured Proxy using the configured Reader.
324      * &lt;p&gt;
325      * If using remote paging, then the first load call must specify the &lt;em&gt;start&lt;/em&gt;
326      * and &lt;em&gt;limit&lt;/em&gt; properties in the options.params property to establish the initial
327      * position within the dataset, and the number of Records to cache on each read from the Proxy.
328      * &lt;p&gt;
329      * &lt;strong&gt;It is important to note that for remote data sources, loading is asynchronous,
330      * and this call will return before the new data has been loaded. Perform any post-processing
331      * in a callback function, or in a &quot;load&quot; event handler.&lt;/strong&gt;
332      * &lt;p&gt;
333      * @param {Object} options An object containing properties which control loading options:&lt;ul&gt;
334      * &lt;li&gt;params {Object} An object containing properties to pass as HTTP parameters to a remote data source.&lt;/li&gt;
335      * &lt;li&gt;callback {Function} A function to be called after the Records have been loaded. The callback is
336      * passed the following arguments:&lt;ul&gt;
337      * &lt;li&gt;r : Roo.data.Record[]&lt;/li&gt;
338      * &lt;li&gt;options: Options object from the load call&lt;/li&gt;
339      * &lt;li&gt;success: Boolean success indicator&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
340      * &lt;li&gt;scope {Object} Scope with which to call the callback (defaults to the Store object)&lt;/li&gt;
341      * &lt;li&gt;add {Boolean} indicator to append loaded records rather than replace the current cache.&lt;/li&gt;
342      * &lt;/ul&gt;
343      */
344     </span><span class="jsdoc-var">load </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">options</span><span class="jsdoc-syntax">){
345         </span><span class="jsdoc-var">options </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">options </span><span class="jsdoc-syntax">|| {};
346         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;beforeload&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">options</span><span class="jsdoc-syntax">) !== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
347             </span><span class="jsdoc-var">this.storeOptions</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">options</span><span class="jsdoc-syntax">);
348             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">options.params </span><span class="jsdoc-syntax">|| {}, </span><span class="jsdoc-var">this.baseParams</span><span class="jsdoc-syntax">);
349             </span><span class="jsdoc-comment">// if meta was not loaded from remote source.. try requesting it.
350             </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.reader.metaFromRemote</span><span class="jsdoc-syntax">) {
351                 </span><span class="jsdoc-var">p._requestMeta </span><span class="jsdoc-syntax">= 1;
352             }
353             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.sortInfo </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.remoteSort</span><span class="jsdoc-syntax">){
354                 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">pn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.paramNames</span><span class="jsdoc-syntax">;
355                 </span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">pn</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">&quot;sort&quot;</span><span class="jsdoc-syntax">]] = </span><span class="jsdoc-var">this.sortInfo.field</span><span class="jsdoc-syntax">;
356                 </span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">pn</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">&quot;dir&quot;</span><span class="jsdoc-syntax">]] = </span><span class="jsdoc-var">this.sortInfo.direction</span><span class="jsdoc-syntax">;
357             }
358             </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.multiSort</span><span class="jsdoc-syntax">) {
359                 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">pn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.paramNames</span><span class="jsdoc-syntax">;
360                 </span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">pn</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">&quot;multisort&quot;</span><span class="jsdoc-syntax">]] = </span><span class="jsdoc-var">Roo.encode</span><span class="jsdoc-syntax">( { </span><span class="jsdoc-var">sort </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.sortToggle</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">order</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.sortOrder </span><span class="jsdoc-syntax">});
361             }
362
363             </span><span class="jsdoc-var">this.proxy.load</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.reader</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.loadRecords</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">options</span><span class="jsdoc-syntax">);
364         }
365     },
366
367     </span><span class="jsdoc-comment">/**
368      * Reloads the Record cache from the configured Proxy using the configured Reader and
369      * the options from the last load operation performed.
370      * @param {Object} options (optional) An object containing properties which may override the options
371      * used in the last load operation. See {@link #load} for details (defaults to null, in which case
372      * the most recently used options are reused).
373      */
374     </span><span class="jsdoc-var">reload </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">options</span><span class="jsdoc-syntax">){
375         </span><span class="jsdoc-var">this.load</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.applyIf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">options</span><span class="jsdoc-syntax">||{}, </span><span class="jsdoc-var">this.lastOptions</span><span class="jsdoc-syntax">));
376     },
377
378     </span><span class="jsdoc-comment">// private
379     // Called as a callback by the Reader during a load operation.
380     </span><span class="jsdoc-var">loadRecords </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">options</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">success</span><span class="jsdoc-syntax">){
381
382         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">){
383             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">success </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
384                 </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;load&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</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">);
385             }
386             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">options.callback</span><span class="jsdoc-syntax">){
387                 </span><span class="jsdoc-var">options.callback.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">options.scope </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, [], </span><span class="jsdoc-var">options</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">);
388             }
389             </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
390         }
391         </span><span class="jsdoc-comment">// if data returned failure - throw an exception.
392         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o.success </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
393             </span><span class="jsdoc-comment">// show a message if no listener is registered.
394             </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.hasListener</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'loadexception'</span><span class="jsdoc-syntax">) &amp;&amp; </span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o.raw.errorMsg</span><span class="jsdoc-syntax">) != </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
395                     </span><span class="jsdoc-var">Roo.MessageBox.alert</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;Error loading&quot;</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">o.raw.errorMsg</span><span class="jsdoc-syntax">);
396             }
397             </span><span class="jsdoc-comment">// loadmask wil be hooked into this..
398             </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;loadexception&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">options</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o.raw.errorMsg</span><span class="jsdoc-syntax">);
399             </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
400         }
401         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">o.records</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">o.totalRecords </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">r.length</span><span class="jsdoc-syntax">;
402
403         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;beforeloadadd&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">r</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">);
404
405         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">options </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">options.add </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">){
406             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.pruneModifiedRecords</span><span class="jsdoc-syntax">){
407                 </span><span class="jsdoc-var">this.modified </span><span class="jsdoc-syntax">= [];
408             }
409             </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">r.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++){
410                 </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
411             }
412             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.snapshot</span><span class="jsdoc-syntax">){
413                 </span><span class="jsdoc-var">this.data </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.snapshot</span><span class="jsdoc-syntax">;
414                 </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">this.snapshot</span><span class="jsdoc-syntax">;
415             }
416             </span><span class="jsdoc-var">this.data.clear</span><span class="jsdoc-syntax">();
417             </span><span class="jsdoc-var">this.data.addAll</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">);
418             </span><span class="jsdoc-var">this.totalLength </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">t</span><span class="jsdoc-syntax">;
419             </span><span class="jsdoc-var">this.applySort</span><span class="jsdoc-syntax">();
420             </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;datachanged&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
421         }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
422             </span><span class="jsdoc-var">this.totalLength </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Math.max</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">t</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.data.length</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">r.length</span><span class="jsdoc-syntax">);
423             </span><span class="jsdoc-var">this.add</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">);
424         }
425
426         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.parent </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">Roo.isIOS </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">this.useNativeIOS </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.parent.emptyTitle.length</span><span class="jsdoc-syntax">) {
427
428             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">e </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.data.Record</span><span class="jsdoc-syntax">({});
429
430             </span><span class="jsdoc-var">e.set</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.parent.displayField</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.parent.emptyTitle</span><span class="jsdoc-syntax">);
431             </span><span class="jsdoc-var">e.set</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.parent.valueField</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
432
433             </span><span class="jsdoc-var">this.insert</span><span class="jsdoc-syntax">(0, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">);
434         }
435
436         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;load&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">r</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">);
437         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">options.callback</span><span class="jsdoc-syntax">){
438             </span><span class="jsdoc-var">options.callback.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">options.scope </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">options</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">);
439         }
440     },
441
442
443     </span><span class="jsdoc-comment">/**
444      * Loads data from a passed data block. A Reader which understands the format of the data
445      * must have been configured in the constructor.
446      * @param {Object} data The data block from which to read the Records.  The format of the data expected
447      * is dependent on the type of Reader that is configured and should correspond to that Reader's readRecords parameter.
448      * @param {Boolean} append (Optional) True to append the new Records rather than replace the existing cache.
449      */
450     </span><span class="jsdoc-var">loadData </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">append</span><span class="jsdoc-syntax">){
451         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.reader.readRecords</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">);
452         </span><span class="jsdoc-var">this.loadRecords</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, {</span><span class="jsdoc-var">add</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">append</span><span class="jsdoc-syntax">}, </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">);
453     },
454
455      </span><span class="jsdoc-comment">/**
456      * using 'cn' the nested child reader read the child array into it's child stores.
457      * @param {Object} rec The record with a 'children array
458      */
459     </span><span class="jsdoc-var">loadDataFromChildren </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">rec</span><span class="jsdoc-syntax">)
460     {
461         </span><span class="jsdoc-var">this.loadData</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.reader.toLoadData</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">rec</span><span class="jsdoc-syntax">));
462     },
463
464
465     </span><span class="jsdoc-comment">/**
466      * Gets the number of cached records.
467      * &lt;p&gt;
468      * &lt;em&gt;If using paging, this may not be the total size of the dataset. If the data object
469      * used by the Reader contains the dataset size, then the getTotalCount() function returns
470      * the data set size&lt;/em&gt;
471      */
472     </span><span class="jsdoc-var">getCount </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
473         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.data.length </span><span class="jsdoc-syntax">|| 0;
474     },
475
476     </span><span class="jsdoc-comment">/**
477      * Gets the total number of records in the dataset as returned by the server.
478      * &lt;p&gt;
479      * &lt;em&gt;If using paging, for this to be accurate, the data object used by the Reader must contain
480      * the dataset size&lt;/em&gt;
481      */
482     </span><span class="jsdoc-var">getTotalCount </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
483         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.totalLength </span><span class="jsdoc-syntax">|| 0;
484     },
485
486     </span><span class="jsdoc-comment">/**
487      * Returns the sort state of the Store as an object with two properties:
488      * &lt;pre&gt;&lt;code&gt;
489  field {String} The name of the field by which the Records are sorted
490  direction {String} The sort order, &quot;ASC&quot; or &quot;DESC&quot;
491      * &lt;/code&gt;&lt;/pre&gt;
492      */
493     </span><span class="jsdoc-var">getSortState </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
494         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.sortInfo</span><span class="jsdoc-syntax">;
495     },
496
497     </span><span class="jsdoc-comment">// private
498     </span><span class="jsdoc-var">applySort </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
499         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.sortInfo </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">this.remoteSort</span><span class="jsdoc-syntax">){
500             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">s </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.sortInfo</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">f </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">s.field</span><span class="jsdoc-syntax">;
501             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">st </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.fields.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">f</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.sortType</span><span class="jsdoc-syntax">;
502             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">fn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r1</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">r2</span><span class="jsdoc-syntax">){
503                 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">v1 </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">st</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r1.data</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">f</span><span class="jsdoc-syntax">]), </span><span class="jsdoc-var">v2 </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">st</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r2.data</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">f</span><span class="jsdoc-syntax">]);
504                 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">v1 </span><span class="jsdoc-syntax">&gt; </span><span class="jsdoc-var">v2 </span><span class="jsdoc-syntax">? 1 : (</span><span class="jsdoc-var">v1 </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">v2 </span><span class="jsdoc-syntax">? -1 : 0);
505             };
506             </span><span class="jsdoc-var">this.data.sort</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">s.direction</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">);
507             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.snapshot </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.snapshot </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-var">this.data</span><span class="jsdoc-syntax">){
508                 </span><span class="jsdoc-var">this.snapshot.sort</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">s.direction</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">);
509             }
510         }
511     },
512
513     </span><span class="jsdoc-comment">/**
514      * Sets the default sort column and order to be used by the next load operation.
515      * @param {String} fieldName The name of the field to sort by.
516      * @param {String} dir (optional) The sort order, &quot;ASC&quot; or &quot;DESC&quot; (defaults to &quot;ASC&quot;)
517      */
518     </span><span class="jsdoc-var">setDefaultSort </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">field</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">dir</span><span class="jsdoc-syntax">){
519         </span><span class="jsdoc-var">this.sortInfo </span><span class="jsdoc-syntax">= {</span><span class="jsdoc-var">field</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">field</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">direction</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">dir </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">dir.toUpperCase</span><span class="jsdoc-syntax">() : </span><span class="jsdoc-string">&quot;ASC&quot;</span><span class="jsdoc-syntax">};
520     },
521
522     </span><span class="jsdoc-comment">/**
523      * Sort the Records.
524      * If remote sorting is used, the sort is performed on the server, and the cache is
525      * reloaded. If local sorting is used, the cache is sorted internally.
526      * @param {String} fieldName The name of the field to sort by.
527      * @param {String} dir (optional) The sort order, &quot;ASC&quot; or &quot;DESC&quot; (defaults to &quot;ASC&quot;)
528      */
529     </span><span class="jsdoc-var">sort </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fieldName</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">dir</span><span class="jsdoc-syntax">){
530         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">f </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.fields.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fieldName</span><span class="jsdoc-syntax">);
531         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">dir</span><span class="jsdoc-syntax">){
532             </span><span class="jsdoc-var">this.sortToggle</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">f.name</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">this.sortToggle</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">f.name</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-var">f.sortDir</span><span class="jsdoc-syntax">;
533
534             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.multiSort </span><span class="jsdoc-syntax">|| (</span><span class="jsdoc-var">this.sortInfo </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.sortInfo.field </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">f.name</span><span class="jsdoc-syntax">) ){ </span><span class="jsdoc-comment">// toggle sort dir
535                 </span><span class="jsdoc-var">dir </span><span class="jsdoc-syntax">= (</span><span class="jsdoc-var">this.sortToggle</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">f.name</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-string">&quot;ASC&quot;</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.toggle</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;ASC&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">&quot;DESC&quot;</span><span class="jsdoc-syntax">);
536             }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
537                 </span><span class="jsdoc-var">dir </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">f.sortDir</span><span class="jsdoc-syntax">;
538             }
539         }
540         </span><span class="jsdoc-var">this.sortToggle</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">f.name</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">dir</span><span class="jsdoc-syntax">;
541         </span><span class="jsdoc-var">this.sortInfo </span><span class="jsdoc-syntax">= {</span><span class="jsdoc-var">field</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">f.name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">direction</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">dir</span><span class="jsdoc-syntax">};
542         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.remoteSort</span><span class="jsdoc-syntax">){
543             </span><span class="jsdoc-var">this.applySort</span><span class="jsdoc-syntax">();
544             </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;datachanged&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
545         }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
546             </span><span class="jsdoc-var">this.load</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.lastOptions</span><span class="jsdoc-syntax">);
547         }
548     },
549
550     </span><span class="jsdoc-comment">/**
551      * Calls the specified function for each of the Records in the cache.
552      * @param {Function} fn The function to call. The Record is passed as the first parameter.
553      * Returning &lt;em&gt;false&lt;/em&gt; aborts and exits the iteration.
554      * @param {Object} scope (optional) The scope in which to call the function (defaults to the Record).
555      */
556     </span><span class="jsdoc-var">each </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">){
557         </span><span class="jsdoc-var">this.data.each</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">);
558     },
559
560     </span><span class="jsdoc-comment">/**
561      * Gets all records modified since the last commit.  Modified records are persisted across load operations
562      * (e.g., during paging).
563      * @return {Roo.data.Record[]} An array of Records containing outstanding modifications.
564      */
565     </span><span class="jsdoc-var">getModifiedRecords </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
566         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.modified</span><span class="jsdoc-syntax">;
567     },
568
569     </span><span class="jsdoc-comment">// private
570     </span><span class="jsdoc-var">createFilterFn </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">property</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">anyMatch</span><span class="jsdoc-syntax">){
571         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">value.exec</span><span class="jsdoc-syntax">){ </span><span class="jsdoc-comment">// not a regex
572             </span><span class="jsdoc-var">value </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">String</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">);
573             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">value.length </span><span class="jsdoc-syntax">== 0){
574                 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
575             }
576             </span><span class="jsdoc-var">value </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">RegExp</span><span class="jsdoc-syntax">((</span><span class="jsdoc-var">anyMatch </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">true </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'^'</span><span class="jsdoc-syntax">) + </span><span class="jsdoc-var">Roo.escapeRe</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">), </span><span class="jsdoc-string">&quot;i&quot;</span><span class="jsdoc-syntax">);
577         }
578         </span><span class="jsdoc-keyword">return function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">){
579             </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">value.test</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r.data</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">property</span><span class="jsdoc-syntax">]);
580         };
581     },
582
583     </span><span class="jsdoc-comment">/**
584      * Sums the value of &lt;i&gt;property&lt;/i&gt; for each record between start and end and returns the result.
585      * @param {String} property A field on your records
586      * @param {Number} start The record index to start at (defaults to 0)
587      * @param {Number} end The last record index to include (defaults to length - 1)
588      * @return {Number} The sum
589      */
590     </span><span class="jsdoc-var">sum </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">property</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">end</span><span class="jsdoc-syntax">){
591         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">rs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.data.items</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">v </span><span class="jsdoc-syntax">= 0;
592         </span><span class="jsdoc-var">start </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">start </span><span class="jsdoc-syntax">|| 0;
593         </span><span class="jsdoc-var">end </span><span class="jsdoc-syntax">= (</span><span class="jsdoc-var">end </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">end </span><span class="jsdoc-syntax">=== 0) ? </span><span class="jsdoc-var">end </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rs.length</span><span class="jsdoc-syntax">-1;
594
595         </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">= </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt;= </span><span class="jsdoc-var">end</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++){
596             </span><span class="jsdoc-var">v </span><span class="jsdoc-syntax">+= (</span><span class="jsdoc-var">rs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.data</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">property</span><span class="jsdoc-syntax">] || 0);
597         }
598         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">;
599     },
600
601     </span><span class="jsdoc-comment">/**
602      * Filter the records by a specified property.
603      * @param {String} field A field on your records
604      * @param {String/RegExp} value Either a string that the field
605      * should start with or a RegExp to test against the field
606      * @param {Boolean} anyMatch True to match any part not just the beginning
607      */
608     </span><span class="jsdoc-var">filter </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">property</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">anyMatch</span><span class="jsdoc-syntax">){
609         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">fn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.createFilterFn</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">property</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">anyMatch</span><span class="jsdoc-syntax">);
610         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">fn </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">this.filterBy</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-var">this.clearFilter</span><span class="jsdoc-syntax">();
611     },
612
613     </span><span class="jsdoc-comment">/**
614      * Filter by a function. The specified function will be called with each
615      * record in this data source. If the function returns true the record is included,
616      * otherwise it is filtered.
617      * @param {Function} fn The function to be called, it will receive 2 args (record, id)
618      * @param {Object} scope (optional) The scope of the function (defaults to this)
619      */
620     </span><span class="jsdoc-var">filterBy </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">){
621         </span><span class="jsdoc-var">this.snapshot </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.snapshot </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this.data</span><span class="jsdoc-syntax">;
622         </span><span class="jsdoc-var">this.data </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.queryBy</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">this</span><span class="jsdoc-syntax">);
623         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;datachanged&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
624     },
625
626     </span><span class="jsdoc-comment">/**
627      * Query the records by a specified property.
628      * @param {String} field A field on your records
629      * @param {String/RegExp} value Either a string that the field
630      * should start with or a RegExp to test against the field
631      * @param {Boolean} anyMatch True to match any part not just the beginning
632      * @return {MixedCollection} Returns an Roo.util.MixedCollection of the matched records
633      */
634     </span><span class="jsdoc-var">query </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">property</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">anyMatch</span><span class="jsdoc-syntax">){
635         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">fn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.createFilterFn</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">property</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">anyMatch</span><span class="jsdoc-syntax">);
636         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">fn </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">this.queryBy</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-var">this.data.clone</span><span class="jsdoc-syntax">();
637     },
638
639     </span><span class="jsdoc-comment">/**
640      * Query by a function. The specified function will be called with each
641      * record in this data source. If the function returns true the record is included
642      * in the results.
643      * @param {Function} fn The function to be called, it will receive 2 args (record, id)
644      * @param {Object} scope (optional) The scope of the function (defaults to this)
645       @return {MixedCollection} Returns an Roo.util.MixedCollection of the matched records
646      **/
647     </span><span class="jsdoc-var">queryBy </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">){
648         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">data </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.snapshot </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this.data</span><span class="jsdoc-syntax">;
649         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">data.filterBy</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">this</span><span class="jsdoc-syntax">);
650     },
651
652     </span><span class="jsdoc-comment">/**
653      * Collects unique values for a particular dataIndex from this store.
654      * @param {String} dataIndex The property to collect
655      * @param {Boolean} allowNull (optional) Pass true to allow null, undefined or empty string values
656      * @param {Boolean} bypassFilter (optional) Pass true to collect from all records, even ones which are filtered
657      * @return {Array} An array of the unique values
658      **/
659     </span><span class="jsdoc-var">collect </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">dataIndex</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">allowNull</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">bypassFilter</span><span class="jsdoc-syntax">){
660         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">d </span><span class="jsdoc-syntax">= (</span><span class="jsdoc-var">bypassFilter </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">true </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.snapshot</span><span class="jsdoc-syntax">) ?
661                 </span><span class="jsdoc-var">this.snapshot.items </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.data.items</span><span class="jsdoc-syntax">;
662         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">sv</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">= [], </span><span class="jsdoc-var">l </span><span class="jsdoc-syntax">= {};
663         </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">d.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++){
664             </span><span class="jsdoc-var">v </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">d</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.data</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">dataIndex</span><span class="jsdoc-syntax">];
665             </span><span class="jsdoc-var">sv </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">String</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">);
666             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">((</span><span class="jsdoc-var">allowNull </span><span class="jsdoc-syntax">|| !</span><span class="jsdoc-var">Roo.isEmpty</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">)) &amp;&amp; !</span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">sv</span><span class="jsdoc-syntax">]){
667                 </span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">sv</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
668                 </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r.length</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">;
669             }
670         }
671         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">;
672     },
673
674     </span><span class="jsdoc-comment">/**
675      * Revert to a view of the Record cache with no filtering applied.
676      * @param {Boolean} suppressEvent If true the filter is cleared silently without notifying listeners
677      */
678     </span><span class="jsdoc-var">clearFilter </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">suppressEvent</span><span class="jsdoc-syntax">){
679         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.snapshot </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.snapshot </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-var">this.data</span><span class="jsdoc-syntax">){
680             </span><span class="jsdoc-var">this.data </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.snapshot</span><span class="jsdoc-syntax">;
681             </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">this.snapshot</span><span class="jsdoc-syntax">;
682             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">suppressEvent </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">){
683                 </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;datachanged&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
684             }
685         }
686     },
687
688     </span><span class="jsdoc-comment">// private
689     </span><span class="jsdoc-var">afterEdit </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">){
690         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.modified.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">) == -1){
691             </span><span class="jsdoc-var">this.modified.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">);
692         }
693         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;update&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.data.Record.EDIT</span><span class="jsdoc-syntax">);
694     },
695
696     </span><span class="jsdoc-comment">// private
697     </span><span class="jsdoc-var">afterReject </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">){
698         </span><span class="jsdoc-var">this.modified.remove</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">);
699         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;update&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.data.Record.REJECT</span><span class="jsdoc-syntax">);
700     },
701
702     </span><span class="jsdoc-comment">// private
703     </span><span class="jsdoc-var">afterCommit </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">){
704         </span><span class="jsdoc-var">this.modified.remove</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">);
705         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;update&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.data.Record.COMMIT</span><span class="jsdoc-syntax">);
706     },
707
708     </span><span class="jsdoc-comment">/**
709      * Commit all Records with outstanding changes. To handle updates for changes, subscribe to the
710      * Store's &quot;update&quot; event, and perform updating when the third parameter is Roo.data.Record.COMMIT.
711      */
712     </span><span class="jsdoc-var">commitChanges </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
713         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">m </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.modified.slice</span><span class="jsdoc-syntax">(0);
714         </span><span class="jsdoc-var">this.modified </span><span class="jsdoc-syntax">= [];
715         </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">m.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++){
716             </span><span class="jsdoc-var">m</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.commit</span><span class="jsdoc-syntax">();
717         }
718     },
719
720     </span><span class="jsdoc-comment">/**
721      * Cancel outstanding changes on all changed records.
722      */
723     </span><span class="jsdoc-var">rejectChanges </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
724         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">m </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.modified.slice</span><span class="jsdoc-syntax">(0);
725         </span><span class="jsdoc-var">this.modified </span><span class="jsdoc-syntax">= [];
726         </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">m.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++){
727             </span><span class="jsdoc-var">m</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.reject</span><span class="jsdoc-syntax">();
728         }
729     },
730
731     </span><span class="jsdoc-var">onMetaChange </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">meta</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">rtype</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">){
732         </span><span class="jsdoc-var">this.recordType </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">rtype</span><span class="jsdoc-syntax">;
733         </span><span class="jsdoc-var">this.fields </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">rtype.prototype.fields</span><span class="jsdoc-syntax">;
734         </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">this.snapshot</span><span class="jsdoc-syntax">;
735         </span><span class="jsdoc-var">this.sortInfo </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">meta.sortInfo </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this.sortInfo</span><span class="jsdoc-syntax">;
736         </span><span class="jsdoc-var">this.modified </span><span class="jsdoc-syntax">= [];
737         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'metachange'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.reader.meta</span><span class="jsdoc-syntax">);
738     },
739
740     </span><span class="jsdoc-var">moveIndex </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">data</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">)
741     {
742         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">data</span><span class="jsdoc-syntax">);
743
744         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">newIndex </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">;
745
746         </span><span class="jsdoc-var">this.remove</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">data</span><span class="jsdoc-syntax">);
747
748         </span><span class="jsdoc-var">this.insert</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newIndex</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">data</span><span class="jsdoc-syntax">);
749
750     }
751 });</span></code></body></html>