| // Mock setTimeout, clearTimeout | |
| // Contributed by Pivotal Computer Systems, www.pivotalsf.com | |
| var Clock = { | |
| timeoutsMade: 0, | |
| scheduledFunctions: {}, | |
| nowMillis: 0, | |
| reset: function() { | |
| this.scheduledFunctions = {}; | |
| this.nowMillis = 0; | |
| this.timeoutsMade = 0; | |
| }, | |
| tick: function(millis) { | |
| var oldMillis = this.nowMillis; | |
| var newMillis = oldMillis + millis; | |
| this.runFunctionsWithinRange(oldMillis, newMillis); | |
| this.nowMillis = newMillis; | |
| }, | |
| runFunctionsWithinRange: function(oldMillis, nowMillis) { | |
| var scheduledFunc; | |
| var funcsToRun = []; | |
| for (var timeoutKey in this.scheduledFunctions) { | |
| scheduledFunc = this.scheduledFunctions[timeoutKey]; | |
| if (scheduledFunc != undefined && | |
| scheduledFunc.runAtMillis >= oldMillis && | |
| scheduledFunc.runAtMillis <= nowMillis) { | |
| funcsToRun.push(scheduledFunc); | |
| this.scheduledFunctions[timeoutKey] = undefined; | |
| } | |
| } | |
| if (funcsToRun.length > 0) { | |
| funcsToRun.sort(function(a, b) { | |
| return a.runAtMillis - b.runAtMillis; | |
| }); | |
| for (var i = 0; i < funcsToRun.length; ++i) { | |
| try { | |
| this.nowMillis = funcsToRun[i].runAtMillis; | |
| funcsToRun[i].funcToCall(); | |
| if (funcsToRun[i].recurring) { | |
| Clock.scheduleFunction(funcsToRun[i].timeoutKey, | |
| funcsToRun[i].funcToCall, | |
| funcsToRun[i].millis, | |
| true); | |
| } | |
| } catch(e) { | |
| } | |
| } | |
| this.runFunctionsWithinRange(oldMillis, nowMillis); | |
| } | |
| }, | |
| scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { | |
| Clock.scheduledFunctions[timeoutKey] = { | |
| runAtMillis: Clock.nowMillis + millis, | |
| funcToCall: funcToCall, | |
| recurring: recurring, | |
| timeoutKey: timeoutKey, | |
| millis: millis | |
| }; | |
| } | |
| }; | |
| function setTimeout(funcToCall, millis) { | |
| Clock.timeoutsMade = Clock.timeoutsMade + 1; | |
| Clock.scheduleFunction(Clock.timeoutsMade, funcToCall, millis, false); | |
| return Clock.timeoutsMade; | |
| } | |
| function setInterval(funcToCall, millis) { | |
| Clock.timeoutsMade = Clock.timeoutsMade + 1; | |
| Clock.scheduleFunction(Clock.timeoutsMade, funcToCall, millis, true); | |
| return Clock.timeoutsMade; | |
| } | |
| function clearTimeout(timeoutKey) { | |
| Clock.scheduledFunctions[timeoutKey] = undefined; | |
| } | |
| function clearInterval(timeoutKey) { | |
| Clock.scheduledFunctions[timeoutKey] = undefined; | |
| } |