demo.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. Demo = function() {
  2. var output = document.getElementById('output'),
  3. demo = document.getElementById('demo'),
  4. panic = document.getElementById('panic'),
  5. warn = document.getElementById('warn'),
  6. calm = document.getElementById('calm'),
  7. clear = document.getElementById('clear'),
  8. count = 0;
  9. var log = function(msg, separate) {
  10. count = count + (separate ? 1 : 0);
  11. output.value = count + ": " + msg + "\n" + (separate ? "\n" : "") + output.value;
  12. demo.className = fsm.current;
  13. panic.disabled = fsm.cannot('panic');
  14. warn.disabled = fsm.cannot('warn');
  15. calm.disabled = fsm.cannot('calm');
  16. clear.disabled = fsm.cannot('clear');
  17. };
  18. var fsm = StateMachine.create({
  19. events: [
  20. { name: 'start', from: 'none', to: 'green' },
  21. { name: 'warn', from: 'green', to: 'yellow' },
  22. { name: 'panic', from: 'green', to: 'red' },
  23. { name: 'panic', from: 'yellow', to: 'red' },
  24. { name: 'calm', from: 'red', to: 'yellow' },
  25. { name: 'clear', from: 'red', to: 'green' },
  26. { name: 'clear', from: 'yellow', to: 'green' },
  27. ],
  28. callbacks: {
  29. onbeforestart: function(event, from, to) { log("STARTING UP"); },
  30. onstart: function(event, from, to) { log("READY"); },
  31. onbeforewarn: function(event, from, to) { log("START EVENT: warn!", true); },
  32. onbeforepanic: function(event, from, to) { log("START EVENT: panic!", true); },
  33. onbeforecalm: function(event, from, to) { log("START EVENT: calm!", true); },
  34. onbeforeclear: function(event, from, to) { log("START EVENT: clear!", true); },
  35. onwarn: function(event, from, to) { log("FINISH EVENT: warn!"); },
  36. onpanic: function(event, from, to) { log("FINISH EVENT: panic!"); },
  37. oncalm: function(event, from, to) { log("FINISH EVENT: calm!"); },
  38. onclear: function(event, from, to) { log("FINISH EVENT: clear!"); },
  39. onleavegreen: function(event, from, to) { log("LEAVE STATE: green"); },
  40. onleaveyellow: function(event, from, to) { log("LEAVE STATE: yellow"); },
  41. onleavered: function(event, from, to) { log("LEAVE STATE: red"); async(to); return StateMachine.ASYNC; },
  42. ongreen: function(event, from, to) { log("ENTER STATE: green"); },
  43. onyellow: function(event, from, to) { log("ENTER STATE: yellow"); },
  44. onred: function(event, from, to) { log("ENTER STATE: red"); },
  45. onchangestate: function(event, from, to) { log("CHANGED STATE: " + from + " to " + to); }
  46. }
  47. });
  48. var async = function(to) {
  49. pending(to, 3);
  50. setTimeout(function() {
  51. pending(to, 2);
  52. setTimeout(function() {
  53. pending(to, 1);
  54. setTimeout(function() {
  55. fsm.transition(); // trigger deferred state transition
  56. }, 1000);
  57. }, 1000);
  58. }, 1000);
  59. };
  60. var pending = function(to, n) { log("PENDING STATE: " + to + " in ..." + n); };
  61. fsm.start();
  62. return fsm;
  63. }();