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.