}
});
+ Chart.animationService = {
+ animations: [],
+ addAnimation: function(chart, animationObject) {
+ for (var index = 0; index < this.animations.length; ++ index){
+ if (this.animations[index].chart === chart){
+ // replacing an in progress animation
+ this.animations[index].lastTimeRun = null;
+ this.animations[index].animationObject = animationObject;
+ return;
+ }
+ }
+
+ this.animations.push({
+ chart: chart,
+ animationObject: animationObject,
+ lastTimeRun: null
+ });
+
+ // If there are no animations queued, manually kickstart a digest, for lack of a better word
+ if(!this.animations.length){
+ helpers.requestAnimFrame(this.startDigest);
+ }
+ },
+ startDigest: function() {
+
+ for (var i = 0; i < this.animations.length; i++) {
+
+ var currentAnimation = this.animations[i];
+
+ if (currentAnimation.animationObject.currentStep === null){
+ currentAnimation.animationObject.currentStep = 0;
+ } else {
+ currentAnimation.animationObject.currentStep++;
+ }
+
+ currentAnimation.animationObject.render(currentAnimation.animationObject);
+
+ if (currentAnimation.animationObject.currentStep == currentAnimation.animationObject.numSteps){
+ // executed the last frame. Remove the animation.
+ this.animations.splice(i, 1);
+ // Keep the index in place to offset the splice
+ i--;
+ }
+ }
+
+ // Do we have more stuff to animate?
+ if (this.animations.length > 0){
+ requestAnimationFrame(this.startDigest);
+ }
+ }
+ };
+
// Attach global event to resize each chart instance when the browser resizes
helpers.addEvent(window, "resize", (function(){
// Basic debounce of resize function so it doesn't hurt performance when resizing browser.