{"pages":{"start":[{"if":{"condition":"!window.setTimeout \/* MPEM::setTimeout v1.7 *\/","commands":[{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-1"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-2"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-3"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-4"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-5"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-6"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-7"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-8"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-9"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-10"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-11"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-12"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-13"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-14"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-15"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-16"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-17"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-18"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-19"}},{"audio.play":{"locator":"file:1-minute-of-silence.mp3","volume":0,"background":true,"id":"timer-20"}},{"eval":{"script":"\/\/ Init native timer emulation\r\n\/*\r\nMPED--author::fapnip\r\nMPED--description::\r\nPolyfill to allow use of setTimeout and setInterval in Eos\r\n\r\nSee:\r\nhttps:\/\/milovana.com\/forum\/viewtopic.php?f=2&t=24006&p=301725\r\n::--description\r\n*\/\r\n\/******************************\r\n *  CHANGE LOG\r\n * ****************************\r\n * \r\n * v1.7\r\n *   - Simplify timer functions\r\n * \r\n * v1.6\r\n *   - Allow re-use of sound end event listener\r\n * \r\n * v1.5\r\n *   - More tweaks to deal with interruptions\r\n * \r\n * v1.4\r\n *   - Further adjustments for JS interpreter interruptions\r\n * \r\n * v1.3\r\n *   - Try to reduce errors in offet counters introduced\r\n *      by pauses between JS interpreter steps\r\n * \r\n * v1.1 - v1.2 \r\n *   - Try to improve performance\r\n * \r\n * v1.0\r\n *   - Initial release\r\n * \r\n *\/\r\n(function() {\r\n  \/\/ var debug = false\r\n  var timers = {}\r\n  var sounds = {}\r\n  var counter = 1\r\n  var timerError = 268 \/\/ Always seems to be around 268ms of error (issue with audio files?)\r\n  var maxTime = 60000 \/\/ Sound is 1 min long, so that's the max\r\n  var i = 1\r\n  var timerPool = []\r\n  \r\n  function listener() {\r\n    var id = this.__id\r\n    var timer = timers[id]\r\n    \/\/ this.stop()\r\n    this.__id = null \/\/ disable id\r\n    if (!timer) return\r\n    var opt = timer._opt\r\n    timerPool.unshift(timer) \/\/ Put timer back in queue\r\n    if ((opt.start + (opt.time * opt.iter)) - Date.now() > 20) {\r\n      \/\/ Not done.  We'll need to run again\r\n      doTimer(opt)\r\n      return\r\n    }\r\n    if (opt.interval) {\r\n      \/\/ Run again\r\n      opt.iter++\r\n      doTimer(opt)\r\n    } else {\r\n      delete timers[id]\r\n    }\r\n    try {\r\n      opt.fn()\r\n    } catch (e) {\r\n      console.error('Error in timer fn', e.toString())\r\n    }\r\n  }\r\n\r\n  var tSound = Sound.get('timer-' + i)\r\n  while (tSound) {\r\n    tSound.stop()\r\n    tSound.seek(maxTime-timerError)\r\n    tSound.play()\r\n    tSound.addEventListener('end', listener)\r\n    sounds[i] = tSound\r\n    var timer = {\r\n      sound: tSound,\r\n      index: i\r\n    }\r\n    timerPool.push(timer)\r\n    i++\r\n    tSound = Sound.get('timer-' + i)\r\n  }\r\n  var poolSize = timerPool.length\r\n\r\n  function doTimer(opt) {\r\n    var id = opt.id\r\n    var timer = timerPool.pop()\r\n    if (!timer) {\r\n      throw \"No timer sounds left in timer pool.  Add more if you need more than \" + poolSize + \" concurrent timers.\"\r\n    }\r\n    timer._opt = opt\r\n    var sound = timer.sound\r\n    sound.__id = id\r\n    timers[id] = timer\r\n    sound.seek(Math.max(1, timerError + (maxTime - Math.min(\r\n      (opt.start + (opt.time * opt.iter)) - Date.now(), \r\n      maxTime - 1000\r\n    ))) \/ 1000)\r\n    sound.play()\r\n    return id\r\n  }\r\n\r\n  function clearTimer(id) {\r\n    var timer = timers[id]\r\n    if (timer) {\r\n      delete timers[id]\r\n      var sound = timer.sound\r\n      sound.__id = null\r\n      sound.stop()\r\n      timerPool.unshift(timer)\r\n    }\r\n  }\r\n\r\n  window.setTimeout = function(fn, time) {\r\n    return doTimer({\r\n      id: counter++,\r\n      time: time || 0, \r\n      iter: 1,\r\n      fn: fn, \r\n      start: Date.now()\r\n      })\r\n  }\r\n\r\n  window.clearTimeout = function(id) {\r\n    return clearTimer(id)\r\n  }\r\n\r\n  window.setInterval = function(fn, time) {\r\n    return doTimer({\r\n      id: counter++,\r\n      time: time || 0, \r\n      iter: 1,\r\n      fn: fn, \r\n      interval: true,\r\n      start: Date.now()\r\n      })\r\n  }\r\n  \r\n  window.clearInterval = function(id) {\r\n    return clearTimer(id)\r\n  }\r\n})()\r\n"}}]}},{"say":{"label":"<p>Open your browser&#39;s JavaScript console to see the results.<\/p>","mode":"instant"}},{"choice":{"options":[{"label":"Okay, run the timers.","commands":[]}]}},{"eval":{"script":"\/\/ Example use\r\nvar startTime = Date.now()\r\nvar tcounter = 1\r\nfunction doTimer(t) {\r\n  var tid = setTimeout(function() {\r\n    console.log('Got test ' + tid, Date.now() - startTime)\r\n    if (tcounter <= 20) {\r\n      doTimer(tcounter)\r\n      tcounter ++\r\n    }\r\n  }, 500)\r\n  console.log('creating test ' + tid)\r\n}\r\ndoTimer(tcounter)\r\nvar intevalCounter = 1\r\nvar intervalId = setInterval(function() {\r\n  console.log('Doing 1 second interval #' + intevalCounter++, Date.now() - startTime)\r\n  }, 1000)\r\nsetTimeout(function(){\r\n  console.log('Stopping 1 second interval')\r\n  clearInterval(intervalId)\r\n}, 10000)"}}]},"files":{"1-minute-of-silence.mp3":{"id":1327668,"hash":"1092af7de1d0a7b87c79797d0adb47c8bdf1f91a","size":96246,"type":"audio\/mpeg"}},"modules":{"audio":{}},"init":"","galleries":{},"editor":{"recentImages":[]}}