workflow.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. var GRID_PUBLIC_ID
  2. ,KNOWN_VERSION = 0
  3. ,GRID
  4. ,SELECTED = []
  5. ,CURRENTINPUT = null;
  6. function lazyGetPseudonyme(cb) {
  7. var pseudo = window["sessionStorage"].getItem("pseudonyme_" +GRID_PUBLIC_ID);
  8. if (pseudo) {
  9. cb(pseudo);
  10. } else {
  11. doGet("/api/register?grid=" +GRID_PUBLIC_ID, function(status, pseudo) {
  12. if (status && pseudo) {
  13. window["sessionStorage"].setItem("pseudonyme_" +GRID_PUBLIC_ID, pseudo);
  14. cb(pseudo);
  15. } else {
  16. cb(null);
  17. }
  18. });
  19. }
  20. }
  21. function keyPressHandler(cell, key) {
  22. cell.dom.classList.add(R.klass.cell.pending);
  23. doGet("/api/put?grid=" +GRID_PUBLIC_ID +"&key=" +key +"&x=" +cell.x +"&y=" +cell.y +"&me=" +GRID.playerSelf.idEncoded, function(status, resp) {
  24. cell.dom.classList.remove(R.klass.cell.pending);
  25. if (status === 403 && !cell.data.found) {
  26. cell.dom.classList.add(R.klass.cell.wrong);
  27. } else if (status === 204) {
  28. pollNow();
  29. } else {
  30. // out of sync ?
  31. pollNow();
  32. }
  33. });
  34. }
  35. function updateOnPollResult(resp) {
  36. if (resp["players"]) {
  37. GRID.updatePlayers(resp["players"]);
  38. if (!GRID.playerSelf)
  39. GRID.playerSelf = GRID.players[GRID.playerSelfId];
  40. onPlayersUpdated();
  41. }
  42. if (resp["grid"]) {
  43. GRID.update(resp["grid"]);
  44. onGridUpdated();
  45. }
  46. if (resp["gridTime"]) {
  47. GRID.gridTime = parseInt(resp["gridTime"], 10);
  48. stopPolling();
  49. }
  50. KNOWN_VERSION = Math.max(KNOWN_VERSION, resp["v"] || 0);
  51. }
  52. function unselect() {
  53. SELECTED.forEach(function (cell) {
  54. cell.dom.classList.remove(R.klass.cell.selected);
  55. });
  56. if (CURRENTINPUT) {
  57. CURRENTINPUT.dom.classList.remove(R.klass.cell.currentInput);
  58. CURRENTINPUT = null;
  59. }
  60. SELECTED = [];
  61. }
  62. function select(x, y) {
  63. var cell = UI_CELLS[x +y *GRID.width];
  64. SELECTED.push(cell);
  65. cell.dom.classList.add(R.klass.cell.selected);
  66. }
  67. document.addEventListener('DOMContentLoaded', function() {
  68. GRID_PUBLIC_ID = (document.location.hash.substr(1));
  69. if (GRID_PUBLIC_ID == "") {
  70. document.location.href = "/";
  71. return;
  72. }
  73. document.addEventListener('click', gridClickDelegate);
  74. document.addEventListener('keydown', function(e) {
  75. if (e.key.toUpperCase() === 'BACKSPACE') {
  76. e.preventDefault();
  77. }
  78. });
  79. document.addEventListener('keyup', function(e) {
  80. if (CURRENTINPUT && !CURRENTINPUT.data.found) {
  81. if (e.key.toUpperCase() == "DELETE") {
  82. CURRENTINPUT.dom.classList.remove(R.klass.cell.wrong);
  83. CURRENTINPUT.data.letter = null;
  84. onGridUpdated();
  85. } else if (e.key.toUpperCase() == "BACKSPACE") {
  86. CURRENTINPUT.dom.classList.remove(R.klass.cell.wrong);
  87. CURRENTINPUT.data.letter = null;
  88. uiSelectWritableCell(-1);
  89. onGridUpdated();
  90. } else if (e.key.length === 1) {
  91. var key = e.key.charAt(0).toUpperCase();
  92. if (key.match(/[A-Z]/)) {
  93. CURRENTINPUT.data.letter = key;
  94. keyPressHandler(CURRENTINPUT, key);
  95. onGridUpdated();
  96. uiSelectWritableCell(1);
  97. }
  98. }
  99. }
  100. });
  101. initPolling();
  102. });