editor_plugin_src.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /**
  2. * editor_plugin_src.js
  3. *
  4. * Copyright 2009, Moxiecode Systems AB
  5. * Released under LGPL License.
  6. *
  7. * License: http://tinymce.moxiecode.com/license
  8. * Contributing: http://tinymce.moxiecode.com/contributing
  9. */
  10. (function() {
  11. var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode;
  12. tinymce.create('tinymce.plugins.TabFocusPlugin', {
  13. init : function(ed, url) {
  14. function tabCancel(ed, e) {
  15. if (e.keyCode === 9)
  16. return Event.cancel(e);
  17. }
  18. function tabHandler(ed, e) {
  19. var x, i, f, el, v;
  20. function find(d) {
  21. el = DOM.select(':input:enabled,*[tabindex]:not(iframe)');
  22. function canSelectRecursive(e) {
  23. return e.nodeName==="BODY" || (e.type != 'hidden' &&
  24. !(e.style.display == "none") &&
  25. !(e.style.visibility == "hidden") && canSelectRecursive(e.parentNode));
  26. }
  27. function canSelectInOldIe(el) {
  28. return el.attributes["tabIndex"].specified || el.nodeName == "INPUT" || el.nodeName == "TEXTAREA";
  29. }
  30. function isOldIe() {
  31. return tinymce.isIE6 || tinymce.isIE7;
  32. }
  33. function canSelect(el) {
  34. return ((!isOldIe() || canSelectInOldIe(el))) && el.getAttribute("tabindex") != '-1' && canSelectRecursive(el);
  35. }
  36. each(el, function(e, i) {
  37. if (e.id == ed.id) {
  38. x = i;
  39. return false;
  40. }
  41. });
  42. if (d > 0) {
  43. for (i = x + 1; i < el.length; i++) {
  44. if (canSelect(el[i]))
  45. return el[i];
  46. }
  47. } else {
  48. for (i = x - 1; i >= 0; i--) {
  49. if (canSelect(el[i]))
  50. return el[i];
  51. }
  52. }
  53. return null;
  54. }
  55. if (e.keyCode === 9) {
  56. v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next')));
  57. if (v.length == 1) {
  58. v[1] = v[0];
  59. v[0] = ':prev';
  60. }
  61. // Find element to focus
  62. if (e.shiftKey) {
  63. if (v[0] == ':prev')
  64. el = find(-1);
  65. else
  66. el = DOM.get(v[0]);
  67. } else {
  68. if (v[1] == ':next')
  69. el = find(1);
  70. else
  71. el = DOM.get(v[1]);
  72. }
  73. if (el) {
  74. if (el.id && (ed = tinymce.get(el.id || el.name)))
  75. ed.focus();
  76. else
  77. window.setTimeout(function() {
  78. if (!tinymce.isWebKit)
  79. window.focus();
  80. el.focus();
  81. }, 10);
  82. return Event.cancel(e);
  83. }
  84. }
  85. }
  86. ed.onKeyUp.add(tabCancel);
  87. if (tinymce.isGecko) {
  88. ed.onKeyPress.add(tabHandler);
  89. ed.onKeyDown.add(tabCancel);
  90. } else
  91. ed.onKeyDown.add(tabHandler);
  92. },
  93. getInfo : function() {
  94. return {
  95. longname : 'Tabfocus',
  96. author : 'Moxiecode Systems AB',
  97. authorurl : 'http://tinymce.moxiecode.com',
  98. infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus',
  99. version : tinymce.majorVersion + "." + tinymce.minorVersion
  100. };
  101. }
  102. });
  103. // Register plugin
  104. tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin);
  105. })();