keyhandler.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /* vim: set expandtab sw=4 ts=4 sts=4: */
  2. /**
  3. * Allows moving around inputs/select by Ctrl+arrows
  4. *
  5. * @param object event data
  6. */
  7. AJAX.registerTeardown('keyhandler.js', function() {
  8. $('#table_columns').die('keydown keyup');
  9. $('table.insertRowTable').die('keydown keyup');
  10. });
  11. AJAX.registerOnload('keyhandler.js', function() {
  12. $('#table_columns').live('keydown keyup', function(event) {
  13. onKeyDownArrowsHandler(event.originalEvent);
  14. });
  15. $('table.insertRowTable').live('keydown keyup', function(event) {
  16. onKeyDownArrowsHandler(event.originalEvent);
  17. });
  18. });
  19. function onKeyDownArrowsHandler(e)
  20. {
  21. e = e||window.event;
  22. var o = (e.srcElement||e.target);
  23. if (!o) {
  24. return;
  25. }
  26. if (o.tagName != "TEXTAREA" && o.tagName != "INPUT" && o.tagName != "SELECT") {
  27. return;
  28. }console.log(e);
  29. if (navigator.userAgent.toLowerCase().indexOf('applewebkit/') != -1) {
  30. if (e.ctrlKey || e.shiftKey || !e.altKey) {
  31. return;
  32. }
  33. } else {
  34. if (!e.ctrlKey || e.shiftKey || e.altKey) {
  35. return;
  36. }
  37. }
  38. if (!o.id) {
  39. return;
  40. }
  41. var pos = o.id.split("_");
  42. if (pos[0] != "field" || typeof pos[2] == "undefined") {
  43. return;
  44. }
  45. var x = pos[2], y = pos[1];
  46. var nO = null;
  47. switch(e.keyCode) {
  48. case 38:
  49. // up
  50. y--;
  51. break;
  52. case 40:
  53. // down
  54. y++;
  55. break;
  56. case 37:
  57. // left
  58. x--;
  59. break;
  60. case 39:
  61. // right
  62. x++;
  63. break;
  64. default:
  65. return;
  66. }
  67. var is_firefox = navigator.userAgent.toLowerCase().indexOf("firefox/") > -1;
  68. // restore selected index, bug #3799
  69. if (is_firefox && e.type == "keyup") {
  70. o.selectedIndex = window["selectedIndex_" + o.id];
  71. }
  72. var id = "field_" + y + "_" + x;
  73. nO = document.getElementById(id);
  74. if (! nO) {
  75. id = "field_" + y + "_" + x + "_0";
  76. nO = document.getElementById(id);
  77. }
  78. // skip non existent fields
  79. if (! nO) {
  80. return;
  81. }
  82. if (e.type == "keydown") {
  83. nO.focus();
  84. if (is_firefox) {
  85. window["selectedIndex_" + nO.id] = nO.selectedIndex;
  86. }
  87. }
  88. if (nO.tagName != 'SELECT') {
  89. nO.select();
  90. }
  91. e.returnValue = false;
  92. }