SVG.ViewBox = function(element) { var x, y, width, height , wm = 1 /* width multiplier */ , hm = 1 /* height multiplier */ , box = element.bbox() , view = (element.attr('viewBox') || '').match(/-?[\d\.]+/g) , we = element , he = element /* get dimensions of current node */ width = new SVG.Number(element.width()) height = new SVG.Number(element.height()) /* find nearest non-percentual dimensions */ while (width.unit == '%') { wm *= width.value width = new SVG.Number(we instanceof SVG.Doc ? we.parent.offsetWidth : we.parent.width()) we = we.parent } while (height.unit == '%') { hm *= height.value height = new SVG.Number(he instanceof SVG.Doc ? he.parent.offsetHeight : he.parent.height()) he = he.parent } /* ensure defaults */ this.x = box.x this.y = box.y this.width = width * wm this.height = height * hm this.zoom = 1 if (view) { /* get width and height from viewbox */ x = parseFloat(view[0]) y = parseFloat(view[1]) width = parseFloat(view[2]) height = parseFloat(view[3]) /* calculate zoom accoring to viewbox */ this.zoom = ((this.width / this.height) > (width / height)) ? this.height / height : this.width / width /* calculate real pixel dimensions on parent SVG.Doc element */ this.x = x this.y = y this.width = width this.height = height } } // SVG.extend(SVG.ViewBox, { // Parse viewbox to string toString: function() { return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height } })