in zookeeper-contrib/zookeeper-contrib-loggraph/src/main/resources/webapp/org/apache/zookeeper/graph/resources/raphael.js [2981:3077]
Element[proto].animate = function (params, ms, easing, callback) {
if (R.is(easing, "function") || !easing) {
callback = easing || null;
}
var from = {},
to = {},
diff = {};
for (var attr in params) if (params[has](attr)) {
if (availableAnimAttrs[has](attr)) {
from[attr] = this.attr(attr);
(from[attr] == null) && (from[attr] = availableAttrs[attr]);
to[attr] = params[attr];
switch (availableAnimAttrs[attr]) {
case "along":
var len = getTotalLength(params[attr]),
point = getPointAtLength(params[attr], len * !!params.back),
bb = this.getBBox();
diff[attr] = len / ms;
diff.tx = bb.x;
diff.ty = bb.y;
diff.sx = point.x;
diff.sy = point.y;
to.rot = params.rot;
to.back = params.back;
to.len = len;
params.rot && (diff.r = toFloat(this.rotate()) || 0);
break;
case "number":
diff[attr] = (to[attr] - from[attr]) / ms;
break;
case "colour":
from[attr] = R.getRGB(from[attr]);
var toColour = R.getRGB(to[attr]);
diff[attr] = {
r: (toColour.r - from[attr].r) / ms,
g: (toColour.g - from[attr].g) / ms,
b: (toColour.b - from[attr].b) / ms
};
break;
case "path":
var paths = path2curve(from[attr], to[attr]);
from[attr] = paths[0];
var toPath = paths[1];
diff[attr] = [];
for (var i = 0, ii = from[attr][length]; i < ii; i++) {
diff[attr][i] = [0];
for (var j = 1, jj = from[attr][i][length]; j < jj; j++) {
diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms;
}
}
break;
case "csv":
var values = (params[attr] + E)[split](separator),
from2 = (from[attr] + E)[split](separator);
switch (attr) {
case "translation":
from[attr] = [0, 0];
diff[attr] = [values[0] / ms, values[1] / ms];
break;
case "rotation":
from[attr] = (from2[1] == values[1] && from2[2] == values[2]) ? from2 : [0, values[1], values[2]];
diff[attr] = [(values[0] - from[attr][0]) / ms, 0, 0];
break;
case "scale":
params[attr] = values;
from[attr] = (from[attr] + E)[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] + E)[split](separator);
diff[attr] = [];
i = 4;
while (i--) {
diff[attr][i] = (values[i] - from[attr][i]) / ms;
}
break;
}
to[attr] = values;
}
}
}
this.stop();
this.in_animation = 1;
animationElements[this.id] = {
start: params.start || +new Date,
ms: ms,
easing: easing,
from: from,
diff: diff,
to: to,
el: this,
callback: callback,
t: {x: 0, y: 0}
};
++animationElements[length] == 1 && animation();
return this;
};