{"version":3,"file":"foundation.util.keyboard.js","sources":["../../../../IREP.Web.Content/v7/node_modules/foundation-sites/js/foundation.util.keyboard.js"],"sourcesContent":["/*******************************************\n * *\n * This util was created by Marius Olbertz *\n * Please thank Marius on GitHub /owlbertz *\n * or the web http://www.mariusolbertz.de/ *\n * *\n ******************************************/\n\nimport $ from 'jquery';\nimport { rtl as Rtl } from './foundation.core.utils';\n\nconst keyCodes = {\n 9: 'TAB',\n 13: 'ENTER',\n 27: 'ESCAPE',\n 32: 'SPACE',\n 35: 'END',\n 36: 'HOME',\n 37: 'ARROW_LEFT',\n 38: 'ARROW_UP',\n 39: 'ARROW_RIGHT',\n 40: 'ARROW_DOWN'\n}\n\nvar commands = {}\n\n// Functions pulled out to be referenceable from internals\nfunction findFocusable($element) {\n if(!$element) {return false; }\n return $element.find('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]').filter(function() {\n if (!$(this).is(':visible') || $(this).attr('tabindex') < 0) { return false; } //only have visible elements and those that have a tabindex greater or equal 0\n return true;\n })\n .sort( function( a, b ) {\n if ($(a).attr('tabindex') === $(b).attr('tabindex')) {\n return 0;\n }\n let aTabIndex = parseInt($(a).attr('tabindex'), 10),\n bTabIndex = parseInt($(b).attr('tabindex'), 10);\n // Undefined is treated the same as 0\n if (typeof $(a).attr('tabindex') === 'undefined' && bTabIndex > 0) {\n return 1;\n }\n if (typeof $(b).attr('tabindex') === 'undefined' && aTabIndex > 0) {\n return -1;\n }\n if (aTabIndex === 0 && bTabIndex > 0) {\n return 1;\n }\n if (bTabIndex === 0 && aTabIndex > 0) {\n return -1;\n }\n if (aTabIndex < bTabIndex) {\n return -1;\n }\n if (aTabIndex > bTabIndex) {\n return 1;\n }\n });\n}\n\nfunction parseKey(event) {\n var key = keyCodes[event.which || event.keyCode] || String.fromCharCode(event.which).toUpperCase();\n\n // Remove un-printable characters, e.g. for `fromCharCode` calls for CTRL only events\n key = key.replace(/\\W+/, '');\n\n if (event.shiftKey) key = `SHIFT_${key}`;\n if (event.ctrlKey) key = `CTRL_${key}`;\n if (event.altKey) key = `ALT_${key}`;\n\n // Remove trailing underscore, in case only modifiers were used (e.g. only `CTRL_ALT`)\n key = key.replace(/_$/, '');\n\n return key;\n}\n\nvar Keyboard = {\n keys: getKeyCodes(keyCodes),\n\n /**\n * Parses the (keyboard) event and returns a String that represents its key\n * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE\n * @param {Event} event - the event generated by the event handler\n * @return String key - String that represents the key pressed\n */\n parseKey: parseKey,\n\n /**\n * Handles the given (keyboard) event\n * @param {Event} event - the event generated by the event handler\n * @param {String} component - Foundation component's name, e.g. Slider or Reveal\n * @param {Objects} functions - collection of functions that are to be executed\n */\n handleKey(event, component, functions) {\n var commandList = commands[component],\n keyCode = this.parseKey(event),\n cmds,\n command,\n fn;\n\n if (!commandList) return console.warn('Component not defined!');\n\n // Ignore the event if it was already handled\n if (event.zfIsKeyHandled === true) return;\n\n // This component does not differentiate between ltr and rtl\n if (typeof commandList.ltr === 'undefined') {\n cmds = commandList; // use plain list\n } else { // merge ltr and rtl: if document is rtl, rtl overwrites ltr and vice versa\n if (Rtl()) cmds = $.extend({}, commandList.ltr, commandList.rtl);\n\n else cmds = $.extend({}, commandList.rtl, commandList.ltr);\n }\n command = cmds[keyCode];\n\n fn = functions[command];\n // Execute the handler if found\n if (fn && typeof fn === 'function') {\n var returnValue = fn.apply();\n\n // Mark the event as \"handled\" to prevent future handlings\n event.zfIsKeyHandled = true;\n\n // Execute function when event was handled\n if (functions.handled || typeof functions.handled === 'function') {\n functions.handled(returnValue);\n }\n } else {\n // Execute function when event was not handled\n if (functions.unhandled || typeof functions.unhandled === 'function') {\n functions.unhandled();\n }\n }\n },\n\n /**\n * Finds all focusable elements within the given `$element`\n * @param {jQuery} $element - jQuery object to search within\n * @return {jQuery} $focusable - all focusable elements within `$element`\n */\n\n findFocusable: findFocusable,\n\n /**\n * Returns the component name name\n * @param {Object} component - Foundation component, e.g. Slider or Reveal\n * @return String componentName\n */\n\n register(componentName, cmds) {\n commands[componentName] = cmds;\n },\n\n\n // TODO9438: These references to Keyboard need to not require global. Will 'this' work in this context?\n //\n /**\n * Traps the focus in the given element.\n * @param {jQuery} $element jQuery object to trap the foucs into.\n */\n trapFocus($element) {\n var $focusable = findFocusable($element),\n $firstFocusable = $focusable.eq(0),\n $lastFocusable = $focusable.eq(-1);\n\n $element.on('keydown.zf.trapfocus', function(event) {\n if (event.target === $lastFocusable[0] && parseKey(event) === 'TAB') {\n event.preventDefault();\n $firstFocusable.focus();\n }\n else if (event.target === $firstFocusable[0] && parseKey(event) === 'SHIFT_TAB') {\n event.preventDefault();\n $lastFocusable.focus();\n }\n });\n },\n /**\n * Releases the trapped focus from the given element.\n * @param {jQuery} $element jQuery object to release the focus for.\n */\n releaseFocus($element) {\n $element.off('keydown.zf.trapfocus');\n }\n}\n\n/*\n * Constants for easier comparing.\n * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE\n */\nfunction getKeyCodes(kcs) {\n var k = {};\n for (var kc in kcs) {\n if (kcs.hasOwnProperty(kc)) k[kcs[kc]] = kcs[kc];\n }\n return k;\n}\n\nexport {Keyboard};\n"],"names":["keyCodes","commands","findFocusable","$element","find","filter","$","this","is","attr","sort","a","b","aTabIndex","parseInt","bTabIndex","parseKey","event","key","which","keyCode","String","fromCharCode","toUpperCase","replace","shiftKey","ctrlKey","altKey","Keyboard","keys","kcs","k","kc","hasOwnProperty","getKeyCodes","handleKey","component","functions","fn","commandList","console","warn","zfIsKeyHandled","ltr","Rtl","extend","rtl","returnValue","apply","handled","unhandled","register","componentName","cmds","trapFocus","$focusable","$firstFocusable","eq","$lastFocusable","on","target","preventDefault","focus","releaseFocus","off"],"mappings":"+EAWA,MAAMA,EAAW,CACf,EAAG,MACH,GAAI,QACJ,GAAI,SACJ,GAAI,QACJ,GAAI,MACJ,GAAI,OACJ,GAAI,aACJ,GAAI,WACJ,GAAI,cACJ,GAAI,cAGN,IAAIC,EAAW,CAAA,EAGf,SAASC,EAAcC,GACrB,QAAIA,GACGA,EAASC,KAAK,gLAAgLC,QAAO,WAC1M,SAAKC,EAAEC,MAAMC,GAAG,aAAeF,EAAEC,MAAME,KAAK,YAAc,EAE3D,IACAC,MAAM,SAAUC,EAAGC,GAClB,GAAIN,EAAEK,GAAGF,KAAK,cAAgBH,EAAEM,GAAGH,KAAK,YACtC,OAAO,EAET,IAAII,EAAYC,SAASR,EAAEK,GAAGF,KAAK,YAAa,IAC9CM,EAAYD,SAASR,EAAEM,GAAGH,KAAK,YAAa,IAE9C,YAAqC,IAA1BH,EAAEK,GAAGF,KAAK,aAA+BM,EAAY,EACvD,OAE4B,IAA1BT,EAAEM,GAAGH,KAAK,aAA+BI,EAAY,GACtD,EAEQ,IAAdA,GAAmBE,EAAY,EAC1B,EAES,IAAdA,GAAmBF,EAAY,GAG/BA,EAAYE,GAFN,EAKNF,EAAYE,EACP,OADT,CAGJ,GACA,CAEA,SAASC,EAASC,GAChB,IAAIC,EAAMlB,EAASiB,EAAME,OAASF,EAAMG,UAAYC,OAAOC,aAAaL,EAAME,OAAOI,cAYrF,OATAL,EAAMA,EAAIM,QAAQ,MAAO,IAErBP,EAAMQ,WAAUP,EAAM,SAASA,KAC/BD,EAAMS,UAASR,EAAM,QAAQA,KAC7BD,EAAMU,SAAQT,EAAM,OAAOA,KAG/BA,EAAMA,EAAIM,QAAQ,KAAM,GAG1B,CAEG,IAACI,EAAW,CACbC,KAgHF,SAAqBC,GACnB,IAAIC,EAAI,CAAE,EACV,IAAK,IAAIC,KAAMF,EACTA,EAAIG,eAAeD,KAAKD,EAAED,EAAIE,IAAOF,EAAIE,IAE/C,OAAOD,CACT,CAtHQG,CAAYlC,GAQlBgB,SAAUA,EAQV,SAAAmB,CAAUlB,EAAOmB,EAAWC,GAC1B,IAIEC,EAJEC,EAActC,EAASmC,GACzBhB,EAAUb,KAAKS,SAASC,GAK1B,IAAKsB,EAAa,OAAOC,QAAQC,KAAK,0BAGtC,IAA6B,IAAzBxB,EAAMyB,eAcV,IAFAJ,EAAKD,QAT0B,IAApBE,EAAYI,IACZJ,EAEHK,IAActC,EAAEuC,OAAO,CAAE,EAAEN,EAAYI,IAAKJ,EAAYO,KAEhDxC,EAAEuC,OAAO,CAAA,EAAIN,EAAYO,IAAKP,EAAYI,MAE3CvB,MAIS,mBAAPkB,EAAmB,CAClC,IAAIS,EAAcT,EAAGU,QAGrB/B,EAAMyB,gBAAiB,GAGnBL,EAAUY,SAAwC,mBAAtBZ,EAAUY,UACtCZ,EAAUY,QAAQF,EAE5B,MAEUV,EAAUa,WAA4C,mBAAxBb,EAAUa,YACxCb,EAAUa,WAGjB,EAQDhD,cAAeA,EAQf,QAAAiD,CAASC,EAAeC,GACtBpD,EAASmD,GAAiBC,CAC3B,EASD,SAAAC,CAAUnD,GACR,IAAIoD,EAAarD,EAAcC,GAC3BqD,EAAkBD,EAAWE,GAAG,GAChCC,EAAiBH,EAAWE,IAAI,GAEpCtD,EAASwD,GAAG,wBAAwB,SAAS1C,GACvCA,EAAM2C,SAAWF,EAAe,IAA0B,QAApB1C,EAASC,IACjDA,EAAM4C,iBACNL,EAAgBM,SAET7C,EAAM2C,SAAWJ,EAAgB,IAA0B,cAApBxC,EAASC,KACvDA,EAAM4C,iBACNH,EAAeI,QAEvB,GACG,EAKD,YAAAC,CAAa5D,GACXA,EAAS6D,IAAI,uBACjB","x_google_ignoreList":[0]}