initial import
[roojs1] / Roo / lib / AnimMgr.js
1
2 /*
3  * Portions of this file are based on pieces of Yahoo User Interface Library
4  * Copyright (c) 2007, Yahoo! Inc. All rights reserved.
5  * YUI licensed under the BSD License:
6  * http://developer.yahoo.net/yui/license.txt
7  * <script type="text/javascript">
8  *
9  */
10
11 Roo.lib.AnimMgr = new function() {
12
13         var thread = null;
14
15
16         var queue = [];
17
18
19         var tweenCount = 0;
20
21
22         this.fps = 1000;
23
24
25         this.delay = 1;
26
27
28         this.registerElement = function(tween) {
29             queue[queue.length] = tween;
30             tweenCount += 1;
31             tween._onStart.fire();
32             this.start();
33         };
34
35
36         this.unRegister = function(tween, index) {
37             tween._onComplete.fire();
38             index = index || getIndex(tween);
39             if (index != -1) {
40                 queue.splice(index, 1);
41             }
42
43             tweenCount -= 1;
44             if (tweenCount <= 0) {
45                 this.stop();
46             }
47         };
48
49
50         this.start = function() {
51             if (thread === null) {
52                 thread = setInterval(this.run, this.delay);
53             }
54         };
55
56
57         this.stop = function(tween) {
58             if (!tween) {
59                 clearInterval(thread);
60
61                 for (var i = 0, len = queue.length; i < len; ++i) {
62                     if (queue[0].isAnimated()) {
63                         this.unRegister(queue[0], 0);
64                     }
65                 }
66
67                 queue = [];
68                 thread = null;
69                 tweenCount = 0;
70             }
71             else {
72                 this.unRegister(tween);
73             }
74         };
75
76
77         this.run = function() {
78             for (var i = 0, len = queue.length; i < len; ++i) {
79                 var tween = queue[i];
80                 if (!tween || !tween.isAnimated()) {
81                     continue;
82                 }
83
84                 if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null)
85                 {
86                     tween.currentFrame += 1;
87
88                     if (tween.useSeconds) {
89                         correctFrame(tween);
90                     }
91                     tween._onTween.fire();
92                 }
93                 else {
94                     Roo.lib.AnimMgr.stop(tween, i);
95                 }
96             }
97         };
98
99         var getIndex = function(anim) {
100             for (var i = 0, len = queue.length; i < len; ++i) {
101                 if (queue[i] == anim) {
102                     return i;
103                 }
104             }
105             return -1;
106         };
107
108
109         var correctFrame = function(tween) {
110             var frames = tween.totalFrames;
111             var frame = tween.currentFrame;
112             var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames);
113             var elapsed = (new Date() - tween.getStartTime());
114             var tweak = 0;
115
116             if (elapsed < tween.duration * 1000) {
117                 tweak = Math.round((elapsed / expected - 1) * tween.currentFrame);
118             } else {
119                 tweak = frames - (frame + 1);
120             }
121             if (tweak > 0 && isFinite(tweak)) {
122                 if (tween.currentFrame + tweak >= frames) {
123                     tweak = frames - (frame + 1);
124                 }
125
126                 tween.currentFrame += tweak;
127             }
128         };
129     };