PageSourceSearch

https://mlkecacademy.org/js/core/vpfocusmanager.js?v=7.265.42.3

js mlkecacademy.org collected 2026-10-05 08:06:35 UTC 6,641 bytes, 217 lines download raw bytes

1(function ($)
2{
3    $.widget("ui.vpFocusManager",
4    {
5        options:
6        {
7            IsCurrentlyActiveCallback: null
8            , ExitFocusBeforeElement: false
9            , ExitFocusSpecificElement: null
10            , OnExitCallback: null
11            , OnFocusCallback: null
12        },
13
14        _destroy: function ()
15        {
16            var self = this;
17            
18            self._clearTabbingEvents();
19            
20            self._prevTabbableItem = null;
21            self._myFirstTabbableItem = null;
22            self._myLastTabbableItem = null;
23            self._nextTabbableItem = null;
24        },
25
26        _init: function ()
27        {
28        },
29
30        _prevTabbableItem: null,
31        _myFirstTabbableItem: null,
32        _myLastTabbableItem: null,
33        _nextTabbableItem: null,
34        
35        _create: function ()
36        {       
37            var self = this;
38            var jElement = $(self.element);
39
40            /*jElement.on("fp:focus:changevisibility", function (aEvent)
41            {
42                self._updateTabbability();
43                console.log('changevisibility caught: "' + aEvent.detail.name + '"');
44            });*/
45            
46            jElement.on("keydown", function (e)
47            {
48                if (e.key === "Escape"
49                    && self._hasFocus() === true)
50                {
51                    e.preventDefault();
52                    e.stopPropagation();
53                    self._onExitFocus();
54                    
55                    if (self.options.OnEscapeCallback !== undefined 
56                        && self.options.OnEscapeCallback !== null 
57                        && typeof self.options.OnEscapeCallback === 'function')
58                    {
59                        self.options.OnEscapeCallback();
60                    }
61                    return false;
62                }
63
64                return true;
65            });
66        },
67        
68        takeFocus: function()
69        {
70            var self = this;
71            var jElement = $(self.element);
72            
73            self._onSetFocus();
74        },
75        
76        dropFocus: function()
77        {
78            var self = this;
79            var jElement = $(self.element);
80            
81            // check if it doesn't have focus...
82            if (self._hasFocus() === false)
83            {
84                return;
85            }
86            
87            self._onExitFocus();
88        },
89        
90        _onSetFocus: function()
91        {
92            var self = this;
93
94            self._updateTabbability();
95            
96            self._myFirstTabbableItem.focus();
97            
98            if (self.options.OnFocusCallback !== undefined 
99                && self.options.OnFocusCallback !== null 
100                && typeof self.options.OnFocusCallback === 'function')
101            {
102                self.options.OnFocusCallback();
103            }
104        },
105        
106        _onExitFocus: function()
107        {
108            var self = this;
109            
110            if (self.options.ExitFocusSpecificElement !== undefined 
111                && self.options.ExitFocusSpecificElement !== null)
112            {
113                $(self.options.ExitFocusSpecificElement).closest(':tabbable').focus();
114                return;
115            }
116            
117            if (self.options.ExitFocusBeforeElement === true)
118            {
119                self._prevTabbableItem.focus();
120            }
121            else
122            {
123                self._nextTabbableItem.focus();
124            }
125            
126            //callback?
127        },
128
129        _hasFocus: function ()
130        {
131            var self = this;
132            var jElement = $(self.element);
133            
134            var lHasFocus = jElement.find(':focus').length > 0;
135
136            return lHasFocus;
137        },
138        
139        _clearTabbingEvents: function()
140        {
141            // all the tabbing events.
142            var self = this;
143            var jElement = $(self.element);
144
145            if (self._myFirstTabbableItem !== null)
146            {
147                self._myFirstTabbableItem.off('keydown');
148            }
149
150            if (self._myFirstTabbableItem !== null)
151            {
152                self._myLastTabbableItem.off('keydown');
153            }
154        },
155        
156        _updateTabbability: function ()
157        {
158            // all the tabbing events.
159            var self = this;
160            var jElement = $(self.element);
161
162            self._clearTabbingEvents();
163
164            var lAllTabbableItems = $(':tabbable');
165
166            self._myFirstTabbableItem = jElement.find(':tabbable').first();
167            self._myLastTabbableItem = jElement.find(':tabbable').last();
168
169            var lMyFirstItemIndex = parseInt(lAllTabbableItems.index(self._myFirstTabbableItem), 10);
170            var lPrevItemIndex = lMyFirstItemIndex - 1;
171            if (lPrevItemIndex < 0)
172            {
173                lPrevItemIndex = lAllTabbableItems.length - 1;
174            }
175            self._prevTabbableItem = lAllTabbableItems.eq(lPrevItemIndex);
176
177            var lMyLastItemIndex = parseInt(lAllTabbableItems.index(self._myLastTabbableItem), 10);
178            var lNextItemIndex = lMyLastItemIndex + 1;
179            if (lNextItemIndex < 0)
180            {
181                lNextItemIndex = 0;
182            }
183            self._nextTabbableItem = lAllTabbableItems.eq(lNextItemIndex);
184
185            // set up the internal loop
186            // bottom to top.
187            self._myLastTabbableItem.on("keydown", function (e)
188            {
189                let propagate = true;
190                if (e.keyCode === 9 
191                    && e.shiftKey === false)
192                {
193                    e.preventDefault();
194                    e.stopPropagation();
195                    self._myFirstTabbableItem.focus();
196                    propagate = false;
197                }
198                return propagate;
199            });
200            // top to bottom.
201            self._myFirstTabbableItem.on("keydown", function (e)
202            {
203                let propagate = true;
204                if (e.keyCode === 9 
205                    && e.shiftKey === true)
206                {
207                    e.preventDefault();
208                    e.stopPropagation();
209                    self._myLastTabbableItem.focus();
210                    propagate = false;
211                }
212                return propagate;
213            });
214        }
215        
216    });
217})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.