summaryrefslogtreecommitdiff
path: root/includes/js/dojox/gfx/svg.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojox/gfx/svg.js')
-rw-r--r--includes/js/dojox/gfx/svg.js638
1 files changed, 0 insertions, 638 deletions
diff --git a/includes/js/dojox/gfx/svg.js b/includes/js/dojox/gfx/svg.js
deleted file mode 100644
index 5f6101c..0000000
--- a/includes/js/dojox/gfx/svg.js
+++ /dev/null
@@ -1,638 +0,0 @@
-if(!dojo._hasResource["dojox.gfx.svg"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.gfx.svg"] = true;
-dojo.provide("dojox.gfx.svg");
-
-dojo.require("dojox.gfx._base");
-dojo.require("dojox.gfx.shape");
-dojo.require("dojox.gfx.path");
-
-dojox.gfx.svg.xmlns = {
- xlink: "http://www.w3.org/1999/xlink",
- svg: "http://www.w3.org/2000/svg"
-};
-
-dojox.gfx.svg.getRef = function(name){
- // summary: returns a DOM Node specified by the name argument or null
- // name: String: an SVG external reference
- if(!name || name == "none") return null;
- if(name.match(/^url\(#.+\)$/)){
- return dojo.byId(name.slice(5, -1)); // Node
- }
- // alternative representation of a reference
- if(name.match(/^#dojoUnique\d+$/)){
- // we assume here that a reference was generated by dojox.gfx
- return dojo.byId(name.slice(1)); // Node
- }
- return null; // Node
-};
-
-dojox.gfx.svg.dasharray = {
- solid: "none",
- shortdash: [4, 1],
- shortdot: [1, 1],
- shortdashdot: [4, 1, 1, 1],
- shortdashdotdot: [4, 1, 1, 1, 1, 1],
- dot: [1, 3],
- dash: [4, 3],
- longdash: [8, 3],
- dashdot: [4, 3, 1, 3],
- longdashdot: [8, 3, 1, 3],
- longdashdotdot: [8, 3, 1, 3, 1, 3]
-};
-
-dojo.extend(dojox.gfx.Shape, {
- // summary: SVG-specific implementation of dojox.gfx.Shape methods
-
- setFill: function(fill){
- // summary: sets a fill object (SVG)
- // fill: Object: a fill object
- // (see dojox.gfx.defaultLinearGradient,
- // dojox.gfx.defaultRadialGradient,
- // dojox.gfx.defaultPattern,
- // or dojo.Color)
-
- if(!fill){
- // don't fill
- this.fillStyle = null;
- this.rawNode.setAttribute("fill", "none");
- this.rawNode.setAttribute("fill-opacity", 0);
- return this;
- }
- var f;
- // FIXME: slightly magical. We're using the outer scope's "f", but setting it later
- var setter = function(x){
- // we assume that we're executing in the scope of the node to mutate
- this.setAttribute(x, f[x].toFixed(8));
- };
- if(typeof(fill) == "object" && "type" in fill){
- // gradient
- switch(fill.type){
- case "linear":
- f = dojox.gfx.makeParameters(dojox.gfx.defaultLinearGradient, fill);
- var gradient = this._setFillObject(f, "linearGradient");
- dojo.forEach(["x1", "y1", "x2", "y2"], setter, gradient);
- break;
- case "radial":
- f = dojox.gfx.makeParameters(dojox.gfx.defaultRadialGradient, fill);
- var gradient = this._setFillObject(f, "radialGradient");
- dojo.forEach(["cx", "cy", "r"], setter, gradient);
- break;
- case "pattern":
- f = dojox.gfx.makeParameters(dojox.gfx.defaultPattern, fill);
- var pattern = this._setFillObject(f, "pattern");
- dojo.forEach(["x", "y", "width", "height"], setter, pattern);
- break;
- }
- this.fillStyle = f;
- return this;
- }
- // color object
- var f = dojox.gfx.normalizeColor(fill);
- this.fillStyle = f;
- this.rawNode.setAttribute("fill", f.toCss());
- this.rawNode.setAttribute("fill-opacity", f.a);
- this.rawNode.setAttribute("fill-rule", "evenodd");
- return this; // self
- },
-
- setStroke: function(stroke){
- // summary: sets a stroke object (SVG)
- // stroke: Object: a stroke object
- // (see dojox.gfx.defaultStroke)
-
- if(!stroke){
- // don't stroke
- this.strokeStyle = null;
- this.rawNode.setAttribute("stroke", "none");
- this.rawNode.setAttribute("stroke-opacity", 0);
- return this;
- }
- // normalize the stroke
- if(typeof stroke == "string"){
- stroke = {color: stroke};
- }
- var s = this.strokeStyle = dojox.gfx.makeParameters(dojox.gfx.defaultStroke, stroke);
- s.color = dojox.gfx.normalizeColor(s.color);
- // generate attributes
- var rn = this.rawNode;
- if(s){
- rn.setAttribute("stroke", s.color.toCss());
- rn.setAttribute("stroke-opacity", s.color.a);
- rn.setAttribute("stroke-width", s.width);
- rn.setAttribute("stroke-linecap", s.cap);
- if(typeof s.join == "number"){
- rn.setAttribute("stroke-linejoin", "miter");
- rn.setAttribute("stroke-miterlimit", s.join);
- }else{
- rn.setAttribute("stroke-linejoin", s.join);
- }
- var da = s.style.toLowerCase();
- if(da in dojox.gfx.svg.dasharray){ da = dojox.gfx.svg.dasharray[da]; }
- if(da instanceof Array){
- da = dojo.clone(da);
- for(var i = 0; i < da.length; ++i){
- da[i] *= s.width;
- }
- if(s.cap != "butt"){
- for(var i = 0; i < da.length; i += 2){
- da[i] -= s.width;
- if(da[i] < 1){ da[i] = 1; }
- }
- for(var i = 1; i < da.length; i += 2){
- da[i] += s.width;
- }
- }
- da = da.join(",");
- }
- rn.setAttribute("stroke-dasharray", da);
- rn.setAttribute("dojoGfxStrokeStyle", s.style);
- }
- return this; // self
- },
-
- _getParentSurface: function(){
- var surface = this.parent;
- for(; surface && !(surface instanceof dojox.gfx.Surface); surface = surface.parent);
- return surface;
- },
-
- _setFillObject: function(f, nodeType){
- var svgns = dojox.gfx.svg.xmlns.svg;
- this.fillStyle = f;
- var surface = this._getParentSurface(),
- defs = surface.defNode,
- fill = this.rawNode.getAttribute("fill"),
- ref = dojox.gfx.svg.getRef(fill);
- if(ref){
- fill = ref;
- if(fill.tagName.toLowerCase() != nodeType.toLowerCase()){
- var id = fill.id;
- fill.parentNode.removeChild(fill);
- fill = document.createElementNS(svgns, nodeType);
- fill.setAttribute("id", id);
- defs.appendChild(fill);
- }else{
- while(fill.childNodes.length){
- fill.removeChild(fill.lastChild);
- }
- }
- }else{
- fill = document.createElementNS(svgns, nodeType);
- fill.setAttribute("id", dojox.gfx._base._getUniqueId());
- defs.appendChild(fill);
- }
- if(nodeType == "pattern"){
- if(dojo.isSafari){
- fill.setAttributeNS(null, "patternUnits", "userSpaceOnUse");
- }else{
- fill.setAttribute("patternUnits", "userSpaceOnUse");
- }
- var img = document.createElementNS(svgns, "image");
- img.setAttribute("x", 0);
- img.setAttribute("y", 0);
- img.setAttribute("width", f.width .toFixed(8));
- img.setAttribute("height", f.height.toFixed(8));
- img.setAttributeNS(dojox.gfx.svg.xmlns.xlink, "href", f.src);
- fill.appendChild(img);
- }else{
- if(dojo.isSafari){
- fill.setAttributeNS(null, "gradientUnits", "userSpaceOnUse");
- }else{
- fill.setAttribute("gradientUnits", "userSpaceOnUse");
- }
- for(var i = 0; i < f.colors.length; ++i){
- var c = f.colors[i], t = document.createElementNS(svgns, "stop"),
- cc = c.color = dojox.gfx.normalizeColor(c.color);
- t.setAttribute("offset", c.offset.toFixed(8));
- t.setAttribute("stop-color", cc.toCss());
- t.setAttribute("stop-opacity", cc.a);
- fill.appendChild(t);
- }
- }
- this.rawNode.setAttribute("fill", "url(#" + fill.getAttribute("id") +")");
- this.rawNode.removeAttribute("fill-opacity");
- this.rawNode.setAttribute("fill-rule", "evenodd");
- return fill;
- },
-
- _applyTransform: function() {
- var matrix = this.matrix;
- if(matrix){
- var tm = this.matrix;
- this.rawNode.setAttribute("transform", "matrix(" +
- tm.xx.toFixed(8) + "," + tm.yx.toFixed(8) + "," +
- tm.xy.toFixed(8) + "," + tm.yy.toFixed(8) + "," +
- tm.dx.toFixed(8) + "," + tm.dy.toFixed(8) + ")");
- }else{
- this.rawNode.removeAttribute("transform");
- }
- return this;
- },
-
- setRawNode: function(rawNode){
- // summary:
- // assigns and clears the underlying node that will represent this
- // shape. Once set, transforms, gradients, etc, can be applied.
- // (no fill & stroke by default)
- var r = this.rawNode = rawNode;
- r.setAttribute("fill", "none");
- r.setAttribute("fill-opacity", 0);
- r.setAttribute("stroke", "none");
- r.setAttribute("stroke-opacity", 0);
- r.setAttribute("stroke-width", 1);
- r.setAttribute("stroke-linecap", "butt");
- r.setAttribute("stroke-linejoin", "miter");
- r.setAttribute("stroke-miterlimit", 4);
- },
-
- setShape: function(newShape){
- // summary: sets a shape object (SVG)
- // newShape: Object: a shape object
- // (see dojox.gfx.defaultPath,
- // dojox.gfx.defaultPolyline,
- // dojox.gfx.defaultRect,
- // dojox.gfx.defaultEllipse,
- // dojox.gfx.defaultCircle,
- // dojox.gfx.defaultLine,
- // or dojox.gfx.defaultImage)
- this.shape = dojox.gfx.makeParameters(this.shape, newShape);
- for(var i in this.shape){
- if(i != "type"){ this.rawNode.setAttribute(i, this.shape[i]); }
- }
- return this; // self
- },
-
- // move family
-
- _moveToFront: function(){
- // summary: moves a shape to front of its parent's list of shapes (SVG)
- this.rawNode.parentNode.appendChild(this.rawNode);
- return this; // self
- },
- _moveToBack: function(){
- // summary: moves a shape to back of its parent's list of shapes (SVG)
- this.rawNode.parentNode.insertBefore(this.rawNode, this.rawNode.parentNode.firstChild);
- return this; // self
- }
-});
-
-dojo.declare("dojox.gfx.Group", dojox.gfx.Shape, {
- // summary: a group shape (SVG), which can be used
- // to logically group shapes (e.g, to propagate matricies)
- constructor: function(){
- dojox.gfx.svg.Container._init.call(this);
- },
- setRawNode: function(rawNode){
- // summary: sets a raw SVG node to be used by this shape
- // rawNode: Node: an SVG node
- this.rawNode = rawNode;
- }
-});
-dojox.gfx.Group.nodeType = "g";
-
-dojo.declare("dojox.gfx.Rect", dojox.gfx.shape.Rect, {
- // summary: a rectangle shape (SVG)
- setShape: function(newShape){
- // summary: sets a rectangle shape object (SVG)
- // newShape: Object: a rectangle shape object
- this.shape = dojox.gfx.makeParameters(this.shape, newShape);
- this.bbox = null;
- for(var i in this.shape){
- if(i != "type" && i != "r"){ this.rawNode.setAttribute(i, this.shape[i]); }
- }
- if(this.shape.r){
- this.rawNode.setAttribute("ry", this.shape.r);
- this.rawNode.setAttribute("rx", this.shape.r);
- }
- return this; // self
- }
-});
-dojox.gfx.Rect.nodeType = "rect";
-
-dojox.gfx.Ellipse = dojox.gfx.shape.Ellipse;
-dojox.gfx.Ellipse.nodeType = "ellipse";
-
-dojox.gfx.Circle = dojox.gfx.shape.Circle;
-dojox.gfx.Circle.nodeType = "circle";
-
-dojox.gfx.Line = dojox.gfx.shape.Line;
-dojox.gfx.Line.nodeType = "line";
-
-dojo.declare("dojox.gfx.Polyline", dojox.gfx.shape.Polyline, {
- // summary: a polyline/polygon shape (SVG)
- setShape: function(points, closed){
- // summary: sets a polyline/polygon shape object (SVG)
- // points: Object: a polyline/polygon shape object
- if(points && points instanceof Array){
- // branch
- // points: Array: an array of points
- this.shape = dojox.gfx.makeParameters(this.shape, { points: points });
- if(closed && this.shape.points.length){
- this.shape.points.push(this.shape.points[0]);
- }
- }else{
- this.shape = dojox.gfx.makeParameters(this.shape, points);
- }
- this.box = null;
- var attr = [], p = this.shape.points;
- for(var i = 0; i < p.length; ++i){
- if(typeof p[i] == "number"){
- attr.push(p[i].toFixed(8));
- }else{
- attr.push(p[i].x.toFixed(8));
- attr.push(p[i].y.toFixed(8));
- }
- }
- this.rawNode.setAttribute("points", attr.join(" "));
- return this; // self
- }
-});
-dojox.gfx.Polyline.nodeType = "polyline";
-
-dojo.declare("dojox.gfx.Image", dojox.gfx.shape.Image, {
- // summary: an image (SVG)
- setShape: function(newShape){
- // summary: sets an image shape object (SVG)
- // newShape: Object: an image shape object
- this.shape = dojox.gfx.makeParameters(this.shape, newShape);
- this.bbox = null;
- var rawNode = this.rawNode;
- for(var i in this.shape){
- if(i != "type" && i != "src"){ rawNode.setAttribute(i, this.shape[i]); }
- }
- rawNode.setAttributeNS(dojox.gfx.svg.xmlns.xlink, "href", this.shape.src);
- return this; // self
- }
-});
-dojox.gfx.Image.nodeType = "image";
-
-dojo.declare("dojox.gfx.Text", dojox.gfx.shape.Text, {
- // summary: an anchored text (SVG)
- setShape: function(newShape){
- // summary: sets a text shape object (SVG)
- // newShape: Object: a text shape object
- this.shape = dojox.gfx.makeParameters(this.shape, newShape);
- this.bbox = null;
- var r = this.rawNode, s = this.shape;
- r.setAttribute("x", s.x);
- r.setAttribute("y", s.y);
- r.setAttribute("text-anchor", s.align);
- r.setAttribute("text-decoration", s.decoration);
- r.setAttribute("rotate", s.rotated ? 90 : 0);
- r.setAttribute("kerning", s.kerning ? "auto" : 0);
- r.setAttribute("text-rendering", "optimizeLegibility");
- r.textContent = s.text;
- return this; // self
- },
- getTextWidth: function(){
- // summary: get the text width in pixels
- var rawNode = this.rawNode,
- oldParent = rawNode.parentNode,
- _measurementNode = rawNode.cloneNode(true);
- _measurementNode.style.visibility = "hidden";
-
- // solution to the "orphan issue" in FF
- var _width = 0, _text = _measurementNode.firstChild.nodeValue;
- oldParent.appendChild(_measurementNode);
-
- // solution to the "orphan issue" in Opera
- // (nodeValue == "" hangs firefox)
- if(_text!=""){
- while(!_width){
- _width = parseInt(_measurementNode.getBBox().width);
- }
- }
- oldParent.removeChild(_measurementNode);
- return _width;
- }
-});
-dojox.gfx.Text.nodeType = "text";
-
-dojo.declare("dojox.gfx.Path", dojox.gfx.path.Path, {
- // summary: a path shape (SVG)
- _updateWithSegment: function(segment){
- // summary: updates the bounding box of path with new segment
- // segment: Object: a segment
- dojox.gfx.Path.superclass._updateWithSegment.apply(this, arguments);
- if(typeof(this.shape.path) == "string"){
- this.rawNode.setAttribute("d", this.shape.path);
- }
- },
- setShape: function(newShape){
- // summary: forms a path using a shape (SVG)
- // newShape: Object: an SVG path string or a path object (see dojox.gfx.defaultPath)
- dojox.gfx.Path.superclass.setShape.apply(this, arguments);
- this.rawNode.setAttribute("d", this.shape.path);
- return this; // self
- }
-});
-dojox.gfx.Path.nodeType = "path";
-
-dojo.declare("dojox.gfx.TextPath", dojox.gfx.path.TextPath, {
- // summary: a textpath shape (SVG)
- _updateWithSegment: function(segment){
- // summary: updates the bounding box of path with new segment
- // segment: Object: a segment
- dojox.gfx.Path.superclass._updateWithSegment.apply(this, arguments);
- this._setTextPath();
- },
- setShape: function(newShape){
- // summary: forms a path using a shape (SVG)
- // newShape: Object: an SVG path string or a path object (see dojox.gfx.defaultPath)
- dojox.gfx.Path.superclass.setShape.apply(this, arguments);
- this._setTextPath();
- return this; // self
- },
- _setTextPath: function(){
- if(typeof this.shape.path != "string"){ return; }
- var r = this.rawNode;
- if(!r.firstChild){
- var tp = document.createElementNS(dojox.gfx.svg.xmlns.svg, "textPath"),
- tx = document.createTextNode("");
- tp.appendChild(tx);
- r.appendChild(tp);
- }
- var ref = r.firstChild.getAttributeNS(dojox.gfx.svg.xmlns.xlink, "href"),
- path = ref && dojox.gfx.svg.getRef(ref);
- if(!path){
- var surface = this._getParentSurface();
- if(surface){
- var defs = surface.defNode;
- path = document.createElementNS(dojox.gfx.svg.xmlns.svg, "path");
- var id = dojox.gfx._base._getUniqueId();
- path.setAttribute("id", id);
- defs.appendChild(path);
- r.firstChild.setAttributeNS(dojox.gfx.svg.xmlns.xlink, "href", "#" + id);
- }
- }
- if(path){
- path.setAttribute("d", this.shape.path);
- }
- },
- _setText: function(){
- var r = this.rawNode;
- if(!r.firstChild){
- var tp = document.createElementNS(dojox.gfx.svg.xmlns.svg, "textPath"),
- tx = document.createTextNode("");
- tp.appendChild(tx);
- r.appendChild(tp);
- }
- r = r.firstChild;
- var t = this.text;
- r.setAttribute("alignment-baseline", "middle");
- switch(t.align){
- case "middle":
- r.setAttribute("text-anchor", "middle");
- r.setAttribute("startOffset", "50%");
- break;
- case "end":
- r.setAttribute("text-anchor", "end");
- r.setAttribute("startOffset", "100%");
- break;
- default:
- r.setAttribute("text-anchor", "start");
- r.setAttribute("startOffset", "0%");
- break;
- }
- //r.parentNode.setAttribute("alignment-baseline", "central");
- //r.setAttribute("dominant-baseline", "central");
- r.setAttribute("baseline-shift", "0.5ex");
- r.setAttribute("text-decoration", t.decoration);
- r.setAttribute("rotate", t.rotated ? 90 : 0);
- r.setAttribute("kerning", t.kerning ? "auto" : 0);
- r.firstChild.data = t.text;
- }
-});
-dojox.gfx.TextPath.nodeType = "text";
-
-dojo.declare("dojox.gfx.Surface", dojox.gfx.shape.Surface, {
- // summary: a surface object to be used for drawings (SVG)
- constructor: function(){
- dojox.gfx.svg.Container._init.call(this);
- },
- setDimensions: function(width, height){
- // summary: sets the width and height of the rawNode
- // width: String: width of surface, e.g., "100px"
- // height: String: height of surface, e.g., "100px"
- if(!this.rawNode){ return this; }
- this.rawNode.setAttribute("width", width);
- this.rawNode.setAttribute("height", height);
- return this; // self
- },
- getDimensions: function(){
- // summary: returns an object with properties "width" and "height"
- return this.rawNode ? {width: this.rawNode.getAttribute("width"), height: this.rawNode.getAttribute("height")} : null; // Object
- }
-});
-
-dojox.gfx.createSurface = function(parentNode, width, height){
- // summary: creates a surface (SVG)
- // parentNode: Node: a parent node
- // width: String: width of surface, e.g., "100px"
- // height: String: height of surface, e.g., "100px"
-
- var s = new dojox.gfx.Surface();
- s.rawNode = document.createElementNS(dojox.gfx.svg.xmlns.svg, "svg");
- s.rawNode.setAttribute("width", width);
- s.rawNode.setAttribute("height", height);
-
- var node = document.createElementNS(dojox.gfx.svg.xmlns.svg, "defs");
- s.rawNode.appendChild(node);
- s.defNode = node;
-
- dojo.byId(parentNode).appendChild(s.rawNode);
- return s; // dojox.gfx.Surface
-};
-
-// Extenders
-
-dojox.gfx.svg.Font = {
- _setFont: function(){
- // summary: sets a font object (SVG)
- var f = this.fontStyle;
- // next line doesn't work in Firefox 2 or Opera 9
- //this.rawNode.setAttribute("font", dojox.gfx.makeFontString(this.fontStyle));
- this.rawNode.setAttribute("font-style", f.style);
- this.rawNode.setAttribute("font-variant", f.variant);
- this.rawNode.setAttribute("font-weight", f.weight);
- this.rawNode.setAttribute("font-size", f.size);
- this.rawNode.setAttribute("font-family", f.family);
- }
-};
-
-dojox.gfx.svg.Container = {
- _init: function(){
- dojox.gfx.shape.Container._init.call(this);
- },
- add: function(shape){
- // summary: adds a shape to a group/surface
- // shape: dojox.gfx.Shape: an VML shape object
- if(this != shape.getParent()){
- this.rawNode.appendChild(shape.rawNode);
- //dojox.gfx.Group.superclass.add.apply(this, arguments);
- //this.inherited(arguments);
- dojox.gfx.shape.Container.add.apply(this, arguments);
- }
- return this; // self
- },
- remove: function(shape, silently){
- // summary: remove a shape from a group/surface
- // shape: dojox.gfx.Shape: an VML shape object
- // silently: Boolean?: if true, regenerate a picture
- if(this == shape.getParent()){
- if(this.rawNode == shape.rawNode.parentNode){
- this.rawNode.removeChild(shape.rawNode);
- }
- //dojox.gfx.Group.superclass.remove.apply(this, arguments);
- //this.inherited(arguments);
- dojox.gfx.shape.Container.remove.apply(this, arguments);
- }
- return this; // self
- },
- clear: function(){
- // summary: removes all shapes from a group/surface
- var r = this.rawNode;
- while(r.lastChild){
- r.removeChild(r.lastChild);
- }
- var d = this.defNode;
- if(d){
- while(d.lastChild){
- d.removeChild(d.lastChild);
- }
- r.appendChild(d);
- }
- //return this.inherited(arguments); // self
- return dojox.gfx.shape.Container.clear.apply(this, arguments);
- },
- _moveChildToFront: dojox.gfx.shape.Container._moveChildToFront,
- _moveChildToBack: dojox.gfx.shape.Container._moveChildToBack
-};
-
-dojo.mixin(dojox.gfx.shape.Creator, {
- // summary: SVG shape creators
- createObject: function(shapeType, rawShape){
- // summary: creates an instance of the passed shapeType class
- // shapeType: Function: a class constructor to create an instance of
- // rawShape: Object: properties to be passed in to the classes "setShape" method
- if(!this.rawNode){ return null; }
- var shape = new shapeType(),
- node = document.createElementNS(dojox.gfx.svg.xmlns.svg, shapeType.nodeType);
- shape.setRawNode(node);
- this.rawNode.appendChild(node);
- shape.setShape(rawShape);
- this.add(shape);
- return shape; // dojox.gfx.Shape
- }
-});
-
-dojo.extend(dojox.gfx.Text, dojox.gfx.svg.Font);
-dojo.extend(dojox.gfx.TextPath, dojox.gfx.svg.Font);
-
-dojo.extend(dojox.gfx.Group, dojox.gfx.svg.Container);
-dojo.extend(dojox.gfx.Group, dojox.gfx.shape.Creator);
-
-dojo.extend(dojox.gfx.Surface, dojox.gfx.svg.Container);
-dojo.extend(dojox.gfx.Surface, dojox.gfx.shape.Creator);
-
-}