is: window.Raphael
},
R = function () {
- return create.apply(R, arguments);
+ if (R.is(arguments[0], "array")) {
+ var a = arguments[0],
+ cnv = create[ap](R, a.splice(0, 3 + R.is(a[0], "number"))),
+ res = cnv.set();
+ for (var i = 0, ii = a[ln]; i < ii; i++) {
+ var j = a[i] || {};
+ j.type in {circle:1, rect:1, path:1, ellipse:1, text:1, image:1} && res.push(cnv[j.type]().attr(j));
+ }
+ return res;
+ }
+ return create[ap](R, arguments);
},
paper = {},
- availableAttrs = {cx: 0, cy: 0, fill: "#fff", "fill-opacity": 1, font: '10px "Arial"', "font-family": '"Arial"', "font-size": "10", "font-style": "normal", "font-weight": 400, gradient: 0, height: 0, href: "http://raphaeljs.com/", opacity: 1, path: "M0,0", r: 0, rotation: 0, rx: 0, ry: 0, scale: "1 1", src: "", stroke: "#000", "stroke-dasharray": "", "stroke-linecap": "butt", "stroke-linejoin": "butt", "stroke-miterlimit": 0, "stroke-opacity": 1, "stroke-width": 1, target: "_blank", "text-anchor": "middle", title: "Raphael", translation: "0 0", width: 0, x: 0, y: 0},
- availableAnimAttrs = {cx: "number", cy: "number", fill: "colour", "fill-opacity": "number", "font-size": "number", height: "number", opacity: "number", path: "path", r: "number", rotation: "csv", rx: "number", ry: "number", scale: "csv", stroke: "colour", "stroke-opacity": "number", "stroke-width": "number", translation: "csv", width: "number", x: "number", y: "number"},
- events = ["click", "dblclick", "mousedown", "mousemove", "mouseout", "mouseover", "mouseup"];
+ availableAttrs = {"clip-rect": "0 0 10e9 10e9", cx: 0, cy: 0, fill: "#fff", "fill-opacity": 1, font: '10px "Arial"', "font-family": '"Arial"', "font-size": "10", "font-style": "normal", "font-weight": 400, gradient: 0, height: 0, href: "http://raphaeljs.com/", opacity: 1, path: "M0,0", r: 0, rotation: 0, rx: 0, ry: 0, scale: "1 1", src: "", stroke: "#000", "stroke-dasharray": "", "stroke-linecap": "butt", "stroke-linejoin": "butt", "stroke-miterlimit": 0, "stroke-opacity": 1, "stroke-width": 1, target: "_blank", "text-anchor": "middle", title: "Raphael", translation: "0 0", width: 0, x: 0, y: 0},
+ availableAnimAttrs = {"clip-rect": "csv", cx: "number", cy: "number", fill: "colour", "fill-opacity": "number", "font-size": "number", height: "number", opacity: "number", path: "path", r: "number", rotation: "csv", rx: "number", ry: "number", scale: "csv", stroke: "colour", "stroke-opacity": "number", "stroke-width": "number", translation: "csv", width: "number", x: "number", y: "number"},
+ events = ["click", "dblclick", "mousedown", "mousemove", "mouseout", "mouseover", "mouseup"],
+ proto = "prototype",
+ ap = "apply",
+ ln = "length",
+ pf = "parseFloat",
+ pi = "parseInt";
R.version = "1.0";
R.type = (window.SVGAngle || document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML");
R.svg = !(R.vml = R.type == "VML");
R.idGenerator = 0;
R.fn = {};
- R.isArray = function (arr) {
- return Object.prototype.toString.call(arr) == "[object Array]";
+ R.is = function (o, type) {
+ type = (type + "").toLowerCase();
+ if ((type == "object" || type == "undefined") && typeof o == type) {
+ return true;
+ }
+ if (o == null && type == "null") {
+ return true;
+ }
+ return Object[proto].toString.call(o).replace(/^\[object\s+|\]$/gi, "").toLowerCase() == type;
};
R.setWindow = function (newwin) {
win = newwin;
};
// colour utilities
R.hsb2rgb = cacher(function (hue, saturation, brightness) {
- if (typeof hue == "object" && "h" in hue && "s" in hue && "b" in hue) {
+ if (R.is(hue, "object") && "h" in hue && "s" in hue && "b" in hue) {
brightness = hue.b;
saturation = hue.s;
hue = hue.h;
green *= 255;
blue *= 255;
var rgb = {r: red, g: green, b: blue},
- r = Math.round(red).toString(16),
- g = Math.round(green).toString(16),
- b = Math.round(blue).toString(16);
- if (r.length == 1) {
+ r = (~~red).toString(16),
+ g = (~~green).toString(16),
+ b = (~~blue).toString(16);
+ if (r[ln] == 1) {
r = "0" + r;
}
- if (g.length == 1) {
+ if (g[ln] == 1) {
g = "0" + g;
}
- if (b.length == 1) {
+ if (b[ln] == 1) {
b = "0" + b;
}
rgb.hex = "#" + r + g + b;
return rgb;
}, R);
R.rgb2hsb = cacher(function (red, green, blue) {
- if (typeof red == "object" && "r" in red && "g" in red && "b" in red) {
+ if (R.is(red, "object") && "r" in red && "g" in red && "b" in red) {
blue = red.b;
green = red.g;
red = red.r;
}
- if (typeof red == "string") {
+ if (R.is(red, "string")) {
var clr = R.getRGB(red);
red = clr.r;
green = clr.g;
R._path2string = function () {
var res = "",
item;
- for (var i = 0, ii = this.length; i < ii; i++) {
- for (var j = 0, jj = this[i].length; j < jj; j++) {
+ for (var i = 0, ii = this[ln]; i < ii; i++) {
+ for (var j = 0, jj = this[i][ln]; j < jj; j++) {
res += this[i][j];
j && j != jj - 1 && (res += ",");
}
};
function cacher(f, scope, postprocessor) {
function newf() {
- var arg = Array.prototype.splice.call(arguments, 0, arguments.length),
+ var arg = Array[proto].splice.call(arguments, 0, arguments[ln]),
args = arg.join("\u25ba");
newf.cache = newf.cache || {};
newf.count = newf.count || [];
if (args in newf.cache) {
return postprocessor ? postprocessor(newf.cache[args]) : newf.cache[args];
}
- if (newf.count.length > 1000) {
+ if (newf.count[ln] > 1000) {
delete newf.cache[newf.count.unshift()];
}
newf.count.push(args);
- newf.cache[args] = f.apply(scope, arg);
+ newf.cache[args] = f[ap](scope, arg);
return postprocessor ? postprocessor(newf.cache[args]) : newf.cache[args];
}
return newf;
}
R.getRGB = cacher(function (colour) {
- var htmlcolors = {aliceblue: "#f0f8ff", amethyst: "#96c", antiquewhite: "#faebd7", aqua: "#0ff", aquamarine: "#7fffd4", azure: "#f0ffff", beige: "#f5f5dc", bisque: "#ffe4c4", black: "#000", blanchedalmond: "#ffebcd", blue: "#00f", blueviolet: "#8a2be2", brown: "#a52a2a", burlywood: "#deb887", cadetblue: "#5f9ea0", chartreuse: "#7fff00", chocolate: "#d2691e", coral: "#ff7f50", cornflowerblue: "#6495ed", cornsilk: "#fff8dc", crimson: "#dc143c", cyan: "#0ff", darkblue: "#00008b", darkcyan: "#008b8b", darkgoldenrod: "#b8860b", darkgray: "#a9a9a9", darkgreen: "#006400", darkkhaki: "#bdb76b", darkmagenta: "#8b008b", darkolivegreen: "#556b2f", darkorange: "#ff8c00", darkorchid: "#9932cc", darkred: "#8b0000", darksalmon: "#e9967a", darkseagreen: "#8fbc8f", darkslateblue: "#483d8b", darkslategray: "#2f4f4f", darkturquoise: "#00ced1", darkviolet: "#9400d3", deeppink: "#ff1493", deepskyblue: "#00bfff", dimgray: "#696969", dodgerblue: "#1e90ff", firebrick: "#b22222", floralwhite: "#fffaf0", forestgreen: "#228b22", fuchsia: "#f0f", gainsboro: "#dcdcdc", ghostwhite: "#f8f8ff", gold: "#ffd700", goldenrod: "#daa520", gray: "#808080", green: "#008000", greenyellow: "#adff2f", honeydew: "#f0fff0", hotpink: "#ff69b4", indianred: "#cd5c5c", indigo: "#4b0082", ivory: "#fffff0", khaki: "#f0e68c", lavender: "#e6e6fa", lavenderblush: "#fff0f5", lawngreen: "#7cfc00", lemonchiffon: "#fffacd", lightblue: "#add8e6", lightcoral: "#f08080", lightcyan: "#e0ffff", lightgoldenrodyellow: "#fafad2", lightgreen: "#90ee90", lightgrey: "#d3d3d3", lightpink: "#ffb6c1", lightsalmon: "#ffa07a", lightsalmon: "#ffa07a", lightseagreen: "#20b2aa", lightskyblue: "#87cefa", lightslategray: "#789", lightsteelblue: "#b0c4de", lightyellow: "#ffffe0", lime: "#0f0", limegreen: "#32cd32", linen: "#faf0e6", magenta: "#f0f", maroon: "#800000", mediumaquamarine: "#66cdaa", mediumblue: "#0000cd", mediumorchid: "#ba55d3", mediumpurple: "#9370db", mediumseagreen: "#3cb371", mediumslateblue: "#7b68ee", mediumslateblue: "#7b68ee", mediumspringgreen: "#00fa9a", mediumturquoise: "#48d1cc", mediumvioletred: "#c71585", midnightblue: "#191970", mintcream: "#f5fffa", mistyrose: "#ffe4e1", moccasin: "#ffe4b5", navajowhite: "#ffdead", navy: "#000080", oldlace: "#fdf5e6", olive: "#808000", olivedrab: "#6b8e23", orange: "#ffa500", orangered: "#ff4500", orchid: "#da70d6", palegoldenrod: "#eee8aa", palegreen: "#98fb98", paleturquoise: "#afeeee", palevioletred: "#db7093", papayawhip: "#ffefd5", peachpuff: "#ffdab9", peru: "#cd853f", pink: "#ffc0cb", plum: "#dda0dd", powderblue: "#b0e0e6", purple: "#800080", red: "#f00", rosybrown: "#bc8f8f", royalblue: "#4169e1", saddlebrown: "#8b4513", salmon: "#fa8072", sandybrown: "#f4a460", seagreen: "#2e8b57", seashell: "#fff5ee", sienna: "#a0522d", silver: "#c0c0c0", skyblue: "#87ceeb", slateblue: "#6a5acd", slategray: "#708090", snow: "#fffafa", springgreen: "#00ff7f", steelblue: "#4682b4", tan: "#d2b48c", teal: "#008080", thistle: "#d8bfd8", tomato: "#ff6347", turquoise: "#40e0d0", violet: "#ee82ee", wheat: "#f5deb3", white: "#fff", whitesmoke: "#f5f5f5", yellow: "#ff0", yellowgreen: "#9acd32"},
- res;
- if ((colour + "").toLowerCase() in htmlcolors) {
- colour = htmlcolors[colour.toString().toLowerCase()];
- }
+ var htmlcolors = {none: "none", aliceblue: "#f0f8ff", amethyst: "#96c", antiquewhite: "#faebd7", aqua: "#0ff", aquamarine: "#7fffd4", azure: "#f0ffff", beige: "#f5f5dc", bisque: "#ffe4c4", black: "#000", blanchedalmond: "#ffebcd", blue: "#00f", blueviolet: "#8a2be2", brown: "#a52a2a", burlywood: "#deb887", cadetblue: "#5f9ea0", chartreuse: "#7fff00", chocolate: "#d2691e", coral: "#ff7f50", cornflowerblue: "#6495ed", cornsilk: "#fff8dc", crimson: "#dc143c", cyan: "#0ff", darkblue: "#00008b", darkcyan: "#008b8b", darkgoldenrod: "#b8860b", darkgray: "#a9a9a9", darkgreen: "#006400", darkkhaki: "#bdb76b", darkmagenta: "#8b008b", darkolivegreen: "#556b2f", darkorange: "#ff8c00", darkorchid: "#9932cc", darkred: "#8b0000", darksalmon: "#e9967a", darkseagreen: "#8fbc8f", darkslateblue: "#483d8b", darkslategray: "#2f4f4f", darkturquoise: "#00ced1", darkviolet: "#9400d3", deeppink: "#ff1493", deepskyblue: "#00bfff", dimgray: "#696969", dodgerblue: "#1e90ff", firebrick: "#b22222", floralwhite: "#fffaf0", forestgreen: "#228b22", fuchsia: "#f0f", gainsboro: "#dcdcdc", ghostwhite: "#f8f8ff", gold: "#ffd700", goldenrod: "#daa520", gray: "#808080", green: "#008000", greenyellow: "#adff2f", honeydew: "#f0fff0", hotpink: "#ff69b4", indianred: "#cd5c5c", indigo: "#4b0082", ivory: "#fffff0", khaki: "#f0e68c", lavender: "#e6e6fa", lavenderblush: "#fff0f5", lawngreen: "#7cfc00", lemonchiffon: "#fffacd", lightblue: "#add8e6", lightcoral: "#f08080", lightcyan: "#e0ffff", lightgoldenrodyellow: "#fafad2", lightgreen: "#90ee90", lightgrey: "#d3d3d3", lightpink: "#ffb6c1", lightsalmon: "#ffa07a", lightsalmon: "#ffa07a", lightseagreen: "#20b2aa", lightskyblue: "#87cefa", lightslategray: "#789", lightsteelblue: "#b0c4de", lightyellow: "#ffffe0", lime: "#0f0", limegreen: "#32cd32", linen: "#faf0e6", magenta: "#f0f", maroon: "#800000", mediumaquamarine: "#66cdaa", mediumblue: "#0000cd", mediumorchid: "#ba55d3", mediumpurple: "#9370db", mediumseagreen: "#3cb371", mediumslateblue: "#7b68ee", mediumslateblue: "#7b68ee", mediumspringgreen: "#00fa9a", mediumturquoise: "#48d1cc", mediumvioletred: "#c71585", midnightblue: "#191970", mintcream: "#f5fffa", mistyrose: "#ffe4e1", moccasin: "#ffe4b5", navajowhite: "#ffdead", navy: "#000080", oldlace: "#fdf5e6", olive: "#808000", olivedrab: "#6b8e23", orange: "#ffa500", orangered: "#ff4500", orchid: "#da70d6", palegoldenrod: "#eee8aa", palegreen: "#98fb98", paleturquoise: "#afeeee", palevioletred: "#db7093", papayawhip: "#ffefd5", peachpuff: "#ffdab9", peru: "#cd853f", pink: "#ffc0cb", plum: "#dda0dd", powderblue: "#b0e0e6", purple: "#800080", red: "#f00", rosybrown: "#bc8f8f", royalblue: "#4169e1", saddlebrown: "#8b4513", salmon: "#fa8072", sandybrown: "#f4a460", seagreen: "#2e8b57", seashell: "#fff5ee", sienna: "#a0522d", silver: "#c0c0c0", skyblue: "#87ceeb", slateblue: "#6a5acd", slategray: "#708090", snow: "#fffafa", springgreen: "#00ff7f", steelblue: "#4682b4", tan: "#d2b48c", teal: "#008080", thistle: "#d8bfd8", tomato: "#ff6347", turquoise: "#40e0d0", violet: "#ee82ee", wheat: "#f5deb3", white: "#fff", whitesmoke: "#f5f5f5", yellow: "#ff0", yellowgreen: "#9acd32"},
+ res;
+ colour = htmlcolors[(colour + "").toLowerCase()] || colour;
if (!colour) {
- return {r: 0, g: 0, b: 0, hex: "#000"};
+ return {r: -1, g: -1, b: -1, hex: "none", error: 1};
}
if (colour == "none") {
return {r: -1, g: -1, b: -1, hex: "none"};
rgb = (colour + "").match(/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgb\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|rgb\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\)|hs[bl]\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hs[bl]\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\))\s*$/i);
if (rgb) {
if (rgb[2]) {
- blue = parseInt(rgb[2].substring(5), 16);
- green = parseInt(rgb[2].substring(3, 5), 16);
- red = parseInt(rgb[2].substring(1, 3), 16);
+ blue = win[pi](rgb[2].substring(5), 16);
+ green = win[pi](rgb[2].substring(3, 5), 16);
+ red = win[pi](rgb[2].substring(1, 3), 16);
}
if (rgb[3]) {
- blue = parseInt(rgb[3].substring(3) + rgb[3].substring(3), 16);
- green = parseInt(rgb[3].substring(2, 3) + rgb[3].substring(2, 3), 16);
- red = parseInt(rgb[3].substring(1, 2) + rgb[3].substring(1, 2), 16);
+ blue = win[pi](rgb[3].substring(3) + rgb[3].substring(3), 16);
+ green = win[pi](rgb[3].substring(2, 3) + rgb[3].substring(2, 3), 16);
+ red = win[pi](rgb[3].substring(1, 2) + rgb[3].substring(1, 2), 16);
}
if (rgb[4]) {
rgb = rgb[4].split(/\s*,\s*/);
- red = parseFloat(rgb[0]);
- green = parseFloat(rgb[1]);
- blue = parseFloat(rgb[2]);
+ red = win[pf](rgb[0]);
+ green = win[pf](rgb[1]);
+ blue = win[pf](rgb[2]);
}
if (rgb[5]) {
rgb = rgb[5].split(/\s*,\s*/);
- red = parseFloat(rgb[0]) * 2.55;
- green = parseFloat(rgb[1]) * 2.55;
- blue = parseFloat(rgb[2]) * 2.55;
+ red = win[pf](rgb[0]) * 2.55;
+ green = win[pf](rgb[1]) * 2.55;
+ blue = win[pf](rgb[2]) * 2.55;
}
if (rgb[6]) {
rgb = rgb[6].split(/\s*,\s*/);
- red = parseFloat(rgb[0]);
- green = parseFloat(rgb[1]);
- blue = parseFloat(rgb[2]);
+ red = win[pf](rgb[0]);
+ green = win[pf](rgb[1]);
+ blue = win[pf](rgb[2]);
return R.hsb2rgb(red, green, blue);
}
if (rgb[7]) {
rgb = rgb[7].split(/\s*,\s*/);
- red = parseFloat(rgb[0]) * 2.55;
- green = parseFloat(rgb[1]) * 2.55;
- blue = parseFloat(rgb[2]) * 2.55;
+ red = win[pf](rgb[0]) * 2.55;
+ green = win[pf](rgb[1]) * 2.55;
+ blue = win[pf](rgb[2]) * 2.55;
return R.hsb2rgb(red, green, blue);
}
- var rgb = {r: red, g: green, b: blue},
- r = Math.round(red).toString(16),
- g = Math.round(green).toString(16),
- b = Math.round(blue).toString(16);
- (r.length == 1) && (r = "0" + r);
- (g.length == 1) && (g = "0" + g);
- (b.length == 1) && (b = "0" + b);
+ rgb = {r: red, g: green, b: blue};
+ var r = (~~red).toString(16),
+ g = (~~green).toString(16),
+ b = (~~blue).toString(16),
+ rg = /^(?=\d$)/,
+ rp = "replace";
+ r = r[rp](rg, "0");
+ g = g[rp](rg, "0");
+ b = b[rp](rg, "0");
rgb.hex = "#" + r + g + b;
res = rgb;
} else {
- res = {r: -1, g: -1, b: -1, hex: "none"};
+ res = {r: -1, g: -1, b: -1, hex: "none", error: 1};
}
return res;
}, R);
}
var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0},
data = [];
- if (R.isArray(pathString) && R.isArray(pathString[0])) { // rough assumption
+ if (R.is(pathString, "array") && R.is(pathString[0], "array")) { // rough assumption
data = pathClone(pathString);
}
- if (!data.length) {
+ if (!data[ln]) {
(pathString + "").replace(/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig, function (a, b, c) {
var params = [],
name = b.toLowerCase();
c.replace(/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig, function (a, b) {
b && params.push(+b);
});
- while (params.length >= paramCounts[name]) {
+ while (params[ln] >= paramCounts[name]) {
data.push([b].concat(params.splice(0, paramCounts[name])));
if (!paramCounts[name]) {
break;
return data;
});
var pathDimensions = cacher(function (path) {
+ if (!path) {
+ return {x: 0, y: 0, width: 0, height: 0};
+ }
path = path2curve(path);
var x = 0,
y = 0,
X = [],
Y = [];
- for (var i = 0, ii = path.length; i < ii; i++) {
+ for (var i = 0, ii = path[ln]; i < ii; i++) {
if (path[i][0] == "M") {
x = path[i][1];
y = path[i][2];
Y = Y.concat(dim.min.y, dim.max.y);
}
}
- var xmin = Math.min.apply(0, X),
- ymin = Math.min.apply(0, Y);
+ var xmin = Math.min[ap](0, X),
+ ymin = Math.min[ap](0, Y);
return {
x: xmin,
y: ymin,
- width: Math.max.apply(0, X) - xmin,
- height: Math.max.apply(0, Y) - ymin
+ width: Math.max[ap](0, X) - xmin,
+ height: Math.max[ap](0, Y) - ymin
};
}),
pathClone = function (pathArray) {
var res = [];
- if (!R.isArray(pathArray) || !R.isArray(pathArray && pathArray[0])) { // rough assumption
+ if (!R.is(pathArray, "array") || !R.is(pathArray && pathArray[0], "array")) { // rough assumption
pathArray = R.parsePathString(pathArray);
}
- for (var i = 0, ii = pathArray.length; i < ii; i++) {
+ for (var i = 0, ii = pathArray[ln]; i < ii; i++) {
res[i] = [];
- for (var j = 0, jj = pathArray[i].length; j < jj; j++) {
+ for (var j = 0, jj = pathArray[i][ln]; j < jj; j++) {
res[i][j] = pathArray[i][j];
}
}
return res;
},
pathToRelative = cacher(function (pathArray) {
- if (!R.isArray(pathArray) || !R.isArray(pathArray && pathArray[0])) { // rough assumption
+ if (!R.is(pathArray, "array") || !R.is(pathArray && pathArray[0], "array")) { // rough assumption
pathArray = R.parsePathString(pathArray);
}
var res = [],
start++;
res.push(["M", x, y]);
}
- for (var i = start, ii = pathArray.length; i < ii; i++) {
+ for (var i = start, ii = pathArray[ln]; i < ii; i++) {
var r = res[i] = [],
pa = pathArray[i];
if (pa[0] != pa[0].toLowerCase()) {
mx = pa[1];
my = pa[2];
default:
- for (var j = 1, jj = pa.length; j < jj; j++) {
+ for (var j = 1, jj = pa[ln]; j < jj; j++) {
r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);
}
}
mx = pa[1] + x;
my = pa[2] + y;
}
- for (var k = 0, kk = pa.length; k < kk; k++) {
+ for (var k = 0, kk = pa[ln]; k < kk; k++) {
res[i][k] = pa[k];
}
}
- var len = res[i].length;
+ var len = res[i][ln];
switch (res[i][0]) {
case "z":
x = mx;
return res;
}, 0, pathClone),
pathToAbsolute = cacher(function (pathArray) {
- if (!R.isArray(pathArray) || !R.isArray(pathArray && pathArray[0])) { // rough assumption
+ if (!R.is(pathArray, "array") || !R.is(pathArray && pathArray[0], "array")) { // rough assumption
pathArray = R.parsePathString(pathArray);
}
var res = [],
start++;
res[0] = ["M", x, y];
}
- for (var i = start, ii = pathArray.length; i < ii; i++) {
+ for (var i = start, ii = pathArray[ln]; i < ii; i++) {
var r = res[i] = [],
pa = pathArray[i];
if (pa[0] != (pa[0] + "").toUpperCase()) {
mx = +pa[1] + x;
my = +pa[2] + y;
default:
- for (var j = 1, jj = pa.length; j < jj; j++) {
+ for (var j = 1, jj = pa[ln]; j < jj; j++) {
r[j] = +pa[j] + ((j % 2) ? x : y);
}
}
} else {
- for (var k = 0, kk = pa.length; k < kk; k++) {
+ for (var k = 0, kk = pa[ln]; k < kk; k++) {
res[i][k] = pa[k];
}
}
y = r[1];
break;
default:
- x = res[i][res[i].length - 2];
- y = res[i][res[i].length - 1];
+ x = res[i][res[i][ln] - 2];
+ y = res[i][res[i][ln] - 1];
}
}
res.toString = R._path2string;
return [x1, y1, x2, y2, x2, y2];
},
q2c = function (x1, y1, ax, ay, x2, y2) {
+ var _13 = 1 / 3,
+ _23 = 2 / 3;
return [
- 2 / 3 * x1 + 1 / 3 * ax,
- 2 / 3 * y1 + 1 / 3 * ay,
- 2 / 3 * x1 + 1 / 3 * x2,
- 2 / 3 * y1 + 1 / 3 * y2,
+ _13 * x1 + _23 * ax,
+ _13 * y1 + _23 * ay,
+ _13 * x2 + _23 * ax,
+ _13 * y2 + _23 * ay,
x2,
y2
];
a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {
// for more information of where this math came from visit:
// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
- var _120 = Math.PI * 120 / 180,
- rad = Math.PI / 180 * (+angle || 0),
+ var PI = Math.PI,
+ _120 = PI * 120 / 180,
+ rad = PI / 180 * (+angle || 0),
res = [],
xy,
rotate = cacher(function (x, y, rad) {
xy = rotate(x2, y2, -rad);
x2 = xy.x;
y2 = xy.y;
- var cos = Math.cos(Math.PI / 180 * angle),
- sin = Math.sin(Math.PI / 180 * angle),
+ var cos = Math.cos(PI / 180 * angle),
+ sin = Math.sin(PI / 180 * angle),
x = (x1 - x2) / 2,
y = (y1 - y2) / 2;
rx = Math.max(rx, Math.abs(x));
var rx2 = rx * rx,
ry2 = ry * ry,
k = (large_arc_flag == sweep_flag ? -1 : 1) *
- Math.sqrt((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x)),
+ Math.sqrt(Math.abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),
cx = k * rx * y / ry + (x1 + x2) / 2,
cy = k * -ry * x / rx + (y1 + y2) / 2,
f1 = Math.asin((y1 - cy) / ry),
f2 = Math.asin((y2 - cy) / ry);
- f1 = x1 < cx ? Math.PI - f1 : f1;
- f2 = x2 < cx ? Math.PI - f2 : f2;
- f1 < 0 && (f1 = Math.PI * 2 + f1);
- f2 < 0 && (f2 = Math.PI * 2 + f2);
+ f1 = x1 < cx ? PI - f1 : f1;
+ f2 = x2 < cx ? PI - f2 : f2;
+ f1 < 0 && (f1 = PI * 2 + f1);
+ f2 < 0 && (f2 = PI * 2 + f2);
if (sweep_flag && f1 > f2) {
- f1 = f1 - Math.PI * 2;
+ f1 = f1 - PI * 2;
}
if (!sweep_flag && f2 > f1) {
- f2 = f2 - Math.PI * 2;
+ f2 = f2 - PI * 2;
}
} else {
f1 = recursive[0];
y2 = cy + ry * Math.sin(f2);
res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);
}
+ df = f2 - f1;
var c1 = Math.cos(f1),
s1 = Math.sin(f1),
c2 = Math.cos(f2),
s2 = Math.sin(f2),
- df = f2 - f1,
t = Math.tan(df / 4),
hx = 4 / 3 * rx * t,
hy = 4 / 3 * ry * t,
} else {
res = [m2, m3, m4].concat(res).join(",").split(",");
var newres = [];
- for (var i = 0, ii = res.length; i < ii; i++) {
+ for (var i = 0, ii = res[ln]; i < ii; i++) {
newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;
}
return newres;
x = x.concat(dot1.x, dot2.x);
y = y.concat(dot1.y, dot2.y);
return {
- min: {x: Math.min.apply(Math, x), y: Math.min.apply(Math, y)},
- max: {x: Math.max.apply(Math, x), y: Math.max.apply(Math, y)}
+ min: {x: Math.min[ap](Math, x), y: Math.min[ap](Math, y)},
+ max: {x: Math.max[ap](Math, x), y: Math.max[ap](Math, y)}
};
}),
path2curve = cacher(function (path, path2) {
var p = pathToAbsolute(path),
p2 = path2 && pathToAbsolute(path2),
- attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0},
- attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0},
+ attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
+ attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
processPath = function (path, d) {
+ var nx, ny;
if (!path) {
return ["C", d.x, d.y, d.x, d.y, d.x, d.y];
}
+ !(path[0] in {T:1, Q:1}) && (d.qx = d.qy = null);
switch (path[0]) {
case "M":
d.X = path[1];
d.Y = path[2];
break;
case "A":
- path = ["C"].concat(a2c(d.x, d.y, path[1], path[2], path[3], path[4], path[5], path[6], path[7]));
+ path = ["C"].concat(a2c[ap](0, [d.x, d.y].concat(path.slice(1))));
break;
case "S":
- var nx = d.x + (d.x - (d.bx || d.x)),
- ny = d.y + (d.y - (d.by || d.y));
- path = ["C", nx, ny, path[1], path[2], path[3], path[4]];
+ nx = d.x + (d.x - (d.bx || d.x));
+ ny = d.y + (d.y - (d.by || d.y));
+ path = ["C", nx, ny].concat(path.slice(1));
break;
case "T":
- var nx = d.x + (d.x - (d.bx || d.x)),
- ny = d.y + (d.y - (d.by || d.y));
- path = ["C"].concat(q2c(d.x, d.y, nx, ny, path[1], path[2]));
+ d.qx = d.x + (d.x - (d.qx || d.x));
+ d.qy = d.y + (d.y - (d.qy || d.y));
+ path = ["C"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));
break;
case "Q":
+ d.qx = path[1];
+ d.qy = path[2];
path = ["C"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));
break;
case "L":
return path;
},
fixArc = function (pp, i) {
- if (pp[i].length > 7) {
+ if (pp[i][ln] > 7) {
pp[i].shift();
var pi = pp[i];
- while (pi.length) {
+ while (pi[ln]) {
pp.splice(i++, 0, ["C"].concat(pi.splice(0, 6)));
}
pp.splice(i, 1);
- ii = Math.max(p.length, p2 && p2.length || 0);
+ ii = Math.max(p[ln], p2 && p2[ln] || 0);
}
},
fixM = function (path1, path2, a1, a2, i) {
a1.by = 0;
a1.x = path1[i][1];
a1.y = path1[i][2];
- ii = Math.max(p.length, p2 && p2.length || 0);
+ ii = Math.max(p[ln], p2 && p2[ln] || 0);
}
};
- for (var i = 0, ii = Math.max(p.length, p2 && p2.length || 0); i < ii; i++) {
+ for (var i = 0, ii = Math.max(p[ln], p2 && p2[ln] || 0); i < ii; i++) {
p[i] = processPath(p[i], attrs);
fixArc(p, i);
p2 && (p2[i] = processPath(p2[i], attrs2));
fixM(p2, p, attrs2, attrs, i);
var seg = p[i],
seg2 = p2 && p2[i],
- seglen = seg.length,
- seg2len = p2 && seg2.length;
- attrs.bx = seg[seglen - 4] || 0;
- attrs.by = seg[seglen - 3] || 0;
+ seglen = seg[ln],
+ seg2len = p2 && seg2[ln];
attrs.x = seg[seglen - 2];
attrs.y = seg[seglen - 1];
- attrs2.bx = p2 && (seg2[seg2len - 4] || 0);
- attrs2.by = p2 && (seg2[seg2len - 3] || 0);
+ attrs.bx = win[pf](seg[seglen - 4]) || attrs.x;
+ attrs.by = win[pf](seg[seglen - 3]) || attrs.y;
+ attrs2.bx = p2 && (win[pf](seg2[seg2len - 4]) || attrs2.x);
+ attrs2.by = p2 && (win[pf](seg2[seg2len - 3]) || attrs2.y);
attrs2.x = p2 && seg2[seg2len - 2];
attrs2.y = p2 && seg2[seg2len - 1];
}
return p2 ? [p, p2] : p;
}, null, pathClone),
- toGradient = cacher(function (gradient) {
- if (typeof gradient == "string") {
- gradient = gradient.split(/\s*\-\s*/);
- var angle = gradient.shift();
- if (angle.toLowerCase() == "v") {
- angle = 90;
- } else if (angle.toLowerCase() == "h") {
- angle = 0;
- } else {
- angle = parseFloat(angle);
- }
- angle = -angle;
- var grobj = {angle: angle, type: "linear", dots: [], vector: [0, 0, Math.cos(angle * Math.PI / 180).toFixed(3), Math.sin(angle * Math.PI / 180).toFixed(3)]},
- max = 1 / (Math.max(Math.abs(grobj.vector[2]), Math.abs(grobj.vector[3])) || 1);
- grobj.vector[2] *= max;
- grobj.vector[3] *= max;
- if (grobj.vector[2] < 0) {
- grobj.vector[0] = -grobj.vector[2];
- grobj.vector[2] = 0;
- }
- if (grobj.vector[3] < 0) {
- grobj.vector[1] = -grobj.vector[3];
- grobj.vector[3] = 0;
- }
- grobj.vector[0] = grobj.vector[0];
- grobj.vector[1] = grobj.vector[1];
- grobj.vector[2] = grobj.vector[2];
- grobj.vector[3] = grobj.vector[3];
- for (var i = 0, ii = gradient.length; i < ii; i++) {
- var dot = {},
- par = gradient[i].match(/^([^:]*):?([\d\.]*)/);
- dot.color = R.getRGB(par[1]).hex;
- par[2] && (dot.offset = par[2] + "%");
- grobj.dots.push(dot);
- }
- for (var i = 1, ii = grobj.dots.length - 1; i < ii; i++) {
- if (!grobj.dots[i].offset) {
- var start = parseFloat(grobj.dots[i - 1].offset || 0),
- end = false;
- for (var j = i + 1; j < ii; j++) {
- if (grobj.dots[j].offset) {
- end = grobj.dots[j].offset;
- break;
- }
- }
- if (!end) {
- end = 100;
- j = ii;
- }
- end = parseFloat(end);
- var d = (end - start) / (j - i + 1);
- for (; i < j; i++) {
- start += d;
- grobj.dots[i].offset = start + "%";
+ parseDots = cacher(function (gradient) {
+ var dots = [];
+ for (var i = 0, ii = gradient[ln]; i < ii; i++) {
+ var dot = {},
+ par = gradient[i].match(/^([^:]*):?([\d\.]*)/);
+ dot.color = R.getRGB(par[1]);
+ if (dot.color.error) {
+ return null;
+ }
+ dot.color = dot.color.hex;
+ par[2] && (dot.offset = par[2] + "%");
+ dots.push(dot);
+ }
+ for (var i = 1, ii = dots[ln] - 1; i < ii; i++) {
+ if (!dots[i].offset) {
+ var start = win[pf](dots[i - 1].offset || 0),
+ end = 0;
+ for (var j = i + 1; j < ii; j++) {
+ if (dots[j].offset) {
+ end = dots[j].offset;
+ break;
}
}
+ if (!end) {
+ end = 100;
+ j = ii;
+ }
+ end = win[pf](end);
+ var d = (end - start) / (j - i + 1);
+ for (; i < j; i++) {
+ start += d;
+ dots[i].offset = start + "%";
+ }
}
- return grobj;
- } else {
- return gradient;
}
+ return dots;
}),
getContainer = function () {
var container,
y,
width,
height;
- if (typeof arguments[0] == "string" || typeof arguments[0] == "object") {
- if (typeof arguments[0] == "string") {
+ if (R.is(arguments[0], "string") || R.is(arguments[0], "object")) {
+ if (R.is(arguments[0], "string")) {
container = doc.getElementById(arguments[0]);
} else {
container = arguments[0];
return {container: container, width: arguments[1], height: arguments[2]};
}
}
- } else if (typeof arguments[0] == "number" && arguments.length > 3) {
+ } else if (R.is(arguments[0], "number") && arguments[ln] > 3) {
return {container: 1, x: arguments[0], y: arguments[1], width: arguments[2], height: arguments[3]};
}
},
switch (typeof add[prop]) {
case "function":
(function (f) {
- con[prop] = con === that ? f : function () { return f.apply(that, arguments); };
+ con[prop] = con === that ? f : function () { return f[ap](that, arguments); };
})(add[prop]);
break;
case "object":
// SVG
if (R.svg) {
+ paper.svgns = "http://www.w3.org/2000/svg";
+ paper.xlink = "http://www.w3.org/1999/xlink";
var round = function (num) {
return +num + (Math.floor(num) == num) * .5;
};
var roundPath = function (path) {
- for (var i = 0, ii = path.length; i < ii; i++) {
+ for (var i = 0, ii = path[ln]; i < ii; i++) {
if (path[i][0].toLowerCase() != "a") {
- for (var j = 1, jj = path[i].length; j < jj; j++) {
+ for (var j = 1, jj = path[i][ln]; j < jj; j++) {
path[i][j] = round(path[i][j]);
}
} else {
}
return path;
};
+ var $ = function (el, attr) {
+ if (attr) {
+ for (var key in attr) if (attr.hasOwnProperty(key)) {
+ el.setAttribute(key, attr[key]);
+ }
+ } else {
+ return doc.createElementNS(paper.svgns, el);
+ }
+ };
R.toString = function () {
return "Your browser supports SVG.\nYou are running Rapha\u00ebl " + this.version;
};
var thePath = function (pathString, SVG) {
- var el = doc.createElementNS(SVG.svgns, "path");
+ var el = $("path");
SVG.canvas && SVG.canvas.appendChild(el);
var p = new Element(el, SVG);
p.type = "path";
return p;
};
var addGradientFill = function (o, gradient, SVG) {
- gradient = toGradient(gradient);
- var el = doc.createElementNS(SVG.svgns, (gradient.type || "linear") + "Gradient");
- el.id = "r" + (R.idGenerator++).toString(36);
- if (gradient.vector && gradient.vector.length) {
- el.setAttribute("x1", gradient.vector[0]);
- el.setAttribute("y1", gradient.vector[1]);
- el.setAttribute("x2", gradient.vector[2]);
- el.setAttribute("y2", gradient.vector[3]);
+ var type = "linear",
+ fx = .5, fy = .5,
+ s = o.style;
+ gradient = (gradient + "").replace(/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, function (all, _fx, _fy) {
+ type = "radial";
+ if (_fx && _fy) {
+ fx = win[pf](_fx);
+ fy = win[pf](_fy);
+ if (Math.pow(fx - .5, 2) + Math.pow(fy - .5, 2) > .25) {
+ fy = Math.sqrt(.25 - Math.pow(fx - .5, 2)) + .5;
+ }
+ }
+ return "";
+ });
+ gradient = gradient.split(/\s*\-\s*/);
+ if (type == "linear") {
+ var angle = gradient.shift();
+ angle = -win[pf](angle);
+ if (isNaN(angle)) {
+ return null;
+ }
+ var vector = [0, 0, Math.cos(angle * Math.PI / 180), Math.sin(angle * Math.PI / 180)],
+ max = 1 / (Math.max(Math.abs(vector[2]), Math.abs(vector[3])) || 1);
+ vector[2] *= max;
+ vector[3] *= max;
+ if (vector[2] < 0) {
+ vector[0] = -vector[2];
+ vector[2] = 0;
+ }
+ if (vector[3] < 0) {
+ vector[1] = -vector[3];
+ vector[3] = 0;
+ }
}
+ var dots = parseDots(gradient);
+ if (!dots) {
+ return null;
+ }
+ var el = $(type + "Gradient");
+ el.id = "r" + (R.idGenerator++).toString(36);
+ type == "radial" ? $(el, {fx: fx, fy: fy}) : $(el, {x1: vector[0], y1: vector[1], x2: vector[2], y2: vector[3]});
SVG.defs.appendChild(el);
- var isopacity = true;
- for (var i = 0, ii = gradient.dots.length; i < ii; i++) {
- var stop = doc.createElementNS(SVG.svgns, "stop");
- if (gradient.dots[i].offset) {
- isopacity = false;
- }
- stop.setAttribute("offset", gradient.dots[i].offset ? gradient.dots[i].offset : (i == 0) ? "0%" : "100%");
- stop.setAttribute("stop-color", R.getRGB(gradient.dots[i].color).hex || "#fff");
- // ignoring opacity for internal points, because VML doesn't support it
+ for (var i = 0, ii = dots[ln]; i < ii; i++) {
+ var stop = $("stop");
+ $(stop, {
+ offset: dots[i].offset ? dots[i].offset : !i ? "0%" : "100%",
+ "stop-color": dots[i].color || "#fff"
+ });
el.appendChild(stop);
};
- if (isopacity && typeof gradient.dots[ii - 1].opacity != "undefined") {
- stop.setAttribute("stop-opacity", gradient.dots[ii - 1].opacity);
- }
- o.setAttribute("fill", "url(#" + el.id + ")");
- o.style.fill = "";
- o.style.opacity = 1;
- o.style.fillOpacity = 1;
- o.setAttribute("opacity", 1);
- o.setAttribute("fill-opacity", 1);
+ $(o, {
+ fill: "url(#" + el.id + ")",
+ opacity: 1,
+ "fill-opacity": 1
+ });
+ s.fill = "";
+ s.opacity = 1;
+ s.fillOpacity = 1;
+ return 1;
};
var updatePosition = function (o) {
var bbox = o.getBBox();
- o.pattern.setAttribute("patternTransform", "translate(".concat(bbox.x, ",", bbox.y, ")"));
+ $(o.pattern, {patternTransform: R.format("translate({0},{1})", bbox.x, bbox.y)});
};
var setFillAndStroke = function (o, params) {
var dasharray = {
var width = o.attrs["stroke-width"] || "1",
butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0,
dashes = [];
- for (var i = 0, ii = value.length; i < ii; i++) {
- dashes.push(value[i] * width + ((i % 2) ? 1 : -1) * butt);
+ var i = value[ln];
+ while (i--) {
+ dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt;
}
- value = dashes.join(",");
- node.setAttribute("stroke-dasharray", value);
+ $(node, {"stroke-dasharray": dashes.join(",")});
}
};
- parseInt(rot, 10) && o.rotate(0, true);
- for (var att in params) {
+ win[pf](rot) && o.rotate(0, true);
+ for (var att in params) if (params.hasOwnProperty(att)) {
if (!(att in availableAttrs)) {
continue;
}
case "target":
var pn = node.parentNode;
if (pn.tagName.toLowerCase() != "a") {
- var hl = doc.createElementNS(o.paper.svgns, "a");
+ var hl = $("a");
pn.insertBefore(hl, node);
hl.appendChild(node);
pn = hl;
}
pn.setAttributeNS(o.paper.xlink, att, value);
break;
+ case "clip-rect":
+ var rect = (value + "").split(separator);
+ if (rect[ln] == 4) {
+ o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);
+ var el = $("clipPath"),
+ rc = $("rect");
+ el.id = "r" + (R.idGenerator++).toString(36);
+ $(rc, {
+ x: rect[0],
+ y: rect[1],
+ width: rect[2],
+ height: rect[3]
+ });
+ el.appendChild(rc);
+ o.paper.defs.appendChild(el);
+ $(node, {"clip-path": "url(#" + el.id + ")"});
+ o.clip = rc;
+ }
+ if (!value) {
+ var clip = doc.getElementById(node.getAttribute("clip-path").replace(/(^url\(#|\)$)/g, ""));
+ clip && clip.parentNode.removeChild(clip);
+ $(node, {"clip-path": ""});
+ delete o.clip;
+ }
+ break;
case "path":
if (value && o.type == "path") {
attrs.path = roundPath(pathToAbsolute(value));
- node.setAttribute("d", attrs.path);
+ $(node, {d: attrs.path});
}
+ break;
case "width":
node.setAttribute(att, value);
if (attrs.fx) {
value = -attrs.x - (attrs.width || 0);
}
case "rx":
+ if (att == "rx" && o.type == "rect") {
+ break;
+ }
case "cx":
node.setAttribute(att, value);
o.pattern && updatePosition(o);
value = -attrs.y - (attrs.height || 0);
}
case "ry":
+ if (att == "ry" && o.type == "rect") {
+ break;
+ }
case "cy":
node.setAttribute(att, value);
o.pattern && updatePosition(o);
break;
case "r":
if (o.type == "rect") {
- node.setAttribute("rx", value);
- node.setAttribute("ry", value);
+ $(node, {rx: value, ry: value});
} else {
node.setAttribute(att, value);
}
case "fill":
var isURL = (value + "").match(/^url\(['"]?([^\)]+)['"]?\)$/i);
if (isURL) {
- var el = doc.createElementNS(o.paper.svgns, "pattern"),
- ig = doc.createElementNS(o.paper.svgns, "image");
+ var el = $("pattern"),
+ ig = $("image");
el.id = "r" + (R.idGenerator++).toString(36);
- el.setAttribute("x", 0);
- el.setAttribute("y", 0);
- el.setAttribute("patternUnits", "userSpaceOnUse");
- ig.setAttribute("x", 0);
- ig.setAttribute("y", 0);
+ $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse"});
+ $(ig, {x: 0, y:0});
ig.setAttributeNS(o.paper.xlink, "href", isURL[1]);
el.appendChild(ig);
var img = doc.createElement("img");
- img.style.position = "absolute";
- img.style.top = "-9999em";
- img.style.left = "-9999em";
+ img.style.cssText = "position:absolute;left:-9999em;top-9999em";
img.onload = function () {
- el.setAttribute("width", this.offsetWidth);
- el.setAttribute("height", this.offsetHeight);
- ig.setAttribute("width", this.offsetWidth);
- ig.setAttribute("height", this.offsetHeight);
+ $(el, {width: this.offsetWidth, height: this.offsetHeight});
+ $(ig, {width: this.offsetWidth, height: this.offsetHeight});
doc.body.removeChild(this);
paper.safari();
};
img.src = isURL[1];
o.paper.defs.appendChild(el);
node.style.fill = "url(#" + el.id + ")";
- node.setAttribute("fill", "url(#" + el.id + ")");
+ $(node, {fill: "url(#" + el.id + ")"});
o.pattern = el;
o.pattern && updatePosition(o);
break;
}
- delete params.gradient;
- delete attrs.gradient;
- if (typeof attrs.opacity != "undefined" && typeof params.opacity == "undefined" ) {
- node.style.opacity = attrs.opacity;
- // Need following line for Firefox
- node.setAttribute("opacity", attrs.opacity);
- }
- if (typeof attrs["fill-opacity"] != "undefined" && typeof params["fill-opacity"] == "undefined" ) {
- node.style.fillOpacity = attrs["fill-opacity"];
- // Need following line for Firefox
- node.setAttribute("fill-opacity", attrs["fill-opacity"]);
+ if (!R.getRGB(value).error) {
+ delete params.gradient;
+ delete attrs.gradient;
+ if (!R.is(attrs.opacity, "undefined") && R.is(params.opacity, "undefined") ) {
+ node.style.opacity = attrs.opacity;
+ // Need following line for Firefox
+ $(node, {opacity: attrs.opacity});
+ }
+ if (!R.is(attrs["fill-opacity"], "undefined") && R.is(params["fill-opacity"], "undefined") ) {
+ node.style.fillOpacity = attrs["fill-opacity"];
+ // Need following line for Firefox
+ $(node, {"fill-opacity": attrs["fill-opacity"]});
+ }
+ } else if ((o.type in {circle: 1, ellipse: 1} || (value + "").charAt(0) != "r") && addGradientFill(node, value, o.paper)) {
+ attrs.gradient = value;
+ attrs.fill = "none";
+ break;
}
case "stroke":
node.style[att] = R.getRGB(value).hex;
node.setAttribute(att, R.getRGB(value).hex);
break;
case "gradient":
- addGradientFill(node, value, o.paper);
+ (o.type in {circle: 1, ellipse: 1} || (value + "").charAt(0) != "r") && addGradientFill(node, value, o.paper);
break;
case "opacity":
case "fill-opacity":
var gradient = doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, ""));
if (gradient) {
var stops = gradient.getElementsByTagName("stop");
- stops[stops.length - 1].setAttribute("stop-opacity", value);
+ stops[stops[ln] - 1].setAttribute("stop-opacity", value);
}
break;
}
default:
- att == "font-size" && (value = parseInt(value, 10) + "px");
+ att == "font-size" && (value = win[pi](value, 10) + "px");
var cssrule = att.replace(/(\-.)/g, function (w) {
return w.substring(1).toUpperCase();
});
}
tuneText(o, params);
- parseInt(rot, 10) && o.rotate(rot, true);
+ win[pi](rot, 10) && o.rotate(rot, true);
};
var leading = 1.2;
var tuneText = function (el, params) {
}
var a = el.attrs,
node = el.node,
- fontSize = node.firstChild ? parseInt(doc.defaultView.getComputedStyle(node.firstChild, "").getPropertyValue("font-size"), 10) : 10;
+ fontSize = node.firstChild ? win[pi](doc.defaultView.getComputedStyle(node.firstChild, "").getPropertyValue("font-size"), 10) : 10;
if ("text" in params) {
while (node.firstChild) {
node.removeChild(node.firstChild);
}
var texts = (params.text + "").split("\n");
- for (var i = 0, ii = texts.length; i < ii; i++) {
- var tspan = doc.createElementNS(el.paper.svgns, "tspan");
- i && tspan.setAttribute("dy", fontSize * leading);
- i && tspan.setAttribute("x", a.x);
+ for (var i = 0, ii = texts[ln]; i < ii; i++) {
+ var tspan = $("tspan");
+ i && $(tspan, {dy: fontSize * leading, x: a.x});
tspan.appendChild(doc.createTextNode(texts[i]));
node.appendChild(tspan);
}
} else {
var texts = node.getElementsByTagName("tspan");
- for (var i = 0, ii = texts.length; i < ii; i++) {
- i && texts[i].setAttribute("dy", fontSize * leading);
- i && texts[i].setAttribute("x", a.x);
+ for (var i = 0, ii = texts[ln]; i < ii; i++) {
+ i && $(texts[i], {dy: fontSize * leading, x: a.x});
}
}
- node.setAttribute("y", a.y);
+ $(node, {y: a.y});
var bb = el.getBBox(),
dif = a.y - (bb.y + bb.height / 2);
- dif && node.setAttribute("y", a.y + dif);
+ dif && $(node, {y: a.y + dif});
};
var Element = function (node, svg) {
var X = 0,
Y = 0;
this[0] = node;
this.node = node;
+ node.raphael = this;
this.paper = svg;
this.attrs = this.attrs || {};
this.transformations = []; // rotate, translate, scale
sy: 1
};
};
- Element.prototype.rotate = function (deg, cx, cy) {
+ Element[proto].rotate = function (deg, cx, cy) {
if (deg == null) {
if (this._.rt.cx) {
return [this._.rt.deg, this._.rt.cx, this._.rt.cy].join(" ");
}
var bbox = this.getBBox();
deg = (deg + "").split(separator);
- if (deg.length - 1) {
- cx = parseFloat(deg[1]);
- cy = parseFloat(deg[2]);
+ if (deg[ln] - 1) {
+ cx = win[pf](deg[1]);
+ cy = win[pf](deg[2]);
}
- deg = parseFloat(deg[0]);
+ deg = win[pf](deg[0]);
if (cx != null) {
this._.rt.deg = deg;
} else {
cx = cx == null ? bbox.x + bbox.width / 2 : cx;
cy = cy == null ? bbox.y + bbox.height / 2 : cy;
if (this._.rt.deg) {
- this.transformations[0] = "rotate(".concat(this._.rt.deg, " ", cx, " ", cy, ")");
+ this.transformations[0] = R.format("rotate({0} {1} {2})", this._.rt.deg, cx, cy);
+ this.clip && $(this.clip, {transform: R.format("rotate({0} {1} {2})", -this._.rt.deg, cx, cy)});
} else {
this.transformations[0] = "";
+ this.clip && $(this.clip, {transform: ""});
}
- this.node.setAttribute("transform", this.transformations.join(" "));
+ $(this.node, {transform: this.transformations.join(" ")});
return this;
};
- Element.prototype.hide = function () {
+ Element[proto].hide = function () {
this.node.style.display = "none";
return this;
};
- Element.prototype.show = function () {
+ Element[proto].show = function () {
this.node.style.display = "block";
return this;
};
- Element.prototype.remove = function () {
+ Element[proto].remove = function () {
this.node.parentNode.removeChild(this.node);
};
- Element.prototype.getBBox = function () {
+ Element[proto].getBBox = function () {
if (this.type == "path") {
return pathDimensions(this.attrs.path);
}
hide && this.hide();
return bbox;
};
- Element.prototype.attr = function () {
- if (arguments.length == 1 && typeof arguments[0] == "string") {
+ Element[proto].attr = function () {
+ if (arguments[ln] == 1 && R.is(arguments[0], "string")) {
if (arguments[0] == "translation") {
return this.translate();
}
}
return this.attrs[arguments[0]];
}
- if (arguments.length == 1 && R.isArray(arguments[0])) {
+ if (arguments[ln] == 1 && R.is(arguments[0], "array")) {
var values = {};
- for (var j in arguments[0]) {
+ for (var j in arguments[0]) if (arguments[0].hasOwnProperty(j)) {
values[arguments[0][j]] = this.attrs[arguments[0][j]];
}
return values;
}
- if (arguments.length == 2) {
+ if (arguments[ln] == 2) {
var params = {};
params[arguments[0]] = arguments[1];
setFillAndStroke(this, params);
- } else if (arguments.length == 1 && typeof arguments[0] == "object") {
+ } else if (arguments[ln] == 1 && R.is(arguments[0], "object")) {
setFillAndStroke(this, arguments[0]);
}
return this;
};
- Element.prototype.toFront = function () {
+ Element[proto].toFront = function () {
this.node.parentNode.appendChild(this.node);
return this;
};
- Element.prototype.toBack = function () {
+ Element[proto].toBack = function () {
if (this.node.parentNode.firstChild != this.node) {
this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild);
}
return this;
};
- Element.prototype.insertAfter = function (element) {
+ Element[proto].insertAfter = function (element) {
if (element.node.nextSibling) {
element.node.parentNode.insertBefore(this.node, element.node.nextSibling);
} else {
}
return this;
};
- Element.prototype.insertBefore = function (element) {
+ Element[proto].insertBefore = function (element) {
var node = element.node;
node.parentNode.insertBefore(this.node, node);
return this;
};
+
var theCircle = function (svg, x, y, r) {
x = round(x);
y = round(y);
- var el = doc.createElementNS(svg.svgns, "circle");
- el.setAttribute("cx", x);
- el.setAttribute("cy", y);
- el.setAttribute("r", r);
- el.setAttribute("fill", "none");
- el.setAttribute("stroke", "#000");
- if (svg.canvas) {
- svg.canvas.appendChild(el);
- }
+ var el = $("circle");
+ svg.canvas && svg.canvas.appendChild(el);
var res = new Element(el, svg);
- res.attrs = res.attrs || {};
- res.attrs.cx = x;
- res.attrs.cy = y;
- res.attrs.r = r;
- res.attrs.stroke = "#000";
+ res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"};
res.type = "circle";
+ $(el, res.attrs);
return res;
};
var theRect = function (svg, x, y, w, h, r) {
x = round(x);
y = round(y);
- var el = doc.createElementNS(svg.svgns, "rect");
- el.setAttribute("x", x);
- el.setAttribute("y", y);
- el.setAttribute("width", w);
- el.setAttribute("height", h);
- if (r) {
- el.setAttribute("rx", r);
- el.setAttribute("ry", r);
- }
- el.setAttribute("fill", "none");
- el.setAttribute("stroke", "#000");
- if (svg.canvas) {
- svg.canvas.appendChild(el);
- }
+ var el = $("rect");
+ svg.canvas && svg.canvas.appendChild(el);
var res = new Element(el, svg);
- res.attrs = res.attrs || {};
- res.attrs.x = x;
- res.attrs.y = y;
- res.attrs.width = w;
- res.attrs.height = h;
- res.attrs.stroke = "#000";
- if (r) {
- res.attrs.rx = res.attrs.ry = r;
- }
+ res.attrs = {x: x, y: y, width: w, height: h, r: r || 0, rx: r || 0, ry: r || 0, fill: "none", stroke: "#000"};
res.type = "rect";
+ $(el, res.attrs);
return res;
};
var theEllipse = function (svg, x, y, rx, ry) {
x = round(x);
y = round(y);
- var el = doc.createElementNS(svg.svgns, "ellipse");
- el.setAttribute("cx", x);
- el.setAttribute("cy", y);
- el.setAttribute("rx", rx);
- el.setAttribute("ry", ry);
- el.setAttribute("fill", "none");
- el.setAttribute("stroke", "#000");
- if (svg.canvas) {
- svg.canvas.appendChild(el);
- }
+ var el = $("ellipse");
+ svg.canvas && svg.canvas.appendChild(el);
var res = new Element(el, svg);
- res.attrs = res.attrs || {};
- res.attrs.cx = x;
- res.attrs.cy = y;
- res.attrs.rx = rx;
- res.attrs.ry = ry;
- res.attrs.stroke = "#000";
+ res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"};
res.type = "ellipse";
+ $(el, res.attrs);
return res;
};
var theImage = function (svg, src, x, y, w, h) {
- var el = doc.createElementNS(svg.svgns, "image");
- el.setAttribute("x", x);
- el.setAttribute("y", y);
- el.setAttribute("width", w);
- el.setAttribute("height", h);
- el.setAttribute("preserveAspectRatio", "none");
+ var el = $("image");
+ $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"});
el.setAttributeNS(svg.xlink, "href", src);
- if (svg.canvas) {
- svg.canvas.appendChild(el);
- }
+ svg.canvas && svg.canvas.appendChild(el);
var res = new Element(el, svg);
- res.attrs = res.attrs || {};
- res.attrs.src = src;
- res.attrs.x = x;
- res.attrs.y = y;
- res.attrs.width = w;
- res.attrs.height = h;
+ res.attrs = {x: x, y: y, width: w, height: h, src: src};
res.type = "image";
return res;
};
var theText = function (svg, x, y, text) {
- var el = doc.createElementNS(svg.svgns, "text");
- el.setAttribute("x", x);
- el.setAttribute("y", y);
- el.setAttribute("text-anchor", "middle");
- if (svg.canvas) {
- svg.canvas.appendChild(el);
- }
+ var el = $("text");
+ $(el, {x: x, y: y, "text-anchor": "middle"});
+ svg.canvas && svg.canvas.appendChild(el);
var res = new Element(el, svg);
- res.attrs = res.attrs || {};
- res.attrs.text = text;
- res.attrs.x = x;
- res.attrs.y = y;
+ res.attrs = {x: x, y: y, "text-anchor": "middle", text: text, font: availableAttrs.font, stroke: "none", fill: "#000"};
res.type = "text";
- setFillAndStroke(res, {font: availableAttrs.font, stroke: "none", fill: "#000", text: text});
+ setFillAndStroke(res, res.attrs);
return res;
};
var setSize = function (width, height) {
return this;
};
var create = function () {
- var con = getContainer.apply(null, arguments),
- container = con.container,
+ var con = getContainer[ap](null, arguments),
+ container = con && con.container,
x = con.x,
y = con.y,
width = con.width,
if (!container) {
throw new Error("SVG container not found.");
}
- paper.canvas = doc.createElementNS(paper.svgns, "svg");
- paper.canvas.setAttribute("width", width || 512);
+ paper.canvas = $("svg");
+ var cnvs = paper.canvas,
+ stl = cnvs.style;
+ cnvs.setAttribute("width", width || 512);
paper.width = width || 512;
- paper.canvas.setAttribute("height", height || 342);
+ cnvs.setAttribute("height", height || 342);
paper.height = height || 342;
if (container == 1) {
- doc.body.appendChild(paper.canvas);
- paper.canvas.style.position = "absolute";
- paper.canvas.style.left = x + "px";
- paper.canvas.style.top = y + "px";
+ doc.body.appendChild(cnvs);
+ stl.position = "absolute";
+ stl.left = x + "px";
+ stl.top = y + "px";
} else {
if (container.firstChild) {
- container.insertBefore(paper.canvas, container.firstChild);
+ container.insertBefore(cnvs, container.firstChild);
} else {
- container.appendChild(paper.canvas);
+ container.appendChild(cnvs);
}
}
container = {
- canvas: paper.canvas,
+ canvas: cnvs,
clear: function () {
while (this.canvas.firstChild) {
this.canvas.removeChild(this.canvas.firstChild);
}
- this.defs = doc.createElementNS(paper.svgns, "defs");
+ this.desc = $("desc");
+ this.defs = $("defs");
+ this.desc.appendChild(doc.createTextNode("Created with Rapha\u00ebl"));
+ this.canvas.appendChild(this.desc);
this.canvas.appendChild(this.defs);
}
};
- for (var prop in paper) {
+ for (var prop in paper) if (paper.hasOwnProperty(prop)) {
if (prop != "create") {
container[prop] = paper[prop];
}
paper.remove = function () {
this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas);
};
- paper.svgns = "http://www.w3.org/2000/svg";
- paper.xlink = "http://www.w3.org/1999/xlink";
- paper.safari = function () {
- if ({"Apple Computer, Inc.": 1, "Google Inc.": 1}[navigator.vendor]) {
- var rect = this.rect(-this.width, -this.height, this.width * 3, this.height * 3).attr({stroke: "none"});
- setTimeout(function () {rect.remove();});
- }
- };
}
// VML
if (R.vml) {
var path2vml = function (path) {
var pa = path2curve(path);
- for (var i = 0, ii = pa.length; i < ii; i++) {
+ for (var i = 0, ii = pa[ln]; i < ii; i++) {
pa[i][0] = (pa[i][0] + "").toLowerCase();
pa[i][0] == "z" && (pa[i][0] = "x");
- for (var j = 1, jj = pa[i].length; j < jj; j++) {
- pa[i][j] = Math.round(pa[i][j]);
+ for (var j = 1, jj = pa[i][ln]; j < jj; j++) {
+ pa[i][j] = ~~(pa[i][j] + .5);
}
}
return (pa + "");
p.isAbsolute = true;
p.type = "path";
p.path = [];
- // p.last = {x: 0, y: 0, bx: 0, by: 0, isAbsolute: true};
p.Path = "";
if (pathString) {
p.attrs.path = R.parsePathString(pathString);
s = node.style,
xy,
res = o;
- for (var par in params) {
+ for (var par in params) if (params.hasOwnProperty(par)) {
a[par] = params[par];
}
params.href && (node.href = params.href);
xy = (params.scale + "").split(separator);
o.scale(+xy[0] || 1, +xy[1] || +xy[0] || 1, +xy[2] || null, +xy[3] || null);
}
+ if ("clip-rect" in params) {
+ var rect = (params["clip-rect"] + "").split(separator);
+ if (rect[ln] == 4) {
+ rect[2] = +rect[2] + (+rect[0]);
+ rect[3] = +rect[3] + (+rect[1]);
+ var div = node.clipRect || doc.createElement("div"),
+ dstyle = div.style,
+ group = node.parentNode;
+ dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect);
+ if (!node.clipRect) {
+ dstyle.position = "absolute";
+ dstyle.top = 0;
+ dstyle.left = 0;
+ dstyle.width = o.paper.width + "px";
+ dstyle.height = o.paper.height + "px";
+ group.parentNode.insertBefore(div, group);
+ div.appendChild(group);
+ node.clipRect = div;
+ }
+ }
+ if (!params["clip-rect"]) {
+ node.clipRect && (node.clipRect.style.clip = "");
+ }
+ }
if (o.type == "image" && params.src) {
node.src = params.src;
}
fill.color = R.getRGB(params.fill).hex;
fill.src = "";
fill.type = "solid";
+ if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || (params.fill + "").charAt(0) != "r") && addGradientFill(res, params.fill)) {
+ a.fill = "none";
+ a.gradient = params.fill;
+ }
}
}
newfill && node.appendChild(fill);
params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter");
stroke.miterlimit = params["stroke-miterlimit"] || 8;
params["stroke-linecap"] && (stroke.endcap = {butt: "flat", square: "square", round: "round"}[params["stroke-linecap"]] || "miter");
- params["stroke-width"] && (stroke.weight = (parseFloat(params["stroke-width"]) || 1) * 12 / 16);
+ params["stroke-width"] && (stroke.weight = (win[pf](params["stroke-width"]) || 1) * 12 / 16);
if (params["stroke-dasharray"]) {
var dasharray = {
"-": "shortdash",
newstroke && node.appendChild(stroke);
}
if (res.type == "text") {
- var s = paper.span.style;
+ var s = res.paper.span.style;
a.font && (s.font = a.font);
a["font-family"] && (s.fontFamily = a["font-family"]);
a["font-size"] && (s.fontSize = a["font-size"]);
a["font-weight"] && (s.fontWeight = a["font-weight"]);
a["font-style"] && (s.fontStyle = a["font-style"]);
- paper.span.innerHTML = res.node.string.replace(/</g, "<").replace(/&/g, "&").replace(/\n/g, "<br>");
- res.W = a.w = paper.span.offsetWidth;
- res.H = a.h = paper.span.offsetHeight;
+ res.node.string && (res.paper.span.innerHTML = res.node.string.replace(/</g, "<").replace(/&/g, "&").replace(/\n/g, "<br>"));
+ res.W = a.w = res.paper.span.offsetWidth;
+ res.H = a.h = res.paper.span.offsetHeight;
res.X = a.x;
- res.Y = a.y + Math.round(res.H / 2);
+ res.Y = a.y + ~~(res.H / 2 + .5);
// text-anchor emulation
switch (a["text-anchor"]) {
case "start":
res.node.style["v-text-align"] = "left";
- res.bbx = Math.round(res.W / 2);
+ res.bbx = ~~(res.W / 2 + .5);
break;
case "end":
res.node.style["v-text-align"] = "right";
- res.bbx = -Math.round(res.W / 2);
+ res.bbx = -~~(res.W / 2 + .5);
break;
default:
res.node.style["v-text-align"] = "center";
}
}
};
- var getAngle = function (a, b, c, d) {
- var angle = Math.round(Math.atan((parseFloat(c) - parseFloat(a)) / (parseFloat(d) - parseFloat(b))) * 57.29) || 0;
- if (!angle && parseFloat(a) < parseFloat(b)) {
- angle = 180;
- }
- angle -= 180;
- if (angle < 0) {
- angle += 360;
- }
- return angle;
- };
var addGradientFill = function (o, gradient) {
- gradient = toGradient(gradient);
o.attrs = o.attrs || {};
var attrs = o.attrs,
- fill = o.node.getElementsByTagName("fill");
+ fill = o.node.getElementsByTagName("fill"),
+ type = "linear",
+ fxfy = ".5 .5";
o.attrs.gradient = gradient;
- o = o.shape || o.node;
- if (fill.length) {
- fill = fill[0];
- } else {
- fill = createNode("fill");
+ gradient = (gradient + "").replace(/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, function (all, fx, fy) {
+ type = "radial";
+ if (fx && fy) {
+ fx = win[pf](fx);
+ fy = win[pf](fy);
+ if (Math.pow(fx - .5, 2) + Math.pow(fy - .5, 2) > .25) {
+ fy = Math.sqrt(.25 - Math.pow(fx - .5, 2)) + .5;
+ }
+ fxfy = fx + " " + fy;
+ }
+ return "";
+ });
+ gradient = gradient.split(/\s*\-\s*/);
+ if (type == "linear") {
+ var angle = gradient.shift();
+ angle = -win[pf](angle);
+ if (isNaN(angle)) {
+ return null;
+ }
}
- if (gradient.dots.length) {
+ var dots = parseDots(gradient);
+ if (!dots) {
+ return null;
+ }
+ o = o.shape || o.node;
+ fill = fill[0] || createNode("fill");
+ if (dots[ln]) {
fill.on = true;
fill.method = "none";
- fill.type = ((gradient.type + "").toLowerCase() == "radial") ? "gradientTitle" : "gradient";
- if (typeof gradient.dots[0].color != "undefined") {
- fill.color = R.getRGB(gradient.dots[0].color).hex;
- }
- if (typeof gradient.dots[gradient.dots.length - 1].color != "undefined") {
- fill.color2 = R.getRGB(gradient.dots[gradient.dots.length - 1].color).hex;
- }
+ fill.type = (type == "radial") ? "gradientradial" : "gradient";
+ fill.color = dots[0].color;
+ fill.color2 = dots[dots[ln] - 1].color;
var clrs = [];
- for (var i = 0, ii = gradient.dots.length; i < ii; i++) {
- if (gradient.dots[i].offset) {
- clrs.push(gradient.dots[i].offset + " " + R.getRGB(gradient.dots[i].color).hex);
- }
- };
- var fillOpacity = typeof gradient.dots[gradient.dots.length - 1].opacity == "undefined" ? (typeof attrs.opacity == "undefined" ? 1 : attrs.opacity) : gradient.dots[gradient.dots.length - 1].opacity;
- if (clrs.length) {
+ for (var i = 0, ii = dots[ln]; i < ii; i++) {
+ dots[i].offset && clrs.push(dots[i].offset + " " + dots[i].color);
+ }
+ if (clrs[ln] && fill.colors) {
fill.colors.value = clrs.join(",");
- fillOpacity = typeof attrs.opacity == "undefined" ? 1 : attrs.opacity;
} else {
- fill.colors && (fill.colors.value = "0% " + fill.color);
+ fill.colors.value = "0% " + fill.color;
}
- fill.opacity = fillOpacity;
- if (typeof gradient.angle != "undefined") {
- fill.angle = (-gradient.angle + 270) % 360;
- } else if (gradient.vector) {
- fill.angle = getAngle.apply(null, gradient.vector);
- }
- if ((gradient.type + "").toLowerCase() == "radial") {
+ if (type == "radial") {
fill.focus = "100%";
- fill.focusposition = "0.5 0.5";
+ fill.focussize = fxfy;
+ fill.focusposition = fxfy;
+ } else {
+ fill.angle = (270 - angle) % 360;
}
}
+ return 1;
};
var Element = function (node, group, vml) {
var Rotation = 0,
Scale = 1;
this[0] = node;
this.node = node;
+ node.raphael = this;
this.X = 0;
this.Y = 0;
this.attrs = {};
sy: 1
};
};
- Element.prototype.rotate = function (deg, cx, cy) {
+ Element[proto].rotate = function (deg, cx, cy) {
if (deg == null) {
if (this._.rt.cx) {
return [this._.rt.deg, this._.rt.cx, this._.rt.cy].join(" ");
return this._.rt.deg;
}
deg = (deg + "").split(separator);
- if (deg.length - 1) {
- cx = parseFloat(deg[1]);
- cy = parseFloat(deg[2]);
+ if (deg[ln] - 1) {
+ cx = win[pf](deg[1]);
+ cy = win[pf](deg[2]);
}
- deg = parseFloat(deg[0]);
+ deg = win[pf](deg[0]);
if (cx != null) {
this._.rt.deg = deg;
} else {
this._.rt.deg += deg;
}
- (cy == null) && (cx = null);
+ cy == null && (cx = null);
this._.rt.cx = cx;
this._.rt.cy = cy;
this.setBox(this.attrs, cx, cy);
// var fill = (this.shape || this.node).getElementsByTagName("fill");
// fill = fill[0] || {};
// var b = ((360 - this._.rt.deg) - 270) % 360;
- // typeof fill.angle != "undefined" && (fill.angle = b);
+ // !R.is(fill.angle, "undefined") && (fill.angle = b);
return this;
};
- Element.prototype.setBox = function (params, cx, cy) {
+ Element[proto].setBox = function (params, cx, cy) {
var gs = this.Group.style,
os = (this.shape && this.shape.style) || this.node.style;
params = params || {};
- for (var i in params) {
+ for (var i in params) if (params.hasOwnProperty(i)) {
this.attrs[i] = params[i];
}
cx = cx || this._.rt.cx;
h = attr.height || 0;
break;
case "text":
- this.textpath.v = ["m", Math.round(attr.x), ", ", Math.round(attr.y - 2), "l", Math.round(attr.x) + 1, ", ", Math.round(attr.y - 2)].join("");
- x = attr.x - Math.round(this.W / 2);
+ this.textpath.v = ["m", ~~(attr.x + .5), ", ", ~~(attr.y - 2 + .5), "l", ~~(attr.x + .5) + 1, ", ", ~~(attr.y - 2 + .5)].join("");
+ x = attr.x - ~~(this.W / 2 + .5);
y = attr.y - this.H / 2;
w = this.W;
h = this.H;
}
}
};
- Element.prototype.hide = function () {
+ Element[proto].hide = function () {
this.Group.style.display = "none";
return this;
};
- Element.prototype.show = function () {
+ Element[proto].show = function () {
this.Group.style.display = "block";
return this;
};
- Element.prototype.getBBox = function () {
+ Element[proto].getBBox = function () {
if (this.type == "path") {
return pathDimensions(this.attrs.path);
}
height: this.H
};
};
- Element.prototype.remove = function () {
+ Element[proto].remove = function () {
this[0].parentNode.removeChild(this[0]);
this.Group.parentNode.removeChild(this.Group);
this.shape && this.shape.parentNode.removeChild(this.shape);
};
- Element.prototype.attr = function () {
- if (arguments.length == 1 && typeof arguments[0] == "string") {
+ Element[proto].attr = function () {
+ if (arguments[ln] == 1 && R.is(arguments[0], "string")) {
if (arguments[0] == "translation") {
return this.translate();
}
}
return this.attrs[arguments[0]];
}
- if (this.attrs && arguments.length == 1 && R.isArray(arguments[0])) {
+ if (this.attrs && arguments[ln] == 1 && R.is(arguments[0], "array")) {
var values = {};
- for (var i = 0, ii = arguments[0].length; i < ii; i++) {
+ for (var i = 0, ii = arguments[0][ln]; i < ii; i++) {
values[arguments[0][i]] = this.attrs[arguments[0][i]];
};
return values;
}
var params;
- if (arguments.length == 2) {
+ if (arguments[ln] == 2) {
params = {};
params[arguments[0]] = arguments[1];
}
- if (arguments.length == 1 && typeof arguments[0] == "object") {
+ if (arguments[ln] == 1 && R.is(arguments[0], "object")) {
params = arguments[0];
}
if (params) {
- if (params.gradient) {
+ if (params.gradient && (this.type in {circle: 1, ellipse: 1} || (params.gradient + "").charAt(0) != "r")) {
addGradientFill(this, params.gradient);
}
if (params.text && this.type == "text") {
}
return this;
};
- Element.prototype.toFront = function () {
+ Element[proto].toFront = function () {
this.Group.parentNode.appendChild(this.Group);
return this;
};
- Element.prototype.toBack = function () {
+ Element[proto].toBack = function () {
if (this.Group.parentNode.firstChild != this.Group) {
this.Group.parentNode.insertBefore(this.Group, this.Group.parentNode.firstChild);
}
return this;
};
- Element.prototype.insertAfter = function (element) {
+ Element[proto].insertAfter = function (element) {
if (element.Group.nextSibling) {
element.Group.parentNode.insertBefore(this.Group, element.Group.nextSibling);
} else {
}
return this;
};
- Element.prototype.insertBefore = function (element) {
+ Element[proto].insertBefore = function (element) {
element.Group.parentNode.insertBefore(this.Group, element.Group);
return this;
};
+
var theCircle = function (vml, x, y, r) {
var g = createNode("group"),
- gl = g.style,
o = createNode("oval"),
ol = o.style;
- gl.position = "absolute";
- gl.left = 0;
- gl.top = 0;
- gl.width = vml.width + "px";
- gl.height = vml.height + "px";
+ g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
g.coordsize = vml.coordsize;
g.coordorigin = vml.coordorigin;
g.appendChild(o);
};
var theRect = function (vml, x, y, w, h, r) {
var g = createNode("group"),
- gl = g.style,
o = createNode(r ? "roundrect" : "rect"),
arcsize = (+r || 0) / (Math.min(w, h));
o.arcsize = arcsize;
- gl.position = "absolute";
- gl.left = 0;
- gl.top = 0;
- gl.width = vml.width + "px";
- gl.height = vml.height + "px";
+ g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
g.coordsize = vml.coordsize;
g.coordorigin = vml.coordorigin;
g.appendChild(o);
};
var theEllipse = function (vml, x, y, rx, ry) {
var g = createNode("group"),
- gl = g.style,
o = createNode("oval"),
ol = o.style;
- gl.position = "absolute";
- gl.left = 0;
- gl.top = 0;
- gl.width = vml.width + "px";
- gl.height = vml.height + "px";
+ g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
g.coordsize = vml.coordsize;
g.coordorigin = vml.coordorigin;
g.appendChild(o);
};
var theImage = function (vml, src, x, y, w, h) {
var g = createNode("group"),
- gl = g.style,
o = createNode("image"),
ol = o.style;
- gl.position = "absolute";
- gl.left = 0;
- gl.top = 0;
- gl.width = vml.width + "px";
- gl.height = vml.height + "px";
+ g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
g.coordsize = vml.coordsize;
g.coordorigin = vml.coordorigin;
o.src = src;
};
var theText = function (vml, x, y, text) {
var g = createNode("group"),
- gs = g.style,
el = createNode("shape"),
ol = el.style,
path = createNode("path"),
ps = path.style,
o = createNode("textpath");
- gs.position = "absolute";
- gs.left = 0;
- gs.top = 0;
- gs.width = vml.width + "px";
- gs.height = vml.height + "px";
+ g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px";
g.coordsize = vml.coordsize;
g.coordorigin = vml.coordorigin;
- path.v = ["m", Math.round(x), ", ", Math.round(y), "l", Math.round(x) + 1, ", ", Math.round(y)].join("");
+ path.v = R.format("m{0},{1}l{2},{1}", ~~(x + .5), ~~(y + .5), ~~(x + .5) + 1);
path.textpathok = true;
ol.width = vml.width;
ol.height = vml.height;
- gs.position = "absolute";
- gs.left = 0;
- gs.top = 0;
- gs.width = vml.width;
- gs.height = vml.height;
o.string = text;
o.on = true;
el.appendChild(o);
};
var setSize = function (width, height) {
var cs = this.canvas.style;
- this.width = width || this.width;
- this.height = height || this.height;
+ this.width = win[pf](width || this.width);
+ this.height = win[pf](height || this.height);
cs.width = this.width + "px";
cs.height = this.height + "px";
cs.clip = "rect(0 " + this.width + "px " + this.height + "px 0)";
- this.canvas.coordsize = this.width + " " + this.height;
+ this.coordsize = this.width + " " + this.height;
return this;
};
doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)");
};
}
var create = function () {
- var con = getContainer.apply(null, arguments),
+ var con = getContainer[ap](null, arguments),
container = con.container,
height = con.height,
s,
if (!container) {
throw new Error("VML container not found.");
}
- var c = paper.canvas = doc.createElement("div"),
+ var res = {},
+ c = res.canvas = doc.createElement("div"),
cs = c.style;
- width = parseFloat(width) || "512px";
- height = parseFloat(height) || "342px";
- paper.width = width;
- paper.height = height;
- paper.coordsize = width + " " + height;
- paper.coordorigin = "0 0";
- paper.span = doc.createElement("span");
- s = paper.span.style;
- c.appendChild(paper.span);
- s.position = "absolute";
- s.left = "-99999px";
- s.top = "-99999px";
- s.padding = 0;
- s.margin = 0;
- s.lineHeight = 1;
- s.display = "inline";
- cs.width = width + "px";
- cs.height = height + "px";
- cs.position = "absolute";
- cs.clip = "rect(0 " + width + "px " + height + "px 0)";
+ width = win[pf](width) || 512;
+ height = win[pf](height) || 342;
+ res.width = width;
+ res.height = height;
+ res.coordsize = width + " " + height;
+ res.coordorigin = "0 0";
+ res.span = doc.createElement("span");
+ res.span.style.cssText = "position:absolute;left:-9999px;top:-9999px;padding:0;margin:0;line-height:1;display:inline;";
+ c.appendChild(res.span);
+ cs.cssText = R.format("width:{0}px;height:{1}px;position:absolute;clip:rect(0 {0}px {1}px 0)", width, height);
if (container == 1) {
doc.body.appendChild(c);
cs.left = x + "px";
container.appendChild(c);
}
}
- for (var prop in paper) {
- container[prop] = paper[prop];
+ for (var prop in paper) if (paper.hasOwnProperty(prop)) {
+ res[prop] = paper[prop];
}
- plugins.call(container, container, R.fn);
- container.clear = function () {
+ plugins.call(res, res, R.fn);
+ res.clear = function () {
while (c.firstChild) {
c.removeChild(c.firstChild);
}
};
- container.raphael = R;
- return container;
+ res.raphael = R;
+ return res;
};
paper.remove = function () {
this.canvas.parentNode.removeChild(this.canvas);
};
- paper.safari = function () {};
}
// rest
+ // Safari or Chrome (WebKit) rendering bug workaround method
+ if ({"Apple Computer, Inc.": 1, "Google Inc.": 1}[navigator.vendor]) {
+ paper.safari = function () {
+ var rect = this.rect(-99, -99, this.width + 99, this.height + 99);
+ setTimeout(function () {rect.remove();});
+ };
+ } else {
+ paper.safari = function () {};
+ }
// Events
var addEvent = (function () {
};
}
})();
- for (var i = events.length; i--;) {
+ for (var i = events[ln]; i--;) {
(function (eventName) {
- Element.prototype[eventName] = function (fn) {
- if (typeof fn == "function") {
+ Element[proto][eventName] = function (fn) {
+ if (R.is(fn, "function")) {
this.events = this.events || {};
this.events[eventName] = this.events[eventName] || {};
this.events[eventName][fn] = this.events[eventName][fn] || [];
}
return this;
};
- Element.prototype["un" + eventName] = function (fn) {
+ Element[proto]["un" + eventName] = function (fn) {
this.events &&
this.events[eventName] &&
this.events[eventName][fn] &&
- this.events[eventName][fn].length &&
+ this.events[eventName][fn][ln] &&
this.events[eventName][fn].shift()() &&
- !this.events[eventName][fn].length &&
+ !this.events[eventName][fn][ln] &&
delete this.events[eventName][fn];
};
})(events[i]);
}
paper.circle = function (x, y, r) {
- return theCircle(this, x, y, r);
+ return theCircle(this, x || 0, y || 0, r || 0);
};
paper.rect = function (x, y, w, h, r) {
- return theRect(this, x, y, w, h, r);
+ return theRect(this, x || 0, y || 0, w || 0, h || 0, r || 0);
};
paper.ellipse = function (x, y, rx, ry) {
- return theEllipse(this, x, y, rx, ry);
+ return theEllipse(this, x || 0, y || 0, rx || 0, ry || 0);
};
paper.path = function (pathString) {
- var args = R.isArray(arguments[1]) ? [0].concat(arguments[1]) : arguments;
- pathString && typeof pathString == "string" && args.length - 1 && (pathString = pathString.replace(/\{(\d+)\}/g, function (str, i) {
- return args[++i] || 0;
- }));
- return thePath(pathString, this);
+ pathString && !R.is(pathString, "string") && !R.is(pathString[0], "array") && (pathString += "");
+ return thePath(R.format[ap](R, arguments), this);
};
paper.image = function (src, x, y, w, h) {
- return theImage(this, src, x, y, w, h);
+ return theImage(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0);
};
paper.text = function (x, y, text) {
- return theText(this, x, y, text);
+ return theText(this, x || 0, y || 0, text || "");
};
paper.set = function (itemsArray) {
- arguments.length > 1 && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length));
+ arguments[ln] > 1 && (itemsArray = Array[proto].splice.call(arguments, 0, arguments[ln]));
return new Set(itemsArray);
};
paper.setSize = setSize;
- Element.prototype.stop = function () {
+ Element[proto].stop = function () {
clearTimeout(this.animation_in_progress);
return this;
};
- Element.prototype.scale = function (x, y, cx, cy) {
+ Element[proto].scale = function (x, y, cx, cy) {
if (x == null && y == null) {
- return {x: this._.sx, y: this._.sy, toString: function () { return +this.x.toFixed(3) + " " + (+this.y.toFixed(3)); }};
+ return {x: this._.sx, y: this._.sy, toString: function () { return this.x + " " + this.y; }};
}
y = y || x;
!+y && (y = x);
dcy,
a = this.attrs;
if (x != 0) {
- var bb = this.type == "path" ? pathDimensions(a.path) : this.getBBox(),
+ var bb = this.getBBox(),
rcx = bb.x + bb.width / 2,
rcy = bb.y + bb.height / 2,
kx = x / this._.sx,
ky = y / this._.sy;
cx = (+cx || cx == 0) ? cx : rcx;
cy = (+cy || cy == 0) ? cy : rcy;
- var dirx = Math.round(x / Math.abs(x)),
- diry = Math.round(y / Math.abs(y)),
+ var dirx = ~~(x / Math.abs(x)),
+ diry = ~~(y / Math.abs(y)),
s = this.node.style,
ncx = cx + (rcx - cx) * dirx * kx,
ncy = cy + (rcy - cy) * diry * ky;
case "image":
var neww = a.width * dirx * kx,
newh = a.height * diry * ky,
+ newr = a.r * Math.min(kx, ky),
newx = ncx - neww / 2,
newy = ncy - newh / 2;
this.attr({
width: neww,
height: newh,
x: newx,
- y: newy
+ y: newy,
+ r: newr
});
break;
case "circle":
this.attr({
rx: a.rx * kx,
ry: a.ry * ky,
- r: a.r * kx,
+ r: a.r * Math.min(kx, ky),
cx: ncx,
cy: ncy
});
case "path":
var path = pathToRelative(a.path),
skip = true;
- for (var i = 0, ii = path.length; i < ii; i++) {
+ for (var i = 0, ii = path[ln]; i < ii; i++) {
var p = path[i];
if (p[0].toUpperCase() == "M" && skip) {
continue;
skip = false;
}
if (R.svg && p[0].toUpperCase() == "A") {
- p[path[i].length - 2] *= kx;
- p[path[i].length - 1] *= ky;
+ p[path[i][ln] - 2] *= kx;
+ p[path[i][ln] - 1] *= ky;
p[1] *= kx;
p[2] *= ky;
p[5] = +(dirx + diry ? !!+p[5] : !+p[5]);
} else {
- for (var j = 1, jj = p.length; j < jj; j++) {
+ for (var j = 1, jj = p[ln]; j < jj; j++) {
p[j] *= (j % 2) ? kx : ky;
}
}
var dim2 = pathDimensions(path),
dx = ncx - dim2.x - dim2.width / 2,
dy = ncy - dim2.y - dim2.height / 2;
- path = pathToRelative(path);
path[0][1] += dx;
path[0][2] += dy;
-
- this.attr({path: path.join(" ")});
+
+ this.attr({path: path});
break;
}
if (this.type in {text: 1, image:1} && (dirx != 1 || diry != 1)) {
}
};
- Element.prototype.animate = function (params, ms, easing, callback) {
+ Element[proto].animate = function (params, ms, easing, callback) {
clearTimeout(this.animation_in_progress);
- if (typeof easing == "function" || !easing) {
+ if (R.is(easing, "function") || !easing) {
callback = easing || null;
}
var from = {},
to = {},
diff = {},
t = {x: 0, y: 0};
- for (var attr in params) {
+ for (var attr in params) if (params.hasOwnProperty(attr)) {
if (attr in availableAnimAttrs) {
from[attr] = this.attr(attr);
- (typeof from[attr] == "undefined") && (from[attr] = availableAttrs[attr]);
+ (from[attr] == null) && (from[attr] = availableAttrs[attr]);
to[attr] = params[attr];
switch (availableAnimAttrs[attr]) {
case "number":
from[attr] = pathes[0];
to[attr] = pathes[1];
diff[attr] = [];
- for (var i = 0, ii = from[attr].length; i < ii; i++) {
+ for (var i = 0, ii = from[attr][ln]; i < ii; i++) {
diff[attr][i] = [0];
- for (var j = 1, jj = from[attr][i].length; j < jj; j++) {
+ for (var j = 1, jj = from[attr][i][ln]; j < jj; j++) {
diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms;
}
}
params[attr] = values;
from[attr] = (from[attr] + "").split(separator);
diff[attr] = [(values[0] - from[attr][0]) / ms, (values[1] - from[attr][1]) / ms, 0, 0];
+ break;
+ case "clip-rect":
+ from[attr] = (from[attr] + "").split(separator);
+ diff[attr] = [];
+ var i = 4;
+ while (i--) {
+ diff[attr][i] = (values[i] - from[attr][i]) / ms;
+ }
+ break;
}
to[attr] = values;
}
var start = +new Date,
prev = 0,
upto255 = function (color) {
- return +color > 255 ? 255 : +color;
+ return color > 255 ? 255 : color;
},
that = this;
(function tick() {
now;
if (time < ms) {
var pos = R.easing_formulas[easing] ? R.easing_formulas[easing](time / ms) : time / ms;
- for (var attr in from) {
+ for (var attr in from) if (from.hasOwnProperty(attr)) {
switch (availableAnimAttrs[attr]) {
case "number":
now = +from[attr] + pos * ms * diff[attr];
break;
case "colour":
now = "rgb(" + [
- upto255(Math.round(from[attr].r + pos * ms * diff[attr].r)),
- upto255(Math.round(from[attr].g + pos * ms * diff[attr].g)),
- upto255(Math.round(from[attr].b + pos * ms * diff[attr].b))
+ upto255(~~(from[attr].r + pos * ms * diff[attr].r + .5)),
+ upto255(~~(from[attr].g + pos * ms * diff[attr].g + .5)),
+ upto255(~~(from[attr].b + pos * ms * diff[attr].b + .5))
].join(",") + ")";
break;
case "path":
now = [];
- for (var i = 0, ii = from[attr].length; i < ii; i++) {
+ for (var i = 0, ii = from[attr][ln]; i < ii; i++) {
now[i] = [from[attr][i][0]];
- for (var j = 1, jj = from[attr][i].length; j < jj; j++) {
+ for (var j = 1, jj = from[attr][i][ln]; j < jj; j++) {
now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j];
}
now[i] = now[i].join(" ");
break;
case "scale":
now = [+from[attr][0] + pos * ms * diff[attr][0], +from[attr][1] + pos * ms * diff[attr][1], (2 in params[attr] ? params[attr][2] : ""), (3 in params[attr] ? params[attr][3] : "")].join(" ");
+ break;
+ case "clip-rect":
+ now = [];
+ var i = 4;
+ while (i--) {
+ now[i] = +from[attr][i] + pos * ms * diff[attr][i];
+ }
+ break;
}
break;
}
that.attr(params);
clearTimeout(that.animation_in_progress);
R.svg && paper.safari();
- (typeof callback == "function") && callback.call(that);
+ (R.is(callback, "function")) && callback.call(that);
}
prev = time;
})();
return this;
};
- Element.prototype.translate = function (x, y) {
+ Element[proto].translate = function (x, y) {
if (x == null) {
return {x: this._.tx, y: this._.ty};
}
}
return this;
};
+ Element[proto].toString = function () {
+ return "Rapha\u00ebl\u2019s object";
+ };
+
// Set
var Set = function (items) {
this.items = [];
- this.length = 0;
+ this[ln] = 0;
if (items) {
- for (var i = 0, ii = items.length; i < ii; i++) {
+ for (var i = 0, ii = items[ln]; i < ii; i++) {
if (items[i] && (items[i].constructor == Element || items[i].constructor == Set)) {
- this[this.items.length] = this.items[this.items.length] = items[i];
- this.length++;
+ this[this.items[ln]] = this.items[this.items[ln]] = items[i];
+ this[ln]++;
}
}
}
};
- Set.prototype.push = function () {
+ Set[proto].push = function () {
var item,
len;
- for (var i = 0, ii = arguments.length; i < ii; i++) {
+ for (var i = 0, ii = arguments[ln]; i < ii; i++) {
item = arguments[i];
if (item && (item.constructor == Element || item.constructor == Set)) {
- len = this.items.length;
+ len = this.items[ln];
this[len] = this.items[len] = item;
- this.length++;
+ this[ln]++;
}
}
return this;
};
- for (var method in Element.prototype) {
- Set.prototype[method] = (function (methodname) {
+ Set[proto].pop = function () {
+ delete this[this[ln]--];
+ return this.items.pop();
+ };
+ for (var method in Element[proto]) if (Element[proto].hasOwnProperty(method)) {
+ Set[proto][method] = (function (methodname) {
return function () {
- for (var i = 0, ii = this.items.length; i < ii; i++) {
- this.items[i][methodname].apply(this.items[i], arguments);
+ for (var i = 0, ii = this.items[ln]; i < ii; i++) {
+ this.items[i][methodname][ap](this.items[i], arguments);
}
return this;
};
})(method);
}
- Set.prototype.attr = function (name, value) {
- if (name && R.isArray(name) && typeof name[0] == "object") {
- for (var j = 0, jj = name.length; j < jj; j++) {
+ Set[proto].attr = function (name, value) {
+ if (name && R.is(name, "array") && R.is(name[0], "object")) {
+ for (var j = 0, jj = name[ln]; j < jj; j++) {
this.items[j].attr(name[j]);
}
} else {
- for (var i = 0, ii = this.items.length; i < ii; i++) {
- this.items[i].attr.apply(this.items[i], arguments);
+ for (var i = 0, ii = this.items[ln]; i < ii; i++) {
+ this.items[i].attr[ap](this.items[i], arguments);
}
}
return this;
};
-
- Set.prototype.getBBox = function () {
+ Set[proto].animate = function (params, ms, easing, callback) {
+ if (R.is(easing, "function") || !easing) {
+ callback = easing || null;
+ }
+ var len = this.items[ln],
+ i = len,
+ set = this;
+ if (callback) {
+ var collector = function () {
+ !--len && callback.call(set);
+ };
+ while (i--) {
+ this.items[i].animate(params, ms, easing || collector, collector);
+ }
+ } else {
+ while (i--) {
+ this.items[i].animate(params, ms, easing);
+ }
+ }
+ return this;
+ };
+
+ Set[proto].getBBox = function () {
var x = [],
y = [],
w = [],
h = [];
- for (var i = this.items.length; i--;) {
+ for (var i = this.items[ln]; i--;) {
var box = this.items[i].getBBox();
x.push(box.x);
y.push(box.y);
w.push(box.x + box.width);
h.push(box.y + box.height);
}
- x = Math.min.apply(Math, x);
- y = Math.min.apply(Math, y);
+ x = Math.min[ap](Math, x);
+ y = Math.min[ap](Math, y);
return {
x: x,
y: y,
- width: Math.max.apply(Math, w) - x,
- height: Math.max.apply(Math, h) - y
+ width: Math.max[ap](Math, w) - x,
+ height: Math.max[ap](Math, h) - y
};
};
glyphs: {}
},
family = font.face["font-family"];
- for (var prop in font.face) {
+ for (var prop in font.face) if (font.face.hasOwnProperty(prop)) {
fontcopy.face[prop] = font.face[prop];
}
if (this.fonts[family]) {
this.fonts[family] = [fontcopy];
}
if (!font.svg) {
- fontcopy.face["units-per-em"] = parseInt(font.face["units-per-em"], 10);
- for (var glyph in font.glyphs) {
+ fontcopy.face["units-per-em"] = win[pi](font.face["units-per-em"], 10);
+ for (var glyph in font.glyphs) if (font.glyphs.hasOwnProperty(glyph)) {
var path = font.glyphs[glyph];
fontcopy.glyphs[glyph] = {
w: path.w,
}) + "z"
};
if (path.k) {
- for (var k in path.k) {
+ for (var k in path.k) if (path.hasOwnProperty(k)) {
fontcopy.glyphs[glyph].k[k] = path.k[k];
}
}
var font = R.fonts[family];
if (!font) {
var name = new RegExp("(^|\\s)" + family.replace(/[^\w\d\s+!~.:_-]/g, "") + "(\\s|$)", "i");
- for (var fontName in R.fonts) {
+ for (var fontName in R.fonts) if (R.fonts.hasOwnProperty(fontName)) {
if (name.test(fontName)) {
font = R.fonts[fontName];
break;
}
var thefont;
if (font) {
- for (var i = 0, ii = font.length; i < ii; i++) {
+ for (var i = 0, ii = font[ln]; i < ii; i++) {
thefont = font[i];
if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) {
break;
shift = 0,
path = "",
scale;
- typeof font == "string" && (font = this.getFont(font));
+ R.is(font, "string") && (font = this.getFont(font));
if (font) {
scale = (size || 16) / font.face["units-per-em"];
- for (var i = 0, ii = letters.length; i < ii; i++) {
+ for (var i = 0, ii = letters[ln]; i < ii; i++) {
var prev = i && font.glyphs[letters[i - 1]] || {},
curr = font.glyphs[letters[i]];
shift += i ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) : 0;
return out;
};
+ R.format = function (token) {
+ var args = R.is(arguments[1], "array") ? [0].concat(arguments[1]) : arguments;
+ token && R.is(token, "string") && args[ln] - 1 && (token = token.replace(/\{(\d+)\}/g, function (str, i) {
+ return args[++i] == null ? "" : args[i];
+ }));
+ return token || "";
+ };
R.ninja = function () {
- var r = window.Raphael;
+ var r = window.Raphael, u;
if (oldRaphael.was) {
window.Raphael = oldRaphael.is;
} else {
try {
delete window.Raphael;
} catch (e) {
- window.Raphael = void(0);
+ window.Raphael = u;
}
}
return r;
};
- R.el = Element.prototype;
+ R.el = Element[proto];
return R;
})();
\ No newline at end of file