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">/*
4 * Copyright(c) 2006-2007, Ext JS, LLC.
6 * Originally Released Under LGPL - original licence link has changed is not relivant.
9 * <script type="text/javascript">
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.
19 * @param {Node} root (optional) The root node
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
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">);
31 </span><span class="jsdoc-var">this.addEvents</span><span class="jsdoc-syntax">({
32 </span><span class="jsdoc-comment">/**
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
40 </span><span class="jsdoc-string">"append" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
41 </span><span class="jsdoc-comment">/**
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
48 </span><span class="jsdoc-string">"remove" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
49 </span><span class="jsdoc-comment">/**
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
58 </span><span class="jsdoc-string">"move" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
59 </span><span class="jsdoc-comment">/**
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
67 </span><span class="jsdoc-string">"insert" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
68 </span><span class="jsdoc-comment">/**
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
75 </span><span class="jsdoc-string">"beforeappend" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
76 </span><span class="jsdoc-comment">/**
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
83 </span><span class="jsdoc-string">"beforeremove" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
84 </span><span class="jsdoc-comment">/**
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
93 </span><span class="jsdoc-string">"beforemove" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
94 </span><span class="jsdoc-comment">/**
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
102 </span><span class="jsdoc-string">"beforeinsert" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true
103 </span><span class="jsdoc-syntax">});
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">);
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">"/"</span><span class="jsdoc-syntax">,
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">);
115 </span><span class="jsdoc-comment">/**
116 * Returns the root node for this tree.
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">;
123 </span><span class="jsdoc-comment">/**
124 * Sets the root node for this tree.
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">;
136 </span><span class="jsdoc-comment">/**
137 * Gets a node in this tree by its id.
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">];
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">;
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">];
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">"[Tree"</span><span class="jsdoc-syntax">+(</span><span class="jsdoc-var">this.id</span><span class="jsdoc-syntax">?</span><span class="jsdoc-string">" "</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">this.id</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">;
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.
164 * @param {Object} attributes The attributes/config for the node
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.
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
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">"ynode-"</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">;
183 </span><span class="jsdoc-comment">/**
184 * All child nodes of this node. @type Array
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">< </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">;
194 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">-1;
197 </span><span class="jsdoc-comment">/**
198 * The parent node for this node. @type Node
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
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
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
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
216 </span><span class="jsdoc-var">this.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
218 </span><span class="jsdoc-var">this.addEvents</span><span class="jsdoc-syntax">({
219 </span><span class="jsdoc-comment">/**
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
227 </span><span class="jsdoc-string">"append" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
228 </span><span class="jsdoc-comment">/**
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
235 </span><span class="jsdoc-string">"remove" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
236 </span><span class="jsdoc-comment">/**
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
245 </span><span class="jsdoc-string">"move" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
246 </span><span class="jsdoc-comment">/**
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
254 </span><span class="jsdoc-string">"insert" </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
262 </span><span class="jsdoc-string">"beforeappend" </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
270 </span><span class="jsdoc-string">"beforeremove" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
271 </span><span class="jsdoc-comment">/**
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
280 </span><span class="jsdoc-string">"beforemove" </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
289 </span><span class="jsdoc-string">"beforeinsert" </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">);
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">;
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">;
308 </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
311 </span><span class="jsdoc-comment">/**
312 * Returns true if this node is a leaf
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">;
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">;
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">;
330 </span><span class="jsdoc-comment">/**
331 * Returns true if this node is the last child of its parent
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">);
338 </span><span class="jsdoc-comment">/**
339 * Returns true if this node is the first child of its parent
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">);
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">() && </span><span class="jsdoc-var">this.childNodes.length </span><span class="jsdoc-syntax">> 0;
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
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">> 1){
360 </span><span class="jsdoc-var">multi </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">;
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">< </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">]);
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">"beforeappend"</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">;
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">"beforemove"</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">;
379 </span><span class="jsdoc-var">oldParent.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
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">);
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">;
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">"append"</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">"appendnode"</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">);
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">"move"</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">);
405 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
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
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">;
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">"beforeremove"</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">;
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);
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">;
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">;
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">);
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">);
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">"remove"</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">;
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
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">);
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">;
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">"beforeinsert"</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">;
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">;
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">&& </span><span class="jsdoc-var">this.childNodes.indexOf</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">){
475 </span><span class="jsdoc-var">refIndex</span><span class="jsdoc-syntax">--;
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">"beforemove"</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">;
483 </span><span class="jsdoc-var">oldParent.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
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">);
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">;
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">"insert"</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">"move"</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">);
504 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
507 </span><span class="jsdoc-comment">/**
508 * Returns the child node at the specified index.
509 * @param {Number} index
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">];
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
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">;
528 </span><span class="jsdoc-comment">/**
529 * Returns the index of a child node
531 * @return {Number} The index of the node or -1 if it was not found
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">);
537 </span><span class="jsdoc-comment">/**
538 * Returns the tree this node is in.
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">;
550 </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
553 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">;
556 </span><span class="jsdoc-comment">/**
557 * Returns depth of this node (the root node has a depth of 0)
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">;
567 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">depth</span><span class="jsdoc-syntax">;
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">);
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">< </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">);
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">);
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
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">"id"</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">;
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">);
605 </span><span class="jsdoc-comment">/**
606 * Bubbles up the tree from this node, calling the specified function with each node. The scope (<i>this</i>) 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)
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">;
620 </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
624 </span><span class="jsdoc-comment">/**
625 * Cascades down the tree from this node, calling the specified function with each node. The scope (<i>this</i>) 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)
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">< </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">);
642 </span><span class="jsdoc-comment">/**
643 * Interates the child nodes of this node, calling the specified function with each node. The scope (<i>this</i>) 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)
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">< </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">;
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
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">< </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">];
673 </span><span class="jsdoc-keyword">return null</span><span class="jsdoc-syntax">;
676 </span><span class="jsdoc-comment">/**
677 * Finds the first child by a custom function. The child matches if the function passed
679 * @param {Function} fn
680 * @param {Object} scope (optional)
681 * @return {Node} The found child or null if none was found
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">< </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">];
690 </span><span class="jsdoc-keyword">return null</span><span class="jsdoc-syntax">;
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)
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">> 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">< </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">);
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">);
718 </span><span class="jsdoc-comment">/**
719 * Returns true if this node is an ancestor (at any point) of the passed node.
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">);
727 </span><span class="jsdoc-comment">/**
728 * Returns true if the passed node is an ancestor (at any point) of this node.
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">;
738 </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
740 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
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">"[Node"</span><span class="jsdoc-syntax">+(</span><span class="jsdoc-var">this.id</span><span class="jsdoc-syntax">?</span><span class="jsdoc-string">" "</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">this.id</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">;
746 });</span></code></body></html>