SVG.Parent = SVG.invent({ // Initialize node create: function(element) { this.constructor.call(this, element) } // Inherit from , inherit: SVG.Element // Add class methods , extend: { // Returns all child elements children: function() { return SVG.utils.map(this.node.childNodes, function(node) { return SVG.adopt(node) }) } // Add given element at a position , add: function(element, i) { if (!this.has(element)) { // define insertion index if none given i = i == null ? this.children().length : i // add element references this.node.insertBefore(element.node, this.node.childNodes[i] || null) } return this } // Basically does the same as `add()` but returns the added element instead , put: function(element, i) { this.add(element, i) return element } // Checks if the given element is a child , has: function(element) { return this.index(element) >= 0 } // Gets index of given element , index: function(element) { return this.children().indexOf(element) } // Get a element at the given index , get: function(i) { return this.children()[i] } // Get first child, skipping the defs node , first: function() { return this.children()[0] } // Get the last child , last: function() { return this.children()[this.children().length - 1] } // Iterates over all children and invokes a given block , each: function(block, deep) { var i, il , children = this.children() for (i = 0, il = children.length; i < il; i++) { if (children[i] instanceof SVG.Element) block.apply(children[i], [i, children]) if (deep && (children[i] instanceof SVG.Container)) children[i].each(block, deep) } return this } // Remove a given child , removeElement: function(element) { this.node.removeChild(element.node) return this } // Remove all elements in this container , clear: function() { // remove children while(this.node.hasChildNodes()) this.node.removeChild(this.node.lastChild) // remove defs reference delete this._defs return this } , // Get defs defs: function() { return this.doc().defs() } } })