blob: f93a2a8ca258e8304674dc02d6a0c760c022eba0 [file] [log] [blame]
/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
dojo.provide("dojo.svg");
dojo.require("dojo.lang.common");
dojo.require("dojo.dom");
dojo.mixin(dojo.svg, dojo.dom);
dojo.svg.graphics = dojo.svg.g = new function (d) {
this.suspend = function () {
try {
d.documentElement.suspendRedraw(0);
}
catch (e) {
}
};
this.resume = function () {
try {
d.documentElement.unsuspendRedraw(0);
}
catch (e) {
}
};
this.force = function () {
try {
d.documentElement.forceRedraw();
}
catch (e) {
}
};
}(document);
dojo.svg.animations = dojo.svg.anim = new function (d) {
this.arePaused = function () {
try {
return d.documentElement.animationsPaused();
}
catch (e) {
return false;
}
};
this.pause = function () {
try {
d.documentElement.pauseAnimations();
}
catch (e) {
}
};
this.resume = function () {
try {
d.documentElement.unpauseAnimations();
}
catch (e) {
}
};
}(document);
dojo.svg.toCamelCase = function (selector) {
var arr = selector.split("-"), cc = arr[0];
for (var i = 1; i < arr.length; i++) {
cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
}
return cc;
};
dojo.svg.toSelectorCase = function (selector) {
return selector.replace(/([A-Z])/g, "-$1").toLowerCase();
};
dojo.svg.getStyle = function (node, cssSelector) {
return document.defaultView.getComputedStyle(node, cssSelector);
};
dojo.svg.getNumericStyle = function (node, cssSelector) {
return parseFloat(dojo.svg.getStyle(node, cssSelector));
};
dojo.svg.getOpacity = function (node) {
return Math.min(1, dojo.svg.getNumericStyle(node, "fill-opacity"));
};
dojo.svg.setOpacity = function (node, opacity) {
node.setAttributeNS(this.xmlns.svg, "fill-opacity", opacity);
node.setAttributeNS(this.xmlns.svg, "stroke-opacity", opacity);
};
dojo.svg.clearOpacity = function (node) {
node.setAttributeNS(this.xmlns.svg, "fill-opacity", "1.0");
node.setAttributeNS(this.xmlns.svg, "stroke-opacity", "1.0");
};
dojo.svg.getCoords = function (node) {
if (node.getBBox) {
var box = node.getBBox();
return {x:box.x, y:box.y};
}
return null;
};
dojo.svg.setCoords = function (node, coords) {
var p = dojo.svg.getCoords();
if (!p) {
return;
}
var dx = p.x - coords.x;
var dy = p.y - coords.y;
dojo.svg.translate(node, dx, dy);
};
dojo.svg.getDimensions = function (node) {
if (node.getBBox) {
var box = node.getBBox();
return {width:box.width, height:box.height};
}
return null;
};
dojo.svg.setDimensions = function (node, dim) {
if (node.width) {
node.width.baseVal.value = dim.width;
node.height.baseVal.value = dim.height;
} else {
if (node.r) {
node.r.baseVal.value = Math.min(dim.width, dim.height) / 2;
} else {
if (node.rx) {
node.rx.baseVal.value = dim.width / 2;
node.ry.baseVal.value = dim.height / 2;
}
}
}
};
dojo.svg.translate = function (node, dx, dy) {
if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform) {
var t = node.ownerSVGElement.createSVGTransform();
t.setTranslate(dx, dy);
node.transform.baseVal.appendItem(t);
}
};
dojo.svg.scale = function (node, scaleX, scaleY) {
if (!scaleY) {
var scaleY = scaleX;
}
if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform) {
var t = node.ownerSVGElement.createSVGTransform();
t.setScale(scaleX, scaleY);
node.transform.baseVal.appendItem(t);
}
};
dojo.svg.rotate = function (node, ang, cx, cy) {
if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform) {
var t = node.ownerSVGElement.createSVGTransform();
if (cx == null) {
t.setMatrix(t.matrix.rotate(ang));
} else {
t.setRotate(ang, cx, cy);
}
node.transform.baseVal.appendItem(t);
}
};
dojo.svg.skew = function (node, ang, axis) {
var dir = axis || "x";
if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform) {
var t = node.ownerSVGElement.createSVGTransform();
if (dir != "x") {
t.setSkewY(ang);
} else {
t.setSkewX(ang);
}
node.transform.baseVal.appendItem(t);
}
};
dojo.svg.flip = function (node, axis) {
var dir = axis || "x";
if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform) {
var t = node.ownerSVGElement.createSVGTransform();
t.setMatrix((dir != "x") ? t.matrix.flipY() : t.matrix.flipX());
node.transform.baseVal.appendItem(t);
}
};
dojo.svg.invert = function (node) {
if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform) {
var t = node.ownerSVGElement.createSVGTransform();
t.setMatrix(t.matrix.inverse());
node.transform.baseVal.appendItem(t);
}
};
dojo.svg.applyMatrix = function (node, a, b, c, d, e, f) {
if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform) {
var m;
if (b) {
var m = node.ownerSVGElement.createSVGMatrix();
m.a = a;
m.b = b;
m.c = c;
m.d = d;
m.e = e;
m.f = f;
} else {
m = a;
}
var t = node.ownerSVGElement.createSVGTransform();
t.setMatrix(m);
node.transform.baseVal.appendItem(t);
}
};
dojo.svg.group = function (nodes) {
var p = nodes.item(0).parentNode;
var g = document.createElementNS(this.xmlns.svg, "g");
for (var i = 0; i < nodes.length; i++) {
g.appendChild(nodes.item(i));
}
p.appendChild(g);
return g;
};
dojo.svg.ungroup = function (g) {
var p = g.parentNode;
while (g.childNodes.length > 0) {
p.appendChild(g.childNodes.item(0));
}
p.removeChild(g);
};
dojo.svg.getGroup = function (node) {
var a = this.getAncestors(node);
for (var i = 0; i < a.length; i++) {
if (a[i].nodeType == this.ELEMENT_NODE && a[i].nodeName.toLowerCase() == "g") {
return a[i];
}
}
return null;
};
dojo.svg.bringToFront = function (node) {
var n = this.getGroup(node) || node;
n.ownerSVGElement.appendChild(n);
};
dojo.svg.sendToBack = function (node) {
var n = this.getGroup(node) || node;
n.ownerSVGElement.insertBefore(n, n.ownerSVGElement.firstChild);
};
dojo.svg.bringForward = function (node) {
var n = this.getGroup(node) || node;
if (this.getLastChildElement(n.parentNode) != n) {
this.insertAfter(n, this.getNextSiblingElement(n), true);
}
};
dojo.svg.sendBackward = function (node) {
var n = this.getGroup(node) || node;
if (this.getFirstChildElement(n.parentNode) != n) {
this.insertBefore(n, this.getPreviousSiblingElement(n), true);
}
};
dojo.svg.createNodesFromText = function (txt, wrap) {
var docFrag = (new DOMParser()).parseFromString(txt, "text/xml").normalize();
if (wrap) {
return [docFrag.firstChild.cloneNode(true)];
}
var nodes = [];
for (var x = 0; x < docFrag.childNodes.length; x++) {
nodes.push(docFrag.childNodes.item(x).cloneNode(true));
}
return nodes;
};