-
Notifications
You must be signed in to change notification settings - Fork 0
/
script.js.map
1 lines (1 loc) · 297 KB
/
script.js.map
1
{"version":3,"sources":["script.js","vendor/fastclick.js","foundation.core.js","foundation.util.keyboard.js","foundation.util.box.js","foundation.util.nest.js","foundation.util.mediaQuery.js","foundation.util.triggers.js","foundation.util.motion.js","foundation.dropdownMenu.js","foundation.offcanvas.js","foundation.sticky.js","foundation.util.timerAndImageLoader.js","foundation.equalizer.js","attorneys.js","header.js","main.js","practice-areas.js","search.js","vendor/jquery.cookie.js"],"names":["_classCallCheck","instance","Constructor","TypeError","FastClick","a","b","c","apply","arguments","d","this","trackingClick","trackingClickStart","targetElement","touchStartX","touchStartY","lastTouchIdentifier","touchBoundary","layer","tapDelay","notNeeded","e","f","g","h","length","deviceIsAndroid","addEventListener","onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel","Event","prototype","stopImmediatePropagation","removeEventListener","Node","call","hijacked","propagationStopped","onclick","_typeof","Symbol","iterator","obj","constructor","$","functionName","fn","undefined","Function","name","funcNameRegex","results","exec","toString","trim","parseValue","str","isNaN","parseFloat","hyphenate","replace","toLowerCase","FOUNDATION_VERSION","Foundation","version","_plugins","_uuids","rtl","attr","plugin","className","attrName","registerPlugin","pluginName","uuid","GetYoDigits","$element","data","trigger","push","unregisterPlugin","splice","indexOf","removeAttr","removeData","prop","reInit","plugins","isJQ","each","_init","type","_this","fns","object","plgs","forEach","p","foundation","string","Object","keys","err","console","error","namespace","Math","round","pow","random","slice","reflow","elem","i","$elem","find","addBack","$el","opts","warn","split","opt","map","el","er","getFnName","transitionend","end","transitions","transition","WebkitTransition","MozTransition","OTransition","document","createElement","t","style","setTimeout","triggerHandler","util","throttle","func","delay","timer","context","args","method","$meta","$noJS","appendTo","head","removeClass","MediaQuery","Array","plugClass","ReferenceError","window","Date","now","getTime","vendors","requestAnimationFrame","vp","cancelAnimationFrame","test","navigator","userAgent","lastTime","callback","nextTime","max","clearTimeout","performance","start","bind","oThis","aArgs","fToBind","fNOP","fBound","concat","jQuery","getKeyCodes","kcs","k","kc","keyCodes","9","13","27","32","37","38","39","40","commands","Keyboard","parseKey","event","key","which","keyCode","String","fromCharCode","toUpperCase","shiftKey","ctrlKey","altKey","handleKey","component","functions","cmds","command","commandList","ltr","extend","returnValue","handled","unhandled","findFocusable","filter","is","register","componentName","trapFocus","$focusable","$firstFocusable","eq","$lastFocusable","on","target","preventDefault","focus","releaseFocus","off","ImNotTouchingYou","element","parent","lrOnly","tbOnly","top","bottom","left","right","eleDims","GetDimensions","parDims","offset","height","width","windowDims","allDirs","Error","rect","getBoundingClientRect","parRect","parentNode","winRect","body","winY","pageYOffset","winX","pageXOffset","parentDims","GetOffsets","anchor","position","vOffset","hOffset","isOverflow","$eleDims","$anchorDims","Box","Nest","Feather","menu","items","role","subMenuClass","subItemClass","hasSubClass","$item","$sub","children","addClass","aria-haspopup","aria-label","text","aria-expanded","data-submenu","aria-hidden","Burn","css","parseStyleToObject","styleObject","reduce","ret","param","parts","val","decodeURIComponent","hasOwnProperty","isArray","queries","current","namedQueries","self","extractedStyles","value","_getCurrentSize","_watcher","atLeast","size","query","get","matchMedia","matches","matched","newSize","currentSize","styleMedia","media","script","getElementsByTagName","info","id","insertBefore","getComputedStyle","currentStyle","matchMedium","styleSheet","cssText","textContent","checkListeners","eventsListener","resizeListener","scrollListener","closemeListener","yetiBoxes","plugNames","listeners","join","pluginId","not","debounce","$nodes","MutationObserver","nodes","querySelectorAll","listeningElementsMutation","mutationRecordsList","$target","attributeName","closest","elementObserver","observe","attributes","childList","characterData","subtree","attributeFilter","prefixes","triggers","stopPropagation","animation","Motion","animateOut","fadeOut","IHearYou","Move","duration","move","ts","prog","anim","animate","isIn","cb","finish","hide","reset","transitionDuration","initClass","activeClass","initClasses","activeClasses","show","offsetWidth","one","animateIn","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","DropdownMenu","options","defaults","ENTER","SPACE","ARROW_RIGHT","ARROW_UP","ARROW_DOWN","ARROW_LEFT","ESCAPE","subs","$menuItems","$tabs","verticalClass","hasClass","rightClass","alignment","parents","changed","_events","hasTouch","ontouchstart","parClass","handleClickFn","parentsUntil","hasSub","hasClicked","closeOnClick","clickOpen","forceFollow","_hide","_show","add","closeOnClickInside","disableHover","hoverDelay","autoclose","closingTime","$prevElement","$nextElement","isTab","index","$elements","siblings","nextSibling","prevSibling","openSub","closeSub","close","open","_isVertical","down","up","next","previous","$body","$link","idx","$sibs","clear","oldClass","$parentLi","_addBodyHandler","$toClose","somethingToClose","data-is-click","OffCanvas","$lastTrigger","$triggers","contentOverlay","overlay","overlayPosition","setAttribute","$overlay","append","isRevealed","RegExp","revealClass","revealOn","match","_setMQChecker","transitionTime","open.zf.trigger","close.zf.trigger","toggle.zf.trigger","toggle","keydown.zf.offcanvas","_handleKeyboard","click.zf.offcanvas","reveal","$closer","scrollHeight","clientHeight","scrollTop","allowUp","allowDown","lastY","originalEvent","pageY","forceTo","scrollTo","contentScroll","_stopScrolling","_recordScrollable","_stopScrollPropagation","autoFocus","canvasFocus","_this2","emCalc","em","parseInt","fontSize","Sticky","$parent","wasWrapped","$container","container","wrapInner","containerClass","stickyClass","data-resize","data-mutate","scrollCount","checkEvery","isStuck","containerHeight","elemHeight","$anchor","_parsePoints","_setSizes","scroll","_calc","_removeSticky","topPoint","reverse","topAnchor","btm","btmAnchor","documentElement","pts","breaks","len","pt","place","points","isOn","canStick","_eventsHandler","_pauseListeners","checkSizes","bottomPoint","_setSticky","stickTo","mrgn","notStuckTo","isTop","stickToTop","anchorPt","anchorHeight","topOrBottom","stickyOn","newElemWidth","comp","pdngl","pdngr","max-width","newContainerHeight","_setBreakPoints","mTop","marginTop","mBtm","marginBottom","winHeight","innerHeight","unwrap","Timer","nameSpace","remain","isPaused","restart","infinite","pause","onImagesLoaded","images","singleImageLoaded","unloaded","complete","readyState","src","Equalizer","eqId","$watched","hasNested","isNested","_bindHandler","onResizeMeBound","_onResizeMe","onPostEqualizedBound","_onPostEqualized","tooSmall","imgs","equalizeOn","_checkMQ","_reflow",".zf.equalizer","resizeme.zf.trigger","mutateme.zf.trigger","_pauseEvents","equalizeOnStack","_isStacked","equalizeByRow","getHeightsByRow","applyHeightByRow","getHeights","applyHeight","heights","offsetHeight","lastElTopOffset","first","groups","group","elOffsetTop","j","ln","groupsILength","lenJ","$attorney_select_items","$attorney_items","click","nav_position","toggleClass","resize","opacity","load","remove","prevent_jump","location","hash","$practice_areas","log","$practice_area","href","substring","resizeInput","$top_bar","$search_container","$search_input","$search_button","placeholder","blur","deviceIsIOS","deviceIsIOS4","deviceIsIOSWithBadTarget","deviceIsBlackBerry10","needsClick","nodeName","disabled","needsFocus","readOnly","sendClick","activeElement","changedTouches","createEvent","initMouseEvent","determineEventType","screenX","screenY","clientX","clientY","forwardedTouchEvent","dispatchEvent","tagName","setSelectionRange","updateScrollParent","fastClickScrollParent","contains","parentElement","fastClickLastScrollTop","getTargetElementFromEventTarget","nodeType","TEXT_NODE","targetTouches","getSelection","rangeCount","isCollapsed","identifier","timeStamp","pageX","lastClickTime","touchHasMoved","abs","findControl","control","htmlFor","getElementById","querySelector","cancelNextClick","elementFromPoint","cancelable","detail","destroy","content","scrollWidth","outerWidth","msTouchAction","attach","define","amd","module","exports","require","raw","encodeURIComponent","json","JSON","stringify","parse","isFunction","cookie","expires","setTime","toUTCString","path","domain","secure","l","m","n","o","q","shift","r","removeCookie"],"mappings":"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","file":"script.js","sourcesContent":["'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n!function ($) {\n\n \"use strict\";\n\n var FOUNDATION_VERSION = '6.3.1';\n\n // Global Foundation object\n // This is attached to the window, or used as a module for AMD/Browserify\n var Foundation = {\n version: FOUNDATION_VERSION,\n\n /**\n * Stores initialized plugins.\n */\n _plugins: {},\n\n /**\n * Stores generated unique ids for plugin instances\n */\n _uuids: [],\n\n /**\n * Returns a boolean for RTL support\n */\n rtl: function rtl() {\n return $('html').attr('dir') === 'rtl';\n },\n /**\n * Defines a Foundation plugin, adding it to the `Foundation` namespace and the list of plugins to initialize when reflowing.\n * @param {Object} plugin - The constructor of the plugin.\n */\n plugin: function plugin(_plugin, name) {\n // Object key to use when adding to global Foundation object\n // Examples: Foundation.Reveal, Foundation.OffCanvas\n var className = name || functionName(_plugin);\n // Object key to use when storing the plugin, also used to create the identifying data attribute for the plugin\n // Examples: data-reveal, data-off-canvas\n var attrName = hyphenate(className);\n\n // Add to the Foundation object and the plugins list (for reflowing)\n this._plugins[attrName] = this[className] = _plugin;\n },\n /**\n * @function\n * Populates the _uuids array with pointers to each individual plugin instance.\n * Adds the `zfPlugin` data-attribute to programmatically created plugins to allow use of $(selector).foundation(method) calls.\n * Also fires the initialization event for each plugin, consolidating repetitive code.\n * @param {Object} plugin - an instance of a plugin, usually `this` in context.\n * @param {String} name - the name of the plugin, passed as a camelCased string.\n * @fires Plugin#init\n */\n registerPlugin: function registerPlugin(plugin, name) {\n var pluginName = name ? hyphenate(name) : functionName(plugin.constructor).toLowerCase();\n plugin.uuid = this.GetYoDigits(6, pluginName);\n\n if (!plugin.$element.attr('data-' + pluginName)) {\n plugin.$element.attr('data-' + pluginName, plugin.uuid);\n }\n if (!plugin.$element.data('zfPlugin')) {\n plugin.$element.data('zfPlugin', plugin);\n }\n /**\n * Fires when the plugin has initialized.\n * @event Plugin#init\n */\n plugin.$element.trigger('init.zf.' + pluginName);\n\n this._uuids.push(plugin.uuid);\n\n return;\n },\n /**\n * @function\n * Removes the plugins uuid from the _uuids array.\n * Removes the zfPlugin data attribute, as well as the data-plugin-name attribute.\n * Also fires the destroyed event for the plugin, consolidating repetitive code.\n * @param {Object} plugin - an instance of a plugin, usually `this` in context.\n * @fires Plugin#destroyed\n */\n unregisterPlugin: function unregisterPlugin(plugin) {\n var pluginName = hyphenate(functionName(plugin.$element.data('zfPlugin').constructor));\n\n this._uuids.splice(this._uuids.indexOf(plugin.uuid), 1);\n plugin.$element.removeAttr('data-' + pluginName).removeData('zfPlugin')\n /**\n * Fires when the plugin has been destroyed.\n * @event Plugin#destroyed\n */\n .trigger('destroyed.zf.' + pluginName);\n for (var prop in plugin) {\n plugin[prop] = null; //clean up script to prep for garbage collection.\n }\n return;\n },\n\n /**\n * @function\n * Causes one or more active plugins to re-initialize, resetting event listeners, recalculating positions, etc.\n * @param {String} plugins - optional string of an individual plugin key, attained by calling `$(element).data('pluginName')`, or string of a plugin class i.e. `'dropdown'`\n * @default If no argument is passed, reflow all currently active plugins.\n */\n reInit: function reInit(plugins) {\n var isJQ = plugins instanceof $;\n try {\n if (isJQ) {\n plugins.each(function () {\n $(this).data('zfPlugin')._init();\n });\n } else {\n var type = typeof plugins === 'undefined' ? 'undefined' : _typeof(plugins),\n _this = this,\n fns = {\n 'object': function object(plgs) {\n plgs.forEach(function (p) {\n p = hyphenate(p);\n $('[data-' + p + ']').foundation('_init');\n });\n },\n 'string': function string() {\n plugins = hyphenate(plugins);\n $('[data-' + plugins + ']').foundation('_init');\n },\n 'undefined': function undefined() {\n this['object'](Object.keys(_this._plugins));\n }\n };\n fns[type](plugins);\n }\n } catch (err) {\n console.error(err);\n } finally {\n return plugins;\n }\n },\n\n /**\n * returns a random base-36 uid with namespacing\n * @function\n * @param {Number} length - number of random base-36 digits desired. Increase for more random strings.\n * @param {String} namespace - name of plugin to be incorporated in uid, optional.\n * @default {String} '' - if no plugin name is provided, nothing is appended to the uid.\n * @returns {String} - unique id\n */\n GetYoDigits: function GetYoDigits(length, namespace) {\n length = length || 6;\n return Math.round(Math.pow(36, length + 1) - Math.random() * Math.pow(36, length)).toString(36).slice(1) + (namespace ? '-' + namespace : '');\n },\n /**\n * Initialize plugins on any elements within `elem` (and `elem` itself) that aren't already initialized.\n * @param {Object} elem - jQuery object containing the element to check inside. Also checks the element itself, unless it's the `document` object.\n * @param {String|Array} plugins - A list of plugins to initialize. Leave this out to initialize everything.\n */\n reflow: function reflow(elem, plugins) {\n\n // If plugins is undefined, just grab everything\n if (typeof plugins === 'undefined') {\n plugins = Object.keys(this._plugins);\n }\n // If plugins is a string, convert it to an array with one item\n else if (typeof plugins === 'string') {\n plugins = [plugins];\n }\n\n var _this = this;\n\n // Iterate through each plugin\n $.each(plugins, function (i, name) {\n // Get the current plugin\n var plugin = _this._plugins[name];\n\n // Localize the search to all elements inside elem, as well as elem itself, unless elem === document\n var $elem = $(elem).find('[data-' + name + ']').addBack('[data-' + name + ']');\n\n // For each plugin found, initialize it\n $elem.each(function () {\n var $el = $(this),\n opts = {};\n // Don't double-dip on plugins\n if ($el.data('zfPlugin')) {\n console.warn(\"Tried to initialize \" + name + \" on an element that already has a Foundation plugin.\");\n return;\n }\n\n if ($el.attr('data-options')) {\n var thing = $el.attr('data-options').split(';').forEach(function (e, i) {\n var opt = e.split(':').map(function (el) {\n return el.trim();\n });\n if (opt[0]) opts[opt[0]] = parseValue(opt[1]);\n });\n }\n try {\n $el.data('zfPlugin', new plugin($(this), opts));\n } catch (er) {\n console.error(er);\n } finally {\n return;\n }\n });\n });\n },\n getFnName: functionName,\n transitionend: function transitionend($elem) {\n var transitions = {\n 'transition': 'transitionend',\n 'WebkitTransition': 'webkitTransitionEnd',\n 'MozTransition': 'transitionend',\n 'OTransition': 'otransitionend'\n };\n var elem = document.createElement('div'),\n end;\n\n for (var t in transitions) {\n if (typeof elem.style[t] !== 'undefined') {\n end = transitions[t];\n }\n }\n if (end) {\n return end;\n } else {\n end = setTimeout(function () {\n $elem.triggerHandler('transitionend', [$elem]);\n }, 1);\n return 'transitionend';\n }\n }\n };\n\n Foundation.util = {\n /**\n * Function for applying a debounce effect to a function call.\n * @function\n * @param {Function} func - Function to be called at end of timeout.\n * @param {Number} delay - Time in ms to delay the call of `func`.\n * @returns function\n */\n throttle: function throttle(func, delay) {\n var timer = null;\n\n return function () {\n var context = this,\n args = arguments;\n\n if (timer === null) {\n timer = setTimeout(function () {\n func.apply(context, args);\n timer = null;\n }, delay);\n }\n };\n }\n };\n\n // TODO: consider not making this a jQuery function\n // TODO: need way to reflow vs. re-initialize\n /**\n * The Foundation jQuery method.\n * @param {String|Array} method - An action to perform on the current jQuery object.\n */\n var foundation = function foundation(method) {\n var type = typeof method === 'undefined' ? 'undefined' : _typeof(method),\n $meta = $('meta.foundation-mq'),\n $noJS = $('.no-js');\n\n if (!$meta.length) {\n $('<meta class=\"foundation-mq\">').appendTo(document.head);\n }\n if ($noJS.length) {\n $noJS.removeClass('no-js');\n }\n\n if (type === 'undefined') {\n //needs to initialize the Foundation object, or an individual plugin.\n Foundation.MediaQuery._init();\n Foundation.reflow(this);\n } else if (type === 'string') {\n //an individual method to invoke on a plugin or group of plugins\n var args = Array.prototype.slice.call(arguments, 1); //collect all the arguments, if necessary\n var plugClass = this.data('zfPlugin'); //determine the class of plugin\n\n if (plugClass !== undefined && plugClass[method] !== undefined) {\n //make sure both the class and method exist\n if (this.length === 1) {\n //if there's only one, call it directly.\n plugClass[method].apply(plugClass, args);\n } else {\n this.each(function (i, el) {\n //otherwise loop through the jQuery collection and invoke the method on each\n plugClass[method].apply($(el).data('zfPlugin'), args);\n });\n }\n } else {\n //error for no class or no method\n throw new ReferenceError(\"We're sorry, '\" + method + \"' is not an available method for \" + (plugClass ? functionName(plugClass) : 'this element') + '.');\n }\n } else {\n //error for invalid argument type\n throw new TypeError('We\\'re sorry, ' + type + ' is not a valid parameter. You must use a string representing the method you wish to invoke.');\n }\n return this;\n };\n\n window.Foundation = Foundation;\n $.fn.foundation = foundation;\n\n // Polyfill for requestAnimationFrame\n (function () {\n if (!Date.now || !window.Date.now) window.Date.now = Date.now = function () {\n return new Date().getTime();\n };\n\n var vendors = ['webkit', 'moz'];\n for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {\n var vp = vendors[i];\n window.requestAnimationFrame = window[vp + 'RequestAnimationFrame'];\n window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame'];\n }\n if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) {\n var lastTime = 0;\n window.requestAnimationFrame = function (callback) {\n var now = Date.now();\n var nextTime = Math.max(lastTime + 16, now);\n return setTimeout(function () {\n callback(lastTime = nextTime);\n }, nextTime - now);\n };\n window.cancelAnimationFrame = clearTimeout;\n }\n /**\n * Polyfill for performance.now, required by rAF\n */\n if (!window.performance || !window.performance.now) {\n window.performance = {\n start: Date.now(),\n now: function now() {\n return Date.now() - this.start;\n }\n };\n }\n })();\n if (!Function.prototype.bind) {\n Function.prototype.bind = function (oThis) {\n if (typeof this !== 'function') {\n // closest thing possible to the ECMAScript 5\n // internal IsCallable function\n throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');\n }\n\n var aArgs = Array.prototype.slice.call(arguments, 1),\n fToBind = this,\n fNOP = function fNOP() {},\n fBound = function fBound() {\n return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));\n };\n\n if (this.prototype) {\n // native functions don't have a prototype\n fNOP.prototype = this.prototype;\n }\n fBound.prototype = new fNOP();\n\n return fBound;\n };\n }\n // Polyfill to get the name of a function in IE9\n function functionName(fn) {\n if (Function.prototype.name === undefined) {\n var funcNameRegex = /function\\s([^(]{1,})\\(/;\n var results = funcNameRegex.exec(fn.toString());\n return results && results.length > 1 ? results[1].trim() : \"\";\n } else if (fn.prototype === undefined) {\n return fn.constructor.name;\n } else {\n return fn.prototype.constructor.name;\n }\n }\n function parseValue(str) {\n if ('true' === str) return true;else if ('false' === str) return false;else if (!isNaN(str * 1)) return parseFloat(str);\n return str;\n }\n // Convert PascalCase to kebab-case\n // Thank you: http://stackoverflow.com/a/8955580\n function hyphenate(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n }\n}(jQuery);\n/*******************************************\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\n'use strict';\n\n!function ($) {\n\n var keyCodes = {\n 9: 'TAB',\n 13: 'ENTER',\n 27: 'ESCAPE',\n 32: 'SPACE',\n 37: 'ARROW_LEFT',\n 38: 'ARROW_UP',\n 39: 'ARROW_RIGHT',\n 40: 'ARROW_DOWN'\n };\n\n var commands = {};\n\n var 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: function 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\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: function 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 if (typeof commandList.ltr === 'undefined') {\n // this component does not differentiate between ltr and rtl\n cmds = commandList; // use plain list\n } else {\n // merge ltr and rtl: if document is rtl, rtl overwrites ltr and vice versa\n if (Foundation.rtl()) cmds = $.extend({}, commandList.ltr, commandList.rtl);else cmds = $.extend({}, commandList.rtl, commandList.ltr);\n }\n command = cmds[keyCode];\n\n fn = functions[command];\n if (fn && typeof fn === 'function') {\n // execute function if exists\n var returnValue = fn.apply();\n if (functions.handled || typeof functions.handled === 'function') {\n // execute function when event was handled\n functions.handled(returnValue);\n }\n } else {\n if (functions.unhandled || typeof functions.unhandled === 'function') {\n // execute function when event was not handled\n functions.unhandled();\n }\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 findFocusable: function findFocusable($element) {\n if (!$element) {\n return false;\n }\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) {\n return false;\n } //only have visible elements and those that have a tabindex greater or equal 0\n return true;\n });\n },\n\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: function register(componentName, cmds) {\n commands[componentName] = cmds;\n },\n\n\n /**\n * Traps the focus in the given element.\n * @param {jQuery} $element jQuery object to trap the foucs into.\n */\n trapFocus: function trapFocus($element) {\n var $focusable = Foundation.Keyboard.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] && Foundation.Keyboard.parseKey(event) === 'TAB') {\n event.preventDefault();\n $firstFocusable.focus();\n } else if (event.target === $firstFocusable[0] && Foundation.Keyboard.parseKey(event) === 'SHIFT_TAB') {\n event.preventDefault();\n $lastFocusable.focus();\n }\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: function 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 */\n function getKeyCodes(kcs) {\n var k = {};\n for (var kc in kcs) {\n k[kcs[kc]] = kcs[kc];\n }return k;\n }\n\n Foundation.Keyboard = Keyboard;\n}(jQuery);\n'use strict';\n\n!function ($) {\n\n Foundation.Box = {\n ImNotTouchingYou: ImNotTouchingYou,\n GetDimensions: GetDimensions,\n GetOffsets: GetOffsets\n\n /**\n * Compares the dimensions of an element to a container and determines collision events with container.\n * @function\n * @param {jQuery} element - jQuery object to test for collisions.\n * @param {jQuery} parent - jQuery object to use as bounding container.\n * @param {Boolean} lrOnly - set to true to check left and right values only.\n * @param {Boolean} tbOnly - set to true to check top and bottom values only.\n * @default if no parent object passed, detects collisions with `window`.\n * @returns {Boolean} - true if collision free, false if a collision in any direction.\n */\n };function ImNotTouchingYou(element, parent, lrOnly, tbOnly) {\n var eleDims = GetDimensions(element),\n top,\n bottom,\n left,\n right;\n\n if (parent) {\n var parDims = GetDimensions(parent);\n\n bottom = eleDims.offset.top + eleDims.height <= parDims.height + parDims.offset.top;\n top = eleDims.offset.top >= parDims.offset.top;\n left = eleDims.offset.left >= parDims.offset.left;\n right = eleDims.offset.left + eleDims.width <= parDims.width + parDims.offset.left;\n } else {\n bottom = eleDims.offset.top + eleDims.height <= eleDims.windowDims.height + eleDims.windowDims.offset.top;\n top = eleDims.offset.top >= eleDims.windowDims.offset.top;\n left = eleDims.offset.left >= eleDims.windowDims.offset.left;\n right = eleDims.offset.left + eleDims.width <= eleDims.windowDims.width;\n }\n\n var allDirs = [bottom, top, left, right];\n\n if (lrOnly) {\n return left === right === true;\n }\n\n if (tbOnly) {\n return top === bottom === true;\n }\n\n return allDirs.indexOf(false) === -1;\n };\n\n /**\n * Uses native methods to return an object of dimension values.\n * @function\n * @param {jQuery || HTML} element - jQuery object or DOM element for which to get the dimensions. Can be any element other that document or window.\n * @returns {Object} - nested object of integer pixel values\n * TODO - if element is window, return only those values.\n */\n function GetDimensions(elem, test) {\n elem = elem.length ? elem[0] : elem;\n\n if (elem === window || elem === document) {\n throw new Error(\"I'm sorry, Dave. I'm afraid I can't do that.\");\n }\n\n var rect = elem.getBoundingClientRect(),\n parRect = elem.parentNode.getBoundingClientRect(),\n winRect = document.body.getBoundingClientRect(),\n winY = window.pageYOffset,\n winX = window.pageXOffset;\n\n return {\n width: rect.width,\n height: rect.height,\n offset: {\n top: rect.top + winY,\n left: rect.left + winX\n },\n parentDims: {\n width: parRect.width,\n height: parRect.height,\n offset: {\n top: parRect.top + winY,\n left: parRect.left + winX\n }\n },\n windowDims: {\n width: winRect.width,\n height: winRect.height,\n offset: {\n top: winY,\n left: winX\n }\n }\n };\n }\n\n /**\n * Returns an object of top and left integer pixel values for dynamically rendered elements,\n * such as: Tooltip, Reveal, and Dropdown\n * @function\n * @param {jQuery} element - jQuery object for the element being positioned.\n * @param {jQuery} anchor - jQuery object for the element's anchor point.\n * @param {String} position - a string relating to the desired position of the element, relative to it's anchor\n * @param {Number} vOffset - integer pixel value of desired vertical separation between anchor and element.\n * @param {Number} hOffset - integer pixel value of desired horizontal separation between anchor and element.\n * @param {Boolean} isOverflow - if a collision event is detected, sets to true to default the element to full width - any desired offset.\n * TODO alter/rewrite to work with `em` values as well/instead of pixels\n */\n function GetOffsets(element, anchor, position, vOffset, hOffset, isOverflow) {\n var $eleDims = GetDimensions(element),\n $anchorDims = anchor ? GetDimensions(anchor) : null;\n\n switch (position) {\n case 'top':\n return {\n left: Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left,\n top: $anchorDims.offset.top - ($eleDims.height + vOffset)\n };\n break;\n case 'left':\n return {\n left: $anchorDims.offset.left - ($eleDims.width + hOffset),\n top: $anchorDims.offset.top\n };\n break;\n case 'right':\n return {\n left: $anchorDims.offset.left + $anchorDims.width + hOffset,\n top: $anchorDims.offset.top\n };\n break;\n case 'center top':\n return {\n left: $anchorDims.offset.left + $anchorDims.width / 2 - $eleDims.width / 2,\n top: $anchorDims.offset.top - ($eleDims.height + vOffset)\n };\n break;\n case 'center bottom':\n return {\n left: isOverflow ? hOffset : $anchorDims.offset.left + $anchorDims.width / 2 - $eleDims.width / 2,\n top: $anchorDims.offset.top + $anchorDims.height + vOffset\n };\n break;\n case 'center left':\n return {\n left: $anchorDims.offset.left - ($eleDims.width + hOffset),\n top: $anchorDims.offset.top + $anchorDims.height / 2 - $eleDims.height / 2\n };\n break;\n case 'center right':\n return {\n left: $anchorDims.offset.left + $anchorDims.width + hOffset + 1,\n top: $anchorDims.offset.top + $anchorDims.height / 2 - $eleDims.height / 2\n };\n break;\n case 'center':\n return {\n left: $eleDims.windowDims.offset.left + $eleDims.windowDims.width / 2 - $eleDims.width / 2,\n top: $eleDims.windowDims.offset.top + $eleDims.windowDims.height / 2 - $eleDims.height / 2\n };\n break;\n case 'reveal':\n return {\n left: ($eleDims.windowDims.width - $eleDims.width) / 2,\n top: $eleDims.windowDims.offset.top + vOffset\n };\n case 'reveal full':\n return {\n left: $eleDims.windowDims.offset.left,\n top: $eleDims.windowDims.offset.top\n };\n break;\n case 'left bottom':\n return {\n left: $anchorDims.offset.left,\n top: $anchorDims.offset.top + $anchorDims.height + vOffset\n };\n break;\n case 'right bottom':\n return {\n left: $anchorDims.offset.left + $anchorDims.width + hOffset - $eleDims.width,\n top: $anchorDims.offset.top + $anchorDims.height + vOffset\n };\n break;\n default:\n return {\n left: Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left + hOffset,\n top: $anchorDims.offset.top + $anchorDims.height + vOffset\n };\n }\n }\n}(jQuery);\n'use strict';\n\n!function ($) {\n\n var Nest = {\n Feather: function Feather(menu) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'zf';\n\n menu.attr('role', 'menubar');\n\n var items = menu.find('li').attr({ 'role': 'menuitem' }),\n subMenuClass = 'is-' + type + '-submenu',\n subItemClass = subMenuClass + '-item',\n hasSubClass = 'is-' + type + '-submenu-parent';\n\n items.each(function () {\n var $item = $(this),\n $sub = $item.children('ul');\n\n if ($sub.length) {\n $item.addClass(hasSubClass).attr({\n 'aria-haspopup': true,\n 'aria-label': $item.children('a:first').text()\n });\n // Note: Drilldowns behave differently in how they hide, and so need\n // additional attributes. We should look if this possibly over-generalized\n // utility (Nest) is appropriate when we rework menus in 6.4\n if (type === 'drilldown') {\n $item.attr({ 'aria-expanded': false });\n }\n\n $sub.addClass('submenu ' + subMenuClass).attr({\n 'data-submenu': '',\n 'role': 'menu'\n });\n if (type === 'drilldown') {\n $sub.attr({ 'aria-hidden': true });\n }\n }\n\n if ($item.parent('[data-submenu]').length) {\n $item.addClass('is-submenu-item ' + subItemClass);\n }\n });\n\n return;\n },\n Burn: function Burn(menu, type) {\n var //items = menu.find('li'),\n subMenuClass = 'is-' + type + '-submenu',\n subItemClass = subMenuClass + '-item',\n hasSubClass = 'is-' + type + '-submenu-parent';\n\n menu.find('>li, .menu, .menu > li').removeClass(subMenuClass + ' ' + subItemClass + ' ' + hasSubClass + ' is-submenu-item submenu is-active').removeAttr('data-submenu').css('display', '');\n\n // console.log( menu.find('.' + subMenuClass + ', .' + subItemClass + ', .has-submenu, .is-submenu-item, .submenu, [data-submenu]')\n // .removeClass(subMenuClass + ' ' + subItemClass + ' has-submenu is-submenu-item submenu')\n // .removeAttr('data-submenu'));\n // items.each(function(){\n // var $item = $(this),\n // $sub = $item.children('ul');\n // if($item.parent('[data-submenu]').length){\n // $item.removeClass('is-submenu-item ' + subItemClass);\n // }\n // if($sub.length){\n // $item.removeClass('has-submenu');\n // $sub.removeClass('submenu ' + subMenuClass).removeAttr('data-submenu');\n // }\n // });\n }\n };\n\n Foundation.Nest = Nest;\n}(jQuery);\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n!function ($) {\n\n // Default set of media queries\n var defaultQueries = {\n 'default': 'only screen',\n landscape: 'only screen and (orientation: landscape)',\n portrait: 'only screen and (orientation: portrait)',\n retina: 'only screen and (-webkit-min-device-pixel-ratio: 2),' + 'only screen and (min--moz-device-pixel-ratio: 2),' + 'only screen and (-o-min-device-pixel-ratio: 2/1),' + 'only screen and (min-device-pixel-ratio: 2),' + 'only screen and (min-resolution: 192dpi),' + 'only screen and (min-resolution: 2dppx)'\n };\n\n var MediaQuery = {\n queries: [],\n\n current: '',\n\n /**\n * Initializes the media query helper, by extracting the breakpoint list from the CSS and activating the breakpoint watcher.\n * @function\n * @private\n */\n _init: function _init() {\n var self = this;\n var extractedStyles = $('.foundation-mq').css('font-family');\n var namedQueries;\n\n namedQueries = parseStyleToObject(extractedStyles);\n\n for (var key in namedQueries) {\n if (namedQueries.hasOwnProperty(key)) {\n self.queries.push({\n name: key,\n value: 'only screen and (min-width: ' + namedQueries[key] + ')'\n });\n }\n }\n\n this.current = this._getCurrentSize();\n\n this._watcher();\n },\n\n\n /**\n * Checks if the screen is at least as wide as a breakpoint.\n * @function\n * @param {String} size - Name of the breakpoint to check.\n * @returns {Boolean} `true` if the breakpoint matches, `false` if it's smaller.\n */\n atLeast: function atLeast(size) {\n var query = this.get(size);\n\n if (query) {\n return window.matchMedia(query).matches;\n }\n\n return false;\n },\n\n\n /**\n * Checks if the screen matches to a breakpoint.\n * @function\n * @param {String} size - Name of the breakpoint to check, either 'small only' or 'small'. Omitting 'only' falls back to using atLeast() method.\n * @returns {Boolean} `true` if the breakpoint matches, `false` if it does not.\n */\n is: function is(size) {\n size = size.trim().split(' ');\n if (size.length > 1 && size[1] === 'only') {\n if (size[0] === this._getCurrentSize()) return true;\n } else {\n return this.atLeast(size[0]);\n }\n return false;\n },\n\n\n /**\n * Gets the media query of a breakpoint.\n * @function\n * @param {String} size - Name of the breakpoint to get.\n * @returns {String|null} - The media query of the breakpoint, or `null` if the breakpoint doesn't exist.\n */\n get: function get(size) {\n for (var i in this.queries) {\n if (this.queries.hasOwnProperty(i)) {\n var query = this.queries[i];\n if (size === query.name) return query.value;\n }\n }\n\n return null;\n },\n\n\n /**\n * Gets the current breakpoint name by testing every breakpoint and returning the last one to match (the biggest one).\n * @function\n * @private\n * @returns {String} Name of the current breakpoint.\n */\n _getCurrentSize: function _getCurrentSize() {\n var matched;\n\n for (var i = 0; i < this.queries.length; i++) {\n var query = this.queries[i];\n\n if (window.matchMedia(query.value).matches) {\n matched = query;\n }\n }\n\n if ((typeof matched === 'undefined' ? 'undefined' : _typeof(matched)) === 'object') {\n return matched.name;\n } else {\n return matched;\n }\n },\n\n\n /**\n * Activates the breakpoint watcher, which fires an event on the window whenever the breakpoint changes.\n * @function\n * @private\n */\n _watcher: function _watcher() {\n var _this = this;\n\n $(window).on('resize.zf.mediaquery', function () {\n var newSize = _this._getCurrentSize(),\n currentSize = _this.current;\n\n if (newSize !== currentSize) {\n // Change the current media query\n _this.current = newSize;\n\n // Broadcast the media query change on the window\n $(window).trigger('changed.zf.mediaquery', [newSize, currentSize]);\n }\n });\n }\n };\n\n Foundation.MediaQuery = MediaQuery;\n\n // matchMedia() polyfill - Test a CSS media type/query in JS.\n // Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license\n window.matchMedia || (window.matchMedia = function () {\n 'use strict';\n\n // For browsers that support matchMedium api such as IE 9 and webkit\n\n var styleMedia = window.styleMedia || window.media;\n\n // For those that don't support matchMedium\n if (!styleMedia) {\n var style = document.createElement('style'),\n script = document.getElementsByTagName('script')[0],\n info = null;\n\n style.type = 'text/css';\n style.id = 'matchmediajs-test';\n\n script && script.parentNode && script.parentNode.insertBefore(style, script);\n\n // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers\n info = 'getComputedStyle' in window && window.getComputedStyle(style, null) || style.currentStyle;\n\n styleMedia = {\n matchMedium: function matchMedium(media) {\n var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';\n\n // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers\n if (style.styleSheet) {\n style.styleSheet.cssText = text;\n } else {\n style.textContent = text;\n }\n\n // Test if media query is true or false\n return info.width === '1px';\n }\n };\n }\n\n return function (media) {\n return {\n matches: styleMedia.matchMedium(media || 'all'),\n media: media || 'all'\n };\n };\n }());\n\n // Thank you: https://github.com/sindresorhus/query-string\n function parseStyleToObject(str) {\n var styleObject = {};\n\n if (typeof str !== 'string') {\n return styleObject;\n }\n\n str = str.trim().slice(1, -1); // browsers re-quote string style values\n\n if (!str) {\n return styleObject;\n }\n\n styleObject = str.split('&').reduce(function (ret, param) {\n var parts = param.replace(/\\+/g, ' ').split('=');\n var key = parts[0];\n var val = parts[1];\n key = decodeURIComponent(key);\n\n // missing `=` should be `null`:\n // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n val = val === undefined ? null : decodeURIComponent(val);\n\n if (!ret.hasOwnProperty(key)) {\n ret[key] = val;\n } else if (Array.isArray(ret[key])) {\n ret[key].push(val);\n } else {\n ret[key] = [ret[key], val];\n }\n return ret;\n }, {});\n\n return styleObject;\n }\n\n Foundation.MediaQuery = MediaQuery;\n}(jQuery);\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n!function ($) {\n\n var MutationObserver = function () {\n var prefixes = ['WebKit', 'Moz', 'O', 'Ms', ''];\n for (var i = 0; i < prefixes.length; i++) {\n if (prefixes[i] + 'MutationObserver' in window) {\n return window[prefixes[i] + 'MutationObserver'];\n }\n }\n return false;\n }();\n\n var triggers = function triggers(el, type) {\n el.data(type).split(' ').forEach(function (id) {\n $('#' + id)[type === 'close' ? 'trigger' : 'triggerHandler'](type + '.zf.trigger', [el]);\n });\n };\n // Elements with [data-open] will reveal a plugin that supports it when clicked.\n $(document).on('click.zf.trigger', '[data-open]', function () {\n triggers($(this), 'open');\n });\n\n // Elements with [data-close] will close a plugin that supports it when clicked.\n // If used without a value on [data-close], the event will bubble, allowing it to close a parent component.\n $(document).on('click.zf.trigger', '[data-close]', function () {\n var id = $(this).data('close');\n if (id) {\n triggers($(this), 'close');\n } else {\n $(this).trigger('close.zf.trigger');\n }\n });\n\n // Elements with [data-toggle] will toggle a plugin that supports it when clicked.\n $(document).on('click.zf.trigger', '[data-toggle]', function () {\n var id = $(this).data('toggle');\n if (id) {\n triggers($(this), 'toggle');\n } else {\n $(this).trigger('toggle.zf.trigger');\n }\n });\n\n // Elements with [data-closable] will respond to close.zf.trigger events.\n $(document).on('close.zf.trigger', '[data-closable]', function (e) {\n e.stopPropagation();\n var animation = $(this).data('closable');\n\n if (animation !== '') {\n Foundation.Motion.animateOut($(this), animation, function () {\n $(this).trigger('closed.zf');\n });\n } else {\n $(this).fadeOut().trigger('closed.zf');\n }\n });\n\n $(document).on('focus.zf.trigger blur.zf.trigger', '[data-toggle-focus]', function () {\n var id = $(this).data('toggle-focus');\n $('#' + id).triggerHandler('toggle.zf.trigger', [$(this)]);\n });\n\n /**\n * Fires once after all other scripts have loaded\n * @function\n * @private\n */\n $(window).on('load', function () {\n checkListeners();\n });\n\n function checkListeners() {\n eventsListener();\n resizeListener();\n scrollListener();\n closemeListener();\n }\n\n //******** only fires this function once on load, if there's something to watch ********\n function closemeListener(pluginName) {\n var yetiBoxes = $('[data-yeti-box]'),\n plugNames = ['dropdown', 'tooltip', 'reveal'];\n\n if (pluginName) {\n if (typeof pluginName === 'string') {\n plugNames.push(pluginName);\n } else if ((typeof pluginName === 'undefined' ? 'undefined' : _typeof(pluginName)) === 'object' && typeof pluginName[0] === 'string') {\n plugNames.concat(pluginName);\n } else {\n console.error('Plugin names must be strings');\n }\n }\n if (yetiBoxes.length) {\n var listeners = plugNames.map(function (name) {\n return 'closeme.zf.' + name;\n }).join(' ');\n\n $(window).off(listeners).on(listeners, function (e, pluginId) {\n var plugin = e.namespace.split('.')[0];\n var plugins = $('[data-' + plugin + ']').not('[data-yeti-box=\"' + pluginId + '\"]');\n\n plugins.each(function () {\n var _this = $(this);\n\n _this.triggerHandler('close.zf.trigger', [_this]);\n });\n });\n }\n }\n\n function resizeListener(debounce) {\n var timer = void 0,\n $nodes = $('[data-resize]');\n if ($nodes.length) {\n $(window).off('resize.zf.trigger').on('resize.zf.trigger', function (e) {\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(function () {\n\n if (!MutationObserver) {\n //fallback for IE 9\n $nodes.each(function () {\n $(this).triggerHandler('resizeme.zf.trigger');\n });\n }\n //trigger all listening elements and signal a resize event\n $nodes.attr('data-events', \"resize\");\n }, debounce || 10); //default time to emit resize event\n });\n }\n }\n\n function scrollListener(debounce) {\n var timer = void 0,\n $nodes = $('[data-scroll]');\n if ($nodes.length) {\n $(window).off('scroll.zf.trigger').on('scroll.zf.trigger', function (e) {\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(function () {\n\n if (!MutationObserver) {\n //fallback for IE 9\n $nodes.each(function () {\n $(this).triggerHandler('scrollme.zf.trigger');\n });\n }\n //trigger all listening elements and signal a scroll event\n $nodes.attr('data-events', \"scroll\");\n }, debounce || 10); //default time to emit scroll event\n });\n }\n }\n\n function eventsListener() {\n if (!MutationObserver) {\n return false;\n }\n var nodes = document.querySelectorAll('[data-resize], [data-scroll], [data-mutate]');\n\n //element callback\n var listeningElementsMutation = function listeningElementsMutation(mutationRecordsList) {\n var $target = $(mutationRecordsList[0].target);\n\n //trigger the event handler for the element depending on type\n switch (mutationRecordsList[0].type) {\n\n case \"attributes\":\n if ($target.attr(\"data-events\") === \"scroll\" && mutationRecordsList[0].attributeName === \"data-events\") {\n $target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]);\n }\n if ($target.attr(\"data-events\") === \"resize\" && mutationRecordsList[0].attributeName === \"data-events\") {\n $target.triggerHandler('resizeme.zf.trigger', [$target]);\n }\n if (mutationRecordsList[0].attributeName === \"style\") {\n $target.closest(\"[data-mutate]\").attr(\"data-events\", \"mutate\");\n $target.closest(\"[data-mutate]\").triggerHandler('mutateme.zf.trigger', [$target.closest(\"[data-mutate]\")]);\n }\n break;\n\n case \"childList\":\n $target.closest(\"[data-mutate]\").attr(\"data-events\", \"mutate\");\n $target.closest(\"[data-mutate]\").triggerHandler('mutateme.zf.trigger', [$target.closest(\"[data-mutate]\")]);\n break;\n\n default:\n return false;\n //nothing\n }\n };\n\n if (nodes.length) {\n //for each element that needs to listen for resizing, scrolling, or mutation add a single observer\n for (var i = 0; i <= nodes.length - 1; i++) {\n var elementObserver = new MutationObserver(listeningElementsMutation);\n elementObserver.observe(nodes[i], { attributes: true, childList: true, characterData: false, subtree: true, attributeFilter: [\"data-events\", \"style\"] });\n }\n }\n }\n\n // ------------------------------------\n\n // [PH]\n // Foundation.CheckWatchers = checkWatchers;\n Foundation.IHearYou = checkListeners;\n // Foundation.ISeeYou = scrollListener;\n // Foundation.IFeelYou = closemeListener;\n}(jQuery);\n'use strict';\n\n!function ($) {\n\n /**\n * Motion module.\n * @module foundation.motion\n */\n\n var initClasses = ['mui-enter', 'mui-leave'];\n var activeClasses = ['mui-enter-active', 'mui-leave-active'];\n\n var Motion = {\n animateIn: function animateIn(element, animation, cb) {\n animate(true, element, animation, cb);\n },\n\n animateOut: function animateOut(element, animation, cb) {\n animate(false, element, animation, cb);\n }\n };\n\n function Move(duration, elem, fn) {\n var anim,\n prog,\n start = null;\n // console.log('called');\n\n if (duration === 0) {\n fn.apply(elem);\n elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]);\n return;\n }\n\n function move(ts) {\n if (!start) start = ts;\n // console.log(start, ts);\n prog = ts - start;\n fn.apply(elem);\n\n if (prog < duration) {\n anim = window.requestAnimationFrame(move, elem);\n } else {\n window.cancelAnimationFrame(anim);\n elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]);\n }\n }\n anim = window.requestAnimationFrame(move);\n }\n\n /**\n * Animates an element in or out using a CSS transition class.\n * @function\n * @private\n * @param {Boolean} isIn - Defines if the animation is in or out.\n * @param {Object} element - jQuery or HTML object to animate.\n * @param {String} animation - CSS class to use.\n * @param {Function} cb - Callback to run when animation is finished.\n */\n function animate(isIn, element, animation, cb) {\n element = $(element).eq(0);\n\n if (!element.length) return;\n\n var initClass = isIn ? initClasses[0] : initClasses[1];\n var activeClass = isIn ? activeClasses[0] : activeClasses[1];\n\n // Set up the animation\n reset();\n\n element.addClass(animation).css('transition', 'none');\n\n requestAnimationFrame(function () {\n element.addClass(initClass);\n if (isIn) element.show();\n });\n\n // Start the animation\n requestAnimationFrame(function () {\n element[0].offsetWidth;\n element.css('transition', '').addClass(activeClass);\n });\n\n // Clean up the animation when it finishes\n element.one(Foundation.transitionend(element), finish);\n\n // Hides the element (for out animations), resets the element, and runs a callback\n function finish() {\n if (!isIn) element.hide();\n reset();\n if (cb) cb.apply(element);\n }\n\n // Resets transitions and removes motion-specific classes\n function reset() {\n element[0].style.transitionDuration = 0;\n element.removeClass(initClass + ' ' + activeClass + ' ' + animation);\n }\n }\n\n Foundation.Move = Move;\n Foundation.Motion = Motion;\n}(jQuery);\n'use strict';\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n!function ($) {\n\n /**\n * DropdownMenu module.\n * @module foundation.dropdown-menu\n * @requires foundation.util.keyboard\n * @requires foundation.util.box\n * @requires foundation.util.nest\n */\n\n var DropdownMenu = function () {\n /**\n * Creates a new instance of DropdownMenu.\n * @class\n * @fires DropdownMenu#init\n * @param {jQuery} element - jQuery object to make into a dropdown menu.\n * @param {Object} options - Overrides to the default plugin settings.\n */\n function DropdownMenu(element, options) {\n _classCallCheck(this, DropdownMenu);\n\n this.$element = element;\n this.options = $.extend({}, DropdownMenu.defaults, this.$element.data(), options);\n\n Foundation.Nest.Feather(this.$element, 'dropdown');\n this._init();\n\n Foundation.registerPlugin(this, 'DropdownMenu');\n Foundation.Keyboard.register('DropdownMenu', {\n 'ENTER': 'open',\n 'SPACE': 'open',\n 'ARROW_RIGHT': 'next',\n 'ARROW_UP': 'up',\n 'ARROW_DOWN': 'down',\n 'ARROW_LEFT': 'previous',\n 'ESCAPE': 'close'\n });\n }\n\n /**\n * Initializes the plugin, and calls _prepareMenu\n * @private\n * @function\n */\n\n\n _createClass(DropdownMenu, [{\n key: '_init',\n value: function _init() {\n var subs = this.$element.find('li.is-dropdown-submenu-parent');\n this.$element.children('.is-dropdown-submenu-parent').children('.is-dropdown-submenu').addClass('first-sub');\n\n this.$menuItems = this.$element.find('[role=\"menuitem\"]');\n this.$tabs = this.$element.children('[role=\"menuitem\"]');\n this.$tabs.find('ul.is-dropdown-submenu').addClass(this.options.verticalClass);\n\n if (this.$element.hasClass(this.options.rightClass) || this.options.alignment === 'right' || Foundation.rtl() || this.$element.parents('.top-bar-right').is('*')) {\n this.options.alignment = 'right';\n subs.addClass('opens-left');\n } else {\n subs.addClass('opens-right');\n }\n this.changed = false;\n this._events();\n }\n }, {\n key: '_isVertical',\n value: function _isVertical() {\n return this.$tabs.css('display') === 'block';\n }\n\n /**\n * Adds event listeners to elements within the menu\n * @private\n * @function\n */\n\n }, {\n key: '_events',\n value: function _events() {\n var _this = this,\n hasTouch = 'ontouchstart' in window || typeof window.ontouchstart !== 'undefined',\n parClass = 'is-dropdown-submenu-parent';\n\n // used for onClick and in the keyboard handlers\n var handleClickFn = function handleClickFn(e) {\n var $elem = $(e.target).parentsUntil('ul', '.' + parClass),\n hasSub = $elem.hasClass(parClass),\n hasClicked = $elem.attr('data-is-click') === 'true',\n $sub = $elem.children('.is-dropdown-submenu');\n\n if (hasSub) {\n if (hasClicked) {\n if (!_this.options.closeOnClick || !_this.options.clickOpen && !hasTouch || _this.options.forceFollow && hasTouch) {\n return;\n } else {\n e.stopImmediatePropagation();\n e.preventDefault();\n _this._hide($elem);\n }\n } else {\n e.preventDefault();\n e.stopImmediatePropagation();\n _this._show($sub);\n $elem.add($elem.parentsUntil(_this.$element, '.' + parClass)).attr('data-is-click', true);\n }\n }\n };\n\n if (this.options.clickOpen || hasTouch) {\n this.$menuItems.on('click.zf.dropdownmenu touchstart.zf.dropdownmenu', handleClickFn);\n }\n\n // Handle Leaf element Clicks\n if (_this.options.closeOnClickInside) {\n this.$menuItems.on('click.zf.dropdownmenu', function (e) {\n var $elem = $(this),\n hasSub = $elem.hasClass(parClass);\n if (!hasSub) {\n _this._hide();\n }\n });\n }\n\n if (!this.options.disableHover) {\n this.$menuItems.on('mouseenter.zf.dropdownmenu', function (e) {\n var $elem = $(this),\n hasSub = $elem.hasClass(parClass);\n\n if (hasSub) {\n clearTimeout($elem.data('_delay'));\n $elem.data('_delay', setTimeout(function () {\n _this._show($elem.children('.is-dropdown-submenu'));\n }, _this.options.hoverDelay));\n }\n }).on('mouseleave.zf.dropdownmenu', function (e) {\n var $elem = $(this),\n hasSub = $elem.hasClass(parClass);\n if (hasSub && _this.options.autoclose) {\n if ($elem.attr('data-is-click') === 'true' && _this.options.clickOpen) {\n return false;\n }\n\n clearTimeout($elem.data('_delay'));\n $elem.data('_delay', setTimeout(function () {\n _this._hide($elem);\n }, _this.options.closingTime));\n }\n });\n }\n this.$menuItems.on('keydown.zf.dropdownmenu', function (e) {\n var $element = $(e.target).parentsUntil('ul', '[role=\"menuitem\"]'),\n isTab = _this.$tabs.index($element) > -1,\n $elements = isTab ? _this.$tabs : $element.siblings('li').add($element),\n $prevElement,\n $nextElement;\n\n $elements.each(function (i) {\n if ($(this).is($element)) {\n $prevElement = $elements.eq(i - 1);\n $nextElement = $elements.eq(i + 1);\n return;\n }\n });\n\n var nextSibling = function nextSibling() {\n if (!$element.is(':last-child')) {\n $nextElement.children('a:first').focus();\n e.preventDefault();\n }\n },\n prevSibling = function prevSibling() {\n $prevElement.children('a:first').focus();\n e.preventDefault();\n },\n openSub = function openSub() {\n var $sub = $element.children('ul.is-dropdown-submenu');\n if ($sub.length) {\n _this._show($sub);\n $element.find('li > a:first').focus();\n e.preventDefault();\n } else {\n return;\n }\n },\n closeSub = function closeSub() {\n //if ($element.is(':first-child')) {\n var close = $element.parent('ul').parent('li');\n close.children('a:first').focus();\n _this._hide(close);\n e.preventDefault();\n //}\n };\n var functions = {\n open: openSub,\n close: function close() {\n _this._hide(_this.$element);\n _this.$menuItems.find('a:first').focus(); // focus to first element\n e.preventDefault();\n },\n handled: function handled() {\n e.stopImmediatePropagation();\n }\n };\n\n if (isTab) {\n if (_this._isVertical()) {\n // vertical menu\n if (Foundation.rtl()) {\n // right aligned\n $.extend(functions, {\n down: nextSibling,\n up: prevSibling,\n next: closeSub,\n previous: openSub\n });\n } else {\n // left aligned\n $.extend(functions, {\n down: nextSibling,\n up: prevSibling,\n next: openSub,\n previous: closeSub\n });\n }\n } else {\n // horizontal menu\n if (Foundation.rtl()) {\n // right aligned\n $.extend(functions, {\n next: prevSibling,\n previous: nextSibling,\n down: openSub,\n up: closeSub\n });\n } else {\n // left aligned\n $.extend(functions, {\n next: nextSibling,\n previous: prevSibling,\n down: openSub,\n up: closeSub\n });\n }\n }\n } else {\n // not tabs -> one sub\n if (Foundation.rtl()) {\n // right aligned\n $.extend(functions, {\n next: closeSub,\n previous: openSub,\n down: nextSibling,\n up: prevSibling\n });\n } else {\n // left aligned\n $.extend(functions, {\n next: openSub,\n previous: closeSub,\n down: nextSibling,\n up: prevSibling\n });\n }\n }\n Foundation.Keyboard.handleKey(e, 'DropdownMenu', functions);\n });\n }\n\n /**\n * Adds an event handler to the body to close any dropdowns on a click.\n * @function\n * @private\n */\n\n }, {\n key: '_addBodyHandler',\n value: function _addBodyHandler() {\n var $body = $(document.body),\n _this = this;\n $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu').on('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu', function (e) {\n var $link = _this.$element.find(e.target);\n if ($link.length) {\n return;\n }\n\n _this._hide();\n $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu');\n });\n }\n\n /**\n * Opens a dropdown pane, and checks for collisions first.\n * @param {jQuery} $sub - ul element that is a submenu to show\n * @function\n * @private\n * @fires DropdownMenu#show\n */\n\n }, {\n key: '_show',\n value: function _show($sub) {\n var idx = this.$tabs.index(this.$tabs.filter(function (i, el) {\n return $(el).find($sub).length > 0;\n }));\n var $sibs = $sub.parent('li.is-dropdown-submenu-parent').siblings('li.is-dropdown-submenu-parent');\n this._hide($sibs, idx);\n $sub.css('visibility', 'hidden').addClass('js-dropdown-active').parent('li.is-dropdown-submenu-parent').addClass('is-active');\n var clear = Foundation.Box.ImNotTouchingYou($sub, null, true);\n if (!clear) {\n var oldClass = this.options.alignment === 'left' ? '-right' : '-left',\n $parentLi = $sub.parent('.is-dropdown-submenu-parent');\n $parentLi.removeClass('opens' + oldClass).addClass('opens-' + this.options.alignment);\n clear = Foundation.Box.ImNotTouchingYou($sub, null, true);\n if (!clear) {\n $parentLi.removeClass('opens-' + this.options.alignment).addClass('opens-inner');\n }\n this.changed = true;\n }\n $sub.css('visibility', '');\n if (this.options.closeOnClick) {\n this._addBodyHandler();\n }\n /**\n * Fires when the new dropdown pane is visible.\n * @event DropdownMenu#show\n */\n this.$element.trigger('show.zf.dropdownmenu', [$sub]);\n }\n\n /**\n * Hides a single, currently open dropdown pane, if passed a parameter, otherwise, hides everything.\n * @function\n * @param {jQuery} $elem - element with a submenu to hide\n * @param {Number} idx - index of the $tabs collection to hide\n * @private\n */\n\n }, {\n key: '_hide',\n value: function _hide($elem, idx) {\n var $toClose;\n if ($elem && $elem.length) {\n $toClose = $elem;\n } else if (idx !== undefined) {\n $toClose = this.$tabs.not(function (i, el) {\n return i === idx;\n });\n } else {\n $toClose = this.$element;\n }\n var somethingToClose = $toClose.hasClass('is-active') || $toClose.find('.is-active').length > 0;\n\n if (somethingToClose) {\n $toClose.find('li.is-active').add($toClose).attr({\n 'data-is-click': false\n }).removeClass('is-active');\n\n $toClose.find('ul.js-dropdown-active').removeClass('js-dropdown-active');\n\n if (this.changed || $toClose.find('opens-inner').length) {\n var oldClass = this.options.alignment === 'left' ? 'right' : 'left';\n $toClose.find('li.is-dropdown-submenu-parent').add($toClose).removeClass('opens-inner opens-' + this.options.alignment).addClass('opens-' + oldClass);\n this.changed = false;\n }\n /**\n * Fires when the open menus are closed.\n * @event DropdownMenu#hide\n */\n this.$element.trigger('hide.zf.dropdownmenu', [$toClose]);\n }\n }\n\n /**\n * Destroys the plugin.\n * @function\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n this.$menuItems.off('.zf.dropdownmenu').removeAttr('data-is-click').removeClass('is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner');\n $(document.body).off('.zf.dropdownmenu');\n Foundation.Nest.Burn(this.$element, 'dropdown');\n Foundation.unregisterPlugin(this);\n }\n }]);\n\n return DropdownMenu;\n }();\n\n /**\n * Default settings for plugin\n */\n\n\n DropdownMenu.defaults = {\n /**\n * Disallows hover events from opening submenus\n * @option\n * @type {boolean}\n * @default false\n */\n disableHover: false,\n /**\n * Allow a submenu to automatically close on a mouseleave event, if not clicked open.\n * @option\n * @type {boolean}\n * @default true\n */\n autoclose: true,\n /**\n * Amount of time to delay opening a submenu on hover event.\n * @option\n * @type {number}\n * @default 50\n */\n hoverDelay: 50,\n /**\n * Allow a submenu to open/remain open on parent click event. Allows cursor to move away from menu.\n * @option\n * @type {boolean}\n * @default false\n */\n clickOpen: false,\n /**\n * Amount of time to delay closing a submenu on a mouseleave event.\n * @option\n * @type {number}\n * @default 500\n */\n\n closingTime: 500,\n /**\n * Position of the menu relative to what direction the submenus should open. Handled by JS. Can be `'left'` or `'right'`.\n * @option\n * @type {string}\n * @default 'left'\n */\n alignment: 'left',\n /**\n * Allow clicks on the body to close any open submenus.\n * @option\n * @type {boolean}\n * @default true\n */\n closeOnClick: true,\n /**\n * Allow clicks on leaf anchor links to close any open submenus.\n * @option\n * @type {boolean}\n * @default true\n */\n closeOnClickInside: true,\n /**\n * Class applied to vertical oriented menus, Foundation default is `vertical`. Update this if using your own class.\n * @option\n * @type {string}\n * @default 'vertical'\n */\n verticalClass: 'vertical',\n /**\n * Class applied to right-side oriented menus, Foundation default is `align-right`. Update this if using your own class.\n * @option\n * @type {string}\n * @default 'align-right'\n */\n rightClass: 'align-right',\n /**\n * Boolean to force overide the clicking of links to perform default action, on second touch event for mobile.\n * @option\n * @type {boolean}\n * @default true\n */\n forceFollow: true\n };\n\n // Window exports\n Foundation.plugin(DropdownMenu, 'DropdownMenu');\n}(jQuery);\n'use strict';\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n!function ($) {\n\n /**\n * OffCanvas module.\n * @module foundation.offcanvas\n * @requires foundation.util.keyboard\n * @requires foundation.util.mediaQuery\n * @requires foundation.util.triggers\n * @requires foundation.util.motion\n */\n\n var OffCanvas = function () {\n /**\n * Creates a new instance of an off-canvas wrapper.\n * @class\n * @fires OffCanvas#init\n * @param {Object} element - jQuery object to initialize.\n * @param {Object} options - Overrides to the default plugin settings.\n */\n function OffCanvas(element, options) {\n _classCallCheck(this, OffCanvas);\n\n this.$element = element;\n this.options = $.extend({}, OffCanvas.defaults, this.$element.data(), options);\n this.$lastTrigger = $();\n this.$triggers = $();\n\n this._init();\n this._events();\n\n Foundation.registerPlugin(this, 'OffCanvas');\n Foundation.Keyboard.register('OffCanvas', {\n 'ESCAPE': 'close'\n });\n }\n\n /**\n * Initializes the off-canvas wrapper by adding the exit overlay (if needed).\n * @function\n * @private\n */\n\n\n _createClass(OffCanvas, [{\n key: '_init',\n value: function _init() {\n var id = this.$element.attr('id');\n\n this.$element.attr('aria-hidden', 'true');\n\n this.$element.addClass('is-transition-' + this.options.transition);\n\n // Find triggers that affect this element and add aria-expanded to them\n this.$triggers = $(document).find('[data-open=\"' + id + '\"], [data-close=\"' + id + '\"], [data-toggle=\"' + id + '\"]').attr('aria-expanded', 'false').attr('aria-controls', id);\n\n // Add an overlay over the content if necessary\n if (this.options.contentOverlay === true) {\n var overlay = document.createElement('div');\n var overlayPosition = $(this.$element).css(\"position\") === 'fixed' ? 'is-overlay-fixed' : 'is-overlay-absolute';\n overlay.setAttribute('class', 'js-off-canvas-overlay ' + overlayPosition);\n this.$overlay = $(overlay);\n if (overlayPosition === 'is-overlay-fixed') {\n $('body').append(this.$overlay);\n } else {\n this.$element.siblings('[data-off-canvas-content]').append(this.$overlay);\n }\n }\n\n this.options.isRevealed = this.options.isRevealed || new RegExp(this.options.revealClass, 'g').test(this.$element[0].className);\n\n if (this.options.isRevealed === true) {\n this.options.revealOn = this.options.revealOn || this.$element[0].className.match(/(reveal-for-medium|reveal-for-large)/g)[0].split('-')[2];\n this._setMQChecker();\n }\n if (!this.options.transitionTime === true) {\n this.options.transitionTime = parseFloat(window.getComputedStyle($('[data-off-canvas]')[0]).transitionDuration) * 1000;\n }\n }\n\n /**\n * Adds event handlers to the off-canvas wrapper and the exit overlay.\n * @function\n * @private\n */\n\n }, {\n key: '_events',\n value: function _events() {\n this.$element.off('.zf.trigger .zf.offcanvas').on({\n 'open.zf.trigger': this.open.bind(this),\n 'close.zf.trigger': this.close.bind(this),\n 'toggle.zf.trigger': this.toggle.bind(this),\n 'keydown.zf.offcanvas': this._handleKeyboard.bind(this)\n });\n\n if (this.options.closeOnClick === true) {\n var $target = this.options.contentOverlay ? this.$overlay : $('[data-off-canvas-content]');\n $target.on({ 'click.zf.offcanvas': this.close.bind(this) });\n }\n }\n\n /**\n * Applies event listener for elements that will reveal at certain breakpoints.\n * @private\n */\n\n }, {\n key: '_setMQChecker',\n value: function _setMQChecker() {\n var _this = this;\n\n $(window).on('changed.zf.mediaquery', function () {\n if (Foundation.MediaQuery.atLeast(_this.options.revealOn)) {\n _this.reveal(true);\n } else {\n _this.reveal(false);\n }\n }).one('load.zf.offcanvas', function () {\n if (Foundation.MediaQuery.atLeast(_this.options.revealOn)) {\n _this.reveal(true);\n }\n });\n }\n\n /**\n * Handles the revealing/hiding the off-canvas at breakpoints, not the same as open.\n * @param {Boolean} isRevealed - true if element should be revealed.\n * @function\n */\n\n }, {\n key: 'reveal',\n value: function reveal(isRevealed) {\n var $closer = this.$element.find('[data-close]');\n if (isRevealed) {\n this.close();\n this.isRevealed = true;\n this.$element.attr('aria-hidden', 'false');\n this.$element.off('open.zf.trigger toggle.zf.trigger');\n if ($closer.length) {\n $closer.hide();\n }\n } else {\n this.isRevealed = false;\n this.$element.attr('aria-hidden', 'true');\n this.$element.off('open.zf.trigger toggle.zf.trigger').on({\n 'open.zf.trigger': this.open.bind(this),\n 'toggle.zf.trigger': this.toggle.bind(this)\n });\n if ($closer.length) {\n $closer.show();\n }\n }\n }\n\n /**\n * Stops scrolling of the body when offcanvas is open on mobile Safari and other troublesome browsers.\n * @private\n */\n\n }, {\n key: '_stopScrolling',\n value: function _stopScrolling(event) {\n return false;\n }\n\n // Taken and adapted from http://stackoverflow.com/questions/16889447/prevent-full-page-scrolling-ios\n // Only really works for y, not sure how to extend to x or if we need to.\n\n }, {\n key: '_recordScrollable',\n value: function _recordScrollable(event) {\n var elem = this; // called from event handler context with this as elem\n\n // If the element is scrollable (content overflows), then...\n if (elem.scrollHeight !== elem.clientHeight) {\n // If we're at the top, scroll down one pixel to allow scrolling up\n if (elem.scrollTop === 0) {\n elem.scrollTop = 1;\n }\n // If we're at the bottom, scroll up one pixel to allow scrolling down\n if (elem.scrollTop === elem.scrollHeight - elem.clientHeight) {\n elem.scrollTop = elem.scrollHeight - elem.clientHeight - 1;\n }\n }\n elem.allowUp = elem.scrollTop > 0;\n elem.allowDown = elem.scrollTop < elem.scrollHeight - elem.clientHeight;\n elem.lastY = event.originalEvent.pageY;\n }\n }, {\n key: '_stopScrollPropagation',\n value: function _stopScrollPropagation(event) {\n var elem = this; // called from event handler context with this as elem\n var up = event.pageY < elem.lastY;\n var down = !up;\n elem.lastY = event.pageY;\n\n if (up && elem.allowUp || down && elem.allowDown) {\n event.stopPropagation();\n } else {\n event.preventDefault();\n }\n }\n\n /**\n * Opens the off-canvas menu.\n * @function\n * @param {Object} event - Event object passed from listener.\n * @param {jQuery} trigger - element that triggered the off-canvas to open.\n * @fires OffCanvas#opened\n */\n\n }, {\n key: 'open',\n value: function open(event, trigger) {\n if (this.$element.hasClass('is-open') || this.isRevealed) {\n return;\n }\n var _this = this;\n\n if (trigger) {\n this.$lastTrigger = trigger;\n }\n\n if (this.options.forceTo === 'top') {\n window.scrollTo(0, 0);\n } else if (this.options.forceTo === 'bottom') {\n window.scrollTo(0, document.body.scrollHeight);\n }\n\n /**\n * Fires when the off-canvas menu opens.\n * @event OffCanvas#opened\n */\n _this.$element.addClass('is-open');\n\n this.$triggers.attr('aria-expanded', 'true');\n this.$element.attr('aria-hidden', 'false').trigger('opened.zf.offcanvas');\n\n // If `contentScroll` is set to false, add class and disable scrolling on touch devices.\n if (this.options.contentScroll === false) {\n $('body').addClass('is-off-canvas-open').on('touchmove', this._stopScrolling);\n this.$element.on('touchstart', this._recordScrollable);\n this.$element.on('touchmove', this._stopScrollPropagation);\n }\n\n if (this.options.contentOverlay === true) {\n this.$overlay.addClass('is-visible');\n }\n\n if (this.options.closeOnClick === true && this.options.contentOverlay === true) {\n this.$overlay.addClass('is-closable');\n }\n\n if (this.options.autoFocus === true) {\n this.$element.one(Foundation.transitionend(this.$element), function () {\n var canvasFocus = _this.$element.find('[data-autofocus]');\n if (canvasFocus.length) {\n canvasFocus.eq(0).focus();\n } else {\n _this.$element.find('a, button').eq(0).focus();\n }\n });\n }\n\n if (this.options.trapFocus === true) {\n this.$element.siblings('[data-off-canvas-content]').attr('tabindex', '-1');\n Foundation.Keyboard.trapFocus(this.$element);\n }\n }\n\n /**\n * Closes the off-canvas menu.\n * @function\n * @param {Function} cb - optional cb to fire after closure.\n * @fires OffCanvas#closed\n */\n\n }, {\n key: 'close',\n value: function close(cb) {\n if (!this.$element.hasClass('is-open') || this.isRevealed) {\n return;\n }\n\n var _this = this;\n\n _this.$element.removeClass('is-open');\n\n this.$element.attr('aria-hidden', 'true')\n /**\n * Fires when the off-canvas menu opens.\n * @event OffCanvas#closed\n */\n .trigger('closed.zf.offcanvas');\n\n // If `contentScroll` is set to false, remove class and re-enable scrolling on touch devices.\n if (this.options.contentScroll === false) {\n $('body').removeClass('is-off-canvas-open').off('touchmove', this._stopScrolling);\n this.$element.off('touchstart', this._recordScrollable);\n this.$element.off('touchmove', this._stopScrollPropagation);\n }\n\n if (this.options.contentOverlay === true) {\n this.$overlay.removeClass('is-visible');\n }\n\n if (this.options.closeOnClick === true && this.options.contentOverlay === true) {\n this.$overlay.removeClass('is-closable');\n }\n\n this.$triggers.attr('aria-expanded', 'false');\n\n if (this.options.trapFocus === true) {\n this.$element.siblings('[data-off-canvas-content]').removeAttr('tabindex');\n Foundation.Keyboard.releaseFocus(this.$element);\n }\n }\n\n /**\n * Toggles the off-canvas menu open or closed.\n * @function\n * @param {Object} event - Event object passed from listener.\n * @param {jQuery} trigger - element that triggered the off-canvas to open.\n */\n\n }, {\n key: 'toggle',\n value: function toggle(event, trigger) {\n if (this.$element.hasClass('is-open')) {\n this.close(event, trigger);\n } else {\n this.open(event, trigger);\n }\n }\n\n /**\n * Handles keyboard input when detected. When the escape key is pressed, the off-canvas menu closes, and focus is restored to the element that opened the menu.\n * @function\n * @private\n */\n\n }, {\n key: '_handleKeyboard',\n value: function _handleKeyboard(e) {\n var _this2 = this;\n\n Foundation.Keyboard.handleKey(e, 'OffCanvas', {\n close: function close() {\n _this2.close();\n _this2.$lastTrigger.focus();\n return true;\n },\n handled: function handled() {\n e.stopPropagation();\n e.preventDefault();\n }\n });\n }\n\n /**\n * Destroys the offcanvas plugin.\n * @function\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n this.close();\n this.$element.off('.zf.trigger .zf.offcanvas');\n this.$overlay.off('.zf.offcanvas');\n\n Foundation.unregisterPlugin(this);\n }\n }]);\n\n return OffCanvas;\n }();\n\n OffCanvas.defaults = {\n /**\n * Allow the user to click outside of the menu to close it.\n * @option\n * @type {boolean}\n * @default true\n */\n closeOnClick: true,\n\n /**\n * Adds an overlay on top of `[data-off-canvas-content]`.\n * @option\n * @type {boolean}\n * @default true\n */\n contentOverlay: true,\n\n /**\n * Enable/disable scrolling of the main content when an off canvas panel is open.\n * @option\n * @type {boolean}\n * @default true\n */\n contentScroll: true,\n\n /**\n * Amount of time in ms the open and close transition requires. If none selected, pulls from body style.\n * @option\n * @type {number}\n * @default 0\n */\n transitionTime: 0,\n\n /**\n * Type of transition for the offcanvas menu. Options are 'push', 'detached' or 'slide'.\n * @option\n * @type {string}\n * @default push\n */\n transition: 'push',\n\n /**\n * Force the page to scroll to top or bottom on open.\n * @option\n * @type {?string}\n * @default null\n */\n forceTo: null,\n\n /**\n * Allow the offcanvas to remain open for certain breakpoints.\n * @option\n * @type {boolean}\n * @default false\n */\n isRevealed: false,\n\n /**\n * Breakpoint at which to reveal. JS will use a RegExp to target standard classes, if changing classnames, pass your class with the `revealClass` option.\n * @option\n * @type {?string}\n * @default null\n */\n revealOn: null,\n\n /**\n * Force focus to the offcanvas on open. If true, will focus the opening trigger on close.\n * @option\n * @type {boolean}\n * @default true\n */\n autoFocus: true,\n\n /**\n * Class used to force an offcanvas to remain open. Foundation defaults for this are `reveal-for-large` & `reveal-for-medium`.\n * @option\n * @type {string}\n * @default reveal-for-\n * @todo improve the regex testing for this.\n */\n revealClass: 'reveal-for-',\n\n /**\n * Triggers optional focus trapping when opening an offcanvas. Sets tabindex of [data-off-canvas-content] to -1 for accessibility purposes.\n * @option\n * @type {boolean}\n * @default false\n */\n trapFocus: false\n\n // Window exports\n };Foundation.plugin(OffCanvas, 'OffCanvas');\n}(jQuery);\n'use strict';\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n!function ($) {\n\n /**\n * Sticky module.\n * @module foundation.sticky\n * @requires foundation.util.triggers\n * @requires foundation.util.mediaQuery\n */\n\n var Sticky = function () {\n /**\n * Creates a new instance of a sticky thing.\n * @class\n * @param {jQuery} element - jQuery object to make sticky.\n * @param {Object} options - options object passed when creating the element programmatically.\n */\n function Sticky(element, options) {\n _classCallCheck(this, Sticky);\n\n this.$element = element;\n this.options = $.extend({}, Sticky.defaults, this.$element.data(), options);\n\n this._init();\n\n Foundation.registerPlugin(this, 'Sticky');\n }\n\n /**\n * Initializes the sticky element by adding classes, getting/setting dimensions, breakpoints and attributes\n * @function\n * @private\n */\n\n\n _createClass(Sticky, [{\n key: '_init',\n value: function _init() {\n var $parent = this.$element.parent('[data-sticky-container]'),\n id = this.$element[0].id || Foundation.GetYoDigits(6, 'sticky'),\n _this = this;\n\n if (!$parent.length) {\n this.wasWrapped = true;\n }\n this.$container = $parent.length ? $parent : $(this.options.container).wrapInner(this.$element);\n this.$container.addClass(this.options.containerClass);\n\n this.$element.addClass(this.options.stickyClass).attr({ 'data-resize': id, 'data-mutate': id });\n if (this.options.anchor !== '') {\n $('#' + _this.options.anchor).attr({ 'data-mutate': id });\n }\n\n this.scrollCount = this.options.checkEvery;\n this.isStuck = false;\n $(window).one('load.zf.sticky', function () {\n //We calculate the container height to have correct values for anchor points offset calculation.\n _this.containerHeight = _this.$element.css(\"display\") == \"none\" ? 0 : _this.$element[0].getBoundingClientRect().height;\n _this.$container.css('height', _this.containerHeight);\n _this.elemHeight = _this.containerHeight;\n if (_this.options.anchor !== '') {\n _this.$anchor = $('#' + _this.options.anchor);\n } else {\n _this._parsePoints();\n }\n\n _this._setSizes(function () {\n var scroll = window.pageYOffset;\n _this._calc(false, scroll);\n //Unstick the element will ensure that proper classes are set.\n if (!_this.isStuck) {\n _this._removeSticky(scroll >= _this.topPoint ? false : true);\n }\n });\n _this._events(id.split('-').reverse().join('-'));\n });\n }\n\n /**\n * If using multiple elements as anchors, calculates the top and bottom pixel values the sticky thing should stick and unstick on.\n * @function\n * @private\n */\n\n }, {\n key: '_parsePoints',\n value: function _parsePoints() {\n var top = this.options.topAnchor == \"\" ? 1 : this.options.topAnchor,\n btm = this.options.btmAnchor == \"\" ? document.documentElement.scrollHeight : this.options.btmAnchor,\n pts = [top, btm],\n breaks = {};\n for (var i = 0, len = pts.length; i < len && pts[i]; i++) {\n var pt;\n if (typeof pts[i] === 'number') {\n pt = pts[i];\n } else {\n var place = pts[i].split(':'),\n anchor = $('#' + place[0]);\n\n pt = anchor.offset().top;\n if (place[1] && place[1].toLowerCase() === 'bottom') {\n pt += anchor[0].getBoundingClientRect().height;\n }\n }\n breaks[i] = pt;\n }\n\n this.points = breaks;\n return;\n }\n\n /**\n * Adds event handlers for the scrolling element.\n * @private\n * @param {String} id - psuedo-random id for unique scroll event listener.\n */\n\n }, {\n key: '_events',\n value: function _events(id) {\n var _this = this,\n scrollListener = this.scrollListener = 'scroll.zf.' + id;\n if (this.isOn) {\n return;\n }\n if (this.canStick) {\n this.isOn = true;\n $(window).off(scrollListener).on(scrollListener, function (e) {\n if (_this.scrollCount === 0) {\n _this.scrollCount = _this.options.checkEvery;\n _this._setSizes(function () {\n _this._calc(false, window.pageYOffset);\n });\n } else {\n _this.scrollCount--;\n _this._calc(false, window.pageYOffset);\n }\n });\n }\n\n this.$element.off('resizeme.zf.trigger').on('resizeme.zf.trigger', function (e, el) {\n _this._eventsHandler(id);\n });\n\n this.$element.on('mutateme.zf.trigger', function (e, el) {\n _this._eventsHandler(id);\n });\n\n if (this.$anchor) {\n this.$anchor.on('mutateme.zf.trigger', function (e, el) {\n _this._eventsHandler(id);\n });\n }\n }\n\n /**\n * Handler for events.\n * @private\n * @param {String} id - psuedo-random id for unique scroll event listener.\n */\n\n }, {\n key: '_eventsHandler',\n value: function _eventsHandler(id) {\n var _this = this,\n scrollListener = this.scrollListener = 'scroll.zf.' + id;\n\n _this._setSizes(function () {\n _this._calc(false);\n if (_this.canStick) {\n if (!_this.isOn) {\n _this._events(id);\n }\n } else if (_this.isOn) {\n _this._pauseListeners(scrollListener);\n }\n });\n }\n\n /**\n * Removes event handlers for scroll and change events on anchor.\n * @fires Sticky#pause\n * @param {String} scrollListener - unique, namespaced scroll listener attached to `window`\n */\n\n }, {\n key: '_pauseListeners',\n value: function _pauseListeners(scrollListener) {\n this.isOn = false;\n $(window).off(scrollListener);\n\n /**\n * Fires when the plugin is paused due to resize event shrinking the view.\n * @event Sticky#pause\n * @private\n */\n this.$element.trigger('pause.zf.sticky');\n }\n\n /**\n * Called on every `scroll` event and on `_init`\n * fires functions based on booleans and cached values\n * @param {Boolean} checkSizes - true if plugin should recalculate sizes and breakpoints.\n * @param {Number} scroll - current scroll position passed from scroll event cb function. If not passed, defaults to `window.pageYOffset`.\n */\n\n }, {\n key: '_calc',\n value: function _calc(checkSizes, scroll) {\n if (checkSizes) {\n this._setSizes();\n }\n\n if (!this.canStick) {\n if (this.isStuck) {\n this._removeSticky(true);\n }\n return false;\n }\n\n if (!scroll) {\n scroll = window.pageYOffset;\n }\n\n if (scroll >= this.topPoint) {\n if (scroll <= this.bottomPoint) {\n if (!this.isStuck) {\n this._setSticky();\n }\n } else {\n if (this.isStuck) {\n this._removeSticky(false);\n }\n }\n } else {\n if (this.isStuck) {\n this._removeSticky(true);\n }\n }\n }\n\n /**\n * Causes the $element to become stuck.\n * Adds `position: fixed;`, and helper classes.\n * @fires Sticky#stuckto\n * @function\n * @private\n */\n\n }, {\n key: '_setSticky',\n value: function _setSticky() {\n var _this = this,\n stickTo = this.options.stickTo,\n mrgn = stickTo === 'top' ? 'marginTop' : 'marginBottom',\n notStuckTo = stickTo === 'top' ? 'bottom' : 'top',\n css = {};\n\n css[mrgn] = this.options[mrgn] + 'em';\n css[stickTo] = 0;\n css[notStuckTo] = 'auto';\n this.isStuck = true;\n this.$element.removeClass('is-anchored is-at-' + notStuckTo).addClass('is-stuck is-at-' + stickTo).css(css)\n /**\n * Fires when the $element has become `position: fixed;`\n * Namespaced to `top` or `bottom`, e.g. `sticky.zf.stuckto:top`\n * @event Sticky#stuckto\n */\n .trigger('sticky.zf.stuckto:' + stickTo);\n this.$element.on(\"transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd\", function () {\n _this._setSizes();\n });\n }\n\n /**\n * Causes the $element to become unstuck.\n * Removes `position: fixed;`, and helper classes.\n * Adds other helper classes.\n * @param {Boolean} isTop - tells the function if the $element should anchor to the top or bottom of its $anchor element.\n * @fires Sticky#unstuckfrom\n * @private\n */\n\n }, {\n key: '_removeSticky',\n value: function _removeSticky(isTop) {\n var stickTo = this.options.stickTo,\n stickToTop = stickTo === 'top',\n css = {},\n anchorPt = (this.points ? this.points[1] - this.points[0] : this.anchorHeight) - this.elemHeight,\n mrgn = stickToTop ? 'marginTop' : 'marginBottom',\n notStuckTo = stickToTop ? 'bottom' : 'top',\n topOrBottom = isTop ? 'top' : 'bottom';\n\n css[mrgn] = 0;\n\n css['bottom'] = 'auto';\n if (isTop) {\n css['top'] = 0;\n } else {\n css['top'] = anchorPt;\n }\n\n this.isStuck = false;\n this.$element.removeClass('is-stuck is-at-' + stickTo).addClass('is-anchored is-at-' + topOrBottom).css(css)\n /**\n * Fires when the $element has become anchored.\n * Namespaced to `top` or `bottom`, e.g. `sticky.zf.unstuckfrom:bottom`\n * @event Sticky#unstuckfrom\n */\n .trigger('sticky.zf.unstuckfrom:' + topOrBottom);\n }\n\n /**\n * Sets the $element and $container sizes for plugin.\n * Calls `_setBreakPoints`.\n * @param {Function} cb - optional callback function to fire on completion of `_setBreakPoints`.\n * @private\n */\n\n }, {\n key: '_setSizes',\n value: function _setSizes(cb) {\n this.canStick = Foundation.MediaQuery.is(this.options.stickyOn);\n if (!this.canStick) {\n if (cb && typeof cb === 'function') {\n cb();\n }\n }\n var _this = this,\n newElemWidth = this.$container[0].getBoundingClientRect().width,\n comp = window.getComputedStyle(this.$container[0]),\n pdngl = parseInt(comp['padding-left'], 10),\n pdngr = parseInt(comp['padding-right'], 10);\n\n if (this.$anchor && this.$anchor.length) {\n this.anchorHeight = this.$anchor[0].getBoundingClientRect().height;\n } else {\n this._parsePoints();\n }\n\n this.$element.css({\n 'max-width': newElemWidth - pdngl - pdngr + 'px'\n });\n\n var newContainerHeight = this.$element[0].getBoundingClientRect().height || this.containerHeight;\n if (this.$element.css(\"display\") == \"none\") {\n newContainerHeight = 0;\n }\n this.containerHeight = newContainerHeight;\n this.$container.css({\n height: newContainerHeight\n });\n this.elemHeight = newContainerHeight;\n\n if (!this.isStuck) {\n if (this.$element.hasClass('is-at-bottom')) {\n var anchorPt = (this.points ? this.points[1] - this.$container.offset().top : this.anchorHeight) - this.elemHeight;\n this.$element.css('top', anchorPt);\n }\n }\n\n this._setBreakPoints(newContainerHeight, function () {\n if (cb && typeof cb === 'function') {\n cb();\n }\n });\n }\n\n /**\n * Sets the upper and lower breakpoints for the element to become sticky/unsticky.\n * @param {Number} elemHeight - px value for sticky.$element height, calculated by `_setSizes`.\n * @param {Function} cb - optional callback function to be called on completion.\n * @private\n */\n\n }, {\n key: '_setBreakPoints',\n value: function _setBreakPoints(elemHeight, cb) {\n if (!this.canStick) {\n if (cb && typeof cb === 'function') {\n cb();\n } else {\n return false;\n }\n }\n var mTop = emCalc(this.options.marginTop),\n mBtm = emCalc(this.options.marginBottom),\n topPoint = this.points ? this.points[0] : this.$anchor.offset().top,\n bottomPoint = this.points ? this.points[1] : topPoint + this.anchorHeight,\n\n // topPoint = this.$anchor.offset().top || this.points[0],\n // bottomPoint = topPoint + this.anchorHeight || this.points[1],\n winHeight = window.innerHeight;\n\n if (this.options.stickTo === 'top') {\n topPoint -= mTop;\n bottomPoint -= elemHeight + mTop;\n } else if (this.options.stickTo === 'bottom') {\n topPoint -= winHeight - (elemHeight + mBtm);\n bottomPoint -= winHeight - mBtm;\n } else {\n //this would be the stickTo: both option... tricky\n }\n\n this.topPoint = topPoint;\n this.bottomPoint = bottomPoint;\n\n if (cb && typeof cb === 'function') {\n cb();\n }\n }\n\n /**\n * Destroys the current sticky element.\n * Resets the element to the top position first.\n * Removes event listeners, JS-added css properties and classes, and unwraps the $element if the JS added the $container.\n * @function\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n this._removeSticky(true);\n\n this.$element.removeClass(this.options.stickyClass + ' is-anchored is-at-top').css({\n height: '',\n top: '',\n bottom: '',\n 'max-width': ''\n }).off('resizeme.zf.trigger').off('mutateme.zf.trigger');\n if (this.$anchor && this.$anchor.length) {\n this.$anchor.off('change.zf.sticky');\n }\n $(window).off(this.scrollListener);\n\n if (this.wasWrapped) {\n this.$element.unwrap();\n } else {\n this.$container.removeClass(this.options.containerClass).css({\n height: ''\n });\n }\n Foundation.unregisterPlugin(this);\n }\n }]);\n\n return Sticky;\n }();\n\n Sticky.defaults = {\n /**\n * Customizable container template. Add your own classes for styling and sizing.\n * @option\n * @type {string}\n * @default '<div data-sticky-container></div>'\n */\n container: '<div data-sticky-container></div>',\n /**\n * Location in the view the element sticks to. Can be `'top'` or `'bottom'`.\n * @option\n * @type {string}\n * @default 'top'\n */\n stickTo: 'top',\n /**\n * If anchored to a single element, the id of that element.\n * @option\n * @type {string}\n * @default ''\n */\n anchor: '',\n /**\n * If using more than one element as anchor points, the id of the top anchor.\n * @option\n * @type {string}\n * @default ''\n */\n topAnchor: '',\n /**\n * If using more than one element as anchor points, the id of the bottom anchor.\n * @option\n * @type {string}\n * @default ''\n */\n btmAnchor: '',\n /**\n * Margin, in `em`'s to apply to the top of the element when it becomes sticky.\n * @option\n * @type {number}\n * @default 1\n */\n marginTop: 1,\n /**\n * Margin, in `em`'s to apply to the bottom of the element when it becomes sticky.\n * @option\n * @type {number}\n * @default 1\n */\n marginBottom: 1,\n /**\n * Breakpoint string that is the minimum screen size an element should become sticky.\n * @option\n * @type {string}\n * @default 'medium'\n */\n stickyOn: 'medium',\n /**\n * Class applied to sticky element, and removed on destruction. Foundation defaults to `sticky`.\n * @option\n * @type {string}\n * @default 'sticky'\n */\n stickyClass: 'sticky',\n /**\n * Class applied to sticky container. Foundation defaults to `sticky-container`.\n * @option\n * @type {string}\n * @default 'sticky-container'\n */\n containerClass: 'sticky-container',\n /**\n * Number of scroll events between the plugin's recalculating sticky points. Setting it to `0` will cause it to recalc every scroll event, setting it to `-1` will prevent recalc on scroll.\n * @option\n * @type {number}\n * @default -1\n */\n checkEvery: -1\n };\n\n /**\n * Helper function to calculate em values\n * @param Number {em} - number of em's to calculate into pixels\n */\n function emCalc(em) {\n return parseInt(window.getComputedStyle(document.body, null).fontSize, 10) * em;\n }\n\n // Window exports\n Foundation.plugin(Sticky, 'Sticky');\n}(jQuery);\n'use strict';\n\n!function ($) {\n\n function Timer(elem, options, cb) {\n var _this = this,\n duration = options.duration,\n //options is an object for easily adding features later.\n nameSpace = Object.keys(elem.data())[0] || 'timer',\n remain = -1,\n start,\n timer;\n\n this.isPaused = false;\n\n this.restart = function () {\n remain = -1;\n clearTimeout(timer);\n this.start();\n };\n\n this.start = function () {\n this.isPaused = false;\n // if(!elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things.\n clearTimeout(timer);\n remain = remain <= 0 ? duration : remain;\n elem.data('paused', false);\n start = Date.now();\n timer = setTimeout(function () {\n if (options.infinite) {\n _this.restart(); //rerun the timer.\n }\n if (cb && typeof cb === 'function') {\n cb();\n }\n }, remain);\n elem.trigger('timerstart.zf.' + nameSpace);\n };\n\n this.pause = function () {\n this.isPaused = true;\n //if(elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things.\n clearTimeout(timer);\n elem.data('paused', true);\n var end = Date.now();\n remain = remain - (end - start);\n elem.trigger('timerpaused.zf.' + nameSpace);\n };\n }\n\n /**\n * Runs a callback function when images are fully loaded.\n * @param {Object} images - Image(s) to check if loaded.\n * @param {Func} callback - Function to execute when image is fully loaded.\n */\n function onImagesLoaded(images, callback) {\n var self = this,\n unloaded = images.length;\n\n if (unloaded === 0) {\n callback();\n }\n\n images.each(function () {\n // Check if image is loaded\n if (this.complete || this.readyState === 4 || this.readyState === 'complete') {\n singleImageLoaded();\n }\n // Force load the image\n else {\n // fix for IE. See https://css-tricks.com/snippets/jquery/fixing-load-in-ie-for-cached-images/\n var src = $(this).attr('src');\n $(this).attr('src', src + (src.indexOf('?') >= 0 ? '&' : '?') + new Date().getTime());\n $(this).one('load', function () {\n singleImageLoaded();\n });\n }\n });\n\n function singleImageLoaded() {\n unloaded--;\n if (unloaded === 0) {\n callback();\n }\n }\n }\n\n Foundation.Timer = Timer;\n Foundation.onImagesLoaded = onImagesLoaded;\n}(jQuery);\n'use strict';\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n!function ($) {\n\n /**\n * Equalizer module.\n * @module foundation.equalizer\n * @requires foundation.util.mediaQuery\n * @requires foundation.util.timerAndImageLoader if equalizer contains images\n */\n\n var Equalizer = function () {\n /**\n * Creates a new instance of Equalizer.\n * @class\n * @fires Equalizer#init\n * @param {Object} element - jQuery object to add the trigger to.\n * @param {Object} options - Overrides to the default plugin settings.\n */\n function Equalizer(element, options) {\n _classCallCheck(this, Equalizer);\n\n this.$element = element;\n this.options = $.extend({}, Equalizer.defaults, this.$element.data(), options);\n\n this._init();\n\n Foundation.registerPlugin(this, 'Equalizer');\n }\n\n /**\n * Initializes the Equalizer plugin and calls functions to get equalizer functioning on load.\n * @private\n */\n\n\n _createClass(Equalizer, [{\n key: '_init',\n value: function _init() {\n var eqId = this.$element.attr('data-equalizer') || '';\n var $watched = this.$element.find('[data-equalizer-watch=\"' + eqId + '\"]');\n\n this.$watched = $watched.length ? $watched : this.$element.find('[data-equalizer-watch]');\n this.$element.attr('data-resize', eqId || Foundation.GetYoDigits(6, 'eq'));\n this.$element.attr('data-mutate', eqId || Foundation.GetYoDigits(6, 'eq'));\n\n this.hasNested = this.$element.find('[data-equalizer]').length > 0;\n this.isNested = this.$element.parentsUntil(document.body, '[data-equalizer]').length > 0;\n this.isOn = false;\n this._bindHandler = {\n onResizeMeBound: this._onResizeMe.bind(this),\n onPostEqualizedBound: this._onPostEqualized.bind(this)\n };\n\n var imgs = this.$element.find('img');\n var tooSmall;\n if (this.options.equalizeOn) {\n tooSmall = this._checkMQ();\n $(window).on('changed.zf.mediaquery', this._checkMQ.bind(this));\n } else {\n this._events();\n }\n if (tooSmall !== undefined && tooSmall === false || tooSmall === undefined) {\n if (imgs.length) {\n Foundation.onImagesLoaded(imgs, this._reflow.bind(this));\n } else {\n this._reflow();\n }\n }\n }\n\n /**\n * Removes event listeners if the breakpoint is too small.\n * @private\n */\n\n }, {\n key: '_pauseEvents',\n value: function _pauseEvents() {\n this.isOn = false;\n this.$element.off({\n '.zf.equalizer': this._bindHandler.onPostEqualizedBound,\n 'resizeme.zf.trigger': this._bindHandler.onResizeMeBound,\n 'mutateme.zf.trigger': this._bindHandler.onResizeMeBound\n });\n }\n\n /**\n * function to handle $elements resizeme.zf.trigger, with bound this on _bindHandler.onResizeMeBound\n * @private\n */\n\n }, {\n key: '_onResizeMe',\n value: function _onResizeMe(e) {\n this._reflow();\n }\n\n /**\n * function to handle $elements postequalized.zf.equalizer, with bound this on _bindHandler.onPostEqualizedBound\n * @private\n */\n\n }, {\n key: '_onPostEqualized',\n value: function _onPostEqualized(e) {\n if (e.target !== this.$element[0]) {\n this._reflow();\n }\n }\n\n /**\n * Initializes events for Equalizer.\n * @private\n */\n\n }, {\n key: '_events',\n value: function _events() {\n var _this = this;\n this._pauseEvents();\n if (this.hasNested) {\n this.$element.on('postequalized.zf.equalizer', this._bindHandler.onPostEqualizedBound);\n } else {\n this.$element.on('resizeme.zf.trigger', this._bindHandler.onResizeMeBound);\n this.$element.on('mutateme.zf.trigger', this._bindHandler.onResizeMeBound);\n }\n this.isOn = true;\n }\n\n /**\n * Checks the current breakpoint to the minimum required size.\n * @private\n */\n\n }, {\n key: '_checkMQ',\n value: function _checkMQ() {\n var tooSmall = !Foundation.MediaQuery.is(this.options.equalizeOn);\n if (tooSmall) {\n if (this.isOn) {\n this._pauseEvents();\n this.$watched.css('height', 'auto');\n }\n } else {\n if (!this.isOn) {\n this._events();\n }\n }\n return tooSmall;\n }\n\n /**\n * A noop version for the plugin\n * @private\n */\n\n }, {\n key: '_killswitch',\n value: function _killswitch() {\n return;\n }\n\n /**\n * Calls necessary functions to update Equalizer upon DOM change\n * @private\n */\n\n }, {\n key: '_reflow',\n value: function _reflow() {\n if (!this.options.equalizeOnStack) {\n if (this._isStacked()) {\n this.$watched.css('height', 'auto');\n return false;\n }\n }\n if (this.options.equalizeByRow) {\n this.getHeightsByRow(this.applyHeightByRow.bind(this));\n } else {\n this.getHeights(this.applyHeight.bind(this));\n }\n }\n\n /**\n * Manually determines if the first 2 elements are *NOT* stacked.\n * @private\n */\n\n }, {\n key: '_isStacked',\n value: function _isStacked() {\n if (!this.$watched[0] || !this.$watched[1]) {\n return true;\n }\n return this.$watched[0].getBoundingClientRect().top !== this.$watched[1].getBoundingClientRect().top;\n }\n\n /**\n * Finds the outer heights of children contained within an Equalizer parent and returns them in an array\n * @param {Function} cb - A non-optional callback to return the heights array to.\n * @returns {Array} heights - An array of heights of children within Equalizer container\n */\n\n }, {\n key: 'getHeights',\n value: function getHeights(cb) {\n var heights = [];\n for (var i = 0, len = this.$watched.length; i < len; i++) {\n this.$watched[i].style.height = 'auto';\n heights.push(this.$watched[i].offsetHeight);\n }\n cb(heights);\n }\n\n /**\n * Finds the outer heights of children contained within an Equalizer parent and returns them in an array\n * @param {Function} cb - A non-optional callback to return the heights array to.\n * @returns {Array} groups - An array of heights of children within Equalizer container grouped by row with element,height and max as last child\n */\n\n }, {\n key: 'getHeightsByRow',\n value: function getHeightsByRow(cb) {\n var lastElTopOffset = this.$watched.length ? this.$watched.first().offset().top : 0,\n groups = [],\n group = 0;\n //group by Row\n groups[group] = [];\n for (var i = 0, len = this.$watched.length; i < len; i++) {\n this.$watched[i].style.height = 'auto';\n //maybe could use this.$watched[i].offsetTop\n var elOffsetTop = $(this.$watched[i]).offset().top;\n if (elOffsetTop != lastElTopOffset) {\n group++;\n groups[group] = [];\n lastElTopOffset = elOffsetTop;\n }\n groups[group].push([this.$watched[i], this.$watched[i].offsetHeight]);\n }\n\n for (var j = 0, ln = groups.length; j < ln; j++) {\n var heights = $(groups[j]).map(function () {\n return this[1];\n }).get();\n var max = Math.max.apply(null, heights);\n groups[j].push(max);\n }\n cb(groups);\n }\n\n /**\n * Changes the CSS height property of each child in an Equalizer parent to match the tallest\n * @param {array} heights - An array of heights of children within Equalizer container\n * @fires Equalizer#preequalized\n * @fires Equalizer#postequalized\n */\n\n }, {\n key: 'applyHeight',\n value: function applyHeight(heights) {\n var max = Math.max.apply(null, heights);\n /**\n * Fires before the heights are applied\n * @event Equalizer#preequalized\n */\n this.$element.trigger('preequalized.zf.equalizer');\n\n this.$watched.css('height', max);\n\n /**\n * Fires when the heights have been applied\n * @event Equalizer#postequalized\n */\n this.$element.trigger('postequalized.zf.equalizer');\n }\n\n /**\n * Changes the CSS height property of each child in an Equalizer parent to match the tallest by row\n * @param {array} groups - An array of heights of children within Equalizer container grouped by row with element,height and max as last child\n * @fires Equalizer#preequalized\n * @fires Equalizer#preequalizedrow\n * @fires Equalizer#postequalizedrow\n * @fires Equalizer#postequalized\n */\n\n }, {\n key: 'applyHeightByRow',\n value: function applyHeightByRow(groups) {\n /**\n * Fires before the heights are applied\n */\n this.$element.trigger('preequalized.zf.equalizer');\n for (var i = 0, len = groups.length; i < len; i++) {\n var groupsILength = groups[i].length,\n max = groups[i][groupsILength - 1];\n if (groupsILength <= 2) {\n $(groups[i][0][0]).css({ 'height': 'auto' });\n continue;\n }\n /**\n * Fires before the heights per row are applied\n * @event Equalizer#preequalizedrow\n */\n this.$element.trigger('preequalizedrow.zf.equalizer');\n for (var j = 0, lenJ = groupsILength - 1; j < lenJ; j++) {\n $(groups[i][j][0]).css({ 'height': max });\n }\n /**\n * Fires when the heights per row have been applied\n * @event Equalizer#postequalizedrow\n */\n this.$element.trigger('postequalizedrow.zf.equalizer');\n }\n /**\n * Fires when the heights have been applied\n */\n this.$element.trigger('postequalized.zf.equalizer');\n }\n\n /**\n * Destroys an instance of Equalizer.\n * @function\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n this._pauseEvents();\n this.$watched.css('height', 'auto');\n\n Foundation.unregisterPlugin(this);\n }\n }]);\n\n return Equalizer;\n }();\n\n /**\n * Default settings for plugin\n */\n\n\n Equalizer.defaults = {\n /**\n * Enable height equalization when stacked on smaller screens.\n * @option\n * @type {boolean}\n * @default false\n */\n equalizeOnStack: false,\n /**\n * Enable height equalization row by row.\n * @option\n * @type {boolean}\n * @default false\n */\n equalizeByRow: false,\n /**\n * String representing the minimum breakpoint size the plugin should equalize heights on.\n * @option\n * @type {string}\n * @default ''\n */\n equalizeOn: ''\n };\n\n // Window exports\n Foundation.plugin(Equalizer, 'Equalizer');\n}(jQuery);\n'use strict';\n\n/**\n Attorneys archive\n\n @since 0.1.0\n @package Inosencio\n */\n(function ($) {\n 'use strict';\n\n $(function () {\n\n var $attorney_select_items = $('.attorney-select').find('li'),\n $attorney_items = $('.attorneys').find('li');\n\n $attorney_items.filter(':not(:first-of-type)').hide();\n $attorney_select_items.first().addClass('active');\n\n $attorney_select_items.click(function () {\n\n $attorney_items.hide();\n $attorney_items.eq($(this).index()).show();\n\n $attorney_select_items.removeClass('active');\n $(this).addClass('active');\n });\n });\n})(jQuery);\n'use strict';\n\n/**\n Site header functionality.\n\n @since 0.1.0\n @package Inosencio\n */\n(function ($) {\n 'use strict';\n\n $(function () {\n\n nav_position();\n\n $('.toggle-nav').click(function () {\n $('#mobile-nav').toggleClass('active');\n });\n });\n\n $(window).resize(nav_position);\n\n function nav_position() {\n\n $('#site-header').find('.site-nav').each(function () {\n\n $(this).css({\n top: $(this).parent().height() / 2 - $(this).height() / 2\n });\n });\n }\n})(jQuery);\n'use strict';\n\n/**\n Main functions file.\n\n @since 0.1.0\n @package Inosencio\n */\n(function ($) {\n 'use strict';\n\n // Foundation\n\n $(document).foundation();\n\n // Page loading overlay\n $('#site-content').append('<div id=\"page-load-overlay\"><div class=\"loader fa fa-circle-o-notch fa-spin-fast\" /></div>');\n\n setTimeout(function () {\n\n var $overlay = $('#page-load-overlay');\n\n if ($overlay.length) {\n $overlay.animate({\n opacity: 1\n }, 300);\n }\n }, 300);\n\n $(window).load(function () {\n $('#page-load-overlay').animate({\n opacity: 0\n }, {\n duration: 500,\n complete: function complete() {\n $(this).remove();\n }\n });\n });\n})(jQuery);\n'use strict';\n\n/**\n Practice areas archive\n\n @since 0.1.0\n @package Inosencio\n */\n(function ($) {\n 'use strict';\n\n $(function () {\n\n // Prevent page jump\n prevent_jump();\n\n if (!$('body').hasClass('post-type-archive-practice_area')) {\n return;\n }\n\n var $practice_areas = $('.practice-areas'),\n hash = window.location.hash;\n\n $practice_areas.find('.practice-area-content').hide();\n\n $practice_areas.find('.practice-area > a').click(function (e) {\n\n console.log('click');\n\n var $practice_area = $(this).closest('.practice-area');\n\n $practice_areas.find('.practice-area').removeClass('active');\n $practice_areas.find('.practice-area-content').hide();\n $practice_area.siblings('.practice-area-content').show();\n $practice_area.addClass('active');\n\n // Scroll\n var href = $(this).attr('href'),\n hash = href.substring(href.indexOf(\"#\") + 1),\n target = $('#' + hash);\n\n if (target.length) {\n $('html,body').animate({\n scrollTop: target.offset().top - $('.top-bar').height() - 10\n }, 500);\n }\n\n e.preventDefault();\n return false;\n });\n\n // Scroll to practice area if hash is in page load\n if (hash.length) {\n setTimeout(function () {\n $(hash).find('> a').click();\n }, 100);\n }\n });\n\n function prevent_jump() {\n\n if (window.location.hash) {\n setTimeout(function () {\n window.scrollTo(0, 0);\n }, 1);\n }\n }\n})(jQuery);\n'use strict';\n\n/**\n Search bar functionality.\n\n @since 0.1.0\n @package Inosencio\n */\n(function ($) {\n 'use strict';\n\n $(function () {\n\n var $top_bar = $('#site-header').find('.top-bar'),\n $search_container = $top_bar.find('.search'),\n $search_input = $search_container.find('input[type=\"search\"]'),\n $search_button = $search_container.find('.search-button'),\n placeholder = $search_input.data('placeholder');\n\n $search_input.val(placeholder).on('focus', function () {\n\n if ($(this).val() == placeholder) {\n $(this).val('');\n }\n }).blur(function () {\n\n if (!$(this).val()) {\n $(this).val(placeholder);\n }\n }).each(resizeInput);\n\n function resizeInput() {\n $(this).attr('size', $(this).val().length);\n }\n\n $search_button.click(function (e) {\n\n $search_input.focus();\n\n e.preventDefault();\n return false;\n });\n });\n})(jQuery);\n\"use strict\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/**\n * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.\n *\n * @version 1.0.3\n * @codingstandard ftlabs-jsv2\n * @copyright The Financial Times Limited [All Rights Reserved]\n * @license MIT License (see LICENSE.txt)\n */\nfunction FastClick(a, b) {\n \"use strict\";\n function c(a, b) {\n return function () {\n return a.apply(b, arguments);\n };\n }var d;if (b = b || {}, this.trackingClick = !1, this.trackingClickStart = 0, this.targetElement = null, this.touchStartX = 0, this.touchStartY = 0, this.lastTouchIdentifier = 0, this.touchBoundary = b.touchBoundary || 10, this.layer = a, this.tapDelay = b.tapDelay || 200, !FastClick.notNeeded(a)) {\n for (var e = [\"onMouse\", \"onClick\", \"onTouchStart\", \"onTouchMove\", \"onTouchEnd\", \"onTouchCancel\"], f = this, g = 0, h = e.length; h > g; g++) {\n f[e[g]] = c(f[e[g]], f);\n }deviceIsAndroid && (a.addEventListener(\"mouseover\", this.onMouse, !0), a.addEventListener(\"mousedown\", this.onMouse, !0), a.addEventListener(\"mouseup\", this.onMouse, !0)), a.addEventListener(\"click\", this.onClick, !0), a.addEventListener(\"touchstart\", this.onTouchStart, !1), a.addEventListener(\"touchmove\", this.onTouchMove, !1), a.addEventListener(\"touchend\", this.onTouchEnd, !1), a.addEventListener(\"touchcancel\", this.onTouchCancel, !1), Event.prototype.stopImmediatePropagation || (a.removeEventListener = function (b, c, d) {\n var e = Node.prototype.removeEventListener;\"click\" === b ? e.call(a, b, c.hijacked || c, d) : e.call(a, b, c, d);\n }, a.addEventListener = function (b, c, d) {\n var e = Node.prototype.addEventListener;\"click\" === b ? e.call(a, b, c.hijacked || (c.hijacked = function (a) {\n a.propagationStopped || c(a);\n }), d) : e.call(a, b, c, d);\n }), \"function\" == typeof a.onclick && (d = a.onclick, a.addEventListener(\"click\", function (a) {\n d(a);\n }, !1), a.onclick = null);\n }\n}var deviceIsAndroid = navigator.userAgent.indexOf(\"Android\") > 0,\n deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent),\n deviceIsIOS4 = deviceIsIOS && /OS 4_\\d(_\\d)?/.test(navigator.userAgent),\n deviceIsIOSWithBadTarget = deviceIsIOS && /OS ([6-9]|\\d{2})_\\d/.test(navigator.userAgent),\n deviceIsBlackBerry10 = navigator.userAgent.indexOf(\"BB10\") > 0;FastClick.prototype.needsClick = function (a) {\n \"use strict\";\n switch (a.nodeName.toLowerCase()) {case \"button\":case \"select\":case \"textarea\":\n if (a.disabled) return !0;break;case \"input\":\n if (deviceIsIOS && \"file\" === a.type || a.disabled) return !0;break;case \"label\":case \"video\":\n return !0;}return (/\\bneedsclick\\b/.test(a.className)\n );\n}, FastClick.prototype.needsFocus = function (a) {\n \"use strict\";\n switch (a.nodeName.toLowerCase()) {case \"textarea\":\n return !0;case \"select\":\n return !deviceIsAndroid;case \"input\":\n switch (a.type) {case \"button\":case \"checkbox\":case \"file\":case \"image\":case \"radio\":case \"submit\":\n return !1;}return !a.disabled && !a.readOnly;default:\n return (/\\bneedsfocus\\b/.test(a.className)\n );}\n}, FastClick.prototype.sendClick = function (a, b) {\n \"use strict\";\n var c, d;document.activeElement && document.activeElement !== a && document.activeElement.blur(), d = b.changedTouches[0], c = document.createEvent(\"MouseEvents\"), c.initMouseEvent(this.determineEventType(a), !0, !0, window, 1, d.screenX, d.screenY, d.clientX, d.clientY, !1, !1, !1, !1, 0, null), c.forwardedTouchEvent = !0, a.dispatchEvent(c);\n}, FastClick.prototype.determineEventType = function (a) {\n \"use strict\";\n return deviceIsAndroid && \"select\" === a.tagName.toLowerCase() ? \"mousedown\" : \"click\";\n}, FastClick.prototype.focus = function (a) {\n \"use strict\";\n var b;deviceIsIOS && a.setSelectionRange && 0 !== a.type.indexOf(\"date\") && \"time\" !== a.type ? (b = a.value.length, a.setSelectionRange(b, b)) : a.focus();\n}, FastClick.prototype.updateScrollParent = function (a) {\n \"use strict\";\n var b, c;if (b = a.fastClickScrollParent, !b || !b.contains(a)) {\n c = a;do {\n if (c.scrollHeight > c.offsetHeight) {\n b = c, a.fastClickScrollParent = c;break;\n }c = c.parentElement;\n } while (c);\n }b && (b.fastClickLastScrollTop = b.scrollTop);\n}, FastClick.prototype.getTargetElementFromEventTarget = function (a) {\n \"use strict\";\n return a.nodeType === Node.TEXT_NODE ? a.parentNode : a;\n}, FastClick.prototype.onTouchStart = function (a) {\n \"use strict\";\n var b, c, d;if (a.targetTouches.length > 1) return !0;if (b = this.getTargetElementFromEventTarget(a.target), c = a.targetTouches[0], deviceIsIOS) {\n if (d = window.getSelection(), d.rangeCount && !d.isCollapsed) return !0;if (!deviceIsIOS4) {\n if (c.identifier && c.identifier === this.lastTouchIdentifier) return a.preventDefault(), !1;this.lastTouchIdentifier = c.identifier, this.updateScrollParent(b);\n }\n }return this.trackingClick = !0, this.trackingClickStart = a.timeStamp, this.targetElement = b, this.touchStartX = c.pageX, this.touchStartY = c.pageY, a.timeStamp - this.lastClickTime < this.tapDelay && a.preventDefault(), !0;\n}, FastClick.prototype.touchHasMoved = function (a) {\n \"use strict\";\n var b = a.changedTouches[0],\n c = this.touchBoundary;return Math.abs(b.pageX - this.touchStartX) > c || Math.abs(b.pageY - this.touchStartY) > c ? !0 : !1;\n}, FastClick.prototype.onTouchMove = function (a) {\n \"use strict\";\n return this.trackingClick ? ((this.targetElement !== this.getTargetElementFromEventTarget(a.target) || this.touchHasMoved(a)) && (this.trackingClick = !1, this.targetElement = null), !0) : !0;\n}, FastClick.prototype.findControl = function (a) {\n \"use strict\";\n return void 0 !== a.control ? a.control : a.htmlFor ? document.getElementById(a.htmlFor) : a.querySelector(\"button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea\");\n}, FastClick.prototype.onTouchEnd = function (a) {\n \"use strict\";\n var b,\n c,\n d,\n e,\n f,\n g = this.targetElement;if (!this.trackingClick) return !0;if (a.timeStamp - this.lastClickTime < this.tapDelay) return this.cancelNextClick = !0, !0;if (this.cancelNextClick = !1, this.lastClickTime = a.timeStamp, c = this.trackingClickStart, this.trackingClick = !1, this.trackingClickStart = 0, deviceIsIOSWithBadTarget && (f = a.changedTouches[0], g = document.elementFromPoint(f.pageX - window.pageXOffset, f.pageY - window.pageYOffset) || g, g.fastClickScrollParent = this.targetElement.fastClickScrollParent), d = g.tagName.toLowerCase(), \"label\" === d) {\n if (b = this.findControl(g)) {\n if (this.focus(g), deviceIsAndroid) return !1;g = b;\n }\n } else if (this.needsFocus(g)) return a.timeStamp - c > 100 || deviceIsIOS && window.top !== window && \"input\" === d ? (this.targetElement = null, !1) : (this.focus(g), this.sendClick(g, a), deviceIsIOS && \"select\" === d || (this.targetElement = null, a.preventDefault()), !1);return deviceIsIOS && !deviceIsIOS4 && (e = g.fastClickScrollParent, e && e.fastClickLastScrollTop !== e.scrollTop) ? !0 : (this.needsClick(g) || (a.preventDefault(), this.sendClick(g, a)), !1);\n}, FastClick.prototype.onTouchCancel = function () {\n \"use strict\";\n this.trackingClick = !1, this.targetElement = null;\n}, FastClick.prototype.onMouse = function (a) {\n \"use strict\";\n return this.targetElement ? a.forwardedTouchEvent ? !0 : a.cancelable && (!this.needsClick(this.targetElement) || this.cancelNextClick) ? (a.stopImmediatePropagation ? a.stopImmediatePropagation() : a.propagationStopped = !0, a.stopPropagation(), a.preventDefault(), !1) : !0 : !0;\n}, FastClick.prototype.onClick = function (a) {\n \"use strict\";\n var b;return this.trackingClick ? (this.targetElement = null, this.trackingClick = !1, !0) : \"submit\" === a.target.type && 0 === a.detail ? !0 : (b = this.onMouse(a), b || (this.targetElement = null), b);\n}, FastClick.prototype.destroy = function () {\n \"use strict\";\n var a = this.layer;deviceIsAndroid && (a.removeEventListener(\"mouseover\", this.onMouse, !0), a.removeEventListener(\"mousedown\", this.onMouse, !0), a.removeEventListener(\"mouseup\", this.onMouse, !0)), a.removeEventListener(\"click\", this.onClick, !0), a.removeEventListener(\"touchstart\", this.onTouchStart, !1), a.removeEventListener(\"touchmove\", this.onTouchMove, !1), a.removeEventListener(\"touchend\", this.onTouchEnd, !1), a.removeEventListener(\"touchcancel\", this.onTouchCancel, !1);\n}, FastClick.notNeeded = function (a) {\n \"use strict\";\n var b, c, d;if (\"undefined\" == typeof window.ontouchstart) return !0;if (c = +(/Chrome\\/([0-9]+)/.exec(navigator.userAgent) || [, 0])[1]) {\n if (!deviceIsAndroid) return !0;if (b = document.querySelector(\"meta[name=viewport]\")) {\n if (-1 !== b.content.indexOf(\"user-scalable=no\")) return !0;if (c > 31 && document.documentElement.scrollWidth <= window.outerWidth) return !0;\n }\n }if (deviceIsBlackBerry10 && (d = navigator.userAgent.match(/Version\\/([0-9]*)\\.([0-9]*)/), d[1] >= 10 && d[2] >= 3 && (b = document.querySelector(\"meta[name=viewport]\")))) {\n if (-1 !== b.content.indexOf(\"user-scalable=no\")) return !0;if (document.documentElement.scrollWidth <= window.outerWidth) return !0;\n }return \"none\" === a.style.msTouchAction ? !0 : !1;\n}, FastClick.attach = function (a, b) {\n \"use strict\";\n return new FastClick(a, b);\n}, \"function\" == typeof define && \"object\" == _typeof(define.amd) && define.amd ? define(function () {\n \"use strict\";\n return FastClick;\n}) : \"undefined\" != typeof module && module.exports ? (module.exports = FastClick.attach, module.exports.FastClick = FastClick) : window.FastClick = FastClick;\n\"use strict\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*!\n * jQuery Cookie Plugin v1.4.1\n * https://github.com/carhartl/jquery-cookie\n *\n * Copyright 2013 Klaus Hartl\n * Released under the MIT license\n */\n!function (a) {\n \"function\" == typeof define && define.amd ? define([\"jquery\"], a) : a(\"object\" == (typeof exports === \"undefined\" ? \"undefined\" : _typeof(exports)) ? require(\"jquery\") : jQuery);\n}(function (a) {\n function b(a) {\n return h.raw ? a : encodeURIComponent(a);\n }function c(a) {\n return h.raw ? a : decodeURIComponent(a);\n }function d(a) {\n return b(h.json ? JSON.stringify(a) : String(a));\n }function e(a) {\n 0 === a.indexOf('\"') && (a = a.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\"));try {\n return a = decodeURIComponent(a.replace(g, \" \")), h.json ? JSON.parse(a) : a;\n } catch (b) {}\n }function f(b, c) {\n var d = h.raw ? b : e(b);return a.isFunction(c) ? c(d) : d;\n }var g = /\\+/g,\n h = a.cookie = function (e, g, i) {\n if (void 0 !== g && !a.isFunction(g)) {\n if (i = a.extend({}, h.defaults, i), \"number\" == typeof i.expires) {\n var j = i.expires,\n k = i.expires = new Date();k.setTime(+k + 864e5 * j);\n }return document.cookie = [b(e), \"=\", d(g), i.expires ? \"; expires=\" + i.expires.toUTCString() : \"\", i.path ? \"; path=\" + i.path : \"\", i.domain ? \"; domain=\" + i.domain : \"\", i.secure ? \"; secure\" : \"\"].join(\"\");\n }for (var l = e ? void 0 : {}, m = document.cookie ? document.cookie.split(\"; \") : [], n = 0, o = m.length; o > n; n++) {\n var p = m[n].split(\"=\"),\n q = c(p.shift()),\n r = p.join(\"=\");if (e && e === q) {\n l = f(r, g);break;\n }e || void 0 === (r = f(r)) || (l[q] = r);\n }return l;\n };h.defaults = {}, a.removeCookie = function (b, c) {\n return void 0 === a.cookie(b) ? !1 : (a.cookie(b, \"\", a.extend({}, c, { expires: -1 })), !a.cookie(b));\n };\n});","/**\n * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.\n *\n * @version 1.0.3\n * @codingstandard ftlabs-jsv2\n * @copyright The Financial Times Limited [All Rights Reserved]\n * @license MIT License (see LICENSE.txt)\n */\nfunction FastClick(a,b){\"use strict\";function c(a,b){return function(){return a.apply(b,arguments)}}var d;if(b=b||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=b.touchBoundary||10,this.layer=a,this.tapDelay=b.tapDelay||200,!FastClick.notNeeded(a)){for(var e=[\"onMouse\",\"onClick\",\"onTouchStart\",\"onTouchMove\",\"onTouchEnd\",\"onTouchCancel\"],f=this,g=0,h=e.length;h>g;g++)f[e[g]]=c(f[e[g]],f);deviceIsAndroid&&(a.addEventListener(\"mouseover\",this.onMouse,!0),a.addEventListener(\"mousedown\",this.onMouse,!0),a.addEventListener(\"mouseup\",this.onMouse,!0)),a.addEventListener(\"click\",this.onClick,!0),a.addEventListener(\"touchstart\",this.onTouchStart,!1),a.addEventListener(\"touchmove\",this.onTouchMove,!1),a.addEventListener(\"touchend\",this.onTouchEnd,!1),a.addEventListener(\"touchcancel\",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(a.removeEventListener=function(b,c,d){var e=Node.prototype.removeEventListener;\"click\"===b?e.call(a,b,c.hijacked||c,d):e.call(a,b,c,d)},a.addEventListener=function(b,c,d){var e=Node.prototype.addEventListener;\"click\"===b?e.call(a,b,c.hijacked||(c.hijacked=function(a){a.propagationStopped||c(a)}),d):e.call(a,b,c,d)}),\"function\"==typeof a.onclick&&(d=a.onclick,a.addEventListener(\"click\",function(a){d(a)},!1),a.onclick=null)}}var deviceIsAndroid=navigator.userAgent.indexOf(\"Android\")>0,deviceIsIOS=/iP(ad|hone|od)/.test(navigator.userAgent),deviceIsIOS4=deviceIsIOS&&/OS 4_\\d(_\\d)?/.test(navigator.userAgent),deviceIsIOSWithBadTarget=deviceIsIOS&&/OS ([6-9]|\\d{2})_\\d/.test(navigator.userAgent),deviceIsBlackBerry10=navigator.userAgent.indexOf(\"BB10\")>0;FastClick.prototype.needsClick=function(a){\"use strict\";switch(a.nodeName.toLowerCase()){case\"button\":case\"select\":case\"textarea\":if(a.disabled)return!0;break;case\"input\":if(deviceIsIOS&&\"file\"===a.type||a.disabled)return!0;break;case\"label\":case\"video\":return!0}return/\\bneedsclick\\b/.test(a.className)},FastClick.prototype.needsFocus=function(a){\"use strict\";switch(a.nodeName.toLowerCase()){case\"textarea\":return!0;case\"select\":return!deviceIsAndroid;case\"input\":switch(a.type){case\"button\":case\"checkbox\":case\"file\":case\"image\":case\"radio\":case\"submit\":return!1}return!a.disabled&&!a.readOnly;default:return/\\bneedsfocus\\b/.test(a.className)}},FastClick.prototype.sendClick=function(a,b){\"use strict\";var c,d;document.activeElement&&document.activeElement!==a&&document.activeElement.blur(),d=b.changedTouches[0],c=document.createEvent(\"MouseEvents\"),c.initMouseEvent(this.determineEventType(a),!0,!0,window,1,d.screenX,d.screenY,d.clientX,d.clientY,!1,!1,!1,!1,0,null),c.forwardedTouchEvent=!0,a.dispatchEvent(c)},FastClick.prototype.determineEventType=function(a){\"use strict\";return deviceIsAndroid&&\"select\"===a.tagName.toLowerCase()?\"mousedown\":\"click\"},FastClick.prototype.focus=function(a){\"use strict\";var b;deviceIsIOS&&a.setSelectionRange&&0!==a.type.indexOf(\"date\")&&\"time\"!==a.type?(b=a.value.length,a.setSelectionRange(b,b)):a.focus()},FastClick.prototype.updateScrollParent=function(a){\"use strict\";var b,c;if(b=a.fastClickScrollParent,!b||!b.contains(a)){c=a;do{if(c.scrollHeight>c.offsetHeight){b=c,a.fastClickScrollParent=c;break}c=c.parentElement}while(c)}b&&(b.fastClickLastScrollTop=b.scrollTop)},FastClick.prototype.getTargetElementFromEventTarget=function(a){\"use strict\";return a.nodeType===Node.TEXT_NODE?a.parentNode:a},FastClick.prototype.onTouchStart=function(a){\"use strict\";var b,c,d;if(a.targetTouches.length>1)return!0;if(b=this.getTargetElementFromEventTarget(a.target),c=a.targetTouches[0],deviceIsIOS){if(d=window.getSelection(),d.rangeCount&&!d.isCollapsed)return!0;if(!deviceIsIOS4){if(c.identifier&&c.identifier===this.lastTouchIdentifier)return a.preventDefault(),!1;this.lastTouchIdentifier=c.identifier,this.updateScrollParent(b)}}return this.trackingClick=!0,this.trackingClickStart=a.timeStamp,this.targetElement=b,this.touchStartX=c.pageX,this.touchStartY=c.pageY,a.timeStamp-this.lastClickTime<this.tapDelay&&a.preventDefault(),!0},FastClick.prototype.touchHasMoved=function(a){\"use strict\";var b=a.changedTouches[0],c=this.touchBoundary;return Math.abs(b.pageX-this.touchStartX)>c||Math.abs(b.pageY-this.touchStartY)>c?!0:!1},FastClick.prototype.onTouchMove=function(a){\"use strict\";return this.trackingClick?((this.targetElement!==this.getTargetElementFromEventTarget(a.target)||this.touchHasMoved(a))&&(this.trackingClick=!1,this.targetElement=null),!0):!0},FastClick.prototype.findControl=function(a){\"use strict\";return void 0!==a.control?a.control:a.htmlFor?document.getElementById(a.htmlFor):a.querySelector(\"button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea\")},FastClick.prototype.onTouchEnd=function(a){\"use strict\";var b,c,d,e,f,g=this.targetElement;if(!this.trackingClick)return!0;if(a.timeStamp-this.lastClickTime<this.tapDelay)return this.cancelNextClick=!0,!0;if(this.cancelNextClick=!1,this.lastClickTime=a.timeStamp,c=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,deviceIsIOSWithBadTarget&&(f=a.changedTouches[0],g=document.elementFromPoint(f.pageX-window.pageXOffset,f.pageY-window.pageYOffset)||g,g.fastClickScrollParent=this.targetElement.fastClickScrollParent),d=g.tagName.toLowerCase(),\"label\"===d){if(b=this.findControl(g)){if(this.focus(g),deviceIsAndroid)return!1;g=b}}else if(this.needsFocus(g))return a.timeStamp-c>100||deviceIsIOS&&window.top!==window&&\"input\"===d?(this.targetElement=null,!1):(this.focus(g),this.sendClick(g,a),deviceIsIOS&&\"select\"===d||(this.targetElement=null,a.preventDefault()),!1);return deviceIsIOS&&!deviceIsIOS4&&(e=g.fastClickScrollParent,e&&e.fastClickLastScrollTop!==e.scrollTop)?!0:(this.needsClick(g)||(a.preventDefault(),this.sendClick(g,a)),!1)},FastClick.prototype.onTouchCancel=function(){\"use strict\";this.trackingClick=!1,this.targetElement=null},FastClick.prototype.onMouse=function(a){\"use strict\";return this.targetElement?a.forwardedTouchEvent?!0:a.cancelable&&(!this.needsClick(this.targetElement)||this.cancelNextClick)?(a.stopImmediatePropagation?a.stopImmediatePropagation():a.propagationStopped=!0,a.stopPropagation(),a.preventDefault(),!1):!0:!0},FastClick.prototype.onClick=function(a){\"use strict\";var b;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):\"submit\"===a.target.type&&0===a.detail?!0:(b=this.onMouse(a),b||(this.targetElement=null),b)},FastClick.prototype.destroy=function(){\"use strict\";var a=this.layer;deviceIsAndroid&&(a.removeEventListener(\"mouseover\",this.onMouse,!0),a.removeEventListener(\"mousedown\",this.onMouse,!0),a.removeEventListener(\"mouseup\",this.onMouse,!0)),a.removeEventListener(\"click\",this.onClick,!0),a.removeEventListener(\"touchstart\",this.onTouchStart,!1),a.removeEventListener(\"touchmove\",this.onTouchMove,!1),a.removeEventListener(\"touchend\",this.onTouchEnd,!1),a.removeEventListener(\"touchcancel\",this.onTouchCancel,!1)},FastClick.notNeeded=function(a){\"use strict\";var b,c,d;if(\"undefined\"==typeof window.ontouchstart)return!0;if(c=+(/Chrome\\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!deviceIsAndroid)return!0;if(b=document.querySelector(\"meta[name=viewport]\")){if(-1!==b.content.indexOf(\"user-scalable=no\"))return!0;if(c>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(deviceIsBlackBerry10&&(d=navigator.userAgent.match(/Version\\/([0-9]*)\\.([0-9]*)/),d[1]>=10&&d[2]>=3&&(b=document.querySelector(\"meta[name=viewport]\")))){if(-1!==b.content.indexOf(\"user-scalable=no\"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return\"none\"===a.style.msTouchAction?!0:!1},FastClick.attach=function(a,b){\"use strict\";return new FastClick(a,b)},\"function\"==typeof define&&\"object\"==typeof define.amd&&define.amd?define(function(){\"use strict\";return FastClick}):\"undefined\"!=typeof module&&module.exports?(module.exports=FastClick.attach,module.exports.FastClick=FastClick):window.FastClick=FastClick;\n","!function($) {\n\n\"use strict\";\n\nvar FOUNDATION_VERSION = '6.3.1';\n\n// Global Foundation object\n// This is attached to the window, or used as a module for AMD/Browserify\nvar Foundation = {\n version: FOUNDATION_VERSION,\n\n /**\n * Stores initialized plugins.\n */\n _plugins: {},\n\n /**\n * Stores generated unique ids for plugin instances\n */\n _uuids: [],\n\n /**\n * Returns a boolean for RTL support\n */\n rtl: function(){\n return $('html').attr('dir') === 'rtl';\n },\n /**\n * Defines a Foundation plugin, adding it to the `Foundation` namespace and the list of plugins to initialize when reflowing.\n * @param {Object} plugin - The constructor of the plugin.\n */\n plugin: function(plugin, name) {\n // Object key to use when adding to global Foundation object\n // Examples: Foundation.Reveal, Foundation.OffCanvas\n var className = (name || functionName(plugin));\n // Object key to use when storing the plugin, also used to create the identifying data attribute for the plugin\n // Examples: data-reveal, data-off-canvas\n var attrName = hyphenate(className);\n\n // Add to the Foundation object and the plugins list (for reflowing)\n this._plugins[attrName] = this[className] = plugin;\n },\n /**\n * @function\n * Populates the _uuids array with pointers to each individual plugin instance.\n * Adds the `zfPlugin` data-attribute to programmatically created plugins to allow use of $(selector).foundation(method) calls.\n * Also fires the initialization event for each plugin, consolidating repetitive code.\n * @param {Object} plugin - an instance of a plugin, usually `this` in context.\n * @param {String} name - the name of the plugin, passed as a camelCased string.\n * @fires Plugin#init\n */\n registerPlugin: function(plugin, name){\n var pluginName = name ? hyphenate(name) : functionName(plugin.constructor).toLowerCase();\n plugin.uuid = this.GetYoDigits(6, pluginName);\n\n if(!plugin.$element.attr(`data-${pluginName}`)){ plugin.$element.attr(`data-${pluginName}`, plugin.uuid); }\n if(!plugin.$element.data('zfPlugin')){ plugin.$element.data('zfPlugin', plugin); }\n /**\n * Fires when the plugin has initialized.\n * @event Plugin#init\n */\n plugin.$element.trigger(`init.zf.${pluginName}`);\n\n this._uuids.push(plugin.uuid);\n\n return;\n },\n /**\n * @function\n * Removes the plugins uuid from the _uuids array.\n * Removes the zfPlugin data attribute, as well as the data-plugin-name attribute.\n * Also fires the destroyed event for the plugin, consolidating repetitive code.\n * @param {Object} plugin - an instance of a plugin, usually `this` in context.\n * @fires Plugin#destroyed\n */\n unregisterPlugin: function(plugin){\n var pluginName = hyphenate(functionName(plugin.$element.data('zfPlugin').constructor));\n\n this._uuids.splice(this._uuids.indexOf(plugin.uuid), 1);\n plugin.$element.removeAttr(`data-${pluginName}`).removeData('zfPlugin')\n /**\n * Fires when the plugin has been destroyed.\n * @event Plugin#destroyed\n */\n .trigger(`destroyed.zf.${pluginName}`);\n for(var prop in plugin){\n plugin[prop] = null;//clean up script to prep for garbage collection.\n }\n return;\n },\n\n /**\n * @function\n * Causes one or more active plugins to re-initialize, resetting event listeners, recalculating positions, etc.\n * @param {String} plugins - optional string of an individual plugin key, attained by calling `$(element).data('pluginName')`, or string of a plugin class i.e. `'dropdown'`\n * @default If no argument is passed, reflow all currently active plugins.\n */\n reInit: function(plugins){\n var isJQ = plugins instanceof $;\n try{\n if(isJQ){\n plugins.each(function(){\n $(this).data('zfPlugin')._init();\n });\n }else{\n var type = typeof plugins,\n _this = this,\n fns = {\n 'object': function(plgs){\n plgs.forEach(function(p){\n p = hyphenate(p);\n $('[data-'+ p +']').foundation('_init');\n });\n },\n 'string': function(){\n plugins = hyphenate(plugins);\n $('[data-'+ plugins +']').foundation('_init');\n },\n 'undefined': function(){\n this['object'](Object.keys(_this._plugins));\n }\n };\n fns[type](plugins);\n }\n }catch(err){\n console.error(err);\n }finally{\n return plugins;\n }\n },\n\n /**\n * returns a random base-36 uid with namespacing\n * @function\n * @param {Number} length - number of random base-36 digits desired. Increase for more random strings.\n * @param {String} namespace - name of plugin to be incorporated in uid, optional.\n * @default {String} '' - if no plugin name is provided, nothing is appended to the uid.\n * @returns {String} - unique id\n */\n GetYoDigits: function(length, namespace){\n length = length || 6;\n return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1) + (namespace ? `-${namespace}` : '');\n },\n /**\n * Initialize plugins on any elements within `elem` (and `elem` itself) that aren't already initialized.\n * @param {Object} elem - jQuery object containing the element to check inside. Also checks the element itself, unless it's the `document` object.\n * @param {String|Array} plugins - A list of plugins to initialize. Leave this out to initialize everything.\n */\n reflow: function(elem, plugins) {\n\n // If plugins is undefined, just grab everything\n if (typeof plugins === 'undefined') {\n plugins = Object.keys(this._plugins);\n }\n // If plugins is a string, convert it to an array with one item\n else if (typeof plugins === 'string') {\n plugins = [plugins];\n }\n\n var _this = this;\n\n // Iterate through each plugin\n $.each(plugins, function(i, name) {\n // Get the current plugin\n var plugin = _this._plugins[name];\n\n // Localize the search to all elements inside elem, as well as elem itself, unless elem === document\n var $elem = $(elem).find('[data-'+name+']').addBack('[data-'+name+']');\n\n // For each plugin found, initialize it\n $elem.each(function() {\n var $el = $(this),\n opts = {};\n // Don't double-dip on plugins\n if ($el.data('zfPlugin')) {\n console.warn(\"Tried to initialize \"+name+\" on an element that already has a Foundation plugin.\");\n return;\n }\n\n if($el.attr('data-options')){\n var thing = $el.attr('data-options').split(';').forEach(function(e, i){\n var opt = e.split(':').map(function(el){ return el.trim(); });\n if(opt[0]) opts[opt[0]] = parseValue(opt[1]);\n });\n }\n try{\n $el.data('zfPlugin', new plugin($(this), opts));\n }catch(er){\n console.error(er);\n }finally{\n return;\n }\n });\n });\n },\n getFnName: functionName,\n transitionend: function($elem){\n var transitions = {\n 'transition': 'transitionend',\n 'WebkitTransition': 'webkitTransitionEnd',\n 'MozTransition': 'transitionend',\n 'OTransition': 'otransitionend'\n };\n var elem = document.createElement('div'),\n end;\n\n for (var t in transitions){\n if (typeof elem.style[t] !== 'undefined'){\n end = transitions[t];\n }\n }\n if(end){\n return end;\n }else{\n end = setTimeout(function(){\n $elem.triggerHandler('transitionend', [$elem]);\n }, 1);\n return 'transitionend';\n }\n }\n};\n\nFoundation.util = {\n /**\n * Function for applying a debounce effect to a function call.\n * @function\n * @param {Function} func - Function to be called at end of timeout.\n * @param {Number} delay - Time in ms to delay the call of `func`.\n * @returns function\n */\n throttle: function (func, delay) {\n var timer = null;\n\n return function () {\n var context = this, args = arguments;\n\n if (timer === null) {\n timer = setTimeout(function () {\n func.apply(context, args);\n timer = null;\n }, delay);\n }\n };\n }\n};\n\n// TODO: consider not making this a jQuery function\n// TODO: need way to reflow vs. re-initialize\n/**\n * The Foundation jQuery method.\n * @param {String|Array} method - An action to perform on the current jQuery object.\n */\nvar foundation = function(method) {\n var type = typeof method,\n $meta = $('meta.foundation-mq'),\n $noJS = $('.no-js');\n\n if(!$meta.length){\n $('<meta class=\"foundation-mq\">').appendTo(document.head);\n }\n if($noJS.length){\n $noJS.removeClass('no-js');\n }\n\n if(type === 'undefined'){//needs to initialize the Foundation object, or an individual plugin.\n Foundation.MediaQuery._init();\n Foundation.reflow(this);\n }else if(type === 'string'){//an individual method to invoke on a plugin or group of plugins\n var args = Array.prototype.slice.call(arguments, 1);//collect all the arguments, if necessary\n var plugClass = this.data('zfPlugin');//determine the class of plugin\n\n if(plugClass !== undefined && plugClass[method] !== undefined){//make sure both the class and method exist\n if(this.length === 1){//if there's only one, call it directly.\n plugClass[method].apply(plugClass, args);\n }else{\n this.each(function(i, el){//otherwise loop through the jQuery collection and invoke the method on each\n plugClass[method].apply($(el).data('zfPlugin'), args);\n });\n }\n }else{//error for no class or no method\n throw new ReferenceError(\"We're sorry, '\" + method + \"' is not an available method for \" + (plugClass ? functionName(plugClass) : 'this element') + '.');\n }\n }else{//error for invalid argument type\n throw new TypeError(`We're sorry, ${type} is not a valid parameter. You must use a string representing the method you wish to invoke.`);\n }\n return this;\n};\n\nwindow.Foundation = Foundation;\n$.fn.foundation = foundation;\n\n// Polyfill for requestAnimationFrame\n(function() {\n if (!Date.now || !window.Date.now)\n window.Date.now = Date.now = function() { return new Date().getTime(); };\n\n var vendors = ['webkit', 'moz'];\n for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {\n var vp = vendors[i];\n window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];\n window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']\n || window[vp+'CancelRequestAnimationFrame']);\n }\n if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent)\n || !window.requestAnimationFrame || !window.cancelAnimationFrame) {\n var lastTime = 0;\n window.requestAnimationFrame = function(callback) {\n var now = Date.now();\n var nextTime = Math.max(lastTime + 16, now);\n return setTimeout(function() { callback(lastTime = nextTime); },\n nextTime - now);\n };\n window.cancelAnimationFrame = clearTimeout;\n }\n /**\n * Polyfill for performance.now, required by rAF\n */\n if(!window.performance || !window.performance.now){\n window.performance = {\n start: Date.now(),\n now: function(){ return Date.now() - this.start; }\n };\n }\n})();\nif (!Function.prototype.bind) {\n Function.prototype.bind = function(oThis) {\n if (typeof this !== 'function') {\n // closest thing possible to the ECMAScript 5\n // internal IsCallable function\n throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');\n }\n\n var aArgs = Array.prototype.slice.call(arguments, 1),\n fToBind = this,\n fNOP = function() {},\n fBound = function() {\n return fToBind.apply(this instanceof fNOP\n ? this\n : oThis,\n aArgs.concat(Array.prototype.slice.call(arguments)));\n };\n\n if (this.prototype) {\n // native functions don't have a prototype\n fNOP.prototype = this.prototype;\n }\n fBound.prototype = new fNOP();\n\n return fBound;\n };\n}\n// Polyfill to get the name of a function in IE9\nfunction functionName(fn) {\n if (Function.prototype.name === undefined) {\n var funcNameRegex = /function\\s([^(]{1,})\\(/;\n var results = (funcNameRegex).exec((fn).toString());\n return (results && results.length > 1) ? results[1].trim() : \"\";\n }\n else if (fn.prototype === undefined) {\n return fn.constructor.name;\n }\n else {\n return fn.prototype.constructor.name;\n }\n}\nfunction parseValue(str){\n if ('true' === str) return true;\n else if ('false' === str) return false;\n else if (!isNaN(str * 1)) return parseFloat(str);\n return str;\n}\n// Convert PascalCase to kebab-case\n// Thank you: http://stackoverflow.com/a/8955580\nfunction hyphenate(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n}\n\n}(jQuery);\n","/*******************************************\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\n'use strict';\n\n!function($) {\n\nconst keyCodes = {\n 9: 'TAB',\n 13: 'ENTER',\n 27: 'ESCAPE',\n 32: 'SPACE',\n 37: 'ARROW_LEFT',\n 38: 'ARROW_UP',\n 39: 'ARROW_RIGHT',\n 40: 'ARROW_DOWN'\n}\n\nvar commands = {}\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(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\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 if (typeof commandList.ltr === 'undefined') { // this component does not differentiate between ltr and rtl\n cmds = commandList; // use plain list\n } else { // merge ltr and rtl: if document is rtl, rtl overwrites ltr and vice versa\n if (Foundation.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 if (fn && typeof fn === 'function') { // execute function if exists\n var returnValue = fn.apply();\n if (functions.handled || typeof functions.handled === 'function') { // execute function when event was handled\n functions.handled(returnValue);\n }\n } else {\n if (functions.unhandled || typeof functions.unhandled === 'function') { // execute function when event was not handled\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 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 },\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 * 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 = Foundation.Keyboard.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] && Foundation.Keyboard.parseKey(event) === 'TAB') {\n event.preventDefault();\n $firstFocusable.focus();\n }\n else if (event.target === $firstFocusable[0] && Foundation.Keyboard.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) k[kcs[kc]] = kcs[kc];\n return k;\n}\n\nFoundation.Keyboard = Keyboard;\n\n}(jQuery);\n","'use strict';\n\n!function($) {\n\nFoundation.Box = {\n ImNotTouchingYou: ImNotTouchingYou,\n GetDimensions: GetDimensions,\n GetOffsets: GetOffsets\n}\n\n/**\n * Compares the dimensions of an element to a container and determines collision events with container.\n * @function\n * @param {jQuery} element - jQuery object to test for collisions.\n * @param {jQuery} parent - jQuery object to use as bounding container.\n * @param {Boolean} lrOnly - set to true to check left and right values only.\n * @param {Boolean} tbOnly - set to true to check top and bottom values only.\n * @default if no parent object passed, detects collisions with `window`.\n * @returns {Boolean} - true if collision free, false if a collision in any direction.\n */\nfunction ImNotTouchingYou(element, parent, lrOnly, tbOnly) {\n var eleDims = GetDimensions(element),\n top, bottom, left, right;\n\n if (parent) {\n var parDims = GetDimensions(parent);\n\n bottom = (eleDims.offset.top + eleDims.height <= parDims.height + parDims.offset.top);\n top = (eleDims.offset.top >= parDims.offset.top);\n left = (eleDims.offset.left >= parDims.offset.left);\n right = (eleDims.offset.left + eleDims.width <= parDims.width + parDims.offset.left);\n }\n else {\n bottom = (eleDims.offset.top + eleDims.height <= eleDims.windowDims.height + eleDims.windowDims.offset.top);\n top = (eleDims.offset.top >= eleDims.windowDims.offset.top);\n left = (eleDims.offset.left >= eleDims.windowDims.offset.left);\n right = (eleDims.offset.left + eleDims.width <= eleDims.windowDims.width);\n }\n\n var allDirs = [bottom, top, left, right];\n\n if (lrOnly) {\n return left === right === true;\n }\n\n if (tbOnly) {\n return top === bottom === true;\n }\n\n return allDirs.indexOf(false) === -1;\n};\n\n/**\n * Uses native methods to return an object of dimension values.\n * @function\n * @param {jQuery || HTML} element - jQuery object or DOM element for which to get the dimensions. Can be any element other that document or window.\n * @returns {Object} - nested object of integer pixel values\n * TODO - if element is window, return only those values.\n */\nfunction GetDimensions(elem, test){\n elem = elem.length ? elem[0] : elem;\n\n if (elem === window || elem === document) {\n throw new Error(\"I'm sorry, Dave. I'm afraid I can't do that.\");\n }\n\n var rect = elem.getBoundingClientRect(),\n parRect = elem.parentNode.getBoundingClientRect(),\n winRect = document.body.getBoundingClientRect(),\n winY = window.pageYOffset,\n winX = window.pageXOffset;\n\n return {\n width: rect.width,\n height: rect.height,\n offset: {\n top: rect.top + winY,\n left: rect.left + winX\n },\n parentDims: {\n width: parRect.width,\n height: parRect.height,\n offset: {\n top: parRect.top + winY,\n left: parRect.left + winX\n }\n },\n windowDims: {\n width: winRect.width,\n height: winRect.height,\n offset: {\n top: winY,\n left: winX\n }\n }\n }\n}\n\n/**\n * Returns an object of top and left integer pixel values for dynamically rendered elements,\n * such as: Tooltip, Reveal, and Dropdown\n * @function\n * @param {jQuery} element - jQuery object for the element being positioned.\n * @param {jQuery} anchor - jQuery object for the element's anchor point.\n * @param {String} position - a string relating to the desired position of the element, relative to it's anchor\n * @param {Number} vOffset - integer pixel value of desired vertical separation between anchor and element.\n * @param {Number} hOffset - integer pixel value of desired horizontal separation between anchor and element.\n * @param {Boolean} isOverflow - if a collision event is detected, sets to true to default the element to full width - any desired offset.\n * TODO alter/rewrite to work with `em` values as well/instead of pixels\n */\nfunction GetOffsets(element, anchor, position, vOffset, hOffset, isOverflow) {\n var $eleDims = GetDimensions(element),\n $anchorDims = anchor ? GetDimensions(anchor) : null;\n\n switch (position) {\n case 'top':\n return {\n left: (Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left),\n top: $anchorDims.offset.top - ($eleDims.height + vOffset)\n }\n break;\n case 'left':\n return {\n left: $anchorDims.offset.left - ($eleDims.width + hOffset),\n top: $anchorDims.offset.top\n }\n break;\n case 'right':\n return {\n left: $anchorDims.offset.left + $anchorDims.width + hOffset,\n top: $anchorDims.offset.top\n }\n break;\n case 'center top':\n return {\n left: ($anchorDims.offset.left + ($anchorDims.width / 2)) - ($eleDims.width / 2),\n top: $anchorDims.offset.top - ($eleDims.height + vOffset)\n }\n break;\n case 'center bottom':\n return {\n left: isOverflow ? hOffset : (($anchorDims.offset.left + ($anchorDims.width / 2)) - ($eleDims.width / 2)),\n top: $anchorDims.offset.top + $anchorDims.height + vOffset\n }\n break;\n case 'center left':\n return {\n left: $anchorDims.offset.left - ($eleDims.width + hOffset),\n top: ($anchorDims.offset.top + ($anchorDims.height / 2)) - ($eleDims.height / 2)\n }\n break;\n case 'center right':\n return {\n left: $anchorDims.offset.left + $anchorDims.width + hOffset + 1,\n top: ($anchorDims.offset.top + ($anchorDims.height / 2)) - ($eleDims.height / 2)\n }\n break;\n case 'center':\n return {\n left: ($eleDims.windowDims.offset.left + ($eleDims.windowDims.width / 2)) - ($eleDims.width / 2),\n top: ($eleDims.windowDims.offset.top + ($eleDims.windowDims.height / 2)) - ($eleDims.height / 2)\n }\n break;\n case 'reveal':\n return {\n left: ($eleDims.windowDims.width - $eleDims.width) / 2,\n top: $eleDims.windowDims.offset.top + vOffset\n }\n case 'reveal full':\n return {\n left: $eleDims.windowDims.offset.left,\n top: $eleDims.windowDims.offset.top\n }\n break;\n case 'left bottom':\n return {\n left: $anchorDims.offset.left,\n top: $anchorDims.offset.top + $anchorDims.height + vOffset\n };\n break;\n case 'right bottom':\n return {\n left: $anchorDims.offset.left + $anchorDims.width + hOffset - $eleDims.width,\n top: $anchorDims.offset.top + $anchorDims.height + vOffset\n };\n break;\n default:\n return {\n left: (Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left + hOffset),\n top: $anchorDims.offset.top + $anchorDims.height + vOffset\n }\n }\n}\n\n}(jQuery);\n","'use strict';\n\n!function($) {\n\nconst Nest = {\n Feather(menu, type = 'zf') {\n menu.attr('role', 'menubar');\n\n var items = menu.find('li').attr({'role': 'menuitem'}),\n subMenuClass = `is-${type}-submenu`,\n subItemClass = `${subMenuClass}-item`,\n hasSubClass = `is-${type}-submenu-parent`;\n\n items.each(function() {\n var $item = $(this),\n $sub = $item.children('ul');\n\n if ($sub.length) {\n $item\n .addClass(hasSubClass)\n .attr({\n 'aria-haspopup': true,\n 'aria-label': $item.children('a:first').text()\n });\n // Note: Drilldowns behave differently in how they hide, and so need\n // additional attributes. We should look if this possibly over-generalized\n // utility (Nest) is appropriate when we rework menus in 6.4\n if(type === 'drilldown') {\n $item.attr({'aria-expanded': false});\n }\n\n $sub\n .addClass(`submenu ${subMenuClass}`)\n .attr({\n 'data-submenu': '',\n 'role': 'menu'\n });\n if(type === 'drilldown') {\n $sub.attr({'aria-hidden': true});\n }\n }\n\n if ($item.parent('[data-submenu]').length) {\n $item.addClass(`is-submenu-item ${subItemClass}`);\n }\n });\n\n return;\n },\n\n Burn(menu, type) {\n var //items = menu.find('li'),\n subMenuClass = `is-${type}-submenu`,\n subItemClass = `${subMenuClass}-item`,\n hasSubClass = `is-${type}-submenu-parent`;\n\n menu\n .find('>li, .menu, .menu > li')\n .removeClass(`${subMenuClass} ${subItemClass} ${hasSubClass} is-submenu-item submenu is-active`)\n .removeAttr('data-submenu').css('display', '');\n\n // console.log( menu.find('.' + subMenuClass + ', .' + subItemClass + ', .has-submenu, .is-submenu-item, .submenu, [data-submenu]')\n // .removeClass(subMenuClass + ' ' + subItemClass + ' has-submenu is-submenu-item submenu')\n // .removeAttr('data-submenu'));\n // items.each(function(){\n // var $item = $(this),\n // $sub = $item.children('ul');\n // if($item.parent('[data-submenu]').length){\n // $item.removeClass('is-submenu-item ' + subItemClass);\n // }\n // if($sub.length){\n // $item.removeClass('has-submenu');\n // $sub.removeClass('submenu ' + subMenuClass).removeAttr('data-submenu');\n // }\n // });\n }\n}\n\nFoundation.Nest = Nest;\n\n}(jQuery);\n","'use strict';\n\n!function($) {\n\n// Default set of media queries\nconst defaultQueries = {\n 'default' : 'only screen',\n landscape : 'only screen and (orientation: landscape)',\n portrait : 'only screen and (orientation: portrait)',\n retina : 'only screen and (-webkit-min-device-pixel-ratio: 2),' +\n 'only screen and (min--moz-device-pixel-ratio: 2),' +\n 'only screen and (-o-min-device-pixel-ratio: 2/1),' +\n 'only screen and (min-device-pixel-ratio: 2),' +\n 'only screen and (min-resolution: 192dpi),' +\n 'only screen and (min-resolution: 2dppx)'\n};\n\nvar MediaQuery = {\n queries: [],\n\n current: '',\n\n /**\n * Initializes the media query helper, by extracting the breakpoint list from the CSS and activating the breakpoint watcher.\n * @function\n * @private\n */\n _init() {\n var self = this;\n var extractedStyles = $('.foundation-mq').css('font-family');\n var namedQueries;\n\n namedQueries = parseStyleToObject(extractedStyles);\n\n for (var key in namedQueries) {\n if(namedQueries.hasOwnProperty(key)) {\n self.queries.push({\n name: key,\n value: `only screen and (min-width: ${namedQueries[key]})`\n });\n }\n }\n\n this.current = this._getCurrentSize();\n\n this._watcher();\n },\n\n /**\n * Checks if the screen is at least as wide as a breakpoint.\n * @function\n * @param {String} size - Name of the breakpoint to check.\n * @returns {Boolean} `true` if the breakpoint matches, `false` if it's smaller.\n */\n atLeast(size) {\n var query = this.get(size);\n\n if (query) {\n return window.matchMedia(query).matches;\n }\n\n return false;\n },\n\n /**\n * Checks if the screen matches to a breakpoint.\n * @function\n * @param {String} size - Name of the breakpoint to check, either 'small only' or 'small'. Omitting 'only' falls back to using atLeast() method.\n * @returns {Boolean} `true` if the breakpoint matches, `false` if it does not.\n */\n is(size) {\n size = size.trim().split(' ');\n if(size.length > 1 && size[1] === 'only') {\n if(size[0] === this._getCurrentSize()) return true;\n } else {\n return this.atLeast(size[0]);\n }\n return false;\n },\n\n /**\n * Gets the media query of a breakpoint.\n * @function\n * @param {String} size - Name of the breakpoint to get.\n * @returns {String|null} - The media query of the breakpoint, or `null` if the breakpoint doesn't exist.\n */\n get(size) {\n for (var i in this.queries) {\n if(this.queries.hasOwnProperty(i)) {\n var query = this.queries[i];\n if (size === query.name) return query.value;\n }\n }\n\n return null;\n },\n\n /**\n * Gets the current breakpoint name by testing every breakpoint and returning the last one to match (the biggest one).\n * @function\n * @private\n * @returns {String} Name of the current breakpoint.\n */\n _getCurrentSize() {\n var matched;\n\n for (var i = 0; i < this.queries.length; i++) {\n var query = this.queries[i];\n\n if (window.matchMedia(query.value).matches) {\n matched = query;\n }\n }\n\n if (typeof matched === 'object') {\n return matched.name;\n } else {\n return matched;\n }\n },\n\n /**\n * Activates the breakpoint watcher, which fires an event on the window whenever the breakpoint changes.\n * @function\n * @private\n */\n _watcher() {\n $(window).on('resize.zf.mediaquery', () => {\n var newSize = this._getCurrentSize(), currentSize = this.current;\n\n if (newSize !== currentSize) {\n // Change the current media query\n this.current = newSize;\n\n // Broadcast the media query change on the window\n $(window).trigger('changed.zf.mediaquery', [newSize, currentSize]);\n }\n });\n }\n};\n\nFoundation.MediaQuery = MediaQuery;\n\n// matchMedia() polyfill - Test a CSS media type/query in JS.\n// Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license\nwindow.matchMedia || (window.matchMedia = function() {\n 'use strict';\n\n // For browsers that support matchMedium api such as IE 9 and webkit\n var styleMedia = (window.styleMedia || window.media);\n\n // For those that don't support matchMedium\n if (!styleMedia) {\n var style = document.createElement('style'),\n script = document.getElementsByTagName('script')[0],\n info = null;\n\n style.type = 'text/css';\n style.id = 'matchmediajs-test';\n\n script && script.parentNode && script.parentNode.insertBefore(style, script);\n\n // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers\n info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle;\n\n styleMedia = {\n matchMedium(media) {\n var text = `@media ${media}{ #matchmediajs-test { width: 1px; } }`;\n\n // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers\n if (style.styleSheet) {\n style.styleSheet.cssText = text;\n } else {\n style.textContent = text;\n }\n\n // Test if media query is true or false\n return info.width === '1px';\n }\n }\n }\n\n return function(media) {\n return {\n matches: styleMedia.matchMedium(media || 'all'),\n media: media || 'all'\n };\n }\n}());\n\n// Thank you: https://github.com/sindresorhus/query-string\nfunction parseStyleToObject(str) {\n var styleObject = {};\n\n if (typeof str !== 'string') {\n return styleObject;\n }\n\n str = str.trim().slice(1, -1); // browsers re-quote string style values\n\n if (!str) {\n return styleObject;\n }\n\n styleObject = str.split('&').reduce(function(ret, param) {\n var parts = param.replace(/\\+/g, ' ').split('=');\n var key = parts[0];\n var val = parts[1];\n key = decodeURIComponent(key);\n\n // missing `=` should be `null`:\n // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n val = val === undefined ? null : decodeURIComponent(val);\n\n if (!ret.hasOwnProperty(key)) {\n ret[key] = val;\n } else if (Array.isArray(ret[key])) {\n ret[key].push(val);\n } else {\n ret[key] = [ret[key], val];\n }\n return ret;\n }, {});\n\n return styleObject;\n}\n\nFoundation.MediaQuery = MediaQuery;\n\n}(jQuery);\n","'use strict';\n\n!function($) {\n\nconst MutationObserver = (function () {\n var prefixes = ['WebKit', 'Moz', 'O', 'Ms', ''];\n for (var i=0; i < prefixes.length; i++) {\n if (`${prefixes[i]}MutationObserver` in window) {\n return window[`${prefixes[i]}MutationObserver`];\n }\n }\n return false;\n}());\n\nconst triggers = (el, type) => {\n el.data(type).split(' ').forEach(id => {\n $(`#${id}`)[ type === 'close' ? 'trigger' : 'triggerHandler'](`${type}.zf.trigger`, [el]);\n });\n};\n// Elements with [data-open] will reveal a plugin that supports it when clicked.\n$(document).on('click.zf.trigger', '[data-open]', function() {\n triggers($(this), 'open');\n});\n\n// Elements with [data-close] will close a plugin that supports it when clicked.\n// If used without a value on [data-close], the event will bubble, allowing it to close a parent component.\n$(document).on('click.zf.trigger', '[data-close]', function() {\n let id = $(this).data('close');\n if (id) {\n triggers($(this), 'close');\n }\n else {\n $(this).trigger('close.zf.trigger');\n }\n});\n\n// Elements with [data-toggle] will toggle a plugin that supports it when clicked.\n$(document).on('click.zf.trigger', '[data-toggle]', function() {\n let id = $(this).data('toggle');\n if (id) {\n triggers($(this), 'toggle');\n } else {\n $(this).trigger('toggle.zf.trigger');\n }\n});\n\n// Elements with [data-closable] will respond to close.zf.trigger events.\n$(document).on('close.zf.trigger', '[data-closable]', function(e){\n e.stopPropagation();\n let animation = $(this).data('closable');\n\n if(animation !== ''){\n Foundation.Motion.animateOut($(this), animation, function() {\n $(this).trigger('closed.zf');\n });\n }else{\n $(this).fadeOut().trigger('closed.zf');\n }\n});\n\n$(document).on('focus.zf.trigger blur.zf.trigger', '[data-toggle-focus]', function() {\n let id = $(this).data('toggle-focus');\n $(`#${id}`).triggerHandler('toggle.zf.trigger', [$(this)]);\n});\n\n/**\n* Fires once after all other scripts have loaded\n* @function\n* @private\n*/\n$(window).on('load', () => {\n checkListeners();\n});\n\nfunction checkListeners() {\n eventsListener();\n resizeListener();\n scrollListener();\n closemeListener();\n}\n\n//******** only fires this function once on load, if there's something to watch ********\nfunction closemeListener(pluginName) {\n var yetiBoxes = $('[data-yeti-box]'),\n plugNames = ['dropdown', 'tooltip', 'reveal'];\n\n if(pluginName){\n if(typeof pluginName === 'string'){\n plugNames.push(pluginName);\n }else if(typeof pluginName === 'object' && typeof pluginName[0] === 'string'){\n plugNames.concat(pluginName);\n }else{\n console.error('Plugin names must be strings');\n }\n }\n if(yetiBoxes.length){\n let listeners = plugNames.map((name) => {\n return `closeme.zf.${name}`;\n }).join(' ');\n\n $(window).off(listeners).on(listeners, function(e, pluginId){\n let plugin = e.namespace.split('.')[0];\n let plugins = $(`[data-${plugin}]`).not(`[data-yeti-box=\"${pluginId}\"]`);\n\n plugins.each(function(){\n let _this = $(this);\n\n _this.triggerHandler('close.zf.trigger', [_this]);\n });\n });\n }\n}\n\nfunction resizeListener(debounce){\n let timer,\n $nodes = $('[data-resize]');\n if($nodes.length){\n $(window).off('resize.zf.trigger')\n .on('resize.zf.trigger', function(e) {\n if (timer) { clearTimeout(timer); }\n\n timer = setTimeout(function(){\n\n if(!MutationObserver){//fallback for IE 9\n $nodes.each(function(){\n $(this).triggerHandler('resizeme.zf.trigger');\n });\n }\n //trigger all listening elements and signal a resize event\n $nodes.attr('data-events', \"resize\");\n }, debounce || 10);//default time to emit resize event\n });\n }\n}\n\nfunction scrollListener(debounce){\n let timer,\n $nodes = $('[data-scroll]');\n if($nodes.length){\n $(window).off('scroll.zf.trigger')\n .on('scroll.zf.trigger', function(e){\n if(timer){ clearTimeout(timer); }\n\n timer = setTimeout(function(){\n\n if(!MutationObserver){//fallback for IE 9\n $nodes.each(function(){\n $(this).triggerHandler('scrollme.zf.trigger');\n });\n }\n //trigger all listening elements and signal a scroll event\n $nodes.attr('data-events', \"scroll\");\n }, debounce || 10);//default time to emit scroll event\n });\n }\n}\n\nfunction eventsListener() {\n if(!MutationObserver){ return false; }\n let nodes = document.querySelectorAll('[data-resize], [data-scroll], [data-mutate]');\n\n //element callback\n var listeningElementsMutation = function (mutationRecordsList) {\n var $target = $(mutationRecordsList[0].target);\n\n\t //trigger the event handler for the element depending on type\n switch (mutationRecordsList[0].type) {\n\n case \"attributes\":\n if ($target.attr(\"data-events\") === \"scroll\" && mutationRecordsList[0].attributeName === \"data-events\") {\n\t\t \t$target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]);\n\t\t }\n\t\t if ($target.attr(\"data-events\") === \"resize\" && mutationRecordsList[0].attributeName === \"data-events\") {\n\t\t \t$target.triggerHandler('resizeme.zf.trigger', [$target]);\n\t\t }\n\t\t if (mutationRecordsList[0].attributeName === \"style\") {\n\t\t\t $target.closest(\"[data-mutate]\").attr(\"data-events\",\"mutate\");\n\t\t\t $target.closest(\"[data-mutate]\").triggerHandler('mutateme.zf.trigger', [$target.closest(\"[data-mutate]\")]);\n\t\t }\n\t\t break;\n\n case \"childList\":\n\t\t $target.closest(\"[data-mutate]\").attr(\"data-events\",\"mutate\");\n\t\t $target.closest(\"[data-mutate]\").triggerHandler('mutateme.zf.trigger', [$target.closest(\"[data-mutate]\")]);\n break;\n\n default:\n return false;\n //nothing\n }\n };\n\n if (nodes.length) {\n //for each element that needs to listen for resizing, scrolling, or mutation add a single observer\n for (var i = 0; i <= nodes.length - 1; i++) {\n var elementObserver = new MutationObserver(listeningElementsMutation);\n elementObserver.observe(nodes[i], { attributes: true, childList: true, characterData: false, subtree: true, attributeFilter: [\"data-events\", \"style\"] });\n }\n }\n }\n\n// ------------------------------------\n\n// [PH]\n// Foundation.CheckWatchers = checkWatchers;\nFoundation.IHearYou = checkListeners;\n// Foundation.ISeeYou = scrollListener;\n// Foundation.IFeelYou = closemeListener;\n\n}(jQuery);\n","'use strict';\n\n!function($) {\n\n/**\n * Motion module.\n * @module foundation.motion\n */\n\nconst initClasses = ['mui-enter', 'mui-leave'];\nconst activeClasses = ['mui-enter-active', 'mui-leave-active'];\n\nconst Motion = {\n animateIn: function(element, animation, cb) {\n animate(true, element, animation, cb);\n },\n\n animateOut: function(element, animation, cb) {\n animate(false, element, animation, cb);\n }\n}\n\nfunction Move(duration, elem, fn){\n var anim, prog, start = null;\n // console.log('called');\n\n if (duration === 0) {\n fn.apply(elem);\n elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]);\n return;\n }\n\n function move(ts){\n if(!start) start = ts;\n // console.log(start, ts);\n prog = ts - start;\n fn.apply(elem);\n\n if(prog < duration){ anim = window.requestAnimationFrame(move, elem); }\n else{\n window.cancelAnimationFrame(anim);\n elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]);\n }\n }\n anim = window.requestAnimationFrame(move);\n}\n\n/**\n * Animates an element in or out using a CSS transition class.\n * @function\n * @private\n * @param {Boolean} isIn - Defines if the animation is in or out.\n * @param {Object} element - jQuery or HTML object to animate.\n * @param {String} animation - CSS class to use.\n * @param {Function} cb - Callback to run when animation is finished.\n */\nfunction animate(isIn, element, animation, cb) {\n element = $(element).eq(0);\n\n if (!element.length) return;\n\n var initClass = isIn ? initClasses[0] : initClasses[1];\n var activeClass = isIn ? activeClasses[0] : activeClasses[1];\n\n // Set up the animation\n reset();\n\n element\n .addClass(animation)\n .css('transition', 'none');\n\n requestAnimationFrame(() => {\n element.addClass(initClass);\n if (isIn) element.show();\n });\n\n // Start the animation\n requestAnimationFrame(() => {\n element[0].offsetWidth;\n element\n .css('transition', '')\n .addClass(activeClass);\n });\n\n // Clean up the animation when it finishes\n element.one(Foundation.transitionend(element), finish);\n\n // Hides the element (for out animations), resets the element, and runs a callback\n function finish() {\n if (!isIn) element.hide();\n reset();\n if (cb) cb.apply(element);\n }\n\n // Resets transitions and removes motion-specific classes\n function reset() {\n element[0].style.transitionDuration = 0;\n element.removeClass(`${initClass} ${activeClass} ${animation}`);\n }\n}\n\nFoundation.Move = Move;\nFoundation.Motion = Motion;\n\n}(jQuery);\n","'use strict';\n\n!function($) {\n\n/**\n * DropdownMenu module.\n * @module foundation.dropdown-menu\n * @requires foundation.util.keyboard\n * @requires foundation.util.box\n * @requires foundation.util.nest\n */\n\nclass DropdownMenu {\n /**\n * Creates a new instance of DropdownMenu.\n * @class\n * @fires DropdownMenu#init\n * @param {jQuery} element - jQuery object to make into a dropdown menu.\n * @param {Object} options - Overrides to the default plugin settings.\n */\n constructor(element, options) {\n this.$element = element;\n this.options = $.extend({}, DropdownMenu.defaults, this.$element.data(), options);\n\n Foundation.Nest.Feather(this.$element, 'dropdown');\n this._init();\n\n Foundation.registerPlugin(this, 'DropdownMenu');\n Foundation.Keyboard.register('DropdownMenu', {\n 'ENTER': 'open',\n 'SPACE': 'open',\n 'ARROW_RIGHT': 'next',\n 'ARROW_UP': 'up',\n 'ARROW_DOWN': 'down',\n 'ARROW_LEFT': 'previous',\n 'ESCAPE': 'close'\n });\n }\n\n /**\n * Initializes the plugin, and calls _prepareMenu\n * @private\n * @function\n */\n _init() {\n var subs = this.$element.find('li.is-dropdown-submenu-parent');\n this.$element.children('.is-dropdown-submenu-parent').children('.is-dropdown-submenu').addClass('first-sub');\n\n this.$menuItems = this.$element.find('[role=\"menuitem\"]');\n this.$tabs = this.$element.children('[role=\"menuitem\"]');\n this.$tabs.find('ul.is-dropdown-submenu').addClass(this.options.verticalClass);\n\n if (this.$element.hasClass(this.options.rightClass) || this.options.alignment === 'right' || Foundation.rtl() || this.$element.parents('.top-bar-right').is('*')) {\n this.options.alignment = 'right';\n subs.addClass('opens-left');\n } else {\n subs.addClass('opens-right');\n }\n this.changed = false;\n this._events();\n };\n\n _isVertical() {\n return this.$tabs.css('display') === 'block';\n }\n\n /**\n * Adds event listeners to elements within the menu\n * @private\n * @function\n */\n _events() {\n var _this = this,\n hasTouch = 'ontouchstart' in window || (typeof window.ontouchstart !== 'undefined'),\n parClass = 'is-dropdown-submenu-parent';\n\n // used for onClick and in the keyboard handlers\n var handleClickFn = function(e) {\n var $elem = $(e.target).parentsUntil('ul', `.${parClass}`),\n hasSub = $elem.hasClass(parClass),\n hasClicked = $elem.attr('data-is-click') === 'true',\n $sub = $elem.children('.is-dropdown-submenu');\n\n if (hasSub) {\n if (hasClicked) {\n if (!_this.options.closeOnClick || (!_this.options.clickOpen && !hasTouch) || (_this.options.forceFollow && hasTouch)) { return; }\n else {\n e.stopImmediatePropagation();\n e.preventDefault();\n _this._hide($elem);\n }\n } else {\n e.preventDefault();\n e.stopImmediatePropagation();\n _this._show($sub);\n $elem.add($elem.parentsUntil(_this.$element, `.${parClass}`)).attr('data-is-click', true);\n }\n }\n };\n\n if (this.options.clickOpen || hasTouch) {\n this.$menuItems.on('click.zf.dropdownmenu touchstart.zf.dropdownmenu', handleClickFn);\n }\n\n // Handle Leaf element Clicks\n if(_this.options.closeOnClickInside){\n this.$menuItems.on('click.zf.dropdownmenu', function(e) {\n var $elem = $(this),\n hasSub = $elem.hasClass(parClass);\n if(!hasSub){\n _this._hide();\n }\n });\n }\n\n if (!this.options.disableHover) {\n this.$menuItems.on('mouseenter.zf.dropdownmenu', function(e) {\n var $elem = $(this),\n hasSub = $elem.hasClass(parClass);\n\n if (hasSub) {\n clearTimeout($elem.data('_delay'));\n $elem.data('_delay', setTimeout(function() {\n _this._show($elem.children('.is-dropdown-submenu'));\n }, _this.options.hoverDelay));\n }\n }).on('mouseleave.zf.dropdownmenu', function(e) {\n var $elem = $(this),\n hasSub = $elem.hasClass(parClass);\n if (hasSub && _this.options.autoclose) {\n if ($elem.attr('data-is-click') === 'true' && _this.options.clickOpen) { return false; }\n\n clearTimeout($elem.data('_delay'));\n $elem.data('_delay', setTimeout(function() {\n _this._hide($elem);\n }, _this.options.closingTime));\n }\n });\n }\n this.$menuItems.on('keydown.zf.dropdownmenu', function(e) {\n var $element = $(e.target).parentsUntil('ul', '[role=\"menuitem\"]'),\n isTab = _this.$tabs.index($element) > -1,\n $elements = isTab ? _this.$tabs : $element.siblings('li').add($element),\n $prevElement,\n $nextElement;\n\n $elements.each(function(i) {\n if ($(this).is($element)) {\n $prevElement = $elements.eq(i-1);\n $nextElement = $elements.eq(i+1);\n return;\n }\n });\n\n var nextSibling = function() {\n if (!$element.is(':last-child')) {\n $nextElement.children('a:first').focus();\n e.preventDefault();\n }\n }, prevSibling = function() {\n $prevElement.children('a:first').focus();\n e.preventDefault();\n }, openSub = function() {\n var $sub = $element.children('ul.is-dropdown-submenu');\n if ($sub.length) {\n _this._show($sub);\n $element.find('li > a:first').focus();\n e.preventDefault();\n } else { return; }\n }, closeSub = function() {\n //if ($element.is(':first-child')) {\n var close = $element.parent('ul').parent('li');\n close.children('a:first').focus();\n _this._hide(close);\n e.preventDefault();\n //}\n };\n var functions = {\n open: openSub,\n close: function() {\n _this._hide(_this.$element);\n _this.$menuItems.find('a:first').focus(); // focus to first element\n e.preventDefault();\n },\n handled: function() {\n e.stopImmediatePropagation();\n }\n };\n\n if (isTab) {\n if (_this._isVertical()) { // vertical menu\n if (Foundation.rtl()) { // right aligned\n $.extend(functions, {\n down: nextSibling,\n up: prevSibling,\n next: closeSub,\n previous: openSub\n });\n } else { // left aligned\n $.extend(functions, {\n down: nextSibling,\n up: prevSibling,\n next: openSub,\n previous: closeSub\n });\n }\n } else { // horizontal menu\n if (Foundation.rtl()) { // right aligned\n $.extend(functions, {\n next: prevSibling,\n previous: nextSibling,\n down: openSub,\n up: closeSub\n });\n } else { // left aligned\n $.extend(functions, {\n next: nextSibling,\n previous: prevSibling,\n down: openSub,\n up: closeSub\n });\n }\n }\n } else { // not tabs -> one sub\n if (Foundation.rtl()) { // right aligned\n $.extend(functions, {\n next: closeSub,\n previous: openSub,\n down: nextSibling,\n up: prevSibling\n });\n } else { // left aligned\n $.extend(functions, {\n next: openSub,\n previous: closeSub,\n down: nextSibling,\n up: prevSibling\n });\n }\n }\n Foundation.Keyboard.handleKey(e, 'DropdownMenu', functions);\n\n });\n }\n\n /**\n * Adds an event handler to the body to close any dropdowns on a click.\n * @function\n * @private\n */\n _addBodyHandler() {\n var $body = $(document.body),\n _this = this;\n $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu')\n .on('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu', function(e) {\n var $link = _this.$element.find(e.target);\n if ($link.length) { return; }\n\n _this._hide();\n $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu');\n });\n }\n\n /**\n * Opens a dropdown pane, and checks for collisions first.\n * @param {jQuery} $sub - ul element that is a submenu to show\n * @function\n * @private\n * @fires DropdownMenu#show\n */\n _show($sub) {\n var idx = this.$tabs.index(this.$tabs.filter(function(i, el) {\n return $(el).find($sub).length > 0;\n }));\n var $sibs = $sub.parent('li.is-dropdown-submenu-parent').siblings('li.is-dropdown-submenu-parent');\n this._hide($sibs, idx);\n $sub.css('visibility', 'hidden').addClass('js-dropdown-active')\n .parent('li.is-dropdown-submenu-parent').addClass('is-active');\n var clear = Foundation.Box.ImNotTouchingYou($sub, null, true);\n if (!clear) {\n var oldClass = this.options.alignment === 'left' ? '-right' : '-left',\n $parentLi = $sub.parent('.is-dropdown-submenu-parent');\n $parentLi.removeClass(`opens${oldClass}`).addClass(`opens-${this.options.alignment}`);\n clear = Foundation.Box.ImNotTouchingYou($sub, null, true);\n if (!clear) {\n $parentLi.removeClass(`opens-${this.options.alignment}`).addClass('opens-inner');\n }\n this.changed = true;\n }\n $sub.css('visibility', '');\n if (this.options.closeOnClick) { this._addBodyHandler(); }\n /**\n * Fires when the new dropdown pane is visible.\n * @event DropdownMenu#show\n */\n this.$element.trigger('show.zf.dropdownmenu', [$sub]);\n }\n\n /**\n * Hides a single, currently open dropdown pane, if passed a parameter, otherwise, hides everything.\n * @function\n * @param {jQuery} $elem - element with a submenu to hide\n * @param {Number} idx - index of the $tabs collection to hide\n * @private\n */\n _hide($elem, idx) {\n var $toClose;\n if ($elem && $elem.length) {\n $toClose = $elem;\n } else if (idx !== undefined) {\n $toClose = this.$tabs.not(function(i, el) {\n return i === idx;\n });\n }\n else {\n $toClose = this.$element;\n }\n var somethingToClose = $toClose.hasClass('is-active') || $toClose.find('.is-active').length > 0;\n\n if (somethingToClose) {\n $toClose.find('li.is-active').add($toClose).attr({\n 'data-is-click': false\n }).removeClass('is-active');\n\n $toClose.find('ul.js-dropdown-active').removeClass('js-dropdown-active');\n\n if (this.changed || $toClose.find('opens-inner').length) {\n var oldClass = this.options.alignment === 'left' ? 'right' : 'left';\n $toClose.find('li.is-dropdown-submenu-parent').add($toClose)\n .removeClass(`opens-inner opens-${this.options.alignment}`)\n .addClass(`opens-${oldClass}`);\n this.changed = false;\n }\n /**\n * Fires when the open menus are closed.\n * @event DropdownMenu#hide\n */\n this.$element.trigger('hide.zf.dropdownmenu', [$toClose]);\n }\n }\n\n /**\n * Destroys the plugin.\n * @function\n */\n destroy() {\n this.$menuItems.off('.zf.dropdownmenu').removeAttr('data-is-click')\n .removeClass('is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner');\n $(document.body).off('.zf.dropdownmenu');\n Foundation.Nest.Burn(this.$element, 'dropdown');\n Foundation.unregisterPlugin(this);\n }\n}\n\n/**\n * Default settings for plugin\n */\nDropdownMenu.defaults = {\n /**\n * Disallows hover events from opening submenus\n * @option\n * @type {boolean}\n * @default false\n */\n disableHover: false,\n /**\n * Allow a submenu to automatically close on a mouseleave event, if not clicked open.\n * @option\n * @type {boolean}\n * @default true\n */\n autoclose: true,\n /**\n * Amount of time to delay opening a submenu on hover event.\n * @option\n * @type {number}\n * @default 50\n */\n hoverDelay: 50,\n /**\n * Allow a submenu to open/remain open on parent click event. Allows cursor to move away from menu.\n * @option\n * @type {boolean}\n * @default false\n */\n clickOpen: false,\n /**\n * Amount of time to delay closing a submenu on a mouseleave event.\n * @option\n * @type {number}\n * @default 500\n */\n\n closingTime: 500,\n /**\n * Position of the menu relative to what direction the submenus should open. Handled by JS. Can be `'left'` or `'right'`.\n * @option\n * @type {string}\n * @default 'left'\n */\n alignment: 'left',\n /**\n * Allow clicks on the body to close any open submenus.\n * @option\n * @type {boolean}\n * @default true\n */\n closeOnClick: true,\n /**\n * Allow clicks on leaf anchor links to close any open submenus.\n * @option\n * @type {boolean}\n * @default true\n */\n closeOnClickInside: true,\n /**\n * Class applied to vertical oriented menus, Foundation default is `vertical`. Update this if using your own class.\n * @option\n * @type {string}\n * @default 'vertical'\n */\n verticalClass: 'vertical',\n /**\n * Class applied to right-side oriented menus, Foundation default is `align-right`. Update this if using your own class.\n * @option\n * @type {string}\n * @default 'align-right'\n */\n rightClass: 'align-right',\n /**\n * Boolean to force overide the clicking of links to perform default action, on second touch event for mobile.\n * @option\n * @type {boolean}\n * @default true\n */\n forceFollow: true\n};\n\n// Window exports\nFoundation.plugin(DropdownMenu, 'DropdownMenu');\n\n}(jQuery);\n","'use strict';\n\n!function($) {\n\n/**\n * OffCanvas module.\n * @module foundation.offcanvas\n * @requires foundation.util.keyboard\n * @requires foundation.util.mediaQuery\n * @requires foundation.util.triggers\n * @requires foundation.util.motion\n */\n\nclass OffCanvas {\n /**\n * Creates a new instance of an off-canvas wrapper.\n * @class\n * @fires OffCanvas#init\n * @param {Object} element - jQuery object to initialize.\n * @param {Object} options - Overrides to the default plugin settings.\n */\n constructor(element, options) {\n this.$element = element;\n this.options = $.extend({}, OffCanvas.defaults, this.$element.data(), options);\n this.$lastTrigger = $();\n this.$triggers = $();\n\n this._init();\n this._events();\n\n Foundation.registerPlugin(this, 'OffCanvas')\n Foundation.Keyboard.register('OffCanvas', {\n 'ESCAPE': 'close'\n });\n\n }\n\n /**\n * Initializes the off-canvas wrapper by adding the exit overlay (if needed).\n * @function\n * @private\n */\n _init() {\n var id = this.$element.attr('id');\n\n this.$element.attr('aria-hidden', 'true');\n\n this.$element.addClass(`is-transition-${this.options.transition}`);\n\n // Find triggers that affect this element and add aria-expanded to them\n this.$triggers = $(document)\n .find('[data-open=\"'+id+'\"], [data-close=\"'+id+'\"], [data-toggle=\"'+id+'\"]')\n .attr('aria-expanded', 'false')\n .attr('aria-controls', id);\n\n // Add an overlay over the content if necessary\n if (this.options.contentOverlay === true) {\n var overlay = document.createElement('div');\n var overlayPosition = $(this.$element).css(\"position\") === 'fixed' ? 'is-overlay-fixed' : 'is-overlay-absolute';\n overlay.setAttribute('class', 'js-off-canvas-overlay ' + overlayPosition);\n this.$overlay = $(overlay);\n if(overlayPosition === 'is-overlay-fixed') {\n $('body').append(this.$overlay);\n } else {\n this.$element.siblings('[data-off-canvas-content]').append(this.$overlay);\n }\n }\n\n this.options.isRevealed = this.options.isRevealed || new RegExp(this.options.revealClass, 'g').test(this.$element[0].className);\n\n if (this.options.isRevealed === true) {\n this.options.revealOn = this.options.revealOn || this.$element[0].className.match(/(reveal-for-medium|reveal-for-large)/g)[0].split('-')[2];\n this._setMQChecker();\n }\n if (!this.options.transitionTime === true) {\n this.options.transitionTime = parseFloat(window.getComputedStyle($('[data-off-canvas]')[0]).transitionDuration) * 1000;\n }\n }\n\n /**\n * Adds event handlers to the off-canvas wrapper and the exit overlay.\n * @function\n * @private\n */\n _events() {\n this.$element.off('.zf.trigger .zf.offcanvas').on({\n 'open.zf.trigger': this.open.bind(this),\n 'close.zf.trigger': this.close.bind(this),\n 'toggle.zf.trigger': this.toggle.bind(this),\n 'keydown.zf.offcanvas': this._handleKeyboard.bind(this)\n });\n\n if (this.options.closeOnClick === true) {\n var $target = this.options.contentOverlay ? this.$overlay : $('[data-off-canvas-content]');\n $target.on({'click.zf.offcanvas': this.close.bind(this)});\n }\n }\n\n /**\n * Applies event listener for elements that will reveal at certain breakpoints.\n * @private\n */\n _setMQChecker() {\n var _this = this;\n\n $(window).on('changed.zf.mediaquery', function() {\n if (Foundation.MediaQuery.atLeast(_this.options.revealOn)) {\n _this.reveal(true);\n } else {\n _this.reveal(false);\n }\n }).one('load.zf.offcanvas', function() {\n if (Foundation.MediaQuery.atLeast(_this.options.revealOn)) {\n _this.reveal(true);\n }\n });\n }\n\n /**\n * Handles the revealing/hiding the off-canvas at breakpoints, not the same as open.\n * @param {Boolean} isRevealed - true if element should be revealed.\n * @function\n */\n reveal(isRevealed) {\n var $closer = this.$element.find('[data-close]');\n if (isRevealed) {\n this.close();\n this.isRevealed = true;\n this.$element.attr('aria-hidden', 'false');\n this.$element.off('open.zf.trigger toggle.zf.trigger');\n if ($closer.length) { $closer.hide(); }\n } else {\n this.isRevealed = false;\n this.$element.attr('aria-hidden', 'true');\n this.$element.off('open.zf.trigger toggle.zf.trigger').on({\n 'open.zf.trigger': this.open.bind(this),\n 'toggle.zf.trigger': this.toggle.bind(this)\n });\n if ($closer.length) {\n $closer.show();\n }\n }\n }\n\n /**\n * Stops scrolling of the body when offcanvas is open on mobile Safari and other troublesome browsers.\n * @private\n */\n _stopScrolling(event) {\n return false;\n }\n\n // Taken and adapted from http://stackoverflow.com/questions/16889447/prevent-full-page-scrolling-ios\n // Only really works for y, not sure how to extend to x or if we need to.\n _recordScrollable(event) {\n let elem = this; // called from event handler context with this as elem\n\n // If the element is scrollable (content overflows), then...\n if (elem.scrollHeight !== elem.clientHeight) {\n // If we're at the top, scroll down one pixel to allow scrolling up\n if (elem.scrollTop === 0) {\n elem.scrollTop = 1;\n }\n // If we're at the bottom, scroll up one pixel to allow scrolling down\n if (elem.scrollTop === elem.scrollHeight - elem.clientHeight) {\n elem.scrollTop = elem.scrollHeight - elem.clientHeight - 1;\n }\n }\n elem.allowUp = elem.scrollTop > 0;\n elem.allowDown = elem.scrollTop < (elem.scrollHeight - elem.clientHeight);\n elem.lastY = event.originalEvent.pageY;\n }\n\n _stopScrollPropagation(event) {\n let elem = this; // called from event handler context with this as elem\n let up = event.pageY < elem.lastY;\n let down = !up;\n elem.lastY = event.pageY;\n\n if((up && elem.allowUp) || (down && elem.allowDown)) {\n event.stopPropagation();\n } else {\n event.preventDefault();\n }\n }\n\n /**\n * Opens the off-canvas menu.\n * @function\n * @param {Object} event - Event object passed from listener.\n * @param {jQuery} trigger - element that triggered the off-canvas to open.\n * @fires OffCanvas#opened\n */\n open(event, trigger) {\n if (this.$element.hasClass('is-open') || this.isRevealed) { return; }\n var _this = this;\n\n if (trigger) {\n this.$lastTrigger = trigger;\n }\n\n if (this.options.forceTo === 'top') {\n window.scrollTo(0, 0);\n } else if (this.options.forceTo === 'bottom') {\n window.scrollTo(0,document.body.scrollHeight);\n }\n\n /**\n * Fires when the off-canvas menu opens.\n * @event OffCanvas#opened\n */\n _this.$element.addClass('is-open')\n\n this.$triggers.attr('aria-expanded', 'true');\n this.$element.attr('aria-hidden', 'false')\n .trigger('opened.zf.offcanvas');\n\n // If `contentScroll` is set to false, add class and disable scrolling on touch devices.\n if (this.options.contentScroll === false) {\n $('body').addClass('is-off-canvas-open').on('touchmove', this._stopScrolling);\n this.$element.on('touchstart', this._recordScrollable);\n this.$element.on('touchmove', this._stopScrollPropagation);\n }\n\n if (this.options.contentOverlay === true) {\n this.$overlay.addClass('is-visible');\n }\n\n if (this.options.closeOnClick === true && this.options.contentOverlay === true) {\n this.$overlay.addClass('is-closable');\n }\n\n if (this.options.autoFocus === true) {\n this.$element.one(Foundation.transitionend(this.$element), function() {\n var canvasFocus = _this.$element.find('[data-autofocus]');\n if (canvasFocus.length) {\n canvasFocus.eq(0).focus();\n } else {\n _this.$element.find('a, button').eq(0).focus();\n }\n });\n }\n\n if (this.options.trapFocus === true) {\n this.$element.siblings('[data-off-canvas-content]').attr('tabindex', '-1');\n Foundation.Keyboard.trapFocus(this.$element);\n }\n }\n\n /**\n * Closes the off-canvas menu.\n * @function\n * @param {Function} cb - optional cb to fire after closure.\n * @fires OffCanvas#closed\n */\n close(cb) {\n if (!this.$element.hasClass('is-open') || this.isRevealed) { return; }\n\n var _this = this;\n\n _this.$element.removeClass('is-open');\n\n this.$element.attr('aria-hidden', 'true')\n /**\n * Fires when the off-canvas menu opens.\n * @event OffCanvas#closed\n */\n .trigger('closed.zf.offcanvas');\n\n // If `contentScroll` is set to false, remove class and re-enable scrolling on touch devices.\n if (this.options.contentScroll === false) {\n $('body').removeClass('is-off-canvas-open').off('touchmove', this._stopScrolling);\n this.$element.off('touchstart', this._recordScrollable);\n this.$element.off('touchmove', this._stopScrollPropagation);\n }\n\n if (this.options.contentOverlay === true) {\n this.$overlay.removeClass('is-visible');\n }\n\n if (this.options.closeOnClick === true && this.options.contentOverlay === true) {\n this.$overlay.removeClass('is-closable');\n }\n\n this.$triggers.attr('aria-expanded', 'false');\n\n if (this.options.trapFocus === true) {\n this.$element.siblings('[data-off-canvas-content]').removeAttr('tabindex');\n Foundation.Keyboard.releaseFocus(this.$element);\n }\n }\n\n /**\n * Toggles the off-canvas menu open or closed.\n * @function\n * @param {Object} event - Event object passed from listener.\n * @param {jQuery} trigger - element that triggered the off-canvas to open.\n */\n toggle(event, trigger) {\n if (this.$element.hasClass('is-open')) {\n this.close(event, trigger);\n }\n else {\n this.open(event, trigger);\n }\n }\n\n /**\n * Handles keyboard input when detected. When the escape key is pressed, the off-canvas menu closes, and focus is restored to the element that opened the menu.\n * @function\n * @private\n */\n _handleKeyboard(e) {\n Foundation.Keyboard.handleKey(e, 'OffCanvas', {\n close: () => {\n this.close();\n this.$lastTrigger.focus();\n return true;\n },\n handled: () => {\n e.stopPropagation();\n e.preventDefault();\n }\n });\n }\n\n /**\n * Destroys the offcanvas plugin.\n * @function\n */\n destroy() {\n this.close();\n this.$element.off('.zf.trigger .zf.offcanvas');\n this.$overlay.off('.zf.offcanvas');\n\n Foundation.unregisterPlugin(this);\n }\n}\n\nOffCanvas.defaults = {\n /**\n * Allow the user to click outside of the menu to close it.\n * @option\n * @type {boolean}\n * @default true\n */\n closeOnClick: true,\n\n /**\n * Adds an overlay on top of `[data-off-canvas-content]`.\n * @option\n * @type {boolean}\n * @default true\n */\n contentOverlay: true,\n\n /**\n * Enable/disable scrolling of the main content when an off canvas panel is open.\n * @option\n * @type {boolean}\n * @default true\n */\n contentScroll: true,\n\n /**\n * Amount of time in ms the open and close transition requires. If none selected, pulls from body style.\n * @option\n * @type {number}\n * @default 0\n */\n transitionTime: 0,\n\n /**\n * Type of transition for the offcanvas menu. Options are 'push', 'detached' or 'slide'.\n * @option\n * @type {string}\n * @default push\n */\n transition: 'push',\n\n /**\n * Force the page to scroll to top or bottom on open.\n * @option\n * @type {?string}\n * @default null\n */\n forceTo: null,\n\n /**\n * Allow the offcanvas to remain open for certain breakpoints.\n * @option\n * @type {boolean}\n * @default false\n */\n isRevealed: false,\n\n /**\n * Breakpoint at which to reveal. JS will use a RegExp to target standard classes, if changing classnames, pass your class with the `revealClass` option.\n * @option\n * @type {?string}\n * @default null\n */\n revealOn: null,\n\n /**\n * Force focus to the offcanvas on open. If true, will focus the opening trigger on close.\n * @option\n * @type {boolean}\n * @default true\n */\n autoFocus: true,\n\n /**\n * Class used to force an offcanvas to remain open. Foundation defaults for this are `reveal-for-large` & `reveal-for-medium`.\n * @option\n * @type {string}\n * @default reveal-for-\n * @todo improve the regex testing for this.\n */\n revealClass: 'reveal-for-',\n\n /**\n * Triggers optional focus trapping when opening an offcanvas. Sets tabindex of [data-off-canvas-content] to -1 for accessibility purposes.\n * @option\n * @type {boolean}\n * @default false\n */\n trapFocus: false\n}\n\n// Window exports\nFoundation.plugin(OffCanvas, 'OffCanvas');\n\n}(jQuery);\n","'use strict';\n\n!function($) {\n\n/**\n * Sticky module.\n * @module foundation.sticky\n * @requires foundation.util.triggers\n * @requires foundation.util.mediaQuery\n */\n\nclass Sticky {\n /**\n * Creates a new instance of a sticky thing.\n * @class\n * @param {jQuery} element - jQuery object to make sticky.\n * @param {Object} options - options object passed when creating the element programmatically.\n */\n constructor(element, options) {\n this.$element = element;\n this.options = $.extend({}, Sticky.defaults, this.$element.data(), options);\n\n this._init();\n\n Foundation.registerPlugin(this, 'Sticky');\n }\n\n /**\n * Initializes the sticky element by adding classes, getting/setting dimensions, breakpoints and attributes\n * @function\n * @private\n */\n _init() {\n var $parent = this.$element.parent('[data-sticky-container]'),\n id = this.$element[0].id || Foundation.GetYoDigits(6, 'sticky'),\n _this = this;\n\n if (!$parent.length) {\n this.wasWrapped = true;\n }\n this.$container = $parent.length ? $parent : $(this.options.container).wrapInner(this.$element);\n this.$container.addClass(this.options.containerClass);\n\n this.$element.addClass(this.options.stickyClass).attr({ 'data-resize': id, 'data-mutate': id });\n if (this.options.anchor !== '') {\n $('#' + _this.options.anchor).attr({ 'data-mutate': id });\n }\n\n this.scrollCount = this.options.checkEvery;\n this.isStuck = false;\n $(window).one('load.zf.sticky', function(){\n //We calculate the container height to have correct values for anchor points offset calculation.\n _this.containerHeight = _this.$element.css(\"display\") == \"none\" ? 0 : _this.$element[0].getBoundingClientRect().height;\n _this.$container.css('height', _this.containerHeight);\n _this.elemHeight = _this.containerHeight;\n if(_this.options.anchor !== ''){\n _this.$anchor = $('#' + _this.options.anchor);\n }else{\n _this._parsePoints();\n }\n\n _this._setSizes(function(){\n var scroll = window.pageYOffset;\n _this._calc(false, scroll);\n //Unstick the element will ensure that proper classes are set.\n if (!_this.isStuck) {\n _this._removeSticky((scroll >= _this.topPoint) ? false : true);\n }\n });\n _this._events(id.split('-').reverse().join('-'));\n });\n }\n\n /**\n * If using multiple elements as anchors, calculates the top and bottom pixel values the sticky thing should stick and unstick on.\n * @function\n * @private\n */\n _parsePoints() {\n var top = this.options.topAnchor == \"\" ? 1 : this.options.topAnchor,\n btm = this.options.btmAnchor== \"\" ? document.documentElement.scrollHeight : this.options.btmAnchor,\n pts = [top, btm],\n breaks = {};\n for (var i = 0, len = pts.length; i < len && pts[i]; i++) {\n var pt;\n if (typeof pts[i] === 'number') {\n pt = pts[i];\n } else {\n var place = pts[i].split(':'),\n anchor = $(`#${place[0]}`);\n\n pt = anchor.offset().top;\n if (place[1] && place[1].toLowerCase() === 'bottom') {\n pt += anchor[0].getBoundingClientRect().height;\n }\n }\n breaks[i] = pt;\n }\n\n\n this.points = breaks;\n return;\n }\n\n /**\n * Adds event handlers for the scrolling element.\n * @private\n * @param {String} id - psuedo-random id for unique scroll event listener.\n */\n _events(id) {\n var _this = this,\n scrollListener = this.scrollListener = `scroll.zf.${id}`;\n if (this.isOn) { return; }\n if (this.canStick) {\n this.isOn = true;\n $(window).off(scrollListener)\n .on(scrollListener, function(e) {\n if (_this.scrollCount === 0) {\n _this.scrollCount = _this.options.checkEvery;\n _this._setSizes(function() {\n _this._calc(false, window.pageYOffset);\n });\n } else {\n _this.scrollCount--;\n _this._calc(false, window.pageYOffset);\n }\n });\n }\n\n this.$element.off('resizeme.zf.trigger')\n .on('resizeme.zf.trigger', function(e, el) {\n _this._eventsHandler(id);\n });\n\n this.$element.on('mutateme.zf.trigger', function (e, el) {\n _this._eventsHandler(id);\n });\n\n if(this.$anchor) {\n this.$anchor.on('mutateme.zf.trigger', function (e, el) {\n _this._eventsHandler(id);\n });\n }\n }\n\n /**\n * Handler for events.\n * @private\n * @param {String} id - psuedo-random id for unique scroll event listener.\n */\n _eventsHandler(id) {\n var _this = this,\n scrollListener = this.scrollListener = `scroll.zf.${id}`;\n\n _this._setSizes(function() {\n _this._calc(false);\n if (_this.canStick) {\n if (!_this.isOn) {\n _this._events(id);\n }\n } else if (_this.isOn) {\n _this._pauseListeners(scrollListener);\n }\n });\n }\n\n /**\n * Removes event handlers for scroll and change events on anchor.\n * @fires Sticky#pause\n * @param {String} scrollListener - unique, namespaced scroll listener attached to `window`\n */\n _pauseListeners(scrollListener) {\n this.isOn = false;\n $(window).off(scrollListener);\n\n /**\n * Fires when the plugin is paused due to resize event shrinking the view.\n * @event Sticky#pause\n * @private\n */\n this.$element.trigger('pause.zf.sticky');\n }\n\n /**\n * Called on every `scroll` event and on `_init`\n * fires functions based on booleans and cached values\n * @param {Boolean} checkSizes - true if plugin should recalculate sizes and breakpoints.\n * @param {Number} scroll - current scroll position passed from scroll event cb function. If not passed, defaults to `window.pageYOffset`.\n */\n _calc(checkSizes, scroll) {\n if (checkSizes) { this._setSizes(); }\n\n if (!this.canStick) {\n if (this.isStuck) {\n this._removeSticky(true);\n }\n return false;\n }\n\n if (!scroll) { scroll = window.pageYOffset; }\n\n if (scroll >= this.topPoint) {\n if (scroll <= this.bottomPoint) {\n if (!this.isStuck) {\n this._setSticky();\n }\n } else {\n if (this.isStuck) {\n this._removeSticky(false);\n }\n }\n } else {\n if (this.isStuck) {\n this._removeSticky(true);\n }\n }\n }\n\n /**\n * Causes the $element to become stuck.\n * Adds `position: fixed;`, and helper classes.\n * @fires Sticky#stuckto\n * @function\n * @private\n */\n _setSticky() {\n var _this = this,\n stickTo = this.options.stickTo,\n mrgn = stickTo === 'top' ? 'marginTop' : 'marginBottom',\n notStuckTo = stickTo === 'top' ? 'bottom' : 'top',\n css = {};\n\n css[mrgn] = `${this.options[mrgn]}em`;\n css[stickTo] = 0;\n css[notStuckTo] = 'auto';\n this.isStuck = true;\n this.$element.removeClass(`is-anchored is-at-${notStuckTo}`)\n .addClass(`is-stuck is-at-${stickTo}`)\n .css(css)\n /**\n * Fires when the $element has become `position: fixed;`\n * Namespaced to `top` or `bottom`, e.g. `sticky.zf.stuckto:top`\n * @event Sticky#stuckto\n */\n .trigger(`sticky.zf.stuckto:${stickTo}`);\n this.$element.on(\"transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd\", function() {\n _this._setSizes();\n });\n }\n\n /**\n * Causes the $element to become unstuck.\n * Removes `position: fixed;`, and helper classes.\n * Adds other helper classes.\n * @param {Boolean} isTop - tells the function if the $element should anchor to the top or bottom of its $anchor element.\n * @fires Sticky#unstuckfrom\n * @private\n */\n _removeSticky(isTop) {\n var stickTo = this.options.stickTo,\n stickToTop = stickTo === 'top',\n css = {},\n anchorPt = (this.points ? this.points[1] - this.points[0] : this.anchorHeight) - this.elemHeight,\n mrgn = stickToTop ? 'marginTop' : 'marginBottom',\n notStuckTo = stickToTop ? 'bottom' : 'top',\n topOrBottom = isTop ? 'top' : 'bottom';\n\n css[mrgn] = 0;\n\n css['bottom'] = 'auto';\n if(isTop) {\n css['top'] = 0;\n } else {\n css['top'] = anchorPt;\n }\n\n this.isStuck = false;\n this.$element.removeClass(`is-stuck is-at-${stickTo}`)\n .addClass(`is-anchored is-at-${topOrBottom}`)\n .css(css)\n /**\n * Fires when the $element has become anchored.\n * Namespaced to `top` or `bottom`, e.g. `sticky.zf.unstuckfrom:bottom`\n * @event Sticky#unstuckfrom\n */\n .trigger(`sticky.zf.unstuckfrom:${topOrBottom}`);\n }\n\n /**\n * Sets the $element and $container sizes for plugin.\n * Calls `_setBreakPoints`.\n * @param {Function} cb - optional callback function to fire on completion of `_setBreakPoints`.\n * @private\n */\n _setSizes(cb) {\n this.canStick = Foundation.MediaQuery.is(this.options.stickyOn);\n if (!this.canStick) {\n if (cb && typeof cb === 'function') { cb(); }\n }\n var _this = this,\n newElemWidth = this.$container[0].getBoundingClientRect().width,\n comp = window.getComputedStyle(this.$container[0]),\n pdngl = parseInt(comp['padding-left'], 10),\n pdngr = parseInt(comp['padding-right'], 10);\n\n if (this.$anchor && this.$anchor.length) {\n this.anchorHeight = this.$anchor[0].getBoundingClientRect().height;\n } else {\n this._parsePoints();\n }\n\n this.$element.css({\n 'max-width': `${newElemWidth - pdngl - pdngr}px`\n });\n\n var newContainerHeight = this.$element[0].getBoundingClientRect().height || this.containerHeight;\n if (this.$element.css(\"display\") == \"none\") {\n newContainerHeight = 0;\n }\n this.containerHeight = newContainerHeight;\n this.$container.css({\n height: newContainerHeight\n });\n this.elemHeight = newContainerHeight;\n\n if (!this.isStuck) {\n if (this.$element.hasClass('is-at-bottom')) {\n var anchorPt = (this.points ? this.points[1] - this.$container.offset().top : this.anchorHeight) - this.elemHeight;\n this.$element.css('top', anchorPt);\n }\n }\n\n this._setBreakPoints(newContainerHeight, function() {\n if (cb && typeof cb === 'function') { cb(); }\n });\n }\n\n /**\n * Sets the upper and lower breakpoints for the element to become sticky/unsticky.\n * @param {Number} elemHeight - px value for sticky.$element height, calculated by `_setSizes`.\n * @param {Function} cb - optional callback function to be called on completion.\n * @private\n */\n _setBreakPoints(elemHeight, cb) {\n if (!this.canStick) {\n if (cb && typeof cb === 'function') { cb(); }\n else { return false; }\n }\n var mTop = emCalc(this.options.marginTop),\n mBtm = emCalc(this.options.marginBottom),\n topPoint = this.points ? this.points[0] : this.$anchor.offset().top,\n bottomPoint = this.points ? this.points[1] : topPoint + this.anchorHeight,\n // topPoint = this.$anchor.offset().top || this.points[0],\n // bottomPoint = topPoint + this.anchorHeight || this.points[1],\n winHeight = window.innerHeight;\n\n if (this.options.stickTo === 'top') {\n topPoint -= mTop;\n bottomPoint -= (elemHeight + mTop);\n } else if (this.options.stickTo === 'bottom') {\n topPoint -= (winHeight - (elemHeight + mBtm));\n bottomPoint -= (winHeight - mBtm);\n } else {\n //this would be the stickTo: both option... tricky\n }\n\n this.topPoint = topPoint;\n this.bottomPoint = bottomPoint;\n\n if (cb && typeof cb === 'function') { cb(); }\n }\n\n /**\n * Destroys the current sticky element.\n * Resets the element to the top position first.\n * Removes event listeners, JS-added css properties and classes, and unwraps the $element if the JS added the $container.\n * @function\n */\n destroy() {\n this._removeSticky(true);\n\n this.$element.removeClass(`${this.options.stickyClass} is-anchored is-at-top`)\n .css({\n height: '',\n top: '',\n bottom: '',\n 'max-width': ''\n })\n .off('resizeme.zf.trigger')\n .off('mutateme.zf.trigger');\n if (this.$anchor && this.$anchor.length) {\n this.$anchor.off('change.zf.sticky');\n }\n $(window).off(this.scrollListener);\n\n if (this.wasWrapped) {\n this.$element.unwrap();\n } else {\n this.$container.removeClass(this.options.containerClass)\n .css({\n height: ''\n });\n }\n Foundation.unregisterPlugin(this);\n }\n}\n\nSticky.defaults = {\n /**\n * Customizable container template. Add your own classes for styling and sizing.\n * @option\n * @type {string}\n * @default '<div data-sticky-container></div>'\n */\n container: '<div data-sticky-container></div>',\n /**\n * Location in the view the element sticks to. Can be `'top'` or `'bottom'`.\n * @option\n * @type {string}\n * @default 'top'\n */\n stickTo: 'top',\n /**\n * If anchored to a single element, the id of that element.\n * @option\n * @type {string}\n * @default ''\n */\n anchor: '',\n /**\n * If using more than one element as anchor points, the id of the top anchor.\n * @option\n * @type {string}\n * @default ''\n */\n topAnchor: '',\n /**\n * If using more than one element as anchor points, the id of the bottom anchor.\n * @option\n * @type {string}\n * @default ''\n */\n btmAnchor: '',\n /**\n * Margin, in `em`'s to apply to the top of the element when it becomes sticky.\n * @option\n * @type {number}\n * @default 1\n */\n marginTop: 1,\n /**\n * Margin, in `em`'s to apply to the bottom of the element when it becomes sticky.\n * @option\n * @type {number}\n * @default 1\n */\n marginBottom: 1,\n /**\n * Breakpoint string that is the minimum screen size an element should become sticky.\n * @option\n * @type {string}\n * @default 'medium'\n */\n stickyOn: 'medium',\n /**\n * Class applied to sticky element, and removed on destruction. Foundation defaults to `sticky`.\n * @option\n * @type {string}\n * @default 'sticky'\n */\n stickyClass: 'sticky',\n /**\n * Class applied to sticky container. Foundation defaults to `sticky-container`.\n * @option\n * @type {string}\n * @default 'sticky-container'\n */\n containerClass: 'sticky-container',\n /**\n * Number of scroll events between the plugin's recalculating sticky points. Setting it to `0` will cause it to recalc every scroll event, setting it to `-1` will prevent recalc on scroll.\n * @option\n * @type {number}\n * @default -1\n */\n checkEvery: -1\n};\n\n/**\n * Helper function to calculate em values\n * @param Number {em} - number of em's to calculate into pixels\n */\nfunction emCalc(em) {\n return parseInt(window.getComputedStyle(document.body, null).fontSize, 10) * em;\n}\n\n// Window exports\nFoundation.plugin(Sticky, 'Sticky');\n\n}(jQuery);\n","'use strict';\n\n!function($) {\n\nfunction Timer(elem, options, cb) {\n var _this = this,\n duration = options.duration,//options is an object for easily adding features later.\n nameSpace = Object.keys(elem.data())[0] || 'timer',\n remain = -1,\n start,\n timer;\n\n this.isPaused = false;\n\n this.restart = function() {\n remain = -1;\n clearTimeout(timer);\n this.start();\n }\n\n this.start = function() {\n this.isPaused = false;\n // if(!elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things.\n clearTimeout(timer);\n remain = remain <= 0 ? duration : remain;\n elem.data('paused', false);\n start = Date.now();\n timer = setTimeout(function(){\n if(options.infinite){\n _this.restart();//rerun the timer.\n }\n if (cb && typeof cb === 'function') { cb(); }\n }, remain);\n elem.trigger(`timerstart.zf.${nameSpace}`);\n }\n\n this.pause = function() {\n this.isPaused = true;\n //if(elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things.\n clearTimeout(timer);\n elem.data('paused', true);\n var end = Date.now();\n remain = remain - (end - start);\n elem.trigger(`timerpaused.zf.${nameSpace}`);\n }\n}\n\n/**\n * Runs a callback function when images are fully loaded.\n * @param {Object} images - Image(s) to check if loaded.\n * @param {Func} callback - Function to execute when image is fully loaded.\n */\nfunction onImagesLoaded(images, callback){\n var self = this,\n unloaded = images.length;\n\n if (unloaded === 0) {\n callback();\n }\n\n images.each(function() {\n // Check if image is loaded\n if (this.complete || (this.readyState === 4) || (this.readyState === 'complete')) {\n singleImageLoaded();\n }\n // Force load the image\n else {\n // fix for IE. See https://css-tricks.com/snippets/jquery/fixing-load-in-ie-for-cached-images/\n var src = $(this).attr('src');\n $(this).attr('src', src + (src.indexOf('?') >= 0 ? '&' : '?') + (new Date().getTime()));\n $(this).one('load', function() {\n singleImageLoaded();\n });\n }\n });\n\n function singleImageLoaded() {\n unloaded--;\n if (unloaded === 0) {\n callback();\n }\n }\n}\n\nFoundation.Timer = Timer;\nFoundation.onImagesLoaded = onImagesLoaded;\n\n}(jQuery);\n","'use strict';\n\n!function($) {\n\n/**\n * Equalizer module.\n * @module foundation.equalizer\n * @requires foundation.util.mediaQuery\n * @requires foundation.util.timerAndImageLoader if equalizer contains images\n */\n\nclass Equalizer {\n /**\n * Creates a new instance of Equalizer.\n * @class\n * @fires Equalizer#init\n * @param {Object} element - jQuery object to add the trigger to.\n * @param {Object} options - Overrides to the default plugin settings.\n */\n constructor(element, options){\n this.$element = element;\n this.options = $.extend({}, Equalizer.defaults, this.$element.data(), options);\n\n this._init();\n\n Foundation.registerPlugin(this, 'Equalizer');\n }\n\n /**\n * Initializes the Equalizer plugin and calls functions to get equalizer functioning on load.\n * @private\n */\n _init() {\n var eqId = this.$element.attr('data-equalizer') || '';\n var $watched = this.$element.find(`[data-equalizer-watch=\"${eqId}\"]`);\n\n this.$watched = $watched.length ? $watched : this.$element.find('[data-equalizer-watch]');\n this.$element.attr('data-resize', (eqId || Foundation.GetYoDigits(6, 'eq')));\n\tthis.$element.attr('data-mutate', (eqId || Foundation.GetYoDigits(6, 'eq')));\n\n this.hasNested = this.$element.find('[data-equalizer]').length > 0;\n this.isNested = this.$element.parentsUntil(document.body, '[data-equalizer]').length > 0;\n this.isOn = false;\n this._bindHandler = {\n onResizeMeBound: this._onResizeMe.bind(this),\n onPostEqualizedBound: this._onPostEqualized.bind(this)\n };\n\n var imgs = this.$element.find('img');\n var tooSmall;\n if(this.options.equalizeOn){\n tooSmall = this._checkMQ();\n $(window).on('changed.zf.mediaquery', this._checkMQ.bind(this));\n }else{\n this._events();\n }\n if((tooSmall !== undefined && tooSmall === false) || tooSmall === undefined){\n if(imgs.length){\n Foundation.onImagesLoaded(imgs, this._reflow.bind(this));\n }else{\n this._reflow();\n }\n }\n }\n\n /**\n * Removes event listeners if the breakpoint is too small.\n * @private\n */\n _pauseEvents() {\n this.isOn = false;\n this.$element.off({\n '.zf.equalizer': this._bindHandler.onPostEqualizedBound,\n 'resizeme.zf.trigger': this._bindHandler.onResizeMeBound,\n\t 'mutateme.zf.trigger': this._bindHandler.onResizeMeBound\n });\n }\n\n /**\n * function to handle $elements resizeme.zf.trigger, with bound this on _bindHandler.onResizeMeBound\n * @private\n */\n _onResizeMe(e) {\n this._reflow();\n }\n\n /**\n * function to handle $elements postequalized.zf.equalizer, with bound this on _bindHandler.onPostEqualizedBound\n * @private\n */\n _onPostEqualized(e) {\n if(e.target !== this.$element[0]){ this._reflow(); }\n }\n\n /**\n * Initializes events for Equalizer.\n * @private\n */\n _events() {\n var _this = this;\n this._pauseEvents();\n if(this.hasNested){\n this.$element.on('postequalized.zf.equalizer', this._bindHandler.onPostEqualizedBound);\n }else{\n this.$element.on('resizeme.zf.trigger', this._bindHandler.onResizeMeBound);\n\t this.$element.on('mutateme.zf.trigger', this._bindHandler.onResizeMeBound);\n }\n this.isOn = true;\n }\n\n /**\n * Checks the current breakpoint to the minimum required size.\n * @private\n */\n _checkMQ() {\n var tooSmall = !Foundation.MediaQuery.is(this.options.equalizeOn);\n if(tooSmall){\n if(this.isOn){\n this._pauseEvents();\n this.$watched.css('height', 'auto');\n }\n }else{\n if(!this.isOn){\n this._events();\n }\n }\n return tooSmall;\n }\n\n /**\n * A noop version for the plugin\n * @private\n */\n _killswitch() {\n return;\n }\n\n /**\n * Calls necessary functions to update Equalizer upon DOM change\n * @private\n */\n _reflow() {\n if(!this.options.equalizeOnStack){\n if(this._isStacked()){\n this.$watched.css('height', 'auto');\n return false;\n }\n }\n if (this.options.equalizeByRow) {\n this.getHeightsByRow(this.applyHeightByRow.bind(this));\n }else{\n this.getHeights(this.applyHeight.bind(this));\n }\n }\n\n /**\n * Manually determines if the first 2 elements are *NOT* stacked.\n * @private\n */\n _isStacked() {\n if (!this.$watched[0] || !this.$watched[1]) {\n return true;\n }\n return this.$watched[0].getBoundingClientRect().top !== this.$watched[1].getBoundingClientRect().top;\n }\n\n /**\n * Finds the outer heights of children contained within an Equalizer parent and returns them in an array\n * @param {Function} cb - A non-optional callback to return the heights array to.\n * @returns {Array} heights - An array of heights of children within Equalizer container\n */\n getHeights(cb) {\n var heights = [];\n for(var i = 0, len = this.$watched.length; i < len; i++){\n this.$watched[i].style.height = 'auto';\n heights.push(this.$watched[i].offsetHeight);\n }\n cb(heights);\n }\n\n /**\n * Finds the outer heights of children contained within an Equalizer parent and returns them in an array\n * @param {Function} cb - A non-optional callback to return the heights array to.\n * @returns {Array} groups - An array of heights of children within Equalizer container grouped by row with element,height and max as last child\n */\n getHeightsByRow(cb) {\n var lastElTopOffset = (this.$watched.length ? this.$watched.first().offset().top : 0),\n groups = [],\n group = 0;\n //group by Row\n groups[group] = [];\n for(var i = 0, len = this.$watched.length; i < len; i++){\n this.$watched[i].style.height = 'auto';\n //maybe could use this.$watched[i].offsetTop\n var elOffsetTop = $(this.$watched[i]).offset().top;\n if (elOffsetTop!=lastElTopOffset) {\n group++;\n groups[group] = [];\n lastElTopOffset=elOffsetTop;\n }\n groups[group].push([this.$watched[i],this.$watched[i].offsetHeight]);\n }\n\n for (var j = 0, ln = groups.length; j < ln; j++) {\n var heights = $(groups[j]).map(function(){ return this[1]; }).get();\n var max = Math.max.apply(null, heights);\n groups[j].push(max);\n }\n cb(groups);\n }\n\n /**\n * Changes the CSS height property of each child in an Equalizer parent to match the tallest\n * @param {array} heights - An array of heights of children within Equalizer container\n * @fires Equalizer#preequalized\n * @fires Equalizer#postequalized\n */\n applyHeight(heights) {\n var max = Math.max.apply(null, heights);\n /**\n * Fires before the heights are applied\n * @event Equalizer#preequalized\n */\n this.$element.trigger('preequalized.zf.equalizer');\n\n this.$watched.css('height', max);\n\n /**\n * Fires when the heights have been applied\n * @event Equalizer#postequalized\n */\n this.$element.trigger('postequalized.zf.equalizer');\n }\n\n /**\n * Changes the CSS height property of each child in an Equalizer parent to match the tallest by row\n * @param {array} groups - An array of heights of children within Equalizer container grouped by row with element,height and max as last child\n * @fires Equalizer#preequalized\n * @fires Equalizer#preequalizedrow\n * @fires Equalizer#postequalizedrow\n * @fires Equalizer#postequalized\n */\n applyHeightByRow(groups) {\n /**\n * Fires before the heights are applied\n */\n this.$element.trigger('preequalized.zf.equalizer');\n for (var i = 0, len = groups.length; i < len ; i++) {\n var groupsILength = groups[i].length,\n max = groups[i][groupsILength - 1];\n if (groupsILength<=2) {\n $(groups[i][0][0]).css({'height':'auto'});\n continue;\n }\n /**\n * Fires before the heights per row are applied\n * @event Equalizer#preequalizedrow\n */\n this.$element.trigger('preequalizedrow.zf.equalizer');\n for (var j = 0, lenJ = (groupsILength-1); j < lenJ ; j++) {\n $(groups[i][j][0]).css({'height':max});\n }\n /**\n * Fires when the heights per row have been applied\n * @event Equalizer#postequalizedrow\n */\n this.$element.trigger('postequalizedrow.zf.equalizer');\n }\n /**\n * Fires when the heights have been applied\n */\n this.$element.trigger('postequalized.zf.equalizer');\n }\n\n /**\n * Destroys an instance of Equalizer.\n * @function\n */\n destroy() {\n this._pauseEvents();\n this.$watched.css('height', 'auto');\n\n Foundation.unregisterPlugin(this);\n }\n}\n\n/**\n * Default settings for plugin\n */\nEqualizer.defaults = {\n /**\n * Enable height equalization when stacked on smaller screens.\n * @option\n * @type {boolean}\n * @default false\n */\n equalizeOnStack: false,\n /**\n * Enable height equalization row by row.\n * @option\n * @type {boolean}\n * @default false\n */\n equalizeByRow: false,\n /**\n * String representing the minimum breakpoint size the plugin should equalize heights on.\n * @option\n * @type {string}\n * @default ''\n */\n equalizeOn: ''\n};\n\n// Window exports\nFoundation.plugin(Equalizer, 'Equalizer');\n\n}(jQuery);\n","/**\n Attorneys archive\n\n @since 0.1.0\n @package Inosencio\n */\n(function ($) {\n 'use strict';\n\n $(function () {\n\n var $attorney_select_items = $('.attorney-select').find('li'),\n $attorney_items = $('.attorneys').find('li');\n\n $attorney_items.filter(':not(:first-of-type)').hide();\n $attorney_select_items.first().addClass('active');\n\n $attorney_select_items.click(function () {\n\n $attorney_items.hide();\n $attorney_items.eq($(this).index()).show();\n\n $attorney_select_items.removeClass('active');\n $(this).addClass('active');\n });\n });\n\n})(jQuery);","/**\n Site header functionality.\n\n @since 0.1.0\n @package Inosencio\n */\n(function ($) {\n 'use strict';\n\n $(function () {\n\n nav_position();\n\n $('.toggle-nav').click(function () {\n $('#mobile-nav').toggleClass('active');\n });\n });\n\n $(window).resize(nav_position);\n\n function nav_position() {\n\n $('#site-header').find('.site-nav').each(function () {\n\n $(this).css({\n top: ($(this).parent().height() / 2) - ($(this).height() / 2)\n });\n });\n }\n\n})(jQuery);","/**\n Main functions file.\n\n @since 0.1.0\n @package Inosencio\n */\n(function ($) {\n 'use strict';\n\n // Foundation\n $(document).foundation();\n\n // Page loading overlay\n $('#site-content').append('<div id=\"page-load-overlay\"><div class=\"loader fa fa-circle-o-notch fa-spin-fast\" /></div>');\n\n setTimeout(function () {\n\n var $overlay = $('#page-load-overlay');\n\n if ($overlay.length) {\n $overlay.animate({\n opacity: 1\n }, 300);\n }\n }, 300);\n\n $(window).load(function () {\n $('#page-load-overlay').animate({\n opacity: 0\n }, {\n duration: 500,\n complete: function () {\n $(this).remove();\n }\n });\n });\n\n})(jQuery);","/**\n Practice areas archive\n\n @since 0.1.0\n @package Inosencio\n */\n(function ($) {\n 'use strict';\n\n\n $(function () {\n\n // Prevent page jump\n prevent_jump();\n\n if (!$('body').hasClass('post-type-archive-practice_area')) {\n return;\n }\n\n var $practice_areas = $('.practice-areas'),\n hash = window.location.hash;\n\n $practice_areas.find('.practice-area-content').hide();\n\n $practice_areas.find('.practice-area > a').click(function (e) {\n\n console.log('click');\n\n var $practice_area = $(this).closest('.practice-area');\n\n $practice_areas.find('.practice-area').removeClass('active');\n $practice_areas.find('.practice-area-content').hide();\n $practice_area.siblings('.practice-area-content').show();\n $practice_area.addClass('active');\n\n // Scroll\n var href = $(this).attr('href'),\n hash = href.substring(href.indexOf(\"#\") + 1),\n target = $('#' + hash);\n\n if (target.length) {\n $('html,body').animate({\n scrollTop: target.offset().top - $('.top-bar').height() - 10\n }, 500);\n }\n\n e.preventDefault();\n return false;\n });\n\n // Scroll to practice area if hash is in page load\n if (hash.length) {\n setTimeout(function () {\n $(hash).find('> a').click();\n }, 100);\n }\n });\n\n function prevent_jump() {\n\n if (window.location.hash) {\n setTimeout(function() {\n window.scrollTo(0, 0);\n }, 1);\n }\n }\n\n})(jQuery);","/**\n Search bar functionality.\n\n @since 0.1.0\n @package Inosencio\n */\n(function ($) {\n 'use strict';\n\n $(function () {\n\n var $top_bar = $('#site-header').find('.top-bar'),\n $search_container = $top_bar.find('.search'),\n $search_input = $search_container.find('input[type=\"search\"]'),\n $search_button = $search_container.find('.search-button'),\n placeholder = $search_input.data('placeholder');\n\n $search_input\n .val(placeholder)\n .on('focus', function () {\n\n if ($(this).val() == placeholder) {\n $(this).val('');\n }\n })\n .blur(function () {\n\n if (!$(this).val()) {\n $(this).val(placeholder);\n }\n })\n .each(resizeInput);\n\n function resizeInput() {\n $(this).attr('size', $(this).val().length);\n }\n\n $search_button.click(function (e) {\n\n $search_input.focus();\n\n e.preventDefault();\n return false;\n });\n });\n\n})(jQuery);","/*!\n * jQuery Cookie Plugin v1.4.1\n * https://github.com/carhartl/jquery-cookie\n *\n * Copyright 2013 Klaus Hartl\n * Released under the MIT license\n */\n!function(a){\"function\"==typeof define&&define.amd?define([\"jquery\"],a):a(\"object\"==typeof exports?require(\"jquery\"):jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('\"')&&(a=a.slice(1,-1).replace(/\\\\\"/g,'\"').replace(/\\\\\\\\/g,\"\\\\\"));try{return a=decodeURIComponent(a.replace(g,\" \")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),\"number\"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),\"=\",d(g),i.expires?\"; expires=\"+i.expires.toUTCString():\"\",i.path?\"; path=\"+i.path:\"\",i.domain?\"; domain=\"+i.domain:\"\",i.secure?\"; secure\":\"\"].join(\"\")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split(\"; \"):[],n=0,o=m.length;o>n;n++){var p=m[n].split(\"=\"),q=c(p.shift()),r=p.join(\"=\");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,\"\",a.extend({},c,{expires:-1})),!a.cookie(b))}});\n"]}