SVG.Doc = SVG.invent({ // Initialize node create: function(element) { if (element) { /* ensure the presence of a dom element */ element = typeof element == 'string' ? document.getElementById(element) : element /* If the target is an svg element, use that element as the main wrapper. This allows svg.js to work with svg documents as well. */ if (element.nodeName == 'svg') { this.constructor.call(this, element) } else { this.constructor.call(this, SVG.create('svg')) element.appendChild(this.node) } /* set svg element attributes and ensure defs node */ this.namespace().size('100%', '100%').defs() } } // Inherit from , inherit: SVG.Container // Add class methods , extend: { // Add namespaces namespace: function() { return this .attr({ xmlns: SVG.ns, version: '1.1' }) .attr('xmlns:xlink', SVG.xlink, SVG.xmlns) } // Creates and returns defs element , defs: function() { if (!this._defs) { var defs // Find or create a defs element in this instance if (defs = this.node.getElementsByTagName('defs')[0]) this._defs = SVG.adopt(defs) else this._defs = new SVG.Defs // Make sure the defs node is at the end of the stack this.node.appendChild(this._defs.node) } return this._defs } // custom parent method , parent: function() { return this.node.parentNode.nodeName == '#document' ? null : this.node.parentNode } // Fix for possible sub-pixel offset. See: // https://bugzilla.mozilla.org/show_bug.cgi?id=608812 , spof: function(spof) { var pos = this.node.getScreenCTM() if (pos) this .style('left', (-pos.e % 1) + 'px') .style('top', (-pos.f % 1) + 'px') return this } // Removes the doc from the DOM , remove: function() { if(this.parent()) { this.parent().removeChild(this.node); } return this; } } })