1 <html><head><title>/home/edward/gitlive/roojs1/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">;
362 </span><span class="jsdoc-comment">// if passed an array or multiple args do them one by one
363 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">multi</span><span class="jsdoc-syntax">){
364 </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">++) {
365 </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 }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
368 </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">){
369 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
371 </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">;
372 </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">;
373 </span><span class="jsdoc-comment">// it's a move, make sure we move it cleanly
374 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">){
375 </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">){
376 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
378 </span><span class="jsdoc-var">oldParent.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
380 </span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.childNodes.length</span><span class="jsdoc-syntax">;
381 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">== 0){
382 </span><span class="jsdoc-var">this.setFirstChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
384 </span><span class="jsdoc-var">this.childNodes.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
385 </span><span class="jsdoc-var">node.parentNode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
386 </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];
387 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ps</span><span class="jsdoc-syntax">){
388 </span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ps</span><span class="jsdoc-syntax">;
389 </span><span class="jsdoc-var">ps.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
390 }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
391 </span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
393 </span><span class="jsdoc-var">node.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
394 </span><span class="jsdoc-var">this.setLastChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
395 </span><span class="jsdoc-var">node.setOwnerTree</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.getOwnerTree</span><span class="jsdoc-syntax">());
396 </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">);
397 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">){
398 </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">);
400 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
404 </span><span class="jsdoc-comment">/**
405 * Removes a child node from this node.
406 * @param {Node} node The node to remove
407 * @return {Node} The removed node
409 </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">){
410 </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">);
411 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">== -1){
412 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
414 </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">){
415 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
418 </span><span class="jsdoc-comment">// remove it from childNodes collection
419 </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);
421 </span><span class="jsdoc-comment">// update siblings
422 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.previousSibling</span><span class="jsdoc-syntax">){
423 </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">;
425 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nextSibling</span><span class="jsdoc-syntax">){
426 </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">;
429 </span><span class="jsdoc-comment">// update child refs
430 </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">){
431 </span><span class="jsdoc-var">this.setFirstChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nextSibling</span><span class="jsdoc-syntax">);
433 </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">){
434 </span><span class="jsdoc-var">this.setLastChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.previousSibling</span><span class="jsdoc-syntax">);
437 </span><span class="jsdoc-var">node.setOwnerTree</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">);
438 </span><span class="jsdoc-comment">// clear any references from the node
439 </span><span class="jsdoc-var">node.parentNode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
440 </span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
441 </span><span class="jsdoc-var">node.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
442 </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">);
443 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
446 </span><span class="jsdoc-comment">/**
447 * Inserts the first node before the second node in this nodes childNodes collection.
448 * @param {Node} node The node to insert
449 * @param {Node} refNode The node to insert before (if null the node is appended)
450 * @return {Node} The inserted node
452 </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">){
453 </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
454 </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">);
456 </span><span class="jsdoc-comment">// nothing to do
457 </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">){
458 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
461 </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">){
462 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
464 </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">);
465 </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">;
466 </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">;
468 </span><span class="jsdoc-comment">// when moving internally, indexes will change after remove
469 </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">){
470 </span><span class="jsdoc-var">refIndex</span><span class="jsdoc-syntax">--;
473 </span><span class="jsdoc-comment">// it's a move, make sure we move it cleanly
474 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">){
475 </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">){
476 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
478 </span><span class="jsdoc-var">oldParent.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
480 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">refIndex </span><span class="jsdoc-syntax">== 0){
481 </span><span class="jsdoc-var">this.setFirstChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
483 </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">);
484 </span><span class="jsdoc-var">node.parentNode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
485 </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];
486 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ps</span><span class="jsdoc-syntax">){
487 </span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ps</span><span class="jsdoc-syntax">;
488 </span><span class="jsdoc-var">ps.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
489 }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
490 </span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
492 </span><span class="jsdoc-var">node.nextSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">refNode</span><span class="jsdoc-syntax">;
493 </span><span class="jsdoc-var">refNode.previousSibling </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
494 </span><span class="jsdoc-var">node.setOwnerTree</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.getOwnerTree</span><span class="jsdoc-syntax">());
495 </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">);
496 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">oldParent</span><span class="jsdoc-syntax">){
497 </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">);
499 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
502 </span><span class="jsdoc-comment">/**
503 * Returns the child node at the specified index.
504 * @param {Number} index
507 </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">){
508 </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">];
511 </span><span class="jsdoc-comment">/**
512 * Replaces one child node in this node with another.
513 * @param {Node} newChild The replacement node
514 * @param {Node} oldChild The node to replace
515 * @return {Node} The replaced node
517 </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">){
518 </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">);
519 </span><span class="jsdoc-var">this.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">oldChild</span><span class="jsdoc-syntax">);
520 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">oldChild</span><span class="jsdoc-syntax">;
523 </span><span class="jsdoc-comment">/**
524 * Returns the index of a child node
526 * @return {Number} The index of the node or -1 if it was not found
528 </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">){
529 </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">);
532 </span><span class="jsdoc-comment">/**
533 * Returns the tree this node is in.
536 </span><span class="jsdoc-var">getOwnerTree </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
537 </span><span class="jsdoc-comment">// if it doesn't have one, look for one
538 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">){
539 </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">;
540 </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">){
541 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p.ownerTree</span><span class="jsdoc-syntax">){
542 </span><span class="jsdoc-var">this.ownerTree </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.ownerTree</span><span class="jsdoc-syntax">;
543 </span><span class="jsdoc-keyword">break</span><span class="jsdoc-syntax">;
545 </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
548 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">;
551 </span><span class="jsdoc-comment">/**
552 * Returns depth of this node (the root node has a depth of 0)
555 </span><span class="jsdoc-var">getDepth </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
556 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">depth </span><span class="jsdoc-syntax">= 0;
557 </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">;
558 </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">){
559 ++</span><span class="jsdoc-var">depth</span><span class="jsdoc-syntax">;
560 </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
562 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">depth</span><span class="jsdoc-syntax">;
565 </span><span class="jsdoc-comment">// private
566 </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">){
567 </span><span class="jsdoc-comment">// if it's move, we need to update everyone
568 </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">){
569 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.ownerTree</span><span class="jsdoc-syntax">){
570 </span><span class="jsdoc-var">this.ownerTree.unregisterNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
572 </span><span class="jsdoc-var">this.ownerTree </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">tree</span><span class="jsdoc-syntax">;
573 </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">;
574 </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">++) {
575 </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">);
577 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tree</span><span class="jsdoc-syntax">){
578 </span><span class="jsdoc-var">tree.registerNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
583 </span><span class="jsdoc-comment">/**
584 * Returns the path for this node. The path can be used to expand or select this node programmatically.
585 * @param {String} attr (optional) The attr to use for the path (defaults to the node's id)
586 * @return {String} The path
588 </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">){
589 </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">;
590 </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">;
591 </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">]];
592 </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">){
593 </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">]);
594 </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
596 </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">;
597 </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">);
600 </span><span class="jsdoc-comment">/**
601 * Bubbles up the tree from this node, calling the specified function with each node. The scope (<i>this</i>) of
602 * function call will be the scope provided or the current node. The arguments to the function
603 * will be the args provided or the current node. If the function returns false at any point,
604 * the bubble is stopped.
605 * @param {Function} fn The function to call
606 * @param {Object} scope (optional) The scope of the function (defaults to current node)
607 * @param {Array} args (optional) The args to call the function with (default to passing the current node)
609 </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">){
610 </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">;
611 </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">){
612 </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">){
613 </span><span class="jsdoc-keyword">break</span><span class="jsdoc-syntax">;
615 </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
619 </span><span class="jsdoc-comment">/**
620 * Cascades down the tree from this node, calling the specified function with each node. The scope (<i>this</i>) of
621 * function call will be the scope provided or the current node. The arguments to the function
622 * will be the args provided or the current node. If the function returns false at any point,
623 * the cascade is stopped on that branch.
624 * @param {Function} fn The function to call
625 * @param {Object} scope (optional) The scope of the function (defaults to current node)
626 * @param {Array} args (optional) The args to call the function with (default to passing the current node)
628 </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">){
629 </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">){
630 </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">;
631 </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">++) {
632 </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">);
637 </span><span class="jsdoc-comment">/**
638 * Interates the child nodes of this node, calling the specified function with each node. The scope (<i>this</i>) of
639 * function call will be the scope provided or the current node. The arguments to the function
640 * will be the args provided or the current node. If the function returns false at any point,
641 * the iteration stops.
642 * @param {Function} fn The function to call
643 * @param {Object} scope (optional) The scope of the function (defaults to current node)
644 * @param {Array} args (optional) The args to call the function with (default to passing the current node)
646 </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">){
647 </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">;
648 </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">++) {
649 </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">){
650 </span><span class="jsdoc-keyword">break</span><span class="jsdoc-syntax">;
655 </span><span class="jsdoc-comment">/**
656 * Finds the first child that has the attribute with the specified value.
657 * @param {String} attribute The attribute name
658 * @param {Mixed} value The value to search for
659 * @return {Node} The found child or null if none was found
661 </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">){
662 </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">;
663 </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0, </span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">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">++) {
664 </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">){
665 </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">];
668 </span><span class="jsdoc-keyword">return null</span><span class="jsdoc-syntax">;
671 </span><span class="jsdoc-comment">/**
672 * Finds the first child by a custom function. The child matches if the function passed
674 * @param {Function} fn
675 * @param {Object} scope (optional)
676 * @return {Node} The found child or null if none was found
678 </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">){
679 </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">;
680 </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">++) {
681 </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">){
682 </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">];
685 </span><span class="jsdoc-keyword">return null</span><span class="jsdoc-syntax">;
688 </span><span class="jsdoc-comment">/**
689 * Sorts this nodes children using the supplied sort function
690 * @param {Function} fn
691 * @param {Object} scope (optional)
693 </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">){
694 </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">;
695 </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">;
696 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">> 0){
697 </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">;
698 </span><span class="jsdoc-var">cs.sort</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sortFn</span><span class="jsdoc-syntax">);
699 </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">++){
700 </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">];
701 </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];
702 </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];
703 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">== 0){
704 </span><span class="jsdoc-var">this.setFirstChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
706 </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){
707 </span><span class="jsdoc-var">this.setLastChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
713 </span><span class="jsdoc-comment">/**
714 * Returns true if this node is an ancestor (at any point) of the passed node.
718 </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">){
719 </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">);
722 </span><span class="jsdoc-comment">/**
723 * Returns true if the passed node is an ancestor (at any point) of this node.
727 </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">){
728 </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">;
729 </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">){
730 </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">){
731 </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
733 </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.parentNode</span><span class="jsdoc-syntax">;
735 </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
738 </span><span class="jsdoc-var">toString </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
739 </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">;
741 });</span></code></body></html>