Rev 1422 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
597 | daniel-mar | 1 | /** |
2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. |
||
3 | * Licensed under the LGPL or a commercial license. |
||
4 | * For LGPL see License.txt in the project root for license information. |
||
5 | * For commercial licenses see https://www.tiny.cloud/ |
||
6 | * |
||
1434 | daniel-mar | 7 | * Version: 5.10.9 (2023-11-15) |
597 | daniel-mar | 8 | */ |
9 | (function () { |
||
10 | 'use strict'; |
||
11 | |||
637 | daniel-mar | 12 | var global$6 = tinymce.util.Tools.resolve('tinymce.PluginManager'); |
597 | daniel-mar | 13 | |
637 | daniel-mar | 14 | var global$5 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); |
597 | daniel-mar | 15 | |
637 | daniel-mar | 16 | var global$4 = tinymce.util.Tools.resolve('tinymce.EditorManager'); |
597 | daniel-mar | 17 | |
18 | var global$3 = tinymce.util.Tools.resolve('tinymce.Env'); |
||
19 | |||
637 | daniel-mar | 20 | var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); |
597 | daniel-mar | 21 | |
637 | daniel-mar | 22 | var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); |
597 | daniel-mar | 23 | |
637 | daniel-mar | 24 | var global = tinymce.util.Tools.resolve('tinymce.util.VK'); |
597 | daniel-mar | 25 | |
26 | var getTabFocusElements = function (editor) { |
||
27 | return editor.getParam('tabfocus_elements', ':prev,:next'); |
||
28 | }; |
||
29 | var getTabFocus = function (editor) { |
||
30 | return editor.getParam('tab_focus', getTabFocusElements(editor)); |
||
31 | }; |
||
32 | |||
637 | daniel-mar | 33 | var DOM = global$5.DOM; |
597 | daniel-mar | 34 | var tabCancel = function (e) { |
637 | daniel-mar | 35 | if (e.keyCode === global.TAB && !e.ctrlKey && !e.altKey && !e.metaKey) { |
597 | daniel-mar | 36 | e.preventDefault(); |
37 | } |
||
38 | }; |
||
39 | var setup = function (editor) { |
||
40 | var tabHandler = function (e) { |
||
637 | daniel-mar | 41 | var x; |
42 | if (e.keyCode !== global.TAB || e.ctrlKey || e.altKey || e.metaKey || e.isDefaultPrevented()) { |
||
597 | daniel-mar | 43 | return; |
44 | } |
||
45 | var find = function (direction) { |
||
46 | var el = DOM.select(':input:enabled,*[tabindex]:not(iframe)'); |
||
47 | var canSelectRecursive = function (e) { |
||
637 | daniel-mar | 48 | var castElem = e; |
49 | return e.nodeName === 'BODY' || castElem.type !== 'hidden' && castElem.style.display !== 'none' && castElem.style.visibility !== 'hidden' && canSelectRecursive(e.parentNode); |
||
597 | daniel-mar | 50 | }; |
51 | var canSelect = function (el) { |
||
637 | daniel-mar | 52 | return /INPUT|TEXTAREA|BUTTON/.test(el.tagName) && global$4.get(e.id) && el.tabIndex !== -1 && canSelectRecursive(el); |
597 | daniel-mar | 53 | }; |
637 | daniel-mar | 54 | global$1.each(el, function (e, i) { |
597 | daniel-mar | 55 | if (e.id === editor.id) { |
56 | x = i; |
||
57 | return false; |
||
58 | } |
||
59 | }); |
||
60 | if (direction > 0) { |
||
637 | daniel-mar | 61 | for (var i = x + 1; i < el.length; i++) { |
597 | daniel-mar | 62 | if (canSelect(el[i])) { |
63 | return el[i]; |
||
64 | } |
||
65 | } |
||
66 | } else { |
||
637 | daniel-mar | 67 | for (var i = x - 1; i >= 0; i--) { |
597 | daniel-mar | 68 | if (canSelect(el[i])) { |
69 | return el[i]; |
||
70 | } |
||
71 | } |
||
72 | } |
||
73 | return null; |
||
74 | }; |
||
637 | daniel-mar | 75 | var v = global$1.explode(getTabFocus(editor)); |
597 | daniel-mar | 76 | if (v.length === 1) { |
77 | v[1] = v[0]; |
||
78 | v[0] = ':prev'; |
||
79 | } |
||
80 | var el; |
||
81 | if (e.shiftKey) { |
||
82 | if (v[0] === ':prev') { |
||
83 | el = find(-1); |
||
84 | } else { |
||
85 | el = DOM.get(v[0]); |
||
86 | } |
||
87 | } else { |
||
88 | if (v[1] === ':next') { |
||
89 | el = find(1); |
||
90 | } else { |
||
91 | el = DOM.get(v[1]); |
||
92 | } |
||
93 | } |
||
94 | if (el) { |
||
637 | daniel-mar | 95 | var focusEditor = global$4.get(el.id || el.name); |
597 | daniel-mar | 96 | if (el.id && focusEditor) { |
97 | focusEditor.focus(); |
||
98 | } else { |
||
637 | daniel-mar | 99 | global$2.setTimeout(function () { |
597 | daniel-mar | 100 | if (!global$3.webkit) { |
101 | window.focus(); |
||
102 | } |
||
103 | el.focus(); |
||
104 | }, 10); |
||
105 | } |
||
106 | e.preventDefault(); |
||
107 | } |
||
108 | }; |
||
109 | editor.on('init', function () { |
||
110 | if (editor.inline) { |
||
111 | DOM.setAttrib(editor.getBody(), 'tabIndex', null); |
||
112 | } |
||
113 | editor.on('keyup', tabCancel); |
||
114 | if (global$3.gecko) { |
||
115 | editor.on('keypress keydown', tabHandler); |
||
116 | } else { |
||
117 | editor.on('keydown', tabHandler); |
||
118 | } |
||
119 | }); |
||
120 | }; |
||
121 | |||
122 | function Plugin () { |
||
637 | daniel-mar | 123 | global$6.add('tabfocus', function (editor) { |
597 | daniel-mar | 124 | setup(editor); |
125 | }); |
||
126 | } |
||
127 | |||
128 | Plugin(); |
||
129 | |||
130 | }()); |