initial import
[roojs1] / Roo / util / TaskRunner.js
1 /*
2  * Based on:
3  * Ext JS Library 1.1.1
4  * Copyright(c) 2006-2007, Ext JS, LLC.
5  *
6  * Originally Released Under LGPL - original licence link has changed is not relivant.
7  *
8  * Fork - LGPL
9  * <script type="text/javascript">
10  */
11  
12  
13 Roo.util.TaskRunner = function(interval){
14     interval = interval || 10;
15     var tasks = [], removeQueue = [];
16     var id = 0;
17     var running = false;
18
19     var stopThread = function(){
20         running = false;
21         clearInterval(id);
22         id = 0;
23     };
24
25     var startThread = function(){
26         if(!running){
27             running = true;
28             id = setInterval(runTasks, interval);
29         }
30     };
31
32     var removeTask = function(task){
33         removeQueue.push(task);
34         if(task.onStop){
35             task.onStop();
36         }
37     };
38
39     var runTasks = function(){
40         if(removeQueue.length > 0){
41             for(var i = 0, len = removeQueue.length; i < len; i++){
42                 tasks.remove(removeQueue[i]);
43             }
44             removeQueue = [];
45             if(tasks.length < 1){
46                 stopThread();
47                 return;
48             }
49         }
50         var now = new Date().getTime();
51         for(var i = 0, len = tasks.length; i < len; ++i){
52             var t = tasks[i];
53             var itime = now - t.taskRunTime;
54             if(t.interval <= itime){
55                 var rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);
56                 t.taskRunTime = now;
57                 if(rt === false || t.taskRunCount === t.repeat){
58                     removeTask(t);
59                     return;
60                 }
61             }
62             if(t.duration && t.duration <= (now - t.taskStartTime)){
63                 removeTask(t);
64             }
65         }
66     };
67
68     /**
69      * Queues a new task.
70      * @param {Object} task
71      */
72     this.start = function(task){
73         tasks.push(task);
74         task.taskStartTime = new Date().getTime();
75         task.taskRunTime = 0;
76         task.taskRunCount = 0;
77         startThread();
78         return task;
79     };
80
81     this.stop = function(task){
82         removeTask(task);
83         return task;
84     };
85
86     this.stopAll = function(){
87         stopThread();
88         for(var i = 0, len = tasks.length; i < len; i++){
89             if(tasks[i].onStop){
90                 tasks[i].onStop();
91             }
92         }
93         tasks = [];
94         removeQueue = [];
95     };
96 };
97
98 Roo.TaskMgr = new Roo.util.TaskRunner();