Fix #6201 - Category select
[roojs1] / docs / src / Roo_data_Tree.js.html
1 <html><head><title>Roo/data/Tree.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  * @class Roo.data.Tree
15  * @extends Roo.util.Observable
16  * Represents a tree data structure and bubbles all the events for its nodes. The nodes
17  * in the tree have most standard DOM functionality.
18  * @constructor
19  * @param {Node} root (optional) The root node
20  */
21 </span><span class="jsdoc-var">Roo.data.Tree </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">root</span><span class="jsdoc-syntax">){
22    </span><span class="jsdoc-var">this.nodeHash </span><span class="jsdoc-syntax">= {};
23    </span><span class="jsdoc-comment">/**
24     * The root node for this tree
25     * @type Node
26     */
27    </span><span class="jsdoc-var">this.root </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
28    </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">root</span><span class="jsdoc-syntax">){
29        </span><span class="jsdoc-var">this.setRootNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">root</span><span class="jsdoc-syntax">);
30    }
31    </span><span class="jsdoc-var">this.addEvents</span><span class="jsdoc-syntax">({
32        </span><span class="jsdoc-comment">/**
33         * @event append
34         * Fires when a new child node is appended to a node in this tree.
35         * @param {Tree} tree The owner tree
36         * @param {Node} parent The parent node
37         * @param {Node} node The newly appended node
38         * @param {Number} index The index of the newly appended node
39         */
40        </span><span class="jsdoc-string">&quot;append&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
41        </span><span class="jsdoc-comment">/**
42         * @event remove
43         * Fires when a child node is removed from a node in this tree.
44         * @param {Tree} tree The owner tree
45         * @param {Node} parent The parent node
46         * @param {Node} node The child node removed
47         */
48        </span><span class="jsdoc-string">&quot;remove&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
49        </span><span class="jsdoc-comment">/**
50         * @event move
51         * Fires when a node is moved to a new location in the tree
52         * @param {Tree} tree The owner tree
53         * @param {Node} node The node moved
54         * @param {Node} oldParent The old parent of this node
55         * @param {Node} newParent The new parent of this node
56         * @param {Number} index The index it was moved to
57         */
58        </span><span class="jsdoc-string">&quot;move&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
59        </span><span class="jsdoc-comment">/**
60         * @event insert
61         * Fires when a new child node is inserted in a node in this tree.
62         * @param {Tree} tree The owner tree
63         * @param {Node} parent The parent node
64         * @param {Node} node The child node inserted
65         * @param {Node} refNode The child node the node was inserted before
66         */
67        </span><span class="jsdoc-string">&quot;insert&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
68        </span><span class="jsdoc-comment">/**
69         * @event beforeappend
70         * Fires before a new child is appended to a node in this tree, return false to cancel the append.
71         * @param {Tree} tree The owner tree
72         * @param {Node} parent The parent node
73         * @param {Node} node The child node to be appended
74         */
75        </span><span class="jsdoc-string">&quot;beforeappend&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
76        </span><span class="jsdoc-comment">/**
77         * @event beforeremove
78         * Fires before a child is removed from a node in this tree, return false to cancel the remove.
79         * @param {Tree} tree The owner tree
80         * @param {Node} parent The parent node
81         * @param {Node} node The child node to be removed
82         */
83        </span><span class="jsdoc-string">&quot;beforeremove&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
84        </span><span class="jsdoc-comment">/**
85         * @event beforemove
86         * Fires before a node is moved to a new location in the tree. Return false to cancel the move.
87         * @param {Tree} tree The owner tree
88         * @param {Node} node The node being moved
89         * @param {Node} oldParent The parent of the node
90         * @param {Node} newParent The new parent the node is moving to
91         * @param {Number} index The index it is being moved to
92         */
93        </span><span class="jsdoc-string">&quot;beforemove&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
94        </span><span class="jsdoc-comment">/**
95         * @event beforeinsert
96         * Fires before a new child is inserted in a node in this tree, return false to cancel the insert.
97         * @param {Tree} tree The owner tree
98         * @param {Node} parent The parent node
99         * @param {Node} node The child node to be inserted
100         * @param {Node} refNode The child node the node is being inserted before
101         */
102        </span><span class="jsdoc-string">&quot;beforeinsert&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true
103    </span><span class="jsdoc-syntax">});
104
105     </span><span class="jsdoc-var">Roo.data.Tree.superclass.constructor.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
106 };
107
108 </span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.data.Tree</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.util.Observable</span><span class="jsdoc-syntax">, {
109     </span><span class="jsdoc-var">pathSeparator</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;/&quot;</span><span class="jsdoc-syntax">,
110
111     </span><span class="jsdoc-var">proxyNodeEvent </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
112         </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">arguments</span><span class="jsdoc-syntax">);
113     },
114
115     </span><span class="jsdoc-comment">/**
116      * Returns the root node for this tree.
117      * @return {Node}
118      */
119     </span><span class="jsdoc-var">getRootNode </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
120         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.root</span><span class="jsdoc-syntax">;
121     },
122
123     </span><span class="jsdoc-comment">/**
124      * Sets the root node for this tree.
125      * @param {Node} node
126      * @return {Node}
127      */
128     </span><span class="jsdoc-var">setRootNode </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
129         </span><span class="jsdoc-var">this.root </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
130         </span><span class="jsdoc-var">node.ownerTree </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
131         </span><span class="jsdoc-var">node.isRoot </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
132         </span><span class="jsdoc-var">this.registerNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
133         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
134     },
135
136     </span><span class="jsdoc-comment">/**
137      * Gets a node in this tree by its id.
138      * @param {String} id
139      * @return {Node}
140      */
141     </span><span class="jsdoc-var">getNodeById </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">){
142         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.nodeHash</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">];
143     },
144
145     </span><span class="jsdoc-var">registerNode </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
146         </span><span class="jsdoc-var">this.nodeHash</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">node.id</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
147     },
148
149     </span><span class="jsdoc-var">unregisterNode </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
150         </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">this.nodeHash</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">node.id</span><span class="jsdoc-syntax">];
151     },
152
153     </span><span class="jsdoc-var">toString </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
154         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-string">&quot;[Tree&quot;</span><span class="jsdoc-syntax">+(</span><span class="jsdoc-var">this.id</span><span class="jsdoc-syntax">?</span><span class="jsdoc-string">&quot; &quot;</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">this.id</span><span class="jsdoc-syntax">:</span><span class="jsdoc-string">&quot;&quot;</span><span class="jsdoc-syntax">)+</span><span class="jsdoc-string">&quot;]&quot;</span><span class="jsdoc-syntax">;
155     }
156 });
157
158 </span><span class="jsdoc-comment">/**
159  * @class Roo.data.Node
160  * @extends Roo.util.Observable
161  * @cfg {Boolean} leaf true if this node is a leaf and does not have children
162  * @cfg {String} id The id for this node. If one is not specified, one is generated.
163  * @constructor
164  * @param {Object} attributes The attributes/config for the node
165  */
166 </span><span class="jsdoc-var">Roo.data.Node </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attributes</span><span class="jsdoc-syntax">){
167     </span><span class="jsdoc-comment">/**
168      * The attributes supplied for the node. You can use this property to access any custom attributes you supplied.
169      * @type {Object}
170      */
171     </span><span class="jsdoc-var">this.attributes </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">attributes </span><span class="jsdoc-syntax">|| {};
172     </span><span class="jsdoc-var">this.leaf </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.attributes.leaf</span><span class="jsdoc-syntax">;
173     </span><span class="jsdoc-comment">/**
174      * The node id. @type String
175      */
176     </span><span class="jsdoc-var">this.id </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.attributes.id</span><span class="jsdoc-syntax">;
177     </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.id</span><span class="jsdoc-syntax">){
178         </span><span class="jsdoc-var">this.id </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.id</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">&quot;ynode-&quot;</span><span class="jsdoc-syntax">);
179         </span><span class="jsdoc-var">this.attributes.id </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.id</span><span class="jsdoc-syntax">;
180     }
181
182
183     </span><span class="jsdoc-comment">/**
184      * All child nodes of this node. @type Array
185      */
186     </span><span class="jsdoc-var">this.childNodes </span><span class="jsdoc-syntax">= [];
187     </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.childNodes.indexOf</span><span class="jsdoc-syntax">){ </span><span class="jsdoc-comment">// indexOf is a must
188         </span><span class="jsdoc-var">this.childNodes.indexOf </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">){
189             </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">this.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">++){
190                 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] == </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">) {
191                     </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">;
192                 }
193             }
194             </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">-1;
195         };
196     }
197     </span><span class="jsdoc-comment">/**
198      * The parent node for this node. @type Node
199      */
200     </span><span class="jsdoc-var">this.parentNode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
201     </span><span class="jsdoc-comment">/**
202      * The first direct child node of this node, or null if this node has no child nodes. @type Node
203      */
204     </span><span class="jsdoc-var">this.firstChild </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
205     </span><span class="jsdoc-comment">/**
206      * The last direct child node of this node, or null if this node has no child nodes. @type Node
207      */
208     </span><span class="jsdoc-var">this.lastChild </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
209     </span><span class="jsdoc-comment">/**
210      * The node immediately preceding this node in the tree, or null if there is no sibling node. @type Node
211      */
212     </span><span class="jsdoc-var">this.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
213     </span><span class="jsdoc-comment">/**
214      * The node immediately following this node in the tree, or null if there is no sibling node. @type Node
215      */
216     </span><span class="jsdoc-var">this.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
217
218     </span><span class="jsdoc-var">this.addEvents</span><span class="jsdoc-syntax">({
219        </span><span class="jsdoc-comment">/**
220         * @event append
221         * Fires when a new child node is appended
222         * @param {Tree} tree The owner tree
223         * @param {Node} this This node
224         * @param {Node} node The newly appended node
225         * @param {Number} index The index of the newly appended node
226         */
227        </span><span class="jsdoc-string">&quot;append&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
228        </span><span class="jsdoc-comment">/**
229         * @event remove
230         * Fires when a child node is removed
231         * @param {Tree} tree The owner tree
232         * @param {Node} this This node
233         * @param {Node} node The removed node
234         */
235        </span><span class="jsdoc-string">&quot;remove&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
236        </span><span class="jsdoc-comment">/**
237         * @event move
238         * Fires when this node is moved to a new location in the tree
239         * @param {Tree} tree The owner tree
240         * @param {Node} this This node
241         * @param {Node} oldParent The old parent of this node
242         * @param {Node} newParent The new parent of this node
243         * @param {Number} index The index it was moved to
244         */
245        </span><span class="jsdoc-string">&quot;move&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
246        </span><span class="jsdoc-comment">/**
247         * @event insert
248         * Fires when a new child node is inserted.
249         * @param {Tree} tree The owner tree
250         * @param {Node} this This node
251         * @param {Node} node The child node inserted
252         * @param {Node} refNode The child node the node was inserted before
253         */
254        </span><span class="jsdoc-string">&quot;insert&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
255        </span><span class="jsdoc-comment">/**
256         * @event beforeappend
257         * Fires before a new child is appended, return false to cancel the append.
258         * @param {Tree} tree The owner tree
259         * @param {Node} this This node
260         * @param {Node} node The child node to be appended
261         */
262        </span><span class="jsdoc-string">&quot;beforeappend&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
263        </span><span class="jsdoc-comment">/**
264         * @event beforeremove
265         * Fires before a child is removed, return false to cancel the remove.
266         * @param {Tree} tree The owner tree
267         * @param {Node} this This node
268         * @param {Node} node The child node to be removed
269         */
270        </span><span class="jsdoc-string">&quot;beforeremove&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
271        </span><span class="jsdoc-comment">/**
272         * @event beforemove
273         * Fires before this node is moved to a new location in the tree. Return false to cancel the move.
274         * @param {Tree} tree The owner tree
275         * @param {Node} this This node
276         * @param {Node} oldParent The parent of this node
277         * @param {Node} newParent The new parent this node is moving to
278         * @param {Number} index The index it is being moved to
279         */
280        </span><span class="jsdoc-string">&quot;beforemove&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
281        </span><span class="jsdoc-comment">/**
282         * @event beforeinsert
283         * Fires before a new child is inserted, return false to cancel the insert.
284         * @param {Tree} tree The owner tree
285         * @param {Node} this This node
286         * @param {Node} node The child node to be inserted
287         * @param {Node} refNode The child node the node is being inserted before
288         */
289        </span><span class="jsdoc-string">&quot;beforeinsert&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true
290    </span><span class="jsdoc-syntax">});
291     </span><span class="jsdoc-var">this.listeners </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.attributes.listeners</span><span class="jsdoc-syntax">;
292     </span><span class="jsdoc-var">Roo.data.Node.superclass.constructor.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
293 };
294
295 </span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.data.Node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.util.Observable</span><span class="jsdoc-syntax">, {
296     </span><span class="jsdoc-var">fireEvent </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">evtName</span><span class="jsdoc-syntax">){
297         </span><span class="jsdoc-comment">// first do standard event for this node
298         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.data.Node.superclass.fireEvent.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">) === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
299             </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
300         }
301         </span><span class="jsdoc-comment">// then bubble it up to the tree if the event wasn't cancelled
302         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ot </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getOwnerTree</span><span class="jsdoc-syntax">();
303         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ot</span><span class="jsdoc-syntax">){
304             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ot.proxyNodeEvent.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ot</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">) === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
305                 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
306             }
307         }
308         </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
309     },
310
311     </span><span class="jsdoc-comment">/**
312      * Returns true if this node is a leaf
313      * @return {Boolean}
314      */
315     </span><span class="jsdoc-var">isLeaf </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
316         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.leaf </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
317     },
318
319     </span><span class="jsdoc-comment">// private
320     </span><span class="jsdoc-var">setFirstChild </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
321         </span><span class="jsdoc-var">this.firstChild </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
322     },
323
324     </span><span class="jsdoc-comment">//private
325     </span><span class="jsdoc-var">setLastChild </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
326         </span><span class="jsdoc-var">this.lastChild </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
327     },
328
329
330     </span><span class="jsdoc-comment">/**
331      * Returns true if this node is the last child of its parent
332      * @return {Boolean}
333      */
334     </span><span class="jsdoc-var">isLast </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
335        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.parentNode </span><span class="jsdoc-syntax">? </span><span class="jsdoc-keyword">true </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.parentNode.lastChild </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
336     },
337
338     </span><span class="jsdoc-comment">/**
339      * Returns true if this node is the first child of its parent
340      * @return {Boolean}
341      */
342     </span><span class="jsdoc-var">isFirst </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
343        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.parentNode </span><span class="jsdoc-syntax">? </span><span class="jsdoc-keyword">true </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.parentNode.firstChild </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
344     },
345
346     </span><span class="jsdoc-var">hasChildNodes </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
347         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">!</span><span class="jsdoc-var">this.isLeaf</span><span class="jsdoc-syntax">() &amp;&amp; </span><span class="jsdoc-var">this.childNodes.length </span><span class="jsdoc-syntax">&gt; 0;
348     },
349
350     </span><span class="jsdoc-comment">/**
351      * Insert node(s) as the last child node of this node.
352      * @param {Node/Array} node The node or Array of nodes to append
353      * @return {Node} The appended node if single append, or null if an array was passed
354      */
355     </span><span class="jsdoc-var">appendChild </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
356         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">multi </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
357         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node </span><span class="jsdoc-keyword">instanceof </span><span class="jsdoc-var">Array</span><span class="jsdoc-syntax">){
358             </span><span class="jsdoc-var">multi </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
359         }</span><span class="jsdoc-keyword">else if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">arguments.length </span><span class="jsdoc-syntax">&gt; 1){
360             </span><span class="jsdoc-var">multi </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">;
361         }
362
363         </span><span class="jsdoc-comment">// if passed an array or multiple args do them one by one
364         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">multi</span><span class="jsdoc-syntax">){
365             </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">multi.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">++) {
366                 </span><span class="jsdoc-var">this.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">multi</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]);
367             }
368         }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
369             </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;beforeappend&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
370                 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
371             }
372             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes.length</span><span class="jsdoc-syntax">;
373             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">oldParent </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.parentNode</span><span class="jsdoc-syntax">;
374             </span><span class="jsdoc-comment">// it's a move, make sure we move it cleanly
375             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">){
376                 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;beforemove&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node.getOwnerTree</span><span class="jsdoc-syntax">(), </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">) === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
377                     </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
378                 }
379                 </span><span class="jsdoc-var">oldParent.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
380             }
381
382             </span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes.length</span><span class="jsdoc-syntax">;
383             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">== 0){
384                 </span><span class="jsdoc-var">this.setFirstChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
385             }
386             </span><span class="jsdoc-var">this.childNodes.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
387             </span><span class="jsdoc-var">node.parentNode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
388             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">-1];
389             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ps</span><span class="jsdoc-syntax">){
390                 </span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ps</span><span class="jsdoc-syntax">;
391                 </span><span class="jsdoc-var">ps.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
392             }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
393                 </span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
394             }
395             </span><span class="jsdoc-var">node.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
396             </span><span class="jsdoc-var">this.setLastChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
397             </span><span class="jsdoc-var">node.setOwnerTree</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.getOwnerTree</span><span class="jsdoc-syntax">());
398             </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;append&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">);
399             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">) {
400                 </span><span class="jsdoc-var">this.ownerTree.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;appendnode&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">);
401             }
402             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">){
403                 </span><span class="jsdoc-var">node.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;move&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">);
404             }
405             </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
406         }
407     },
408
409     </span><span class="jsdoc-comment">/**
410      * Removes a child node from this node.
411      * @param {Node} node The node to remove
412      * @return {Node} The removed node
413      */
414     </span><span class="jsdoc-var">removeChild </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
415         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
416         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">== -1){
417             </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
418         }
419         </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;beforeremove&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
420             </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
421         }
422
423         </span><span class="jsdoc-comment">// remove it from childNodes collection
424         </span><span class="jsdoc-var">this.childNodes.splice</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">, 1);
425
426         </span><span class="jsdoc-comment">// update siblings
427         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.previousSibling</span><span class="jsdoc-syntax">){
428             </span><span class="jsdoc-var">node.previousSibling.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.nextSibling</span><span class="jsdoc-syntax">;
429         }
430         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nextSibling</span><span class="jsdoc-syntax">){
431             </span><span class="jsdoc-var">node.nextSibling.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.previousSibling</span><span class="jsdoc-syntax">;
432         }
433
434         </span><span class="jsdoc-comment">// update child refs
435         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.firstChild </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
436             </span><span class="jsdoc-var">this.setFirstChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nextSibling</span><span class="jsdoc-syntax">);
437         }
438         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.lastChild </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
439             </span><span class="jsdoc-var">this.setLastChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.previousSibling</span><span class="jsdoc-syntax">);
440         }
441
442         </span><span class="jsdoc-var">node.setOwnerTree</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">);
443         </span><span class="jsdoc-comment">// clear any references from the node
444         </span><span class="jsdoc-var">node.parentNode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
445         </span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
446         </span><span class="jsdoc-var">node.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
447         </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.ownerTree</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
448         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
449     },
450
451     </span><span class="jsdoc-comment">/**
452      * Inserts the first node before the second node in this nodes childNodes collection.
453      * @param {Node} node The node to insert
454      * @param {Node} refNode The node to insert before (if null the node is appended)
455      * @return {Node} The inserted node
456      */
457     </span><span class="jsdoc-var">insertBefore </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">refNode</span><span class="jsdoc-syntax">){
458         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">refNode</span><span class="jsdoc-syntax">){ </span><span class="jsdoc-comment">// like standard Dom, refNode can be null for append
459             </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
460         }
461         </span><span class="jsdoc-comment">// nothing to do
462         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">refNode</span><span class="jsdoc-syntax">){
463             </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
464         }
465
466         </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;beforeinsert&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">refNode</span><span class="jsdoc-syntax">) === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
467             </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
468         }
469         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">refNode</span><span class="jsdoc-syntax">);
470         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">oldParent </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.parentNode</span><span class="jsdoc-syntax">;
471         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">refIndex </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">;
472
473         </span><span class="jsdoc-comment">// when moving internally, indexes will change after remove
474         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">oldParent </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">this </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.childNodes.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) &lt; </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">){
475             </span><span class="jsdoc-var">refIndex</span><span class="jsdoc-syntax">--;
476         }
477
478         </span><span class="jsdoc-comment">// it's a move, make sure we move it cleanly
479         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">){
480             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;beforemove&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node.getOwnerTree</span><span class="jsdoc-syntax">(), </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">refNode</span><span class="jsdoc-syntax">) === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
481                 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
482             }
483             </span><span class="jsdoc-var">oldParent.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
484         }
485         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">refIndex </span><span class="jsdoc-syntax">== 0){
486             </span><span class="jsdoc-var">this.setFirstChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
487         }
488         </span><span class="jsdoc-var">this.childNodes.splice</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">refIndex</span><span class="jsdoc-syntax">, 0, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
489         </span><span class="jsdoc-var">node.parentNode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
490         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">refIndex</span><span class="jsdoc-syntax">-1];
491         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ps</span><span class="jsdoc-syntax">){
492             </span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ps</span><span class="jsdoc-syntax">;
493             </span><span class="jsdoc-var">ps.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
494         }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
495             </span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
496         }
497         </span><span class="jsdoc-var">node.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">refNode</span><span class="jsdoc-syntax">;
498         </span><span class="jsdoc-var">refNode.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
499         </span><span class="jsdoc-var">node.setOwnerTree</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.getOwnerTree</span><span class="jsdoc-syntax">());
500         </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;insert&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">refNode</span><span class="jsdoc-syntax">);
501         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">){
502             </span><span class="jsdoc-var">node.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;move&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">refIndex</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">refNode</span><span class="jsdoc-syntax">);
503         }
504         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
505     },
506
507     </span><span class="jsdoc-comment">/**
508      * Returns the child node at the specified index.
509      * @param {Number} index
510      * @return {Node}
511      */
512     </span><span class="jsdoc-var">item </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">){
513         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.childNodes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">];
514     },
515
516     </span><span class="jsdoc-comment">/**
517      * Replaces one child node in this node with another.
518      * @param {Node} newChild The replacement node
519      * @param {Node} oldChild The node to replace
520      * @return {Node} The replaced node
521      */
522     </span><span class="jsdoc-var">replaceChild </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newChild</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">oldChild</span><span class="jsdoc-syntax">){
523         </span><span class="jsdoc-var">this.insertBefore</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newChild</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">oldChild</span><span class="jsdoc-syntax">);
524         </span><span class="jsdoc-var">this.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">oldChild</span><span class="jsdoc-syntax">);
525         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">oldChild</span><span class="jsdoc-syntax">;
526     },
527
528     </span><span class="jsdoc-comment">/**
529      * Returns the index of a child node
530      * @param {Node} node
531      * @return {Number} The index of the node or -1 if it was not found
532      */
533     </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">child</span><span class="jsdoc-syntax">){
534         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.childNodes.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">child</span><span class="jsdoc-syntax">);
535     },
536
537     </span><span class="jsdoc-comment">/**
538      * Returns the tree this node is in.
539      * @return {Tree}
540      */
541     </span><span class="jsdoc-var">getOwnerTree </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
542         </span><span class="jsdoc-comment">// if it doesn't have one, look for one
543         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">){
544             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
545             </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">){
546                 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p.ownerTree</span><span class="jsdoc-syntax">){
547                     </span><span class="jsdoc-var">this.ownerTree </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.ownerTree</span><span class="jsdoc-syntax">;
548                     </span><span class="jsdoc-keyword">break</span><span class="jsdoc-syntax">;
549                 }
550                 </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
551             }
552         }
553         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">;
554     },
555
556     </span><span class="jsdoc-comment">/**
557      * Returns depth of this node (the root node has a depth of 0)
558      * @return {Number}
559      */
560     </span><span class="jsdoc-var">getDepth </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
561         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">depth </span><span class="jsdoc-syntax">= 0;
562         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
563         </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">){
564             ++</span><span class="jsdoc-var">depth</span><span class="jsdoc-syntax">;
565             </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
566         }
567         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">depth</span><span class="jsdoc-syntax">;
568     },
569
570     </span><span class="jsdoc-comment">// private
571     </span><span class="jsdoc-var">setOwnerTree </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tree</span><span class="jsdoc-syntax">){
572         </span><span class="jsdoc-comment">// if it's move, we need to update everyone
573         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tree </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">){
574             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">){
575                 </span><span class="jsdoc-var">this.ownerTree.unregisterNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
576             }
577             </span><span class="jsdoc-var">this.ownerTree </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">tree</span><span class="jsdoc-syntax">;
578             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes</span><span class="jsdoc-syntax">;
579             </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">cs.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">++) {
580                 </span><span class="jsdoc-var">cs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.setOwnerTree</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tree</span><span class="jsdoc-syntax">);
581             }
582             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tree</span><span class="jsdoc-syntax">){
583                 </span><span class="jsdoc-var">tree.registerNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
584             }
585         }
586     },
587
588     </span><span class="jsdoc-comment">/**
589      * Returns the path for this node. The path can be used to expand or select this node programmatically.
590      * @param {String} attr (optional) The attr to use for the path (defaults to the node's id)
591      * @return {String} The path
592      */
593     </span><span class="jsdoc-var">getPath </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">){
594         </span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-string">&quot;id&quot;</span><span class="jsdoc-syntax">;
595         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parentNode</span><span class="jsdoc-syntax">;
596         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">b </span><span class="jsdoc-syntax">= [</span><span class="jsdoc-var">this.attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">]];
597         </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">){
598             </span><span class="jsdoc-var">b.unshift</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p.attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">]);
599             </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
600         }
601         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">sep </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getOwnerTree</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.pathSeparator</span><span class="jsdoc-syntax">;
602         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">sep </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">b.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sep</span><span class="jsdoc-syntax">);
603     },
604
605     </span><span class="jsdoc-comment">/**
606      * Bubbles up the tree from this node, calling the specified function with each node. The scope (&lt;i&gt;this&lt;/i&gt;) of
607      * function call will be the scope provided or the current node. The arguments to the function
608      * will be the args provided or the current node. If the function returns false at any point,
609      * the bubble is stopped.
610      * @param {Function} fn The function to call
611      * @param {Object} scope (optional) The scope of the function (defaults to current node)
612      * @param {Array} args (optional) The args to call the function with (default to passing the current node)
613      */
614     </span><span class="jsdoc-var">bubble </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">args</span><span class="jsdoc-syntax">){
615         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
616         </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">){
617             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">scope </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">args </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">) === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
618                 </span><span class="jsdoc-keyword">break</span><span class="jsdoc-syntax">;
619             }
620             </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
621         }
622     },
623
624     </span><span class="jsdoc-comment">/**
625      * Cascades down the tree from this node, calling the specified function with each node. The scope (&lt;i&gt;this&lt;/i&gt;) of
626      * function call will be the scope provided or the current node. The arguments to the function
627      * will be the args provided or the current node. If the function returns false at any point,
628      * the cascade is stopped on that branch.
629      * @param {Function} fn The function to call
630      * @param {Object} scope (optional) The scope of the function (defaults to current node)
631      * @param {Array} args (optional) The args to call the function with (default to passing the current node)
632      */
633     </span><span class="jsdoc-var">cascade </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">args</span><span class="jsdoc-syntax">){
634         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn.call</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">, </span><span class="jsdoc-var">args </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">) !== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
635             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes</span><span class="jsdoc-syntax">;
636             </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">cs.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">++) {
637                 </span><span class="jsdoc-var">cs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.cascade</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">args</span><span class="jsdoc-syntax">);
638             }
639         }
640     },
641
642     </span><span class="jsdoc-comment">/**
643      * Interates the child nodes of this node, calling the specified function with each node. The scope (&lt;i&gt;this&lt;/i&gt;) of
644      * function call will be the scope provided or the current node. The arguments to the function
645      * will be the args provided or the current node. If the function returns false at any point,
646      * the iteration stops.
647      * @param {Function} fn The function to call
648      * @param {Object} scope (optional) The scope of the function (defaults to current node)
649      * @param {Array} args (optional) The args to call the function with (default to passing the current node)
650      */
651     </span><span class="jsdoc-var">eachChild </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">args</span><span class="jsdoc-syntax">){
652         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes</span><span class="jsdoc-syntax">;
653         </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">cs.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">++) {
654                 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn.call</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">, </span><span class="jsdoc-var">args </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">cs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]) === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
655                     </span><span class="jsdoc-keyword">break</span><span class="jsdoc-syntax">;
656                 }
657         }
658     },
659
660     </span><span class="jsdoc-comment">/**
661      * Finds the first child that has the attribute with the specified value.
662      * @param {String} attribute The attribute name
663      * @param {Mixed} value The value to search for
664      * @return {Node} The found child or null if none was found
665      */
666     </span><span class="jsdoc-var">findChild </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attribute</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">){
667         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes</span><span class="jsdoc-syntax">;
668         </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">cs.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">++) {
669                 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">attribute</span><span class="jsdoc-syntax">] == </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">){
670                     </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">cs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
671                 }
672         }
673         </span><span class="jsdoc-keyword">return null</span><span class="jsdoc-syntax">;
674     },
675
676     </span><span class="jsdoc-comment">/**
677      * Finds the first child by a custom function. The child matches if the function passed
678      * returns true.
679      * @param {Function} fn
680      * @param {Object} scope (optional)
681      * @return {Node} The found child or null if none was found
682      */
683     </span><span class="jsdoc-var">findChildBy </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">){
684         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes</span><span class="jsdoc-syntax">;
685         </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">cs.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">++) {
686                 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">||</span><span class="jsdoc-var">cs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">], </span><span class="jsdoc-var">cs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]) === </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">){
687                     </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">cs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
688                 }
689         }
690         </span><span class="jsdoc-keyword">return null</span><span class="jsdoc-syntax">;
691     },
692
693     </span><span class="jsdoc-comment">/**
694      * Sorts this nodes children using the supplied sort function
695      * @param {Function} fn
696      * @param {Object} scope (optional)
697      */
698     </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">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
699         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes</span><span class="jsdoc-syntax">;
700         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cs.length</span><span class="jsdoc-syntax">;
701         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">&gt; 0){
702             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">sortFn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">scope </span><span class="jsdoc-syntax">? </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){</span><span class="jsdoc-var">fn.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">);} : </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">;
703             </span><span class="jsdoc-var">cs.sort</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sortFn</span><span class="jsdoc-syntax">);
704             </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">&lt; </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++){
705                 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">n </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
706                 </span><span class="jsdoc-var">n.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">-1];
707                 </span><span class="jsdoc-var">n.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">+1];
708                 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">== 0){
709                     </span><span class="jsdoc-var">this.setFirstChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
710                 }
711                 </span><span class="jsdoc-keyword">if</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">-1){
712                     </span><span class="jsdoc-var">this.setLastChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
713                 }
714             }
715         }
716     },
717
718     </span><span class="jsdoc-comment">/**
719      * Returns true if this node is an ancestor (at any point) of the passed node.
720      * @param {Node} node
721      * @return {Boolean}
722      */
723     </span><span class="jsdoc-var">contains </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
724         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">node.isAncestor</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
725     },
726
727     </span><span class="jsdoc-comment">/**
728      * Returns true if the passed node is an ancestor (at any point) of this node.
729      * @param {Node} node
730      * @return {Boolean}
731      */
732     </span><span class="jsdoc-var">isAncestor </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
733         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parentNode</span><span class="jsdoc-syntax">;
734         </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">){
735             </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">){
736                 </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
737             }
738             </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
739         }
740         </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
741     },
742
743     </span><span class="jsdoc-var">toString </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
744         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-string">&quot;[Node&quot;</span><span class="jsdoc-syntax">+(</span><span class="jsdoc-var">this.id</span><span class="jsdoc-syntax">?</span><span class="jsdoc-string">&quot; &quot;</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">this.id</span><span class="jsdoc-syntax">:</span><span class="jsdoc-string">&quot;&quot;</span><span class="jsdoc-syntax">)+</span><span class="jsdoc-string">&quot;]&quot;</span><span class="jsdoc-syntax">;
745     }
746 });</span></code></body></html>