// 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; }