plugin.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /**
  2. * plugin.js
  3. *
  4. * Copyright, Moxiecode Systems AB
  5. * Released under LGPL License.
  6. *
  7. * License: http://www.tinymce.com/license
  8. * Contributing: http://www.tinymce.com/contributing
  9. */
  10. /*global tinymce:true */
  11. tinymce.PluginManager.add('tabfocus', function(editor) {
  12. var DOM = tinymce.DOM, each = tinymce.each, explode = tinymce.explode;
  13. function tabCancel(e) {
  14. if (e.keyCode === 9 && !e.ctrlKey && !e.altKey && !e.metaKey) {
  15. e.preventDefault();
  16. }
  17. }
  18. function tabHandler(e) {
  19. var x, el, v, i;
  20. if (e.keyCode !== 9 || e.ctrlKey || e.altKey || e.metaKey) {
  21. return;
  22. }
  23. function find(direction) {
  24. el = DOM.select(':input:enabled,*[tabindex]:not(iframe)');
  25. function canSelectRecursive(e) {
  26. return e.nodeName === "BODY" || (e.type != 'hidden' &&
  27. e.style.display != "none" &&
  28. e.style.visibility != "hidden" && canSelectRecursive(e.parentNode));
  29. }
  30. function canSelectInOldIe(el) {
  31. return el.tabIndex || el.nodeName == "INPUT" || el.nodeName == "TEXTAREA";
  32. }
  33. function canSelect(el) {
  34. return ((!canSelectInOldIe(el))) && el.getAttribute("tabindex") != '-1' && canSelectRecursive(el);
  35. }
  36. each(el, function(e, i) {
  37. if (e.id == editor.id) {
  38. x = i;
  39. return false;
  40. }
  41. });
  42. if (direction > 0) {
  43. for (i = x + 1; i < el.length; i++) {
  44. if (canSelect(el[i])) {
  45. return el[i];
  46. }
  47. }
  48. } else {
  49. for (i = x - 1; i >= 0; i--) {
  50. if (canSelect(el[i])) {
  51. return el[i];
  52. }
  53. }
  54. }
  55. return null;
  56. }
  57. v = explode(editor.getParam('tab_focus', editor.getParam('tabfocus_elements', ':prev,:next')));
  58. if (v.length == 1) {
  59. v[1] = v[0];
  60. v[0] = ':prev';
  61. }
  62. // Find element to focus
  63. if (e.shiftKey) {
  64. if (v[0] == ':prev') {
  65. el = find(-1);
  66. } else {
  67. el = DOM.get(v[0]);
  68. }
  69. } else {
  70. if (v[1] == ':next') {
  71. el = find(1);
  72. } else {
  73. el = DOM.get(v[1]);
  74. }
  75. }
  76. if (el) {
  77. var focusEditor = tinymce.get(el.id || el.name);
  78. if (el.id && focusEditor) {
  79. focusEditor.focus();
  80. } else {
  81. window.setTimeout(function() {
  82. if (!tinymce.Env.webkit) {
  83. window.focus();
  84. }
  85. el.focus();
  86. }, 10);
  87. }
  88. e.preventDefault();
  89. }
  90. }
  91. editor.on('init', function() {
  92. if (editor.inline) {
  93. // Remove default tabIndex in inline mode
  94. tinymce.DOM.setAttrib(editor.getBody(), 'tabIndex', null);
  95. }
  96. });
  97. editor.on('keyup', tabCancel);
  98. if (tinymce.Env.gecko) {
  99. editor.on('keypress keydown', tabHandler);
  100. } else {
  101. editor.on('keydown', tabHandler);
  102. }
  103. });