{"version":3,"sources":["node_modules/browser-pack/_prelude.js","helpers/cookies.js","helpers/cssControlCode.js","helpers/getElementOuterHtml.js","helpers/getHandlebarTemplate.js","helpers/jQueryExtend.js","helpers/jQueryExtend_ajaxPattern.js","helpers/listing.js","helpers/slugify.js","helpers/sticky.js","helpers/throttle.js","helpers/twiggy.js","index.js","modules/accordions.js","modules/ajaxPattern.js","modules/ajaxPatternOverride.js","modules/back2top.js","modules/clickable.js","modules/dropdown.js","modules/emergencyAlerts.js","modules/eventFilters.js","modules/eventListingInteractive.js","modules/footnote.js","modules/formInputs.js","modules/formValidation.js","modules/googleMap.js","modules/headerTags.js","modules/hideAlert.js","modules/imageFill.js","modules/inlineOverlay.js","modules/keywordSearch.js","modules/linkListToggle.js","modules/locationFilters.js","modules/locationListing.js","modules/mainNav.js","modules/mobileNav.js","modules/orgSelector.js","modules/pagination.js","modules/pikaday.js","modules/responsiveVideo.js","modules/resultsHeading.js","modules/richText.js","modules/scrollAnchors.js","modules/stickyTOC.js","modules/teaserListingGroup.js","modules/truncateTitle.js","modules/utilNav.js"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","1","module","document","window","setCookie","name","value","expires","d","Date","setTime","getTime","toUTCString","cookie","getCookie","parts","split","pop","shift","$el","getComputedStyle","getPropertyValue","replace","err","el","outerHTML","container","createElement","appendChild","cloneNode","innerHTML","undefined","Handlebars","templates","jQuery","ajax","url","ma","themePath","success","data","compile","async","$","extend","expr","focusable","index","selector","is","ajaxCache","fn","MassAjaxPattern","options","this","each","$element","element","endpoint","pattern","renderPattern","patternTransform","transform","self","updatePattern","getPatternData","then","patternData","isEmptyObject","console","error","fail","_twiggy2","template","renderAsync","markup","html","trigger","getPatternPath","pathParts","namespace","patternPath","join","patternPaths","type","cache","dataType","jqXHR","textStatus","errorThrown","defaults","moment","transformTag","tag","label","svg","id","_helpersGetElementOuterHtmlJs2","find","siblings","hasFilter","filters","some","filter","hasOwnProperty","getFilterValues","map","transformActiveTagsData","args","filterData","clearedFilter","resultsHeading","tags","getActiveFilters","formData","paginateItems","items","max","page","pageTotal","item","isActive","totalPages","clearListingPage","listing","parent","makeAllActive","filterDataByTags","haystack","every","v","Boolean","Object","keys","indexOf","filterDataByDateTags","filterStart","filterEnd","start","end","isSameOrAfter","isSameOrBefore","isSame","paginated","maxItems","renderListingPage","warn","selectors","forEach","append","row","first","eq","focus","_helpersStickyJs2","init","transformPaginationData","targetPage","pages","push","text","toString","active","pagination","prev","disabled","next","currentPage","transformResultsHeading","totalActive","firstItem","Number","lastItem","totalResults","numResults","filterListingData","sortDataAlphabetically","sort","b","nameA","title","toUpperCase","nameB","sortDataByDate","dateType","dateA","dateB","isBefore","isAfter","geocodeAddressString","address","callback","geocoder","geocode","results","status","google","maps","GeocoderStatus","OK","place","geocodePlaceId","place_id","placeId","calculateDistance","lat1","lon1","lat2","lon2","unit","radlat1","Math","PI","radlat2","theta","radtheta","dist","sin","cos","acos","transformListing","compiledTemplate","_helpersGetHandlebarTemplateJs2","listingMarkup","itemData","val","tagsData","tagsFormatted","assign","itemTransform","makeMoment","startTimestamp","endTimestamp","toLowerCase","$elParent","elWidth","lowerLimit","upperLimit","runCode","updateData","newRunCode","_helpersCssControlCodeJs2","removeAttr","height","width","offset","top","outerHeight","setPosition","attr","windowTop","scrollTop","middle","bottom","css","offsetParent","setTimeout","resize","scroll","threshhold","scope","last","deferTimer","context","now","arguments","clearTimeout","apply","Twig","extendFunction","twig","href","iconPath","render","patternName","Promise","resolve","reject","allowInlineIncludes","namespaces","base","atoms","molecules","organisms","meta","load","$link","$content","$status","open","hasClass","stop","slideDown","on","preventDefault","slideUp","toggleClass","temp","removeClass","$context","ajaxData","emergencyAlerts","alerts","these","are","animate","addClass","click","event","dest","location","dropdownMenu","querySelectorAll","_length","parentEl","selectEl","querySelector","link","onchange","elem","selectedIndex","srcElement","innerText","cookieName","cookieValue","_helpersCookiesJs2","$button","$locationFilterParent","$locationFilter","locationInput","getElementById","swLat","swLng","neLat","neLng","bounds","LatLngBounds","LatLng","strictBounds","types","componentRestrictions","country","placeIdOnly","autocomplete","places","Autocomplete","$form","$place","$dateStart","$dateEnd","$tags","prop","submit","$location","dateRange","startDate","endDate","useToday","format","getFormData","transformData","transformation","promise","Deferred","transformReturn","filteredData","_helpersListingJs2","sortedData","autocompletePlace","getPlace","Geocoder","result","sortDataAroundPlace","lat","geometry","lng","key","distance","position","$resultsHeading","$pagination","$eventFilter","rawData","eventListingInteractive","masterData","handlePagination","target","nextPage","parseInt","updateChildComponents","listArray","eventListing","events","masterListing","masterListingMarkup","date","endDay","ceil","populateMasterDataSource","formValues","done","defaultPage","params","URLSearchParams","search","history","state","get","$messageLink","clone","$rtelink","isMobile","getPosition","$target","pos","headerHeight","navHeight","scrollTo","maxlength","remaining","message","wrap","inArray","keyCode","ctrlKey","metaKey","shiftKey","$plus","$minus","trim","validate","valid","match","requiredFields","$errorList","$field","submitForm","googleMapData","mapsInitialized","checkForGoogleMaps","setInterval","clearInterval","stopChecking","markers","initializedMarkers","mapData","scrollwheel","Map","potentialHTML","infoData","markerData","infoWindow","marker","Marker","phoneFormatted","formatPhone","phone","faxFormatted","fax","InfoWindow","content","markerBouncing","addListener","hideInfo","showInfo","close","bounce","setAnimation","Animation","BOUNCE","addMarkersToMap","addListenerOnce","$mapItems","role","tabindex","aria-label","bind","ev","which","markerIndex","_i","setCenter","setZoom","_i2","setMap","removeMarkersFromMap","dataMarkers","updateMapByMarkers","substring","fitBounds","$showHideButton","$dynamicItems","show","hide","$tagWrapper","$buttonCounter","$hiddenTag","tagCount","$tagState","toggle","$tagStateText","fadeIn","fadeOut","sidebarHeight","debounceTimer","mediaWidth","wrapperWidth","$thisMedia","thisPosition","tocContainerClass","containerClass","contentClass","titleClass","toggleOverlay","$containerEl","closest","isOpen","parents","floor","random","initialize","keydown","$thisList","$thisToggle","$thisToggleLabel","$listItem","children","listItems","showToggle","thisToggleText","$item","clearDeactivatedFilter","activeClass","markerActiveClass","activeLocationListingRow","markerActiveLocationListingRow","mapCol","getActiveMarkers","spherical","computeDistanceBetween","$mapCol","$map","locationListing","promosArray","imagePromos","currentTarget","windowWidth","innerWidth","openClass","closeClass","submenuClass","$parent","$mainNavToggle","$mainNavItems","breakpoint","delay","$topLevelLinks","$openContent","$focusedElement","activeElement","menuFlipped","$topLevelItem","$topLevelLink","$dropdownLinks","dropdownLinksLength","focusIndexInDropdown","keycode","action","skip","left","right","up","down","linkCount","menuButton","addEventListener","classList","searchForm","orgSelector","$select","$placeholder","renderTemplate","organizations","change","pushPaginationState","onpopstate","_helpersTwiggy2","renderPagination","targetPageNumber","has","pageNum","set","pushState","origin","pathname","restrict","picker","Pikaday","field","setMaxDate","setMinDate","fitVids","richTextIndex","heading","nextUntil","_helpersSlugifyJs2","before","$links","elHeight","headerBuffer","activeAnchorIndex","anchors","numAnchors","linkScrolling","setVariables","topOffset","hasAttribute","Array","hash","paddingTop","activateLink","innerHeight","currentAnchor","$toc","$tocContent","$tocSections","lastHeading","tocSectionCount","$tocColumn","$mobileToggle","$tocToggle","$tocFooter","$stickyToc","minSectionsToShow","menuToggle","remove","$section","sectionId","sectionTitle","$tocLink","prepend","$buttonText","windowBottom","docHeight","stickyNavActive","section","appendTo","log","$toggle","$root","$sections","hiddenClass","ready","totalShown","teaserItems","slice","totalTeaserItems","hiddenItems","$this","$thisParent","$thisWrapper","thisTitle","truncatedTitle","substr","min","lastIndexOf","waitForIt","preventdefault"],"mappings":"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","file":"index-generated.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i {\r\n let value = \"true\";\r\n try {\r\n value = window.getComputedStyle($el[0], ':before').getPropertyValue('content').replace(/\\\"/g, '');\r\n } catch(err) {}\r\n return value === \"false\" ? false : true;\r\n};\r\n","/**\n * Get outerHTML of elements, taking care\n * of SVG elements in IE as well.\n *\n * @param {Element} DOM object\n * @return {String}\n */\n\nexport default function (el) {\n if (el.outerHTML) {\n return el.outerHTML\n }\n else {\n let container = document.createElement('div');\n container.appendChild(el.cloneNode(true));\n return container.innerHTML;\n }\n}\n","module.exports = function(name) {\r\n if (Handlebars.templates === undefined || Handlebars.templates[name] === undefined) {\r\n jQuery.ajax({\r\n url : ma.themePath + '/js/templates/' + name + '.html',\r\n success : function(data) {\r\n if (Handlebars.templates === undefined) {\r\n Handlebars.templates = {};\r\n }\r\n Handlebars.templates[name] = Handlebars.compile(data);\r\n },\r\n async : false\r\n });\r\n }\r\n return Handlebars.templates[name];\r\n};\r\n","export default function (window,document,$,undefined) {\n $.extend($.expr[':'], {\n // jQuery find all focusable elements\n // see: https://coderwall.com/p/jqsanw/jquery-find-every-focusable-elements\n focusable: function(el, index, selector){\n return $(el).is('a, button, :input, [tabindex]');\n }\n });\n}(window,document,jQuery);\n","import twiggy from './twiggy';\n\nexport default function (window,document,$,undefined) {\n 'use strict';\n\n // Plain old javascript object to hold cached alert data.\n // This prevents duplicate calls to endpoints on pages that\n // display alerts in both the header and the body.\n let ajaxCache = {};\n\n // Object-orientated approach to jQuery plugin building, so as to not\n // pollute global namespace or a complicated switch based on passed params.\n let ajaxPattern = function(element, options) {\n let endpoint = options.endpoint;\n const pattern = options.renderPattern;\n let patternTransform = options.transform;\n let self = this;\n let $element = $(element);\n\n /**\n * Wrapper function to get and render data for a given pattern.\n */\n self.updatePattern = function() {\n self.getPatternData()\n .then(function (patternData) {\n // If a custom transform function was passed in, invoke it.\n if (patternTransform && typeof patternTransform === \"function\") {\n patternData = patternTransform(patternData);\n }\n\n //@todo validate the data against a schema: https://github.com/tdegrunt/jsonschema\n\n // Only attempt to render a pattern if there is data.\n if ($.isEmptyObject(patternData)) {\n return;\n }\n // Render the pattern with the data.\n try {\n self.renderPattern(pattern,patternData);\n }\n catch (e) {\n console.error(e);\n }\n })\n .fail(function () {\n console.error('MA::AjaxPattern::Could not get data at endpoint:', endpoint);\n });\n };\n\n /**\n * Use TwigJS to render the pattern with its data from the twig template.\n *\n * @param pattern\n * A namespaced path to a twig template for the pattern we want to render (i.e. @atoms/decorative-link.twig)\n * @param data\n * The data structure which the pattern expects in order to render.\n */\n self.renderPattern = function(pattern,data) {\n return twiggy(pattern)\n .then(template => template.renderAsync(data))\n .then(markup => {\n $element.html(markup)\n $(document).trigger('ma:AjaxPattern:Render', [{'el': $element}]);\n });\n };\n\n /**\n * Returns the gettable path to a pattern based on its namespaced path.\n *\n * @param pattern\n * The namespaced path to a pattern (i.e. @atoms/decorative-link.twig)\n *\n * @returns {string}\n * The path to a pattern which can be used in a get request (i.e. /assets/patterns/atoms/decorative-link.twig )\n */\n self.getPatternPath = function(pattern) {\n let pathParts = pattern.split(\"/\");\n let namespace = pathParts.shift();\n let patternPath = pathParts.join(\"/\");\n // Set ma.patternPaths in your implementation's env.js file (see /source/_meta/_00-foot.twig)\n return ma.patternPaths[namespace] + patternPath;\n };\n\n /**\n * Asynchronous function which makes ajax request to passed in endpoint to get emergency alerts data.\n *\n * @returns {*}\n * A promise.\n */\n self.getPatternData = function() {\n if (!endpoint) {\n // throw an error\n throw new Error('MA::AjaxPattern::An endpoint argument is required.');\n }\n\n // Check if we have a request already made or in-flight for this endpoint.\n if (ajaxCache[endpoint]) {\n return ajaxCache[endpoint];\n }\n\n // Make ajax request to endpoint (returns promise)\n return ajaxCache[endpoint] = $.ajax({\n type: 'GET',\n url: endpoint,\n cache: true,\n dataType: 'json'\n }).fail(function(jqXHR, textStatus, errorThrown) {\n console.error('MA::AjaxPattern::Ajax Error: ', errorThrown);\n });\n };\n\n self.updatePattern();\n return true;\n };\n\n\n /**\n * Create a custom Transform plugin.\n */\n $.fn.MassAjaxPattern = function(options) {\n\n return this.each(function(i, el) {\n let $element = $(el);\n // Returns early if plugin is already there.\n if ($element.data('mass-ajax-data')) {\n return;\n }\n let data = new ajaxPattern(this, options);\n $element.data('mass-ajax-data', data);\n });\n\n };\n\n // Plugin defaults.\n $.fn.MassAjaxPattern.defaults = {\n endpoint: '',\n pattern: '',\n transform: undefined\n };\n}(window,document,jQuery);\n","import getTemplate from \"../helpers/getHandlebarTemplate.js\";\nimport sticky from \"../helpers/sticky.js\";\nimport getOuterHtml from \"../helpers/getElementOuterHtml.js\";\n\nexport default function(window, document, undefined, $, moment){\n \"use strict\";\n\n /**\n * Common Helpers between event + location listings\n */\n\n\n /**\n * Renders the new page of location listing image promos and broadcasts the rendered master data instance.\n *\n * @param args\n * Arguments object with the following structure:\n * {\n * page: (optional) the page to be rendered, defaults to 1\n * data: the instance of master data to render\n * }\n */\n function renderListingPage(args) {\n if (args.data.hasOwnProperty('selectors')) {\n clearListingPage(args.data.selectors.container, args.data.selectors.parent);\n let $el = $(args.data.selectors.container).find(args.data.selectors.parent),\n page = args.page ? args.page : 1;\n\n args.data.items.forEach(function (item) {\n if (item.isActive && item.page === page) {\n $el.append(item.markup);\n }\n });\n\n // Focus on the first focusable element in the first listing\n let $firstListing = $el.find(args.data.selectors.row).first();\n // :focusable is possible with helpers/jQueryExtend.js\n $firstListing.find(':focusable').eq(0).focus();\n\n if (args.data.selectors.hasOwnProperty('map') && args.data.selectors.map) {\n sticky.init($(args.data.selectors.map));\n }\n }\n else {\n console.warn(\"masterData.selectors must be set for this listing.\");\n return false;\n }\n }\n\n\n /**\n * Returns the data structure necessary to render pagination component, reflecting current state.\n *\n * @param args\n * An object with the following structure:\n * {\n * data: [instance of filtered, sorted master data],\n * targetPage: (optional) the page which should be active\n * }\n *\n * @returns {*}\n * Data structure necessary to render pagination component\n */\n function transformPaginationData(args) {\n let data = args.data;\n let targetPage = args.targetPage ? args.targetPage : 1; // default to first page if none passed\n let totalPages = data.totalPages;\n let pages = [];\n\n for (let i = 1; i <= totalPages; i++) {\n pages.push({\n text: i.toString(),\n active: i === targetPage\n });\n }\n\n data.pagination.prev = {\n text: \"Previous\",\n disabled: targetPage === 1\n };\n\n data.pagination.next = {\n text: \"Next\",\n disabled: targetPage === totalPages\n };\n\n data.pagination.pages = pages;\n data.pagination.currentPage = targetPage;\n\n return data.pagination;\n }\n\n /**\n * Updates the resultsHeading data structure to reflect the current component state.\n *\n * @param args\n * Arguments object with the following structure:\n * args: {\n * data: the current instance of master data,\n * page: (optional) the current page, defaults to 1\n * }\n *\n * @returns {resultsHeading|{numResults, totalResults}|*}\n */\n function transformResultsHeading(args) {\n let pageTotal = 0,\n totalActive = 0,\n page = args.page ? args.page : 1,\n data = args.data,\n resultsHeading = data.resultsHeading; // preserve active resultsHeading.tags\n\n // Tally the total active and page length.\n data.items.map(function(item){\n if (item.isActive) {\n totalActive += 1;\n if (item.page === page) {\n pageTotal += 1;\n }\n }\n });\n\n // Get the index (from 1) of the first and last items on this page.\n let firstItem = (Number(data.maxItems) * Number(page)) - (Number(data.maxItems) - 1),\n lastItem = firstItem + (Number(pageTotal) - 1);\n\n resultsHeading.totalResults = totalActive;\n resultsHeading.numResults = firstItem + \" - \" + lastItem; // @todo add accessibility consideration here\n\n return resultsHeading;\n }\n\n /**\n * Creates an array with generated markup for location listing items, preserving original index.\n *\n * @param listing\n * The array of items\n * @param template\n * The string name of the template\n *\n * @returns {Array}\n * An array of compiled markup\n */\n function transformListing(listing, template) {\n // Get template for location listing (organisms > imagePromo)\n let compiledTemplate = getTemplate(template);\n let listingMarkup = [];\n listing.forEach(function (data, index) {\n let itemData = itemTransform(data);\n listingMarkup[index] = compiledTemplate(itemData);\n });\n return listingMarkup;\n }\n\n\n /**\n * Returns transformed item data object.\n *\n * @param item\n * The item.item[]{} being transformed.\n *\n * @returns {*}\n * The original item object with a formatted tag property.\n */\n function itemTransform(item) {\n // Ensure tags are an array.\n let tags = [];\n\n $.map(item.tags, function(val, index) {\n tags[index] = val;\n });\n\n item.tags = tags;\n\n let tagsData = {\n tagsFormatted: item.tags.map(transformTag)\n };\n return Object.assign({}, item, tagsData);\n }\n\n /**\n * Returns a formatted item.tag object with a label and svg icon markup.\n *\n * @param tag\n * The tag being transformed.\n *\n * @returns {{label, svg: boolean}}\n */\n function transformTag(tag) {\n return {\n label: tag.label,\n svg: getSvgFromTag(tag.id)\n };\n }\n\n /**\n * Returns the svg element markup from the corresponding tag filter checkbox label icon\n *\n * @param tag\n * The imagePromo tag.id whose icon we need\n *\n * @return string\n * The svg element for the matching filter form tag input.\n */\n function getSvgFromTag(tag) {\n // Get the existing corresponding icon markup so we don't have to worry about outdated markup.\n // return $('.js-filter-by-tags').find(\"#\" + tag).parent().siblings('svg').prop('outerHTML');\n // Get outerHtml of svgElement shim for IE\n // See: https://stackoverflow.com/questions/12592417/outerhtml-of-an-svg-element\n return getOuterHtml($('.js-filter-by-tags').find(\"#\" + tag).siblings('svg')[0]);\n }\n\n /**\n * Returns true if the passed filters array includes an item with the passed type.\n *\n * @param filters\n * Array of filters.\n * @param type\n * The type of filter to search for.\n *\n * @returns {*|boolean}\n */\n function hasFilter(filters, type) {\n return filters.some(function (filter) {\n return filter.hasOwnProperty('type') && filter['type'] === type;\n });\n }\n\n /**\n * Returns the value(s) of the passed filters of the passed type.\n *\n * @param filters\n * Array of filters from which to abstract values.\n * @param type\n * The type of filter to search for.\n *\n * @return array\n * An array of filter values of type.\n */\n function getFilterValues(filters, type) {\n return filters.filter(function(data) {\n return data.type === type;\n }).map(function(data) {\n return data.value;\n })\n }\n\n /**\n * Creates the active filter object based on either cleared or submitted filter data.\n *\n * @param args\n * An object with the following structure:\n * data {\n * [masterData current instance]\n * },\n * filterData: {\n * clearedFilter: (optional cleared filter data)\n * {\n * type: '[filter type]: location || tag',\n * text: '[filter text or label]',\n * value: '[filter value]'\n * }, || 'all' (if clear all button was pressed)\n * {\n * formData: (optional submitted form filter data)\n * [\n * {\n * type: '[filter type] location || tag',\n * text: '[filter label]',\n * value: '[filter value]'\n * }, ...\n * ]\n * }\n * }\n *\n * @returns {*}\n */\n function transformActiveTagsData(args) {\n if (args.filterData.hasOwnProperty('clearedFilter')) {\n return getActiveFilters(args.data, args.filterData); // This was an active tag interaction, get remaining filters.\n }\n else {\n return args.filterData.formData; // This was a form submission, so just return the applied form data.\n }\n }\n\n /**\n * Returns an array of the currently active filters, based on passed filterData.\n *\n * @param data\n * The current instance of master data structure.\n *\n * @param filterData\n * An object representing the cleared filter:\n * {\n * clearedFilter: {\n * type: '[filter type]: location || tag',\n * text: '[filter text or label]',\n * value: '[filter value]'\n * } || 'all' (if clear all button was pressed)\n * }\n *\n * @returns {Array}\n * An array of the currently active filters:\n * [ {\n * type:\n * text:\n * value:\n * }, ... ]\n */\n function getActiveFilters(data, filterData) {\n // Single filter button clicked, so remove that filter from the list.\n if (filterData.clearedFilter !== \"all\") {\n let filters = data.resultsHeading.tags;\n // Remove the clicked tag from the tags array.\n return filters.filter(function (tag) {\n return tag.value !== filterData.clearedFilter.value;\n });\n }\n else {\n // Clear all button was clicked so remove all filters.\n return [];\n }\n }\n\n\n /**\n * Assigns page values to masterData items, based on the provided max number.\n *\n * @param items\n * The master data items.\n *\n * @param max\n * The max number of items to show per page.\n *\n * @returns\n * The updated master data items.\n */\n function paginateItems(items, max) {\n let page = 1,\n pageTotal = 0;\n let paginatedItems = items.map(function(item){\n if (item.isActive) {\n if (pageTotal < max){\n item.page = page;\n }\n else {\n page += 1;\n pageTotal = 0;\n item.page = page;\n }\n pageTotal += 1;\n }\n return item;\n });\n\n return {\n items: paginatedItems,\n totalPages: page\n }\n }\n\n // Remove the listing content children on the current listing page.\n function clearListingPage(listing, parent) {\n $(listing).find(parent).html('');\n }\n\n /**\n * Filters the listing data based on component filter state.\n *\n * @param data\n * An instance of masterData to start from.\n * @param filterData\n * Data structure representing either the newly applied or cleared filters.\n * @returns {*}\n */\n function filterListingData(data, filterData) {\n // Get the currently active filters.\n let filters = transformActiveTagsData({data: data, filterData: filterData});\n // Update the results heading tags with the new active filters.\n data.resultsHeading.tags = filters;\n\n // If tag (checkbox) filter is present, filter based on current tag values.\n if (hasFilter(filters, 'tag')) {\n // Get just the tag values from the filters array.\n let tags = getFilterValues(filters, 'tag');\n // Identify active data based on filter.\n return filterDataByTags(tags, data);\n }\n\n // If a date filter is present, filter based on the date filter values.\n if (hasFilter(filters, 'dateRange')) {\n return filterDataByDateTags(filters, data);\n }\n\n\n // Either there are no filters or the only active filter is location, make all items active\n return makeAllActive(data);\n }\n\n /**\n * Returns an instance of master data which is sorted alphabetically by item data.title.text\n *\n * @param data\n * The instance of master data being sorted.\n *\n * @returns {*}\n * Sorted instance of master data.\n */\n function sortDataAlphabetically(data) {\n let items = data.items.sort(function(a, b) {\n let nameA = a.data.title.text.toUpperCase();\n let nameB = b.data.title.text.toUpperCase();\n\n // Sort the items alphabetically\n return (nameA < nameB) ? -1 : (nameA > nameB) ? 1 : 0;\n });\n\n let paginated = paginateItems(items, data.maxItems);\n data.items = paginated.items;\n data.totalPages = paginated.totalPages;\n return data;\n }\n\n /**\n * Geocodes an address string arg and executes callback upon successful return.\n *\n * @param address\n * Address string to be geocoded.\n * @param callback\n * Callback function to call upon successful geocode return.\n *\n * @returns {*}\n * Upon success, the return value of the passed callback function.\n */\n function geocodeAddressString(address, callback) {\n // Only attempt to execute if google's geocode library is loaded.\n if (typeof ma.geocoder === \"undefined\") {\n return;\n }\n\n // Geocode address string, then execute callback with argument upon success.\n ma.geocoder.geocode({address: address}, function (results, status) {\n if (status === google.maps.GeocoderStatus.OK) {\n let place = results[0];\n return callback(place);\n }\n else {\n console.warn('Geocode was not successful for the following reason: ' + status);\n }\n });\n }\n\n /**\n * Geocodes an address string arg and executes callback upon successful return.\n *\n * @param address\n * Address string to be geocoded.\n * @param callback\n * Callback function to call upon successful geocode return.\n *\n * @returns {*}\n * Upon success, the return value of the passed callback function.\n */\n function geocodePlaceId(place_id, callback) {\n // Only attempt to execute if google's geocode library is loaded.\n if (typeof ma.geocoder === \"undefined\") {\n return;\n }\n\n // Geocode address string, then execute callback with argument upon success.\n ma.geocoder.geocode({ 'placeId': place_id}, function(results, status) {\n if (status === google.maps.GeocoderStatus.OK) {\n let place = results[0];\n return callback(place);\n }\n else {\n console.warn('Geocode was not successful for the following reason: ' + status);\n }\n });\n }\n\n /**\n * Resets all items in a master data instance to active (i.e. not filtered out).\n *\n * @param data\n * The instance of master data whose items are being made active.\n *\n * @returns {*}\n * The master data instance with all active items.\n */\n function makeAllActive(data) {\n data.items = data.items.map(function(item){\n item.isActive = true;\n return item;\n });\n return data;\n }\n\n /**\n * Returns masterData with necessary filtered items flagged inactive.\n *\n * @param tags\n * The array of filters by which to filter.\n *\n * @param data\n * The current instance of master data being filtered.\n *\n * @returns {*}\n * The 'filtered' (flagged) instance of master data.\n */\n function filterDataByTags(tags, data){\n // @todo use map similar to sortDataAlphabetically\n data.items = data.items.map(function(item) {\n item.isActive = doesItemContainTags(item.data.tags, tags);\n return item;\n });\n\n return data;\n }\n\n /**\n * Location Listing Specific\n */\n\n /**\n * Determines if an masterData item contains the necessary tag(s).\n *\n * @param haystack\n * The data object in question.\n *\n * @param needle\n * The tag(s) being searched for.\n *\n * @returns {boolean|*}\n */\n function doesItemContainTags(haystack, needle) {\n return needle.every(function(v) {\n return Boolean(haystack.filter(function(item){\n // return Object.values(item).indexOf(v) !== -1;\n // return Object.values(item).indexOf(v) !== -1;\n // Object.values shim for IE11\n return Object.keys(item).map(function(i) { return item[i]; }).indexOf(v) !== -1;\n }).length);\n });\n }\n\n /**\n * Event Listing specific helpers\n */\n\n /**\n * Calculate distance from lat/lng.\n *\n * @param lat1\n * Latitude 1 input.\n * @param lon1\n * Longitude 1 input.\n * @param lat2\n * Latitude 2 input.\n * @param lon2\n * Longitude 2 input.\n * @param unit\n *\n * @returns {*}\n * Return the distance from points.\n */\n function calculateDistance(lat1, lon1, lat2, lon2, unit) {\n let radlat1 = Math.PI * lat1/180;\n let radlat2 = Math.PI * lat2/180;\n let radlon1 = Math.PI * lon1/180;\n let radlon2 = Math.PI * lon2/180;\n let theta = lon1-lon2;\n let radtheta = Math.PI * theta/180;\n let dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);\n dist = Math.acos(dist);\n dist = dist * 180/Math.PI;\n dist = dist * 60 * 1.1515;\n\n if (unit === \"K\") {\n dist = dist * 1.609344\n }\n if (unit === \"N\") {\n dist = dist * 0.8684\n }\n return dist\n }\n\n /**\n * Create a moment.js object for a passed eventTeaser date data\n *\n * @param args\n * Data structure for eventTeaser.date and a type (\"start\" || \"end\") property\n * @returns\n * A moment.js object for the event start/end date in MM/D format.\n * See: https://momentjs.com/docs/#/parsing/string-format/\n */\n function makeMoment(args) {\n /**\n * args: {\n * data: {\n * summary: \"March 2, 2017 - April 25, 2017\",\n * startMonth: \"Mar\",\n * startDay: \"2\",\n * startTimestamp: \"3/2/2017 - 14:00\",\n * endMonth: \"Apr\",\n * endDay: \"25\",\n * endTimestamp: \"4/25/2017 - 15:00\"\n * },\n * type: 'start' || 'end'\n * }\n */\n // Create moment.js object for start timestamp\n if (args.hasOwnProperty('type') && args.type === 'start') {\n return moment(args.data.startTimestamp, 'M/DD/YYYY')\n }\n // Create a moment.js object for end timestamp\n if (args.hasOwnProperty('type') && args.type === 'end') {\n return args.data.endTimestamp ? moment(args.data.endTimestamp, 'M/DD/YYYY') : \"\";\n }\n return false;\n }\n\n /**\n * Returns an instance of master data which is sorted by start timestamp then alphabetically by item data.title.text\n *\n * @param data\n * The instance of master data being sorted.\n * @param dateType\n * The type of date by which to sort: start || end\n *\n * @returns {*}\n * Sorted instance of master data.\n */\n function sortDataByDate(data, dateType) {\n let type = dateType ? dateType : 'start';\n let dateA = '';\n let dateB = '';\n let items = data.items.sort(function(a, b) {\n if (type !== \"end\") {\n dateA = a.start;\n dateB = b.start;\n }\n else {\n dateA = a.end;\n dateB = b.end;\n }\n\n let nameA = a.data.title.text.toUpperCase();\n let nameB = b.data.title.text.toUpperCase();\n\n // Sort the items by start date timestamp, then alphabetically.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort\n return (dateA.isBefore(dateB, 'minute')) ? -1 : (dateA.isAfter(dateB, 'minute')) ? 1 : (nameA < nameB) ? -1 : (nameA > nameB) ? 1 : 0;\n });\n\n let paginated = paginateItems(items, data.maxItems);\n data.items = paginated.items;\n data.totalPages = paginated.totalPages;\n return data;\n }\n\n /**\n * Returns data with necessary items flagged inactive according to date/date range.\n *\n * @param tags\n * The array of filters by which to filter.\n *\n * @param data\n * The current instance of master data being filtered.\n *\n * @returns {*}\n * The 'filtered' instance of data after checking date(s).\n */\n function filterDataByDateTags(tags, data) {\n data.items = data.items.map(function(item) {\n item.isActive = isEventInDateRange(item, tags);\n return item;\n });\n let paginated = paginateItems(data.items, data.maxItems);\n data.items = paginated.items;\n data.totalPages = paginated.totalPages;\n return data;\n }\n\n /**\n * Returns an item's isActive value depending on the date range from date filters.\n *\n * @param item\n * The item.item[]{} being transformed.\n *\n * @param tags\n * The array of filters by which to filter.\n *\n * @returns\n * The updated item.\n */\n function isEventInDateRange(item, tags) {\n let filterStart = '';\n let filterEnd = '';\n\n tags.map(function(tag) {\n if (tag.type == 'dateRange') { filterStart = moment(tag.start, 'M/DD/YYYY'); }\n if (tag.type == 'dateRange') { filterEnd = moment(tag.end, 'M/DD/YYYY'); }\n });\n\n if (filterEnd && filterStart) {\n return item.start.isSameOrAfter(filterStart, 'day') && item.start.isSameOrBefore(filterEnd, 'day') ? true : false;\n }\n else {\n return item.start.isSame(filterStart, 'day') ? true : false;\n }\n }\n\n return {\n renderListingPage,\n transformPaginationData,\n transformResultsHeading,\n filterListingData,\n hasFilter,\n getFilterValues,\n filterDataByTags,\n filterDataByDateTags,\n transformActiveTagsData,\n paginateItems,\n clearListingPage,\n sortDataAlphabetically,\n sortDataByDate,\n geocodeAddressString,\n geocodePlaceId,\n makeAllActive,\n calculateDistance,\n transformListing,\n makeMoment\n };\n\n}(window, document, undefined, jQuery, moment);\n","module.exports = function(window, document, undefined){\n \"use strict\";\n\n function slugify(text) {\n return text.toString().toLowerCase()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(/[^\\w\\-]+/g, '') // Remove all non-word chars\n .replace(/\\-\\-+/g, '-') // Replace multiple - with single -\n .replace(/^-+/, '') // Trim - from start of text\n .replace(/-+$/, ''); // Trim - from end of text\n }\n\n return slugify;\n\n}(window, document);","import checkActive from \"../helpers/cssControlCode.js\";\r\n\r\nexport default function (window,document,$,undefined) {\r\n let $el,\r\n $elParent,\r\n elHeight,\r\n elWidth,\r\n lowerLimit,\r\n upperLimit,\r\n debounceTimer,\r\n runCode = false;\r\n\r\n function init(element) {\r\n $el = element;\r\n $elParent = $el.parent().css('position') === 'relative' ? $el.parent() : $el.parent().offsetParent();\r\n\r\n // default assumption as to where the screen will load\r\n $el.attr('data-sticky','top');\r\n\r\n updateData();\r\n\r\n // update variables one more time to catch any post page load changes\r\n window.setTimeout(function(){\r\n updateData();\r\n },1000);\r\n \r\n $(window).resize(function() {\r\n updateData();\r\n setPosition();\r\n });\r\n\r\n // toggle the sticky positioning\r\n $(window).scroll(function () {\r\n setPosition();\r\n });\r\n }\r\n\r\n function updateData(){\r\n let newRunCode = checkActive($el);\r\n\r\n if(runCode && !newRunCode) {\r\n $el.removeAttr('style');\r\n }\r\n\r\n runCode = newRunCode;\r\n\r\n if(!runCode){\r\n return;\r\n }\r\n \r\n runCode = newRunCode;\r\n elHeight = $el.height();\r\n elWidth = $elParent.width();\r\n upperLimit = $elParent.offset().top;\r\n lowerLimit = upperLimit + $elParent.outerHeight(true) - $el.height();\r\n\r\n $el.width(elWidth); \r\n }\r\n\r\n function setPosition() {\r\n if(!runCode){\r\n $el.attr('data-sticky','top');\r\n return false;\r\n }\r\n\r\n let windowTop = $(window).scrollTop(),\r\n attr = $el.attr('data-sticky'),\r\n top = attr !== 'top' && windowTop <= upperLimit, \r\n middle = attr !== 'middle' && windowTop < lowerLimit && windowTop > upperLimit,\r\n bottom = attr !== 'bottom' && windowTop >= lowerLimit;\r\n \r\n if(top) {\r\n $el.attr('data-sticky','top');\r\n } \r\n else if (middle) {\r\n $el.attr('data-sticky','middle');\r\n } \r\n else if (bottom) {\r\n $el.attr('data-sticky','bottom');\r\n }\r\n }\r\n\r\n return {init};\r\n\r\n}(window,document,jQuery);","export default function (window,document,undefined) {\n\n function throttle (fn, threshhold, scope) {\n threshhold || (threshhold = 250); // default threshold is 250 ms\n let last,\n\tdeferTimer;\n return function () {\n let context = scope || this;\n\n let now = +new Date,\n\t args = arguments;\n if (last && now < last + threshhold) {\n\t// hold on to it\n\tclearTimeout(deferTimer);\n\tdeferTimer = setTimeout(function () {\n\t last = now;\n\t fn.apply(context, args);\n\t}, threshhold);\n } else {\n\tlast = now;\n\tfn.apply(context, args);\n }\n };\n }\n\n return throttle;\n\n}(window,document);\n","\nexport default (function(Twig, ma) {\n 'use strict';\n\n /**\n * Returns the gettable path to a pattern based on its namespaced path.\n *\n * @param pattern\n * The namespaced path to a pattern (i.e. @atoms/decorative-link.twig)\n *\n * @returns {string}\n * The path to a pattern which can be used in a get request (i.e. /assets/patterns/atoms/decorative-link.twig )\n */\n function resolveTwigPath(patternName) {\n let pathParts = patternName.split(\"/\");\n let namespace = pathParts.shift();\n let patternPath = pathParts.join(\"/\");\n // Set ma.patternPaths in your implementation's env.js file (see /source/_meta/_00-foot.twig)\n return ma.patternPaths[namespace] + patternPath;\n }\n\n /**\n * Returns the gettable path to an icon based on its name.\n *\n * @param name\n * The name of an icon (i.e. arrow)\n *\n * @returns {string}\n * The path to an icon SVG file which can be used in a get request (i.e. /images/svg-icons/arrow.svg )\n */\n function getIconPath(name) {\n return ma.iconPath + '/' + name + '.svg';\n };\n\n /**\n * Extend Twig with an icon function that embeds an SVG directly.\n */\n Twig.extendFunction('icon', function(name) {\n // Just use Twig to fetch the SVG and render it like a template.\n var svg = Twig.twig({\n href: getIconPath(name),\n async: false,\n });\n // Don't choke here if we aren't able to load the SVG.\n return svg ? svg.render() : '';\n });\n\n /**\n * Asynchronously loads a Twig template based on the internal name.\n *\n * @param patternName\n * The namespaced path to a pattern (i.e. @atoms/decorative-link.twig)\n *\n * @return {Promise}\n * The loaded and compiled Twig template.\n */\n return function twiggy(patternName) {\n return new Promise(function(resolve, reject) {\n Twig.twig({\n href: resolveTwigPath(patternName),\n allowInlineIncludes: true,\n namespaces: {\n 'base': ma.patternPaths['@base'],\n 'atoms': ma.patternPaths['@atoms'],\n 'molecules': ma.patternPaths['@molecules'],\n 'organisms': ma.patternPaths['@organisms'],\n 'templates': ma.patternPaths['@templates'],\n 'pages': ma.patternPaths['@pages'],\n 'meta': ma.patternPaths['@meta']\n },\n async: true, // Included/extended patterns loaded synchronously: https://github.com/twigjs/twig.js/issues/426\n load: resolve\n })\n })\n };\n\n}(Twig, ma))","import \"./helpers/jQueryExtend.js\";\nimport \"./helpers/jQueryExtend_ajaxPattern.js\";\nimport ajaxPattern from \"./modules/ajaxPattern.js\";\nimport ajaxPatternOverride from \"./modules/ajaxPatternOverride.js\";\nimport accordions from \"./modules/accordions.js\";\nimport googleMap from \"./modules/googleMap.js\";\nimport back2top from \"./modules/back2top.js\";\nimport clickable from \"./modules/clickable.js\";\nimport dropdown from \"./modules/dropdown.js\";\nimport emergencyAlerts from \"./modules/emergencyAlerts.js\";\nimport eventFilters from \"./modules/eventFilters\";\nimport eventListingInteractive from \"./modules/eventListingInteractive\";\nimport footnote from \"./modules/footnote.js\";\nimport formValidation from \"./modules/formValidation.js\";\nimport headerTags from \"./modules/headerTags.js\";\nimport hideAlert from \"./modules/hideAlert.js\";\nimport inlineOverlay from \"./modules/inlineOverlay.js\";\nimport imageFill from \"./modules/imageFill.js\";\nimport keywordSearch from \"./modules/keywordSearch.js\";\nimport linkListToggle from \"./modules/linkListToggle.js\";\nimport locationFilters from \"./modules/locationFilters.js\";\nimport locationListing from \"./modules/locationListing.js\";\nimport mainNav from \"./modules/mainNav.js\";\nimport mobileNav from \"./modules/mobileNav.js\";\nimport orgSelector from \"./modules/orgSelector.js\";\nimport pagination from \"./modules/pagination.js\";\nimport pikaday from \"./modules/pikaday.js\";\nimport responsiveVideo from \"./modules/responsiveVideo.js\";\nimport resultsHeading from \"./modules/resultsHeading.js\";\nimport richText from \"./modules/richText.js\";\nimport scrollAnchors from \"./modules/scrollAnchors.js\";\nimport teaserListingGroup from \"./modules/teaserListingGroup\";\nimport truncateTitle from \"./modules/truncateTitle.js\";\nimport formInputs from \"./modules/formInputs.js\";\nimport utilNav from \"./modules/utilNav.js\";\nimport stickyTOC from \"./modules/stickyTOC.js\";\n","import checkActive from \"../helpers/cssControlCode.js\";\r\n\r\nexport default function (window,document,$,undefined) {\r\n\r\n $('.js-accordion').each(function(index){\r\n init.apply(this, [index]);\r\n });\r\n\r\n $(document).on('ma:AjaxPattern:Render', function(e,data){\r\n let $context = data.el;\r\n if ($context.find('.js-accordion').length) {\r\n $context.find('.js-accordion').each(function(index){\r\n // Try to ensure we don't collide with the index values from DOM load.\r\n let offset = 100;\r\n let offsetIndex = offset + index;\r\n init.apply(this, [offsetIndex]);\r\n })\r\n }\r\n });\r\n\r\n function init(index) {\r\n let $el = $(this),\r\n $link = $el.find('.js-accordion-link'),\r\n $content = $el.find('.js-accordion-content'),\r\n $status = $el.find('.js-accordion-status'),\r\n id = $content.attr('id') || 'accordion' + (index + 1),\r\n active = checkActive($el),\r\n open = $el.hasClass('is-open');\r\n\r\n $content.attr('id', id);\r\n $link.attr('aria-expanded',open).attr('aria-controls', id);\r\n\r\n if(open) {\r\n // setup the inline display block\r\n $content.stop(true,true).slideDown();\r\n }\r\n\r\n $link.on('click',function(e){\r\n if(active) {\r\n e.preventDefault();\r\n open = $el.hasClass('is-open');\r\n if(open){\r\n $content.stop(true,true).slideUp();\r\n $status.attr('aria-label', 'click to show info');\r\n } else {\r\n $content.stop(true,true).slideDown();\r\n $status.attr('aria-label', 'click to hide info');\r\n }\r\n $link.attr('aria-expanded',!open);\r\n $el.toggleClass('is-open');\r\n }\r\n });\r\n\r\n $(window).resize(function () {\r\n let temp = checkActive($el);\r\n\r\n if(temp !== active && !temp) {\r\n $content.removeAttr('style');\r\n $el.removeClass('is-open');\r\n $link.attr('aria-expanded','false');\r\n }\r\n\r\n active = temp;\r\n }).resize();\r\n }\r\n\r\n}(window,document,jQuery);\r\n","/**\n * @file\n * Ajax Alert js has to execute prior to its dependent accordion and emergency alert js modules.\n */\n\nexport default function (window,document,$,undefined) {\n\n $('.js-ajax-pattern').each(function(){\n // Get the endpoint which is passed in as ajaxAlerts.endpoint to organism data attribute.\n let endpoint = $(this).data('ma-ajax-endpoint');\n if (!endpoint) {\n console.error(\"MA::AjaxPattern::This pattern requires an endpoint to be passed in as an argument.\");\n return false;\n }\n\n let renderPattern = $(this).data('ma-ajax-render-pattern');\n if (!renderPattern) {\n console.error(\"MA::AjaxPattern::This pattern requires a child pattern to be passed as an argument.\");\n return false;\n }\n try {\n $(this).MassAjaxPattern({\"endpoint\": endpoint, \"renderPattern\": renderPattern});\n }\n catch (e) {\n console.error(e);\n }\n });\n\n}(window,document,jQuery);\n","/**\n * @file\n * This demonstrates how to pass a transform function to MassAjaxPattern.\n */\n\nexport default function (window,document,$,undefined) {\n\n // Note that this selector is passed into the template so that this is run instead of the\n // default 'js-ajax-pattern'. See the ajaxPattern.customSelector in guide.json page object.\n // In an implementation of this you would want to create your own selector and avoid\n // js-ajax-pattern and js-ajax-pattern-override since Mayflower will attach to these.\n $('.js-ajax-pattern-override').each(function(){\n // Get the endpoint which is passed in as ajaxAlerts.endpoint to organism data attribute.\n let endpoint = $(this).data('ma-ajax-endpoint');\n if (!endpoint) {\n console.error(\"MA::AjaxPattern::This pattern requires an endpoint to be passed in as an argument.\");\n return false;\n }\n\n let renderPattern = $(this).data('ma-ajax-render-pattern');\n if (!renderPattern) {\n console.error(\"MA::AjaxPattern::This pattern requires a child pattern to be passed as an argument.\");\n return false;\n }\n try {\n $(this).MassAjaxPattern({\n \"endpoint\": endpoint,\n \"renderPattern\": renderPattern,\n \"transform\": function(ajaxData) {\n // Example of some custom data transformation being done to the data according to implementation needs. This will often include restructuring of data.\n // If business logic indicates that the pattern should not render (for example, if the endpoint returns no emergency alert data) then this function should return an empty js object {}.\n var data = ajaxData;\n data.emergencyAlerts.alerts = data.emergencyAlerts.these.are.alerts;\n return data;\n }\n });\n }\n catch (e) {\n console.error(e);\n }\n });\n\n}(window,document,jQuery);\n","export default function (window,document,$,undefined) {\r\n let $footer = $('.js-footer'),\r\n visibleThreshold = 250,\r\n staticThreshold = 50;\r\n\r\n $(\".js-back2top\").each(function() {\r\n let $el = $(this);\r\n\r\n $el.on('click',function(e) {\r\n e.preventDefault();\r\n try {\r\n $(\"html, body\").stop(true,true).animate({scrollTop:0}, '750');\r\n } \r\n catch(e) {\r\n $('body').scrollTop(0);\r\n }\r\n // Bring keyboard focus back to top as well.\r\n $(\"#main-content\").focus();\r\n return false;\r\n });\r\n\r\n $(window).on('scroll', function() {\r\n // if we've exceeded the threshold of scrolling\r\n // from the top, show control\r\n let scrollTop = $(window).scrollTop();\r\n\r\n if (scrollTop > visibleThreshold) {\r\n $el.removeClass('is-hidden');\r\n } else {\r\n $el.addClass('is-hidden');\r\n }\r\n });\r\n });\r\n\r\n}(window,document,jQuery);","export default function (window,document,$,undefined) {\r\n $('.js-clickable').each(function(){\r\n // if the this is clicked\r\n $(this).click(function(event){\r\n event.preventDefault();\r\n\r\n var $el = $(this).find('.js-clickable-link').first();\r\n // find the destination\r\n var dest = $el.attr(\"href\");\r\n // if the target attribute exists\r\n if(\"_blank\" === $el.attr(\"target\")) {\r\n // launch new tab/window\r\n window.open(dest);\r\n } else {\r\n // otherwise redirect to a new page\r\n window.location = dest;\r\n }\r\n });\r\n });\r\n}(window,document,jQuery);","// ****** basic custom select that uses mobile select keyboard ******\r\nlet dropdownMenu = document.querySelectorAll(\".js-dropdown\");\r\n\r\nif(null !== dropdownMenu){\r\n\r\n let length = dropdownMenu.length;\r\n\r\n for (let i = 0; i < length; i++ ) {\r\n let parentEl = dropdownMenu[i],\r\n selectEl = parentEl.querySelector(\".js-dropdown-select\"),\r\n link = parentEl.querySelector(\".js-dropdown-link\")\r\n\r\n if(null === selectEl || null === link) {\r\n break;\r\n }\r\n\r\n selectEl.onchange = function() {\r\n let elem = (typeof this.selectedIndex === \"undefined\" ? window.event.srcElement : this);\r\n link.innerText = elem.text || elem.options[elem.selectedIndex].text;\r\n }\r\n }\r\n}\r\n","import cookie from \"../helpers/cookies.js\";\r\n\r\nexport default function (window,document,$,undefined) {\r\n // Emergency Alerts start close on page load\r\n // the default behavior is to expand the alerts\r\n // Emergency Alerts should stay closed if the cookie is set to false\r\n\r\n /* ********* NOTE:\r\n This component is dependent on the\r\n accordion.js component runing before it.\r\n ********* */\r\n\r\n $('.js-emergency-alerts').each(function(){\r\n init.apply(this);\r\n });\r\n\r\n $(document).on('ma:AjaxPattern:Render', function(e,data){\r\n let $context = data.el;\r\n if ($context.find('.js-emergency-alerts').length) {\r\n $context.find('.js-emergency-alerts').each(function(){\r\n init.apply(this);\r\n })\r\n }\r\n });\r\n\r\n /**\r\n * Initialize the emergency alert.\r\n */\r\n function init() {\r\n let open = true,\r\n id = $(this).data('id'),\r\n cookieName = 'emergency-alerts' + id,\r\n cookieValue = cookie.getCookie(cookieName),\r\n $button = $(this).find('.js-accordion-link');\r\n\r\n $button.on('click', function() {\r\n // clicking this link also triggers the accordion click\r\n // toggle the current state\r\n open = !open;\r\n // update open/close state cookie\r\n // leave off third argument to make it expire on session\r\n cookie.setCookie(cookieName,open);\r\n });\r\n\r\n // if the user has closed the alerts on a previous page\r\n if(typeof(cookieValue) !== 'undefined' && cookieValue === 'false') {\r\n open = false;\r\n // set the state of aria-expanded\r\n $button.attr('aria-expanded', open);\r\n }\r\n\r\n // Emergency Alerts loads closed so expand it.\r\n if(open) {\r\n open = false; // clicking the link swaps the value\r\n $button.first().trigger('click');\r\n }\r\n }\r\n}(window,document,jQuery);\r\n","export default function (window,document,$,undefined) {\n $('.js-event-filters').each(function(){\n let $el = $(this);\n\n // When google map libraries are loaded, initialize places.autocomplete on the location input, if it exists.\n $(document).on('ma:LibrariesLoaded:GoogleMaps', function() {\n let $locationFilterParent = $('.js-event-filter-by-location', $el);\n let $locationFilter = $locationFilterParent.find('input');\n if ($locationFilter.length) {\n // Create the google places autocomplete object and associate it with the zip code text input.\n let locationInput = document.getElementById($locationFilter.attr('id'));\n let swLat = $locationFilterParent.data('maPlaceBoundsSwLat');\n let swLng = $locationFilterParent.data('maPlaceBoundsSwLng');\n let neLat = $locationFilterParent.data('maPlaceBoundsNeLat');\n let neLng = $locationFilterParent.data('maPlaceBoundsNeLng');\n\n let defaultBounds = new google.maps.LatLngBounds(new google.maps.LatLng(swLat,swLng), new google.maps.LatLng(neLat,neLng));\n\n // See options: https://developers.google.com/maps/documentation/javascript/places-autocomplete#add_autocomplete\n let options = {\n bounds: defaultBounds,\n strictBounds: true,\n types: ['geocode'],\n componentRestrictions: {country: 'us'},\n placeIdOnly: true\n };\n ma.autocomplete = new google.maps.places.Autocomplete(locationInput, options);\n }\n });\n\n // Listen for new data from another component interaction (i.e. results heading), update form.\n $el.on('ma:FormFilter:DataUpdated', function(e, data){\n renderForm({clearedFilter: data.clearedFilter, $form: $el});\n });\n\n // Handle global form submission.\n $el.submit(function(e){\n e.preventDefault();\n // Update master data with the various filter values.\n let formData = getFormData({$form: $(this)});\n\n // Trigger location listing filter event with current filter values.\n $el.trigger('ma:EventFilter:FormSubmitted', [{formData: formData}]);\n });\n\n });\n\n function renderForm(args) {\n let clearedFilter = args.clearedFilter;\n // The clear all button was pressed.\n if (clearedFilter === \"all\") {\n clearForm(args);\n }\n // Single filter button was pressed.\n else {\n clearDeactivatedFilter(args);\n }\n }\n\n function getFormData(args) {\n let $form = $(args.$form),\n $location = $form.find('.js-event-filter-by-location'),\n $tags = $form.find('.js-filter-by-tags'),\n $dateStart = $form.find('.js-filter-by-date-range__start'),\n $dateEnd = $form.find('.js-filter-by-date-range__end'),\n formData = [];\n\n // Get location\n if ($location.find('input').length) {\n let place = $location.find('input').val();\n if (place) {\n formData.push({\n type: 'location',\n text: place,\n value: place\n });\n }\n }\n\n let dateRange = '',\n startDate = '',\n endDate = '',\n useToday = false;\n\n // Get start date.\n if ($dateStart.find('input').length) {\n startDate = $dateStart.find('input').val();\n if (startDate) {\n dateRange += startDate;\n }\n else {\n startDate = moment().format('M/DD/YYYY');\n useToday = true;\n }\n }\n\n // Get end date.\n if ($dateEnd.find('input').length) {\n endDate = $dateEnd.find('input').val();\n if (endDate) {\n if (startDate && !useToday) {\n dateRange += ' - ' + endDate;\n }\n else {\n dateRange = 'Today - ' + endDate;\n }\n }\n }\n\n if (dateRange) {\n formData.push({\n type: 'dateRange',\n text: dateRange,\n value: dateRange,\n start: startDate,\n end: endDate,\n });\n }\n\n // Get checkboxes/tags.\n $tags.find('input:checked').each(function() {\n formData.push({\n 'type': 'tag',\n 'text': $(this).next(\"label\").text(),\n 'value': $(this).val()\n\n });\n });\n\n return formData;\n }\n\n function clearDeactivatedFilter(args) {\n let $form = $(args.$form),\n $place = $form.find('.js-event-filter-by-location'),\n $dateStart = $form.find('.js-filter-by-date-range__start'),\n $dateEnd = $form.find('.js-filter-by-date-range__end'),\n $tags = $form.find('.js-filter-by-tags'),\n clearedFilter = args.clearedFilter;\n\n // If the cleared filter button was for a location filter.\n if (clearedFilter.type === 'location') {\n $place.find('input').val(\"\");\n return;\n }\n // Clear dates text inputs.\n if (clearedFilter.type === 'dateRange') {\n $dateStart.find('input').val(\"\");\n $dateEnd.find('input').val(\"\");\n return;\n }\n // If the cleared filter button was for a tag filter.\n if (clearedFilter.type === 'tag') {\n $tags.find('input[type=checkbox][value=' + clearedFilter.value + ']').prop('checked', false);\n }\n }\n\n function clearForm(args) {\n let $form = $(args.$form),\n $place = $('.js-event-filter-by-location', $form).find('input'),\n $dateStart = $('.js-filter-by-date-range__start', $form).find('input'),\n $dateEnd = $('.js-filter-by-date-range__end', $form).find('input');\n\n // Clear location text input.\n if ($place.length) {\n $place.val(\"\");\n }\n\n // Clear start date text input.\n if ($dateStart.length) {\n $dateStart.val(\"\");\n }\n\n // Clear end date text input.\n if ($dateEnd.length) {\n $dateEnd.val(\"\");\n }\n\n // Check for tags and uncheck all checked tags inputs.\n if (typeof $tags != \"undefined\") {\n $tags.find('input:checked').prop('checked', false);\n }\n }\n\n}(window,document,jQuery);\n","import listings from \"../helpers/listing.js\";\n\nexport default function (window,document,$,undefined) {\n let container = '.js-event-listing-interactive',\n parent = '.js-event-listing-items',\n row = '.js-event-listing-item';\n\n $('.js-event-listing-interactive').each(function(i) {\n let $el = $(this),\n $resultsHeading = $el.find('.js-results-heading'),\n $pagination = $el.find('.js-pagination'),\n $eventFilter = $el.find('.js-event-filters');\n\n // Get the location listing component data (this could be replaced with an api)\n const rawData = ma.eventListingInteractive[i]; // Data object created in @organisms/by-author/event-listing-interactive.twig\n\n let masterData = []; // master data structure to preserve state\n\n masterData = populateMasterDataSource(rawData); // to preserve state\n\n // Handle location listings form interaction (triggered by locationFilters.js).\n $eventFilter.on('ma:EventFilter:FormSubmitted', function (e, formValues) {\n // transformData() returns a jQuery deferred object which allows us to wait for any asynchronous js execution to return before executing the .done(callback).\n // @see: https://api.jquery.com/deferred.done/\n transformData(masterData, formValues).done(function (transformation) {\n masterData = transformation.data; // preserve state\n // Update the results heading based on the current items state.\n transformation.data.resultsHeading = listings.transformResultsHeading({data: transformation.data});\n // Update pagination data structure, reset to first page\n transformation.data.pagination = listings.transformPaginationData({data: transformation.data});\n // Render the listing page.\n listings.renderListingPage({data: transformation.data});\n // Trigger child components render with updated data\n updateChildComponents(transformation);\n });\n });\n\n\n // Handle active filter/tag button interactions (triggered by resultsHeading.js).\n $resultsHeading.on('ma:ResultsHeading:ActiveTagClicked', function (e, clearedFilter) {\n // transformData() returns a jQuery deferred object which allows us to wait for any asynchronous js execution to return before executing the .done(callback).\n // @see: https://api.jquery.com/deferred.done/\n transformData(masterData, clearedFilter).done(function (transformation) {\n masterData = transformation.data; // preserve state\n transformation.clearedFilter = clearedFilter;\n\n masterData = transformation.data; // preserve state\n // Update the results heading based on the current items state.\n transformation.data.resultsHeading = listings.transformResultsHeading({data: transformation.data});\n // Update pagination data structure, reset to first page\n transformation.data.pagination = listings.transformPaginationData({data: transformation.data});\n // Render the listing page.\n listings.renderListingPage({data: transformation.data});\n // Trigger child components render with updated data\n updateChildComponents(transformation);\n });\n });\n\n // Handle pagination click events\n function handlePagination (e, target) {\n \"use strict\";\n let nextPage = parseInt(target, 10);\n\n masterData.pagination = listings.transformPaginationData({ data: masterData, targetPage: nextPage });\n masterData.resultsHeading = listings.transformResultsHeading({ data: masterData, page: nextPage });\n listings.renderListingPage({ data: masterData, page: nextPage });\n\n // Trigger child components render with updated data\n updateChildComponents({ data: masterData });\n }\n $pagination.on('ma:Pagination:Pagination', handlePagination);\n let defaultPage = 1;\n let params = new URLSearchParams(window.location.search);\n if (history.state) {\n defaultPage = history.state.page;\n }\n if (params) {\n defaultPage = params.get(\"page\");\n }\n handlePagination(null, defaultPage);\n\n\n // Trigger events to update child components with new data.\n function updateChildComponents(args) {\n $resultsHeading.trigger('ma:ResultsHeading:DataUpdated', [args.data.resultsHeading]);\n\n $pagination.trigger('ma:Pagination:DataUpdated', [args.data.pagination]);\n if (args.clearedFilter) {\n $eventFilter.trigger('ma:FormFilter:DataUpdated', [args.clearedFilter]);\n }\n }\n\n /**\n * Returns a master data structure with page level / listing item level data and markup, to reflect component state.\n *\n * @param listing\n * The listing data structure to use as a source\n * @returns {Array}\n * An array with the following structure:\n * [\n * maxItems: the max number of items to show per listing \"page\" if provided, defaults to all\n * totalPages: the number of pages of items that should render, given the current filters\n * resultsHeading: the data structure necessary to render a resultsHeading component\n * items: an array of listing items [\n * isActive: whether or not the listing should be shown, given current filters state\n * page: the page that the listing, if active, will appear on, given the current sort order\n * data: the data structure for the eventTeaser component\n * markup: the compiled eventTeaser markup\n * start: the momentjs object for the start timestamp\n * ]\n * pagination: the data structure necessary to render a pagination component,\n * selectors: the necessary $selectors for rendering the listing\n * ]\n */\n function populateMasterDataSource(listing) {\n // Populate master data structure\n let masterData = [];\n\n // Ensure eventListing.events.items is an array (the twig template json_encode()'s a php array)\n let listArray = [];\n $.map(listing.eventListing.events, function(val, index) {\n listArray[index] = val;\n });\n\n listing.eventListing.events = listArray;\n\n // Ensure eventListing.pagination.pages is an array (the twig template json_encode()'s a php array)\n let pages = [];\n $.map(listing.pagination.pages, function(val, index) { pages[index] = val; });\n listing.pagination.pages = pages;\n\n // Get the listing events, generate markup for each\n let masterListing = listing.eventListing.events,\n\n // Pass in listing and template name.\n masterListingMarkup = listings.transformListing(masterListing, 'eventListingRow');\n\n // The max number of items per page, if designated in eventListing data structure, else all\n masterData.maxItems = listing.maxItems ? listing.maxItems : masterListing.length;\n\n // The initial results heading data structure\n masterData.resultsHeading = listing.resultsHeading;\n\n // Create items with listing and markup.\n masterData.items = getMasterListingWithMarkup(masterListing, masterListingMarkup, masterData.maxItems);\n\n // The initial pagination data structure;\n masterData.pagination = listing.pagination;\n\n // The total number of pages, given the number of items and the maxItems variable\n masterData.totalPages = Math.ceil(masterData.items.length / masterData.maxItems);\n\n // Set the selector properties necessary to render\n masterData.selectors = {};\n masterData.selectors.container = container;\n masterData.selectors.parent = parent;\n masterData.selectors.row = row;\n\n return masterData;\n }\n\n /**\n * Creates the master data structure items array\n *\n * @param listing\n * The eventListing data structure\n * @param markup\n * The generated array of item markup\n * @param max\n * The maximum number of items per page\n * @returns {Array}\n * An array of listing items with the following structure:\n * [\n * isActive: whether or not the listing should be shown, given current filters state\n * page: the page that the listing, if active, will appear on, given the current sort order\n * data: the data structure for the eventListing component\n * markup: the compiled event markup\n * start: a momentjs object for this event's start timestamp\n * ]\n */\n function getMasterListingWithMarkup(listing, markup, max) {\n let items = [];\n listing.forEach(function (item, index) {\n // determine if there is an end date to this event\n let endDate = listing[index].date.endDay.length;\n\n items[index] = {\n isActive: true, // @todo consider checking for this in case of server side preprocessing of state\n page: Math.ceil((index+1) / max),\n markup: markup[index],\n data: listing[index],\n start: listings.makeMoment({data: listing[index].date, type: 'start'}),\n end: (endDate) ? listings.makeMoment({data: listing[index].date, type: 'end'}) : endDate\n };\n });\n return items;\n }\n\n });\n\n /**\n * The main data transformation wrapper, returns an instance of masterData which reflects the component state.\n *\n * @param data\n * An instance of masterData to start from.\n * @param transformation\n * An object representing the change in state (locationFilter form data, resultsHeading tag interaction, etc.)\n *\n * @returns {{data: *, place: *}}\n * An object with the current state masterData instance and an array of their related sorted markers to send to map.\n */\n function transformData(data, transformation) {\n // This data transformation potentially involves asynchronous google geocoding.\n // This jQuery deferered object allows us to wait for a return before moving on inside of the parent function (which invokes this function).\n // @see https://api.jquery.com/jquery.deferred/\n let promise = $.Deferred();\n let transformReturn = {};\n\n // First filter the data based on component state, then sort alphabetically by default.\n let filteredData = listings.filterListingData(data, transformation),\n tags = filteredData.resultsHeading.tags,\n sortedData = listings.sortDataByDate(filteredData),\n place = '';\n\n // Sort data by location, if that filter is present.\n if (listings.hasFilter(tags, 'location')) {\n place = listings.getFilterValues(tags, 'location')[0]; // returns array\n // If place argument was selected from the locationFilter autocomplete (initiated on the zipcode text input).\n let autocompletePlace = ma.autocomplete.getPlace();\n // Geocode the address, then sort the markers and instance of locationListing masterData.\n ma.geocoder = ma.geocoder ? ma.geocoder : new google.maps.Geocoder();\n if (typeof autocompletePlace !== \"undefined\" && autocompletePlace.hasOwnProperty('place_id')) {\n // This is an asynchronous function\n listings.geocodePlaceId(autocompletePlace.place_id, function(result) {\n transformReturn.data = sortDataAroundPlace(result, filteredData);\n transformReturn.geocode = result;\n // Return the data sorted by location and the geocoded place object\n promise.resolve(transformReturn);\n });\n }\n // If place argument was populated from locationFilter (zipcode text input) but not from Place autocomplete.\n else {\n // This is an asynchronous function\n listings.geocodeAddressString(place, function(result) {\n transformReturn.data = sortDataAroundPlace(result, filteredData);\n transformReturn.geocode = result;\n // Return the data sorted by location and the geocoded place object\n promise.resolve(transformReturn);\n });\n }\n }\n else {\n // Return the data sorted by alphabet and the empty place object\n promise.resolve({data: sortedData, place: place});\n }\n\n return promise;\n }\n\n /**\n * Returns instance of location listing masterData, sorted proximity to place.\n *\n * @param place\n * The geocode information by which to sort.\n * @param data\n * The instance of location listing masterData.\n * @returns {*}\n * Sorted instance of location listing masterData.\n */\n function sortDataAroundPlace(place, data) {\n let lat = place.geometry.location.lat(),\n lng = place.geometry.location.lng();\n\n // Get all existing marker distance from place, assign as marker property.\n for (let key in data.items) {\n if (data.items.hasOwnProperty(key)) {\n data.items[key].distance = listings.calculateDistance(data.items[key].data.position.lat, data.items[key].data.position.lng, lat, lng, \"K\");\n }\n }\n\n // Sort existing markers by closest to the place.\n data.items.sort(function (a, b) {\n return a.distance - b.distance;\n });\n\n // Update each location listing item's page number based on new marker sort order.\n let paginated = listings.paginateItems(data.items, data.maxItems);\n data.items = paginated.items;\n data.totalPages = paginated.totalPages;\n\n // Return the newly sorted instance of location listing masterData.\n return data;\n }\n\n}(window,document,jQuery);","import checkMobile from \"../helpers/cssControlCode.js\";\r\n\r\nexport default function (window,document,$,undefined) {\r\n\r\n $('.js-footnote').each(function(){\r\n let $el = $(this),\r\n $link = $el.find(\".js-footnote-link\"),\r\n $messageLink = $link.clone(),\r\n $rtelink = null,\r\n isMobile = checkMobile($el);\r\n\r\n if ($link.attr('href') === \"#\") {\r\n return;\r\n } else {\r\n $rtelink = $($link.attr('href'));\r\n }\r\n\r\n $messageLink.text('');\r\n\r\n $el.find(\".js-footnote-message p:last-child\").append($messageLink);\r\n\r\n $(window).resize(function() {\r\n isMobile = checkMobile($el);\r\n });\r\n\r\n $el.on('click','.js-footnote-link', function(e) {\r\n e.preventDefault();\r\n\r\n let target = $(this).attr('href');\r\n let position = getPosition($(target).parent());\r\n \r\n scrollTo(position.top, target);\r\n });\r\n\r\n $rtelink.click(function(e) {\r\n e.preventDefault();\r\n\r\n let target = $(this).attr('href');\r\n let position = getPosition($(target));\r\n \r\n scrollTo(position.top, target);\r\n });\r\n\r\n function getPosition($target) {\r\n let pos = $target.offset() || 0;\r\n\r\n if(isMobile) {\r\n let headerHeight = $('.js-sticky-header').height() || 0;\r\n let navHeight = $(\".js-scroll-anchors\").height() || 0;\r\n\r\n pos.top = pos.top - headerHeight - navHeight;\r\n }\r\n\r\n return pos;\r\n }\r\n\r\n function scrollTo(position, focus) {\r\n $(\"html,body\").stop(true,true).animate({scrollTop:position}, '750', function(){\r\n if(focus) {\r\n $(focus).focus();\r\n }\r\n });\r\n }\r\n });\r\n}(window,document,jQuery);\r\n","export default function (window,document,$,undefined) {\r\n\r\n $('textarea[maxlength]').each(function(){\r\n const $el = $(this);\r\n const maxlength = $el.attr('maxlength');\r\n\r\n let remaining = maxlength - $el.val().length;\r\n let message = `${remaining}/${maxlength}`;\r\n\r\n $el.wrap('
');\r\n\r\n $el.parent().attr('data-char-left',message);\r\n\r\n $el.on('keyup mouseup blur', function(){\r\n remaining = maxlength - $el.val().length;\r\n message = `${remaining}/${maxlength}`;\r\n $el.parent().attr('data-char-left',message);\r\n });\r\n });\r\n\r\n // number restricted input based on it's pattern (this must run prior to type=\"number\")\r\n $('input[type=\"text\"][pattern=\"[0-9]*\"]').on('keydown', function(e){\r\n // Allow: delte(46), backspace(8), tab(9), escape(27), enter(13) and space(32))\r\n if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 32]) !== -1 ||\r\n // Allow: Ctrl/cmd+A\r\n (e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true)) ||\r\n // Allow: Ctrl/cmd+C\r\n (e.keyCode == 67 && (e.ctrlKey === true || e.metaKey === true)) ||\r\n // Allow: Ctrl/cmd+X\r\n (e.keyCode == 88 && (e.ctrlKey === true || e.metaKey === true)) ||\r\n // Allow: home, end, left, right\r\n (e.keyCode >= 35 && e.keyCode <= 39)) {\r\n // let it happen, don't do anything\r\n return;\r\n }\r\n // Ensure that it is a number and stop the keypress\r\n if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n // number input type\r\n $('input[type=\"number\"], .js-input-number').each(function(){\r\n const $el = $(this);\r\n const $plus = $('');\r\n const $minus = $('');\r\n\r\n let value = $el.val();\r\n\r\n // if the input is not an html input and key restrictions\r\n if($el.attr('type') !== \"number\") {\r\n $el.on('keydown', function(e){\r\n // Allow: delte(46), backspace(8), tab(9), escape(27), enter(13) and .(110 & 190))\r\n if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 ||\r\n // Allow: Ctrl/cmd+A\r\n (e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true)) ||\r\n // Allow: Ctrl/cmd+C\r\n (e.keyCode == 67 && (e.ctrlKey === true || e.metaKey === true)) ||\r\n // Allow: Ctrl/cmd+X\r\n (e.keyCode == 88 && (e.ctrlKey === true || e.metaKey === true)) ||\r\n // Allow: home, end, left, right\r\n (e.keyCode >= 35 && e.keyCode <= 39)) {\r\n // let it happen, don't do anything\r\n return;\r\n }\r\n // Ensure that it is a number and stop the keypress\r\n if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {\r\n e.preventDefault();\r\n }\r\n });\r\n }\r\n\r\n $plus.on('click', function(){\r\n let value = parseInt($el.val().trim(),10);\r\n\r\n if(value !== value) {\r\n value = 0;\r\n }\r\n\r\n $el.val(value + 1);\r\n });\r\n\r\n $minus.on('click', function(){\r\n let value = parseInt($el.val(),10);\r\n \r\n if(value !== value) {\r\n value = 0;\r\n }\r\n \r\n $el.val(value - 1);\r\n });\r\n\r\n $el.wrap('
');\r\n\r\n $el.parent().append($plus,$minus);\r\n });\r\n\r\n\r\n}(window,document,jQuery);\r\n","export default function (window,document,$,undefined) {\r\n\r\n $('form').each(function(){\r\n let $form = $(this),\r\n requiredFields = [],\r\n $errorList = $form.find('.js-error-list');\r\n\r\n // find all required fields\r\n $('.js-is-required').each(function(){\r\n let $field = $(this),\r\n type = $field.data('type'),\r\n value = $field.val(),\r\n valid = validate(value,type);\r\n\r\n requiredFields.push({type,valid,$el:$field});\r\n\r\n $(this).data('index',requiredFields.length);\r\n });\r\n\r\n // if there aren't any required fields, don't do anything\r\n if(requiredFields.length === 0) {\r\n return;\r\n }\r\n\r\n // $form.on('submit', function(e){\r\n // e.preventDefault();\r\n // });\r\n\r\n $form.find('button[type=\"submit\"], input[type=\"submit\"]').on('click',function(e){\r\n let submitForm = true;\r\n\r\n // validate each required field\r\n requiredFields.forEach(function(item) {\r\n let value = item.$el.val();\r\n\r\n item.valid = validate(value,item.type);\r\n\r\n if(item.valid) {\r\n clearError(item.$el);\r\n } else {\r\n submitForm = false;\r\n addError(item.$el);\r\n }\r\n });\r\n\r\n if(!submitForm) {\r\n // prevent the form from submitting\r\n e.preventDefault();\r\n // show the form error message \r\n $form.addClass('has-error');\r\n // scroll up to the error message\r\n let position = $form.offset();\r\n \r\n // scroll to the top of the form where the list of errors should be\r\n // using 100px offset to compenstate for possible sticky headers\r\n $(\"html,body\").stop(true,true).animate({scrollTop:position.top - 100}, '750', function(){\r\n // bring focus to the item we just scrolled to\r\n $errorList.focus();\r\n });\r\n }\r\n });\r\n });\r\n\r\n // receives the jquery object of the input\r\n function clearError($el){\r\n $el.removeClass('has-error');\r\n $el.prev('.ma__error-msg').removeClass('has-error');\r\n }\r\n\r\n // receives the jquery object of the input\r\n function addError($el) {\r\n $el.addClass('has-error');\r\n $el.prev('.ma__error-msg').addClass('has-error');\r\n }\r\n\r\n function validate(value,type='text'){\r\n let valid = false;\r\n\r\n switch(type) {\r\n case 'email':\r\n valid = !!(value.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]+/i));\r\n break;\r\n default:\r\n valid = value.length !== 0;\r\n }\r\n\r\n return valid;\r\n }\r\n\r\n}(window,document,jQuery);\r\n","import getTemplate from \"../helpers/getHandlebarTemplate.js\";\r\n\r\nexport default function (window,document,$,undefined) {\r\n // Only run this code if there is a google map component on the page.\r\n if(!$('.js-google-map').length || typeof ma.googleMapData === 'undefined'){\r\n return;\r\n }\r\n\r\n // Initialize global (at component scope) map properties\r\n let max = false, // Maximum number of map markers per map, can be updated instance\r\n mapsInitialized = false; // Flag to set to trigger clearInterval(checkForGoogleMaps)\r\n\r\n /**\r\n * Test for presence of google maps default library (without geocode, places, etc.) until we find it.\r\n * Loaded in _meta/_01.foot.twig with static api key\r\n * @todo set up config to pull in dynamic api key\r\n */\r\n let checkForGoogleMaps = setInterval(function() {\r\n if (window.google && window.google.maps && !mapsInitialized) {\r\n initMaps();\r\n }\r\n }, 100);\r\n\r\n // Stop checking for google maps library after 2 minutes.\r\n let stopChecking = setTimeout(function() {\r\n clearInterval(checkForGoogleMaps);\r\n }, 2 * 60 * 1000);\r\n\r\n // Clear out any potential HTML tags in text\r\n function sanitizeText (potentialHTML) {\r\n let d = document.createElement(\"div\");\r\n d.innerHTML = potentialHTML;\r\n return d.innerText;\r\n }\r\n\r\n // Initialize the map\r\n function initMaps () {\r\n // Stop checking for google maps library.\r\n mapsInitialized = true;\r\n clearInterval(checkForGoogleMaps);\r\n clearTimeout(stopChecking);\r\n\r\n $(\".js-google-map\").each(function(i) {\r\n const $el = $(this);\r\n max = ma.googleMapData[i].maxItems ? ma.googleMapData[i].maxItems : ma.googleMapData[i].markers.length;\r\n\r\n // Get the maps data (this could be replaced with an api)\r\n const rawData = ma.googleMapData[i]; // Data object created in @molecules/google-map.twig\r\n\r\n // *** Create the Map *** //\r\n // Map default config.\r\n const initMapData = {\r\n scrollwheel: false\r\n };\r\n // Create map data by combining the rawData with the defaults.\r\n const mapData = Object.assign({}, rawData.map, initMapData);\r\n // Create google map object assigned to this component instance with map data.\r\n const map = new google.maps.Map(this, mapData);\r\n // Initialize global markers, map bounds.\r\n let bounds = new google.maps.LatLngBounds();\r\n // Initialize all markers\r\n let markers = initMarkers(map, rawData.markers);\r\n // Add up to max markers to the map, zoom map to fit all bounds\r\n addMarkersToMap(markers, map, bounds);\r\n\r\n // Trigger map initialized event, broadcast master markers.\r\n $el.trigger('ma:GoogleMap:MapInitialized', [markers]);\r\n\r\n // Add keyboard navigation only after the map is rendered (becoming idle).\r\n google.maps.event.addListenerOnce(map, 'idle', function() {\r\n let $mapItems = $(\".js-google-map\").find(\r\n 'div[title=\"Show street map\"],' +\r\n 'div[title=\"Show street map with terrain\"],' +\r\n 'div[title=\"Show satellite imagery\"],' +\r\n 'div[title=\"Zoom in to show 45 degree view\"],' +\r\n 'div[title=\"Show imagery with street names\"],' +\r\n 'div[title=\"Pan up\"],' +\r\n 'div[title=\"Pan down\"],' +\r\n 'div[title=\"Pan left\"],' +\r\n 'div[title=\"Pan right\"],' +\r\n 'div[title=\"Return to the last result\"],' +\r\n 'div[title=\"Zoom in\"],' +\r\n 'div[title=\"Zoom out\"],' +\r\n 'img[title=\"Rotate map 90 degrees\"],' +\r\n '.gmnoprint area'\r\n );\r\n $mapItems.each(function(i, o){\r\n $(o).attr({\r\n role: 'button',\r\n tabindex: '0',\r\n 'aria-label': o.title\r\n }).bind('keydown', function(ev){\r\n // If enter is pressed on one of these elements, trigger a click of the element.\r\n if (ev.which == 13){\r\n ev.preventDefault();\r\n $(o).trigger('click');\r\n }\r\n });\r\n });\r\n });\r\n\r\n // Listen for map recenter event\r\n $el.on(\"ma:GoogleMap:MapRecenter\", function (event, markerIndex) {\r\n if (typeof markers[markerIndex] === \"undefined\") {\r\n return false;\r\n }\r\n let marker = markers[markerIndex];\r\n // center the map on this marker\r\n map.setCenter(marker.getPosition());\r\n // close all open infoWindows\r\n for (let i in markers) {\r\n if (markers[i].open) {\r\n markers[i].hideInfo();\r\n }\r\n }\r\n // show the infoWindow for this marker\r\n marker.showInfo();\r\n });\r\n // Listen for map marker bounce event\r\n $el.on(\"ma:GoogleMap:MarkerBounce\", function( event, markerIndex ) {\r\n if(typeof markers[markerIndex] === \"undefined\") {\r\n return false;\r\n }\r\n let marker = markers[markerIndex];\r\n // center and zoom the map on this marker\r\n map.setCenter(marker.getPosition());\r\n map.setZoom(15);\r\n // make the marker bounce three times\r\n marker.bounce();\r\n });\r\n // Listen for data change event to update markers by filters.\r\n $el.on(\"ma:GoogleMap:MarkersUpdated\", function (e, args) {\r\n // Update map based on pre-sorted markers order\r\n markers = updateMapByMarkers({\r\n dataMarkers: args.markers,\r\n map: map,\r\n markers: markers,\r\n place: args.place ? args.place : false\r\n });\r\n\r\n // hide all info windows\r\n for (let i in markers) {\r\n if(markers[i].open) {\r\n markers[i].hideInfo();\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Returns the array of initialized current map markers.\r\n *\r\n * @param map\r\n * The current map object.\r\n *\r\n * @param markers\r\n * The markers to be initialized.\r\n *\r\n * @return {Array}\r\n */\r\n function initMarkers(map, markers) {\r\n let initializedMarkers = [];\r\n markers.forEach(function(data) {\r\n let markerData = {\r\n position: new google.maps.LatLng({\r\n lat: data.position.lat,\r\n lng: data.position.lng\r\n }),\r\n label: data.label,\r\n infoWindow: data.infoWindow,\r\n title: 'Marker: ' + sanitizeText(data.infoWindow.name)\r\n };\r\n let marker = new google.maps.Marker(markerData);\r\n let infoData = infoTransform(markerData.infoWindow);\r\n let compiledTemplate = getTemplate('googleMapInfo');\r\n let template = compiledTemplate(infoData);\r\n let infoWindow = new google.maps.InfoWindow({\r\n content: template\r\n });\r\n let markerBouncing = null;\r\n\r\n marker.addListener('click', function(){\r\n // hide all info windows\r\n for (let i in initializedMarkers) {\r\n if(initializedMarkers[i].open) {\r\n initializedMarkers[i].hideInfo();\r\n }\r\n }\r\n\r\n // show this info window\r\n marker.showInfo();\r\n });\r\n\r\n marker.showInfo = () => {\r\n infoWindow.open(map, marker);\r\n marker.open = true;\r\n };\r\n\r\n marker.hideInfo = () => {\r\n infoWindow.close(map, marker);\r\n marker.open = false;\r\n };\r\n\r\n marker.bounce = () => {\r\n clearTimeout(markerBouncing);\r\n marker.setAnimation(null);\r\n marker.setAnimation(google.maps.Animation.BOUNCE);\r\n markerBouncing = setTimeout(() => {\r\n marker.setAnimation(null);\r\n },3000);\r\n };\r\n\r\n initializedMarkers.push(marker);\r\n });\r\n\r\n return initializedMarkers;\r\n }\r\n\r\n /**\r\n * Return formatted marker infowindow data.\r\n *\r\n * @param data\r\n * Infowindow data object:\r\n * \"infoWindow\": {\r\n * \"name\": \"Attleboro District Court\",\r\n * \"phone\": \"15082225900\",\r\n * \"fax\": \"15082233706\",\r\n * \"email\": \"courts@state.ma.us\",\r\n * \"address\": \"88 North Main Street\\nAttleboro, MA 02703\"\r\n * }\r\n *\r\n * @returns {*}\r\n * Object with passed data and new infoData property.\r\n */\r\n function infoTransform(data) {\r\n let infoData = {\r\n phoneFormatted: formatPhone(data.phone),\r\n faxFormatted: formatPhone(data.fax)\r\n };\r\n return Object.assign({},data,infoData);\r\n }\r\n\r\n /**\r\n * Return phone number data formatted for map marker.\r\n *\r\n * @param phone\r\n * \"15082225900\",\r\n * @returns {string}\r\n * (508) 222-5900\r\n */\r\n function formatPhone(phone) {\r\n let phoneTemp = phone[0] === '1' ? phone.substring(1) : phone;\r\n return phoneTemp.replace(/(\\d{3})(\\d{3})(\\d{4})/, '($1) $2-$3');\r\n }\r\n\r\n /**\r\n * Location listing specific map helper functions\r\n */\r\n\r\n\r\n /**\r\n * Renders a new map, with markers reference to passed marker order and length.\r\n *\r\n * @param args\r\n * arguments object:\r\n * {\r\n * dataMarkers: args.markers, // sorted array of markers by witch to sort and filter master markers\r\n * map: map, // initialized map instance\r\n * markers: markers, // master list of current map markers\r\n * place: args.place, // optional location filter place input\r\n\r\n * }\r\n */\r\n function updateMapByMarkers(args) {\r\n removeMarkersFromMap(args.markers);\r\n\r\n // Reset bounds to remove previous search locations.\r\n let bounds = new google.maps.LatLngBounds();\r\n if (args.place && ma.autocomplete.getPlace()) {\r\n // Ensure the map includes the provided location based on the place value.\r\n bounds.extend(args.place.geometry.location);\r\n }\r\n\r\n // Add the new markers to the map and set new bounds based on filtered markers.\r\n addMarkersToMap(args.dataMarkers, args.map, bounds);\r\n\r\n // If there is only one marker, zoom out to provide some context.\r\n if (args.dataMarkers.length === 1) {\r\n args.map.setZoom(16);\r\n }\r\n\r\n return args.dataMarkers;\r\n }\r\n\r\n /**\r\n * Removes passed marker objects from a given map.\r\n *\r\n * @param markers\r\n * Array of map marker objects.\r\n */\r\n function removeMarkersFromMap(markers) {\r\n for(let i = 0; i < markers.length; i++){\r\n markers[i].setMap(null);\r\n }\r\n }\r\n\r\n /**\r\n * Adds markers to a given map and sets bounds based on those markers.\r\n *\r\n * @param markers\r\n * Initialized map marker objects to be added.\r\n * @param map\r\n * Initialized map object.\r\n * @param bounds\r\n * Initialized map bounds object.\r\n */\r\n function addMarkersToMap(markers, map, bounds) {\r\n // Set max number of markers to whichever is smaller: max or the number of markers sent.\r\n let maxItems = markers.length < max ? markers.length : max;\r\n\r\n markers.forEach(function(marker, index) {\r\n if (index < maxItems) {\r\n marker.setMap(map);\r\n // Extend the bounds to include each marker's position.\r\n bounds.extend(marker.position);\r\n }\r\n });\r\n\r\n // Google Maps default behavior with a single marker when calling\r\n // fitBounds() is to maximize zoom. This can be undesirable behavior.\r\n // If only a single marker, let mapData define center and zoom.\r\n if (markers.length > 1) {\r\n // Make the map zoom to fit the bounds, showing all locations.\r\n map.fitBounds(bounds);\r\n }\r\n }\r\n\r\n}(window,document,jQuery);\r\n","export default function (window,document,$,undefined) {\n \"use strict\";\n $('.js-header-tag-link').each(function(index) {\n\n let $el = $(this),\n $showHideButton = $('.js-header-tag-button', $el),\n $dynamicItems = $('a:nth-child(n+4)', $el),\n id = $el.attr('id') || 'headerTags' + (index + 1),\n open = $el.hasClass('is-open');\n\n // Set the id attribute (respects default if set).\n $el.attr('id', id);\n\n if ($dynamicItems.length) {\n // Show our see button if we have more than three items.\n $showHideButton.attr('aria-expanded',open).attr('aria-controls', id);\n $showHideButton.show();\n }\n\n $showHideButton.on('click', function(e) {\n e.preventDefault();\n $el.toggleClass('is-open');\n\n if ($el.hasClass('is-open')) {\n $showHideButton.attr('aria-expanded', 'true');\n $dynamicItems.show();\n }\n else {\n $showHideButton.attr('aria-expanded', 'false');\n $dynamicItems.hide();\n }\n });\n });\n\n $('.ma__relationship-indicators--terms').each(function() {\n let $tagWrapper = $(this);\n let $button = $tagWrapper.find('.js-relationship-indicator-button');\n let $buttonCounter = $button.find('.tag-count');\n let $hiddenTag = $tagWrapper.find('.ma__relationship-indicators--term:hidden');\n let tagCount = $hiddenTag.length;\n let $tagState = $button.find('.tag-state');\n\n // if hidden tags exist, show button\n if (tagCount) {\n $button.toggle();\n }\n\n // use hidden tags to populate button label\n $buttonCounter.text(tagCount);\n\n $button.on('click', function() {\n let $tagStateText = $tagState.text();\n\n $tagWrapper.parent().toggleClass('tags-open');\n $button.toggleClass('is-open');\n $tagState.text($tagStateText === 'fewer' ? 'more' : 'fewer');\n $hiddenTag.toggle();\n });\n\n $(window).resize(function () {\n // remove all the screen width specific styles\n $buttonCounter.removeAttr('style');\n $hiddenTag.removeAttr('style');\n\n // recount the hidden tags and update the button text\n setTimeout(function(){\n $hiddenTag = $tagWrapper.find('.ma__relationship-indicators--term:hidden');\n \n tagCount = $hiddenTag.length;\n $buttonCounter.text(tagCount);\n $tagState.text('more');\n }, 500);\n\n });\n\n });\n\n}(window,document,jQuery);\n","import cookies from \"../helpers/cookies.js\";\r\n\r\nexport default function (window,document,$,undefined) {\r\n\r\n $('.js-header-alert').each(function(){\r\n init.apply(this);\r\n });\r\n\r\n $(document).on('ma:AjaxPattern:Render', function(e,data){\r\n let $context = data.el;\r\n if ($context.find('.js-header-alert').length) {\r\n $context.find('.js-header-alert').each(function(){\r\n init.apply(this);\r\n })\r\n }\r\n });\r\n\r\n function init(){\r\n let $el = $(this),\r\n $link = $el.find('.js-header-alert-link'),\r\n id = $el.data('id'),\r\n cookieName = \"Alert\" + id,\r\n cookieExpires = 365,\r\n cookieValue = cookies.getCookie(cookieName);\r\n\r\n // show alert if cookie doesn't exist\r\n if(cookieValue !== \"hide\") {\r\n $el.fadeIn().fadeOut('fast').fadeIn('slow');\r\n }\r\n\r\n // hide the alert\r\n $link.on('click',function(){\r\n cookies.setCookie(cookieName,\"hide\",cookieExpires);\r\n $el.stop(true,true).fadeOut();\r\n })\r\n }\r\n}(window,document,jQuery);\r\n\r\n","export default function (window,document,$,undefined) {\n\n const sidebarHeight = $('.sidebar').outerHeight( true ) + 100;\n // Set height of sidebar plus 100 pixels so full width images\n // don't sit too tight under under the sidebar content.\n let debounceTimer;\n\n function mediaWidth() {\n // Define wrapper width for use.\n var wrapperWidth = $('.main-content').width();\n\n $('.ma__figure--full, .ma__iframe--full').each(function() {\n var $thisMedia = $(this);\n\n // Get position of image relative to container.\n var thisPosition = $thisMedia.position().top;\n\n // If this image is below the sidebar.\n if (thisPosition > sidebarHeight) {\n\n // Make the image the full width of the wrapper.\n $thisMedia.css('width', wrapperWidth);\n }\n });\n }\n\n $(window).on('load', function() {\n mediaWidth();\n });\n\n $(window).resize(function() {\n if(typeof debounceTimer === \"number\") {\n window.clearTimeout(debounceTimer);\n }\n debounceTimer = window.setTimeout(function(){\n mediaWidth();\n },250);\n });\n\n}\n(window,document,jQuery);\n","import throttle from \"../helpers/throttle.js\";\n\nexport default function (window,document,$,undefined) {\n let tocContainerClass = '.js-toc-container';\n let containerClass = '.js-inline-overlay';\n let contentClass = '.js-inline-overlay-content';\n let toggleClass = '.js-inline-overlay-toggle';\n let titleClass = '.js-inline-overlay-title';\n\n function initialize () {\n // Add random ID if no ID present.\n let contentID = $(contentClass).attr('id');\n if(!contentID) {\n let id = `overlay-${Math.floor(Math.random()*100000)}`;\n $(containerClass).attr('id', id);\n $(toggleClass).attr('aria-controls, id');\n }\n }\n\n function toggleOverlay() {\n let $containerEl = $(this).closest(tocContainerClass).find(containerClass);\n let isOpen = $containerEl.hasClass('is-open');\n $('body').toggleClass('scroll-disabled', !isOpen);\n $containerEl.toggleClass('is-open', !isOpen);\n\n $(`${toggleClass}[aria-expanded=${!isOpen}]`).parents(titleClass).focus();\n }\n\n initialize();\n $(document).on('click', toggleClass, toggleOverlay);\n // allow esc key to dismiss overlay\n $(document).keydown(function(e) {\n // ESCAPE key pressed\n if (e.keyCode === 27 && $(containerClass).hasClass('is-open')) {\n toggleOverlay();\n }\n });\n\n\n}(window,document,jQuery);\n","export default function (window,document,$,undefined) {\r\n\r\n $('.js-keyword-search').each(function(){\r\n let $el = $(this),\r\n $form = $el.find('form');\r\n\r\n $form.on('submit',function(e){\r\n e.preventDefault();\r\n $el.addClass('is-dirty')\r\n });\r\n\r\n $form.on('reset',function(){\r\n $el.removeClass('is-dirty')\r\n });\r\n });\r\n\r\n}(window,document,jQuery);\r\n","export default function (window,document,$,undefined) {\n\n $('.ma__link-list--image-blocks, .ma__link-list--image-links').each(function() {\n\n const $thisList = $(this).find('.ma__link-list__items'),\n $thisToggle = $(this).find('.ma__link-list__toggle'),\n $thisToggleLabel = $thisToggle.find('span'),\n $listItem = $thisList.children(),\n listItems = $listItem.length;\n\n let debounceTimer;\n\n function showToggle() {\n let width = $(window).width();\n\n if ((listItems > 3) && (width < 780) || (listItems > 6) && (width < 1201)) {\n // Show More button only when there are enough to toggle.\n $thisToggle.addClass('show-toggle');\n }\n else {\n $thisToggle.removeClass('show-toggle');\n }\n }\n showToggle();\n\n $thisToggle.on('click', function() {\n\n let thisToggleText = $thisToggleLabel.text();\n $thisToggle.toggleClass('toggle-open');\n $thisToggleLabel.text(thisToggleText === \"less\" ? \"more\" : \"less\");\n\n $listItem.each(function() {\n let $item = $(this);\n\n if ($item.is(':hidden')) {\n $item.slideDown().addClass('toggle-open');\n }\n else if ($item.is(':visible') && $item.hasClass('toggle-open')) {\n $item.slideUp().removeClass('toggle-open');\n }\n });\n });\n\n $(window).resize(function () {\n\n if(typeof debounceTimer === \"number\") {\n window.clearTimeout(debounceTimer);\n }\n debounceTimer = window.setTimeout(function(){\n showToggle();\n\n // Remove added attributes at desktop width.\n if ($(window).width() < 1201) {\n $thisToggle.removeAttr('style');\n $listItem.removeAttr('style');\n }\n },150);\n });\n });\n\n}(window,document,jQuery);","export default function (window,document,$,undefined) {\n $('.js-location-filters').each(function(){\n let $el = $(this);\n\n // When google map libraries are loaded, initialize places.autocomplete on the location input, if it exists.\n $(document).on('ma:LibrariesLoaded:GoogleMaps', function() {\n let $locationFilterParent = $('.js-filter-by-location', $el);\n let $locationFilter = $locationFilterParent.find('input');\n if ($locationFilter.length) {\n // Create the google places autocomplete object and associate it with the zip code text input.\n let locationInput = document.getElementById($locationFilter.attr('id'));\n let swLat = $locationFilterParent.data('maPlaceBoundsSwLat');\n let swLng = $locationFilterParent.data('maPlaceBoundsSwLng');\n let neLat = $locationFilterParent.data('maPlaceBoundsNeLat');\n let neLng = $locationFilterParent.data('maPlaceBoundsNeLng');\n\n let defaultBounds = new google.maps.LatLngBounds(new google.maps.LatLng(swLat,swLng), new google.maps.LatLng(neLat,neLng));\n\n // See options: https://developers.google.com/maps/documentation/javascript/places-autocomplete#add_autocomplete\n let options = {\n bounds: defaultBounds,\n strictBounds: true,\n types: ['geocode'],\n componentRestrictions: {country: 'us'},\n placeIdOnly: true\n };\n ma.autocomplete = new google.maps.places.Autocomplete(locationInput, options);\n }\n });\n\n // Listen for new data from another component interaction (i.e. results heading), update form.\n $el.on('ma:FormFilter:DataUpdated', function(e, data){\n renderForm({clearedFilter: data.clearedFilter, $form: $el});\n });\n\n // Handle global form submission.\n $el.submit(function(e){\n e.preventDefault();\n // Update master data with the various filter values.\n let formData = getFormData({$form: $(this)});\n\n // Trigger location listing filter event with current filter values.\n $el.trigger('ma:LocationFilter:FormSubmitted', [{formData: formData}]);\n });\n\n });\n\n function renderForm(args) {\n let clearedFilter = args.clearedFilter;\n // The clear all button was pressed.\n if (clearedFilter === \"all\") {\n clearForm(args);\n }\n // Single filter button was pressed.\n else {\n clearDeactivatedFilter(args);\n }\n }\n\n function getFormData(args) {\n let $form = $(args.$form),\n $location = $form.find('.js-filter-by-location'),\n $tags = $form.find('.js-filter-by-tags'),\n formData = [];\n\n // Get location\n if ($location.find('input').length) {\n let place = $location.find('input').val();\n if (place) {\n formData.push({\n type: 'location',\n text: place,\n value: place\n });\n }\n }\n\n $tags.find('input:checked').each(function() {\n formData.push({'type': 'tag', 'value': $(this).val(), 'text': $(this).siblings(\"label\").text()});\n });\n\n return formData;\n }\n\n function clearDeactivatedFilter(args) {\n let $form = $(args.$form),\n $place = $form.find('.js-filter-by-location'),\n $tags = $form.find('.js-filter-by-tags'),\n clearedFilter = args.clearedFilter;\n\n // If the cleared filter button was for a location filter.\n if (clearedFilter.type === 'location') {\n $place.find('input').val(\"\");\n return;\n }\n\n // If the cleared filter button was for a tag filter.\n if (clearedFilter.type === 'tag') {\n $tags.find('input[type=checkbox][value=' + clearedFilter.value + ']').prop('checked', false);\n }\n }\n\n function clearForm(args) {\n let $form = $(args.$form),\n $tags = $('.js-filter-by-tags', $form),\n $place = $('.js-filter-by-location', $form).find('input');\n\n // Clear location text input.\n if ($place.length) {\n $place.val(\"\");\n }\n // Uncheck all checked tags inputs.\n $tags.find('input:checked').prop('checked', false);\n }\n\n}(window,document,jQuery);\n","import sticky from \"../helpers/sticky.js\";\r\nimport listings from \"../helpers/listing.js\";\r\n\r\nexport default function (window, document, $, undefined) {\r\n // Active state classes for location listing rows.\r\n let activeClass = 'is-active',\r\n markerActiveClass = 'is-marker-bounce',\r\n // Selectors for event listeners on dynamic content.\r\n row = '.js-location-listing-link',\r\n activeLocationListingRow = row + '.' + activeClass,\r\n markerActiveLocationListingRow = row + '.' + markerActiveClass,\r\n // Parent component selectors.\r\n container = '.js-location-listing-results',\r\n parent = '.js-image-promos',\r\n mapCol = '.js-location-listing-map';\r\n\r\n $('.js-location-listing').each(function (i) {\r\n let $el = $(this),\r\n $mapCol = $el.find('.js-location-listing-map'),\r\n $map = $el.find('.js-google-map'),\r\n $resultsHeading = $el.find('.js-results-heading'),\r\n $pagination = $el.find('.js-pagination'),\r\n $locationFilter = $el.find('.js-location-filters');\r\n\r\n sticky.init($mapCol);\r\n\r\n // Get the location listing component data (this could be replaced with an api)\r\n const rawData = ma.locationListing[i]; // Data object created in @organisms/by-author/location-listing.twig\r\n\r\n let masterData = []; // master data structure to preserve state\r\n // Listen for map initialization, populate master data structure using locationListing, map markers.\r\n $map.on('ma:GoogleMap:MapInitialized', function (e, markers) {\r\n masterData = populateMasterDataSource(rawData, markers); // to preserve state\r\n });\r\n\r\n // Listen for Google Map api library load completion, with geocode, geometry, and places libraries\r\n $(document).on('ma:LibrariesLoaded:GoogleMaps', function () {\r\n // Set up click handler for location listing rows.\r\n $el.on('click', row, function (e) {\r\n let index = $(e.currentTarget).index();\r\n // trigger map to recenter on this item based on it's index.\r\n $map.trigger('ma:GoogleMap:MapRecenter', index);\r\n // mark this link as active\r\n $el.find(activeLocationListingRow).removeClass(activeClass);\r\n $(e.currentTarget).addClass(activeClass); // in case the event is triggered on a child element.\r\n // focus on the map - mainly for mobile when it is stacked\r\n let position = $map.offset().top;\r\n $(\"html,body\").stop(true, true).animate({ scrollTop: position }, '750');\r\n });\r\n\r\n // Set up hover / focus event for listing rows.\r\n $el.on('mouseenter focusin', row, function (e) {\r\n // remove active state from previously selected list item\r\n $el.find(activeLocationListingRow).removeClass(activeClass);\r\n\r\n // Don't bounce the marker again if focus moves within the same listing.\r\n if ($(e.currentTarget).hasClass(markerActiveClass)) {\r\n return false;\r\n }\r\n\r\n // Remove \"focus\" class from any \"focused\" location listing row.\r\n // (\"focus\" vs focus because hover doesn't bring focus to element.)\r\n $el.find(markerActiveLocationListingRow).removeClass(markerActiveClass);\r\n\r\n // Focus moved into listing for first time, so flag with class, recenter + bounce marker.\r\n $(e.currentTarget).addClass(markerActiveClass);\r\n let index = $(e.currentTarget).index();\r\n\r\n // Trigger map to recenter on this item and make the marker bounce\r\n $map.trigger('ma:GoogleMap:MarkerBounce', index);\r\n });\r\n\r\n // Remove \"focus\" class from any \"focused\" location listing row.\r\n $el.on('mouseleave', row, function (e) {\r\n $el.find(markerActiveLocationListingRow).removeClass(markerActiveClass);\r\n });\r\n\r\n // Handle location listings form interaction (triggered by locationFilters.js).\r\n $locationFilter.on('ma:LocationFilter:FormSubmitted', function (e, formValues) {\r\n // transformData() returns a jQuery deferred object which allows us to wait for any asynchronous js execution to return before executing the .done(callback).\r\n // @see: https://api.jquery.com/deferred.done/\r\n transformData(masterData, formValues).done(function (transformation) {\r\n masterData = transformation.data; // preserve state\r\n // Update the results heading based on the current items state.\r\n transformation.data.resultsHeading = listings.transformResultsHeading({ data: transformation.data });\r\n // Update pagination data structure, reset to first page\r\n transformation.data.pagination = listings.transformPaginationData({ data: transformation.data });\r\n // Render the listing page.\r\n listings.renderListingPage({ data: transformation.data });\r\n // Get the associated markers based on the listing items.\r\n transformation.markers = getActiveMarkers({ data: transformation.data });\r\n // Trigger child components render with updated data\r\n updateChildComponents(transformation);\r\n });\r\n });\r\n\r\n // Handle active filter/tag button interactions (triggered by resultsHeading.js).\r\n $resultsHeading.on('ma:ResultsHeading:ActiveTagClicked', function (e, clearedFilter) {\r\n // transformData() returns a jQuery deferred object which allows us to wait for any asynchronous js execution to return before executing the .done(callback).\r\n // @see: https://api.jquery.com/deferred.done/\r\n transformData(masterData, clearedFilter).done(function (transformation) {\r\n masterData = transformation.data; // preserve state\r\n transformation.clearedFilter = clearedFilter;\r\n\r\n masterData = transformation.data; // preserve state\r\n // Update the results heading based on the current items state.\r\n transformation.data.resultsHeading = listings.transformResultsHeading({ data: transformation.data });\r\n // Update pagination data structure, reset to first page\r\n transformation.data.pagination = listings.transformPaginationData({ data: transformation.data });\r\n // Render the listing page.\r\n listings.renderListingPage({ data: transformation.data });\r\n // Get the associated markers based on the listing items.\r\n transformation.markers = getActiveMarkers({ data: transformation.data });\r\n // Trigger child components render with updated data\r\n updateChildComponents(transformation);\r\n });\r\n });\r\n\r\n function handlePagination(e, target) {\r\n let nextPage = parseInt(target, 10);\r\n\r\n masterData.pagination = listings.transformPaginationData({ data: masterData, targetPage: nextPage });\r\n masterData.resultsHeading = listings.transformResultsHeading({ data: masterData, page: nextPage });\r\n listings.renderListingPage({ data: masterData, page: nextPage });\r\n\r\n let markers = getActiveMarkers({ data: masterData, page: nextPage });\r\n // Trigger child components render with updated data\r\n updateChildComponents({ data: masterData, markers: markers });\r\n }\r\n\r\n // Handle pagination event (triggered by pagination.js), render targetPage.\r\n $pagination.on('ma:Pagination:Pagination', handlePagination);\r\n let defaultPage = 1;\r\n let params = new URLSearchParams(window.location.search);\r\n if (history.state) {\r\n defaultPage = history.state.page;\r\n }\r\n if (params) {\r\n defaultPage = params.get(\"page\");\r\n }\r\n if (parseInt(defaultPage, 10) !== 1) {\r\n handlePagination(null, defaultPage);\r\n }\r\n\r\n });\r\n\r\n // Trigger events to update child components with new data.\r\n function updateChildComponents(args) {\r\n $resultsHeading.trigger('ma:ResultsHeading:DataUpdated', [args.data.resultsHeading]);\r\n $map.trigger('ma:GoogleMap:MarkersUpdated', [{ markers: args.markers, place: args.place }]);\r\n $pagination.trigger('ma:Pagination:DataUpdated', [args.data.pagination]);\r\n if (args.clearedFilter) {\r\n $locationFilter.trigger('ma:FormFilter:DataUpdated', [args.clearedFilter]);\r\n }\r\n }\r\n });\r\n\r\n /**\r\n * Data initialization.\r\n */\r\n\r\n /**\r\n * Returns a master data structure with page level / listing item level data and markup, to reflect component state.\r\n *\r\n * @param listing\r\n * The locationListing data structure to use as a source\r\n * @param markers\r\n * The array of map markers created by component google map (googleMaps.js module)\r\n * @returns {Array}\r\n * An array with the following structure:\r\n * [\r\n * maxItems: the max number of items to show per listing \"page\" if provided, defaults to all\r\n * totalPages: the number of pages of items that should render, given the current filters\r\n * resultsHeading: the data structure necessary to render a resultsHeading component\r\n * items: an array of listing items [\r\n * isActive: whether or not the listing should be shown, given current filters state\r\n * page: the page that the listing, if active, will appear on, given the current sort order\r\n * promo: the data structure for the imagePromo component\r\n * markup: the compiled imagePromo markup\r\n * marker: the related map marker data structure for the listing item\r\n * ]\r\n * pagination: the data structure necessary to render a pagination component\r\n * selectors: the selectors for the listing, listing items, listing row, and map\r\n * ]\r\n */\r\n function populateMasterDataSource(listing, markers) {\r\n // Populate master data structure\r\n let masterData = [];\r\n\r\n // Ensure locationListing.imagePromos.items is an array (the twig template json_encode()'s a php array)\r\n let promosArray = [];\r\n $.map(listing.imagePromos.items, function (val, index) { promosArray[index] = val; });\r\n listing.imagePromos.items = promosArray;\r\n\r\n // Ensure locationListing.pagination.pages is an array (the twig template json_encode()'s a php array)\r\n let pages = [];\r\n $.map(listing.pagination.pages, function (val, index) { pages[index] = val; });\r\n listing.pagination.pages = pages;\r\n\r\n\r\n // Get the listing imagePromos, generate markup for each\r\n let masterListing = listing.imagePromos.items,\r\n masterListingMarkup = listings.transformListing(masterListing, 'locationListingRow');\r\n\r\n // The max number of items per page, if designated in locationListing data structure, else all\r\n masterData.maxItems = listing.maxItems ? listing.maxItems : listing.imagePromos.items.length;\r\n // The initial results heading data structure\r\n masterData.resultsHeading = listing.resultsHeading;\r\n // The array of items and their respective page, in/active status, marker data, imagePromo data, and markup\r\n masterData.items = getMasterListingWithMarkupAndMarkers(masterListing, masterListingMarkup, markers, masterData.maxItems);\r\n // The initial pagination data structure;\r\n masterData.pagination = listing.pagination;\r\n // The total number of pages, given the number of items and the maxItems variable\r\n masterData.totalPages = Math.ceil(masterData.items.length / masterData.maxItems);\r\n // Set the selector properties necessary to render\r\n masterData.selectors = {};\r\n masterData.selectors.container = container;\r\n masterData.selectors.parent = parent;\r\n masterData.selectors.row = row;\r\n masterData.selectors.map = mapCol;\r\n\r\n return masterData;\r\n }\r\n\r\n /**\r\n * Creates the master data structure items array\r\n *\r\n * @param listing\r\n * The locationListing data structure\r\n * @param markup\r\n * The generated array of item markup\r\n * @param markers\r\n * The associated map markers for each item\r\n * @param max\r\n * The maximum number of items per page\r\n * @returns {Array}\r\n * An array of listing items with the following structure:\r\n * [\r\n * isActive: whether or not the listing should be shown, given current filters state\r\n * page: the page that the listing, if active, will appear on, given the current sort order\r\n * promo: the data structure for the imagePromo component\r\n * markup: the compiled imagePromo markup\r\n * marker: the related map marker data structure for the listing item\r\n * ]\r\n */\r\n function getMasterListingWithMarkupAndMarkers(listing, markup, markers, max) {\r\n let items = [];\r\n markers.forEach(function (item, index) {\r\n items[index] = {\r\n isActive: true, // @todo consider checking for this in case of server side preprocessing of state\r\n page: Math.ceil((index + 1) / max),\r\n marker: item,\r\n markup: markup[index],\r\n data: listing[index]\r\n };\r\n });\r\n return items;\r\n }\r\n\r\n /**\r\n * Data transformation.\r\n */\r\n\r\n /**\r\n * The main data transformation wrapper, returns an instance of masterData which reflects the component state.\r\n *\r\n * @param data\r\n * An instance of masterData to start from.\r\n * @param transformation\r\n * An object representing the change in state (locationFilter form data, resultsHeading tag interaction, etc.)\r\n *\r\n * @returns {{data: *, markers: *}}\r\n * An object with the current state masterData instance and an array of their related sorted markers to send to map.\r\n */\r\n function transformData(data, transformation) {\r\n // This data transformation potentially involves asynchronous google geocoding.\r\n // This jQuery deferered object allows us to wait for a return before moving on inside of the parent function (which invokes this function).\r\n // @see https://api.jquery.com/jquery.deferred/\r\n let promise = $.Deferred();\r\n let transformReturn = {};\r\n\r\n // First filter the data based on component state, then sort alphabetically by default.\r\n let filteredData = listings.filterListingData(data, transformation),\r\n sortedData = listings.sortDataAlphabetically(filteredData),\r\n place = '';\r\n\r\n // Sort data by location, if that filter is present.\r\n if (listings.hasFilter(filteredData.resultsHeading.tags, 'location')) {\r\n place = listings.getFilterValues(filteredData.resultsHeading.tags, 'location')[0]; // returns array\r\n // If place argument was selected from the locationFilter autocomplete (initiated on the zipcode text input).\r\n let autocompletePlace = ma.autocomplete.getPlace();\r\n // Geocode the address, then sort the markers and instance of locationListing masterData.\r\n ma.geocoder = ma.geocoder ? ma.geocoder : new google.maps.Geocoder();\r\n if (typeof autocompletePlace !== \"undefined\" && autocompletePlace.hasOwnProperty('place_id')) {\r\n // This is an asynchronous function\r\n listings.geocodePlaceId(autocompletePlace.place_id, function (result) {\r\n transformReturn.data = sortDataAroundPlace(result, filteredData);\r\n transformReturn.geocode = result;\r\n // Return the data sorted by location and the geocoded place object\r\n promise.resolve(transformReturn);\r\n });\r\n }\r\n // If place argument was populated from locationFilter (zipcode text input) but not from Place autocomplete.\r\n else {\r\n // This is an asynchronous function\r\n listings.geocodeAddressString(place, function (result) {\r\n transformReturn.data = sortDataAroundPlace(result, filteredData);\r\n transformReturn.geocode = result;\r\n // Return the data sorted by location and the geocoded place object\r\n promise.resolve(transformReturn);\r\n });\r\n }\r\n }\r\n else {\r\n // Return the data sorted by alphabet and the empty place object\r\n promise.resolve({ data: sortedData, place: place });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * Returns the markers which correspond to a given \"page\" of location listing data.\r\n *\r\n * @param args\r\n * An object with the following structure:\r\n * {\r\n * data: instance of filtered, sorted masterData off of which to base markers\r\n * page: the target page of items/markers to render\r\n * }\r\n *\r\n * @returns\r\n * An array of corresponding map marker objects which should be rendered\r\n */\r\n function getActiveMarkers(args) {\r\n let data = args.data,\r\n page = args.page ? args.page : 1; // default to first page if non provided\r\n\r\n // Get just the markers from our active sorted/filtered data listing.\r\n return data.items.filter(function (item) {\r\n return item.isActive && item.page === page;\r\n }).map(function (item) {\r\n return item.marker;\r\n });\r\n }\r\n\r\n /**\r\n * Returns instance of location listing masterData, sorted proximity to place.\r\n *\r\n * @param geocode\r\n * The geocode information by which to sort.\r\n * @param data\r\n * The instance of location listing masterData.\r\n * @returns {*}\r\n * Sorted instance of location listing masterData.\r\n */\r\n function sortDataAroundPlace(geocode, data) {\r\n // Get all existing marker distance from place, assign as marker property.\r\n for (let key in data.items) {\r\n if (data.items.hasOwnProperty(key)) {\r\n data.items[key].marker.distance = google.maps.geometry.spherical.computeDistanceBetween(geocode.geometry.location, data.items[key].marker.getPosition());\r\n }\r\n }\r\n\r\n // Sort existing markers by closest to the place.\r\n data.items.sort(function (a, b) {\r\n return a.marker.distance - b.marker.distance;\r\n });\r\n\r\n // Update each location listing item's page number based on new marker sort order.\r\n let paginated = listings.paginateItems(data.items, data.maxItems);\r\n data.items = paginated.items;\r\n data.totalPages = paginated.totalPages;\r\n data.place = geocode;\r\n\r\n // Return the newly sorted instance of location listing masterData.\r\n return data;\r\n }\r\n} (window, document, jQuery);","export default function (window,document,$,undefined) {\r\n\r\n let windowWidth = window.innerWidth;\r\n\r\n $(window).resize(function(){\r\n windowWidth = window.innerWidth;\r\n });\r\n\r\n $('.js-main-nav').each(function() {\r\n let openClass = \"is-open\",\r\n closeClass = \"is-closed\",\r\n submenuClass = \"show-submenu\",\r\n $parent = $(this),\r\n $mainNavToggle = $parent.find('.js-main-nav-toggle'),\r\n $mainNavItems = $parent.find('.js-main-nav-toggle, .js-main-nav-top-link'),\r\n breakpoint = 840; // matches CSS breakpoint for Main Nav\r\n\r\n $mainNavItems.on('keydown', function(e) {\r\n // Grab all the DOM info we need...\r\n let $link = $(this),\r\n $topLevelLinks = $parent.find('.ma__main-nav__top-link'),\r\n open = $link.hasClass(openClass),\r\n $openContent = $parent.find('.js-main-nav-content.' + openClass),\r\n $focusedElement = $(document.activeElement),\r\n menuFlipped = (windowWidth < breakpoint),\r\n // relevant if open..\r\n $topLevelItem = $focusedElement.parents('.ma__main-nav__item'),\r\n $topLevelLink = $topLevelItem.find('.ma__main-nav__top-link'),\r\n $dropdownLinks = $link.find('.ma__main-nav__subitem .ma__main-nav__link'),\r\n dropdownLinksLength = $dropdownLinks.length,\r\n focusIndexInDropdown = $dropdownLinks.index($focusedElement),\r\n // Easy access to the key that was pressed.\r\n keycode = e.keyCode,\r\n action = {\r\n 'skip': keycode === 9,\r\n 'close': keycode === 27,\r\n 'left': keycode === 37,\r\n 'right': keycode === 39,\r\n 'up': keycode === 38,\r\n 'down': keycode === 40\r\n };\r\n\r\n // Default behavior is prevented for all actions except 'skip'.\r\n if (action.close || action.left || action.right || action.up || action.down) {\r\n e.preventDefault();\r\n }\r\n\r\n // Skip out of the menu and close any currently-open submenus.\r\n if(action.skip) {\r\n hide($openContent);\r\n $link.removeClass(openClass);\r\n $topLevelLink.attr('aria-expanded','false');\r\n return;\r\n }\r\n\r\n // Navigate into or within a submenu. This is needed on up/down actions\r\n // (unless the menu is flipped and closed) and when using the right arrow\r\n // while the menu is flipped and submenu is closed.\r\n if(((action.up || action.down) && !(menuFlipped && !open))\r\n || (action.right && menuFlipped && !open)) {\r\n // Open pull down menu if necessary.\r\n if (!open) {\r\n show($topLevelItem.find('.js-main-nav-content'));\r\n $topLevelLink.attr('aria-expanded', 'true');\r\n $link.addClass(openClass);\r\n }\r\n\r\n // Adjust index of active menu item based on performed action.\r\n focusIndexInDropdown += (action.up ? -1 : 1);\r\n // If the menu is flipped, skip the last item in each submenu. Otherwise,\r\n // skip the first item. This is done by repeating the index adjustment.\r\n if(menuFlipped) {\r\n if(focusIndexInDropdown === dropdownLinksLength - 1) {\r\n focusIndexInDropdown += (action.up ? -1 : 1);\r\n }\r\n } else {\r\n if(focusIndexInDropdown === 0 || focusIndexInDropdown >= dropdownLinksLength) {\r\n focusIndexInDropdown += (action.up ? -1 : 1);\r\n }\r\n }\r\n // Wrap around if at the end of the submenu.\r\n focusIndexInDropdown = ((focusIndexInDropdown % dropdownLinksLength) + dropdownLinksLength) % dropdownLinksLength;\r\n $dropdownLinks[focusIndexInDropdown].focus();\r\n return;\r\n }\r\n\r\n // Close menu and return focus to menubar\r\n if(action.close || (menuFlipped && action.left)) {\r\n hide($openContent);\r\n $link.removeClass(openClass);\r\n $topLevelLink.focus().attr('aria-expanded','false');\r\n return;\r\n }\r\n\r\n // Navigate between submenus. This is needed for left/right actions in\r\n // normal layout, or up/down actions in flipped layout (when nav is closed).\r\n if(((action.left || action.right) && !menuFlipped) ||\r\n ((action.up || action.down) && menuFlipped && !open)) {\r\n let index = $topLevelLinks.index($topLevelLink),\r\n prev = action.left || action.up,\r\n linkCount = $topLevelLinks.length;\r\n\r\n // hide content\r\n // If menubar focus\r\n // - Change menubar item\r\n //\r\n // If dropdown focus\r\n // - Open previous pull down menu and select first item\r\n hide($openContent);\r\n $topLevelLink.attr('aria-expanded','false');\r\n // Get previous item if left arrow, next item if right arrow.\r\n index += (prev ? -1 : 1);\r\n // Wrap around if at the end of the set of menus.\r\n index = ((index % linkCount) + linkCount) % linkCount;\r\n $topLevelLinks[index].focus();\r\n return;\r\n }\r\n\r\n });\r\n $mainNavItems.on('mouseenter', function(e) {\r\n $(this).children('button').attr(\"aria-expanded\",\"true\");\r\n\r\n if(windowWidth > breakpoint) {\r\n let $openContent = $(this).find('.js-main-nav-content');\r\n show($openContent);\r\n }\r\n });\r\n $mainNavItems.on('mouseleave', function(e) {\r\n $(this).children('button').attr(\"aria-expanded\",\"false\");\r\n\r\n if(windowWidth > breakpoint) {\r\n let $openContent = $(this).find('.js-main-nav-content');\r\n hide($openContent);\r\n }\r\n });\r\n $mainNavToggle.children('button, a').on('click', function(e) {\r\n let $el = $(this),\r\n $elParent = $el.parent(),\r\n $content = $elParent.find('.js-main-nav-content'),\r\n $openContent = $parent.find('.js-main-nav-content.' + openClass),\r\n isOpen = $content.hasClass(openClass);\r\n\r\n // mobile\r\n if(windowWidth <= breakpoint) {\r\n e.preventDefault();\r\n // add open class to this item\r\n $elParent.addClass(openClass);\r\n show($content);\r\n $el.attr('aria-expanded', 'true');\r\n } else {\r\n hide($openContent);\r\n $el.attr('aria-expanded', 'false');\r\n\r\n if(!isOpen) {\r\n show($content);\r\n $el.attr('aria-expanded', 'true');\r\n }\r\n }\r\n });\r\n\r\n $('.js-close-sub-nav').on('click', function(){\r\n let $openContent = $parent.find('.js-main-nav-content.' + openClass);\r\n hide($openContent);\r\n });\r\n\r\n // Hide any open submenu content when the sidebar menu is closed\r\n $('.js-header-menu-button').click(function() {\r\n let $openContent = $parent.find('.js-main-nav-content.' + openClass);\r\n hide($openContent);\r\n });\r\n\r\n function hide($content) {\r\n $('body').removeClass(submenuClass);\r\n $parent.find(\".\" + openClass).removeClass(openClass);\r\n\r\n if(windowWidth <= breakpoint) {\r\n $content.addClass(closeClass);\r\n } else {\r\n $content\r\n .stop( true, true )\r\n .slideUp('fast',function() {\r\n $content\r\n .addClass(closeClass)\r\n .slideDown(0);\r\n });\r\n }\r\n }\r\n\r\n function show($content) {\r\n $('body').addClass(submenuClass);\r\n if(windowWidth <= breakpoint) {\r\n $content\r\n .addClass(openClass)\r\n .removeClass(closeClass);\r\n } else {\r\n $content\r\n .stop( true, true )\r\n .delay( 200 )\r\n .slideUp(0,function() {\r\n $content\r\n .addClass(openClass)\r\n .removeClass(closeClass)\r\n .slideDown('fast');\r\n });\r\n }\r\n }\r\n\r\n\r\n });\r\n\r\n}(window,document,jQuery);\r\n","// ****** Menu button ******\r\nlet menuButton = document.querySelector(\".js-header-menu-button\");\r\n\r\nif(null !== menuButton){\r\n menuButton.addEventListener(\"click\", function(event) {\r\n event.preventDefault();\r\n document.querySelector(\"body\").classList.toggle(\"show-menu\");\r\n });\r\n}\r\n\r\n// ****** Main Header Search button on mobile should open the mobile menu ******\r\nlet searchForm = document.querySelector(\".js-header-search-menu .js-header-search-form\");\r\n\r\nif(null !== searchForm){\r\n searchForm.addEventListener(\"submit\", function(event) {\r\n if(window.innerWidth > 620) {\r\n return;\r\n }\r\n event.preventDefault();\r\n document.querySelector(\"body\").classList.toggle(\"show-menu\");\r\n });\r\n}\r\n\r\n\r\n","import getTemplate from \"../helpers/getHandlebarTemplate.js\";\r\n\r\nexport default function (window,document,$,undefined) {\r\n \r\n $('.js-org-selector').each(function(i){\r\n let $el = $(this);\r\n let data = orgSelector[i];\r\n let compiledTemplate = getTemplate('orgInfo');\r\n let $select = $el.find('select').first();\r\n let $placeholder = $el.find('.js-org-info');\r\n\r\n //render the template based on the current value\r\n renderTemplate($select.val());\r\n\r\n // When the select changes\r\n $select.change(() => {\r\n //render the template based on the new value\r\n renderTemplate($select.val());\r\n });\r\n\r\n // Render the template based on value\r\n function renderTemplate(value) {\r\n if (typeof(data.organizations[value]) === \"undefined\") {\r\n $placeholder.html(\"\");\r\n return false;\r\n }\r\n\r\n $placeholder.html(compiledTemplate(data.organizations[value]));\r\n\r\n return true;\r\n }\r\n });\r\n\r\n}(window,document,jQuery);\r\n","import twiggy from '../helpers/twiggy';\n\nexport default function (window, document, $, undefined) {\n\n if ($('.js-pagination').length === 0) {\n return;\n }\n\n // Set up global component config\n let prevButton = '.js-pagination-prev',\n nextButton = '.js-pagination-next',\n pageButton = '.js-pagination-page';\n\n $('.js-pagination').each(function () {\n let $el = $(this);\n\n // Listen for previous page button click and trigger pagination event.\n $el.on('click', prevButton, function () {\n let targetPageNumber = parseInt(history.state.page, 10) - 1;\n pushPaginationState(targetPageNumber);\n $el.trigger('ma:Pagination:Pagination', [history.state.page]);\n });\n // Listen for next button click and trigger pagination event.\n $el.on('click', nextButton, function () {\n let targetPageNumber = parseInt(history.state.page, 10) + 1;\n pushPaginationState(targetPageNumber);\n $el.trigger('ma:Pagination:Pagination', [history.state.page]);\n });\n // Listen for page number button click and trigger pagination event;\n $el.on('click', pageButton, function (e) {\n let targetPageNumber = $(e.target).data('page');\n pushPaginationState(targetPageNumber);\n $el.trigger('ma:Pagination:Pagination', [history.state.page]);\n });\n\n window.onpopstate = function(e) {\n if (e.state.page) {\n $el.trigger(\"ma:Pagination:Pagination\", [e.state.page]);\n }\n };\n\n // Listen for new data, render new pagination.\n $el.on('ma:Pagination:DataUpdated', function (e, data) {\n renderPagination({ data: data, $el: $el });\n });\n\n\n // if we already have a state or a query parameter, initialize things\n let targetPageNumber = 1;\n let params = new URLSearchParams(window.location.search);\n if (history.state && history.state.page) {\n targetPageNumber = history.state.page;\n } else if (params.has('page')) {\n targetPageNumber = params.get('page');\n }\n pushPaginationState(targetPageNumber);\n\n });\n\n /**\n * Renders the contents of a specific results pagination component.\n *\n * @param args\n * The arguments object, can contain the following properties:\n * data: data object from which to populate handlebars template variables (required),\n * context: the parent component selector\n */\n function renderPagination(args) {\n // Don't attempt to render anything if we don't have new data.\n if (!args.data) {\n return;\n }\n\n // Render async with Twig.\n return twiggy('@molecules/pagination.twig')\n .then(template => template.renderAsync({ pagination: args.data }))\n .then(markup => args.$el.html(markup))\n\n // Create new markup using handlebars template, helper.\n let markup = compiledTemplate(args.data);\n args.$el.html(markup);\n }\n\n\n function pushPaginationState(pageNum) {\n let params = new URLSearchParams(window.location.search);\n params.set('page', pageNum);\n\n history.pushState(\n { page: pageNum },\n `${document.title} | page ${pageNum}`, `${window.location.origin}${window.location.pathname}?${params.toString()}`\n );\n }\n\n} (window, document, jQuery);","export default function (window,document,$,undefined) {\r\n \r\n $('.js-input-date').each(function(){\r\n let $el = $(this);\r\n let restrict = $el.data('restrict');\r\n let picker = new Pikaday({ \r\n field: this,\r\n format: 'MM/DD/YYYY',\r\n });\r\n\r\n switch(restrict) {\r\n case 'max':\r\n picker.setMaxDate(new Date());\r\n break;\r\n case 'min':\r\n picker.setMinDate(new Date());\r\n break;\r\n }\r\n\r\n $el.attr('type','text');\r\n });\r\n\r\n}(window,document,jQuery);\r\n","export default function (window,document,$,undefined) {\n\n $('.js-ma-responsive-video').fitVids();\n\n}(window,document,jQuery);","import twiggy from '../helpers/twiggy';\n\nexport default function (window,document,$,undefined) {\n // Set up global component config\n let clearAllButton = '.js-results-heading-clear', // events triggered on parent\n filterButton = '.js-results-heading-tag'; // events triggered on parent\n\n $(\".js-results-heading\").each(function() {\n const $el = $(this);\n\n // Listen for clear all button click + trigger interaction event on parent.\n $el.on('click', clearAllButton, function () {\n $el.trigger('ma:ResultsHeading:ActiveTagClicked', [{clearedFilter: 'all'}]);\n });\n\n // Listen for single filter button click and trigger interaction event on parent.\n $el.on('click', filterButton, function (e) {\n let clearedFilter = {\n 'type': $(e.target).data('ma-filter-type'),\n 'value': $(e.target).data('ma-filter-value'),\n 'text': $(e.target).text()\n };\n\n $el.trigger('ma:ResultsHeading:ActiveTagClicked', [{clearedFilter: clearedFilter}]);\n });\n\n // Listen for new results heading data, render new results heading.\n $el.on('ma:ResultsHeading:DataUpdated', function (e, data) {\n renderResultsHeading({data: data, $el: $el});\n });\n });\n\n /**\n * Renders the contents of a specific results heading component.\n *\n * @param args\n * The arguments object, can contain the following properties:\n * data: data object from which to populate handlebars template variables (required),\n * context: the parent component selector\n */\n function renderResultsHeading(args) {\n // Don't attempt to render anything if we don't have new data.\n if (!args.data) {\n return;\n }\n // Asynchronously render via TwigJS.\n twiggy('@molecules/results-heading.twig')\n .then(t => t.renderAsync({resultsHeading: args.data}))\n .then(markup => args.$el.html(markup))\n\n }\n\n}(window,document,jQuery);\n","import slugify from \"../helpers/slugify.js\";\r\nexport default function (window,document,$,undefined) {\r\n\r\n $('.js-ma-rich-text').each(function(index){\r\n let $el = $(this),\r\n richTextIndex = index;\r\n\r\n $el.find('table').wrap( \"
\" );\r\n\r\n // Provide css hooks to indent each child heading and its nested contents if js hook is present.\r\n if ($el.hasClass('js-ma-outline-indent')) {\r\n $el.find(':header').each(function(index,heading){\r\n if ($(heading).prop(\"tagName\") !== 'H2') {\r\n $(heading).addClass(\"ma__rich-text__indent\");\r\n }\r\n $(heading).nextUntil(':header')\r\n .addClass(\"ma__rich-text__indent\")\r\n .attr('data-ma-heading-parent', $(heading).prop('tagName'));\r\n });\r\n }\r\n\r\n // Insert anchor tags prior to all child headings if js hook is present.\r\n if ($el.hasClass('js-ma-insert-heading-anchors')) {\r\n // Get all of the content headings.\r\n let $headings = $el.find(\":header\");\r\n $headings.each(function (index, heading) {\r\n // For H3+\r\n if ($(heading).prop(\"tagName\") !== 'H2') {\r\n // Create an id based on the heading text.\r\n let id = slugify($(heading).text());\r\n // Insert an anchor tag before the heading.\r\n $(heading).before(\"\");\r\n }\r\n });\r\n }\r\n });\r\n}\r\n(window,document,jQuery);\r\n","import checkMobile from \"../helpers/cssControlCode.js\";\r\n\r\nexport default function (window,document,$,undefined) {\r\n\r\n $(\".js-scroll-anchors\").each(function() {\r\n let $el = $(this),\r\n $elParent = $el.parent().css('position') === 'relative' ? $el.parent() : $el.parent().offsetParent(),\r\n $links = $el.find('.js-scroll-anchors-link'),\r\n elHeight,\r\n headerBuffer = 0,\r\n lowerLimit,\r\n upperLimit,\r\n debounceTimer,\r\n activeClass = \"is-active\",\r\n activeAnchorIndex = 0,\r\n anchors = [],\r\n numAnchors = 0,\r\n isMobile = false,\r\n linkScrolling = false;\r\n\r\n setVariables();\r\n\r\n // default assumption as to where the screen will load\r\n $el.attr('data-sticky','top');\r\n\r\n // update variables one more time to catch any post page load changes\r\n window.setTimeout(function(){\r\n setVariables();\r\n },1000);\r\n\r\n $links.on('click',function(e) {\r\n e.preventDefault();\r\n\r\n let $link = $(this);\r\n\r\n // is the menu closed on mobile\r\n if(!$el.hasClass('is-open') && isMobile) {\r\n // just show the menu\r\n $el.addClass('is-open');\r\n return;\r\n }\r\n\r\n activeAnchorIndex = $(this).data('index');\r\n // find the location of the desired link and scroll the page\r\n let position = anchors[activeAnchorIndex].position;\r\n // close the menu\r\n $el.removeClass('is-open');\r\n // prevent the scroll event from updating active links\r\n linkScrolling = true;\r\n\r\n $(\"html,body\").stop(true,true).animate({scrollTop:position}, '750', function(){\r\n linkScrolling = false;\r\n // Get the link hash target so we can bring focus to it\r\n let hash = anchors[activeAnchorIndex].hash;\r\n // bring focus to the item we just scrolled to\r\n $(hash).focus();\r\n // timing issue with window.scroll event firing.\r\n setTimeout(function(){\r\n // set this link as active.\r\n $el.find('.' + activeClass).removeClass(activeClass);\r\n $link.addClass(activeClass);\r\n },30);\r\n });\r\n });\r\n\r\n // if the content contains accordions,\r\n // readjust settings when there state changes.\r\n $('.js-accordion-link').on('click',function() {\r\n if(typeof debounceTimer === \"number\") {\r\n window.clearTimeout(debounceTimer);\r\n }\r\n debounceTimer = window.setTimeout(function(){\r\n setVariables();\r\n setPosition();\r\n activateLink();\r\n },400);\r\n })\r\n\r\n $el.find(\".js-scroll-anchors-toggle\").on('click',function() {\r\n $el.toggleClass('is-open');\r\n });\r\n\r\n // make the links sticky\r\n $(window).resize(function() {\r\n if(typeof debounceTimer === \"number\") {\r\n window.clearTimeout(debounceTimer);\r\n }\r\n debounceTimer = window.setTimeout(function(){\r\n setVariables();\r\n setPosition();\r\n activateLink();\r\n },300);\r\n });\r\n\r\n $(window).scroll(function () {\r\n setPosition();\r\n\r\n if(!linkScrolling){\r\n activateLink();\r\n }\r\n });\r\n\r\n function setVariables() {\r\n let topOffset = 0;\r\n\r\n headerBuffer = 0;\r\n elHeight = $el.outerHeight(true);\r\n upperLimit = $elParent.offset().top;\r\n isMobile = checkMobile($el);\r\n\r\n if($elParent[0].hasAttribute(\"style\") && !isMobile) {\r\n $elParent.removeAttr('style');\r\n }\r\n\r\n if(isMobile) {\r\n headerBuffer = $('.js-sticky-header').height() || 0;\r\n upperLimit -= headerBuffer;\r\n topOffset = elHeight;\r\n }\r\n\r\n lowerLimit = upperLimit + $elParent.outerHeight(true) - $el.height();\r\n\r\n // locate the position of all of the anchor targets\r\n anchors = new Array;\r\n $links.each(function(i,e){\r\n let $el = $(this),\r\n $link = $el.is('a') ? $el : $el.find('a'),\r\n hash = $link[0].hash,\r\n position = $(hash).offset() ? $(hash).offset().top - headerBuffer - topOffset : upperLimit;\r\n\r\n anchors[i] = { hash, position };\r\n\r\n $el.data('index',i);\r\n });\r\n\r\n // record the number of anchors for performance\r\n numAnchors = anchors.length;\r\n }\r\n\r\n function setPosition() {\r\n let windowTop = $(window).scrollTop(),\r\n attr = $el.attr('data-sticky'),\r\n top = attr !== 'top' && windowTop <= upperLimit,\r\n middle = attr !== 'middle' && windowTop < lowerLimit && windowTop > upperLimit,\r\n bottom = attr !== 'bottom' && windowTop >= lowerLimit;\r\n\r\n if($elParent[0].hasAttribute(\"style\") && !isMobile) {\r\n $elParent.removeAttr('style');\r\n }\r\n\r\n if(!$elParent[0].hasAttribute(\"style\") && isMobile && attr === 'middle') {\r\n $elParent.css({'paddingTop':elHeight});\r\n }\r\n\r\n if(top) {\r\n $el.attr('data-sticky','top');\r\n\r\n if(isMobile){\r\n $elParent.removeAttr('style');\r\n }\r\n }\r\n else if (middle) {\r\n $el.attr('data-sticky','middle');\r\n\r\n if(isMobile){\r\n $elParent.css({'paddingTop':elHeight});\r\n }\r\n }\r\n else if (bottom) {\r\n $el.attr('data-sticky','bottom');\r\n\r\n if(isMobile){\r\n $elParent.removeAttr('style');\r\n }\r\n }\r\n }\r\n\r\n function activateLink() {\r\n // do we have more than one anchor\r\n if(numAnchors < 2 || linkScrolling) {\r\n return;\r\n }\r\n\r\n // get the current scroll position and offset by half the view port\r\n let windowTop = $(window).scrollTop() + (window.innerHeight/2),\r\n currentAnchor = activeAnchorIndex;\r\n\r\n // is there a prev target\r\n // and\r\n // is the current scroll position above the current target\r\n if(currentAnchor > 0 && windowTop < anchors[activeAnchorIndex].position) {\r\n // make the prev link active\r\n --activeAnchorIndex;\r\n }\r\n\r\n // is there a next target\r\n // and\r\n // is the current scroll position below the next target\r\n else if(currentAnchor < numAnchors-1 && windowTop > anchors[activeAnchorIndex+1].position) {\r\n // make the next link active\r\n ++activeAnchorIndex;\r\n }\r\n\r\n if (currentAnchor !== activeAnchorIndex) {\r\n // move the active flag\r\n $el.find('.' + activeClass).removeClass(activeClass);\r\n $links.eq(activeAnchorIndex).addClass(activeClass);\r\n }\r\n }\r\n });\r\n}(window,document,jQuery);\r\n","export default function (window,document,$,undefined) {\n\n $('.pre-content .ma__sticky-toc').each(function() {\n const $toc = $('.ma__sticky-toc'),\n $tocContent = $('.ma__sticky-toc__links'),\n $tocSections = $('.ma__information-details .page-content, .ma__stacked-row-section__container .ma__stacked-row-section__title').find('h2'),\n lastHeading = $tocSections.last().text(),\n tocSectionCount = $tocSections.length,\n $tocColumn = $('.ma__sticky-toc__column'),\n $mobileToggle = $('.ma__sticky-toc__toggle-link'),\n $tocToggle = $('.stickyTOC-open'),\n $tocFooter = $('.ma__sticky-toc__footer'),\n $stickyToc = $('.ma__sticky-toc__current-section'),\n minSectionsToShow = $toc.data('min-to-show');\n\n // // Remove wrapper if not enough links.\n if (minSectionsToShow && (tocSectionCount < minSectionsToShow) || !minSectionsToShow && tocSectionCount < 3 ) {\n $toc.remove();\n }\n else {\n // To set an overflow rule for jumpy IE wrapping\n $('html').addClass('stickyTOC');\n }\n // Show expander when more than 10 links.\n if (tocSectionCount <= 10) {\n if ($(window).width() > 480 ) {\n $('.ma__sticky-toc__footer').toggle();\n }\n }\n\n // Use headers to fill TOC.\n $tocSections.each(function() {\n let $section = $(this);\n let sectionId = $section.attr('id');\n let sectionTitle = $section.text();\n if (!sectionId) {\n sectionId = sectionTitle.replace(/\\s+/g, '-').toLowerCase();\n $section.attr('id', sectionId);\n }\n let $tocLink = '';\n let dest = '';\n\n $section.removeAttr('id');\n $section.parent().prepend(dest);\n $('.ma__sticky-toc__column').append($tocLink);\n });\n\n // Toggle mobile TOC open.\n $mobileToggle.on('click', function() {\n $tocContent.toggleClass('is-open');\n });\n\n $tocFooter.on('click', function() {\n let $button = $(this).find('button');\n let $buttonText = $button.text();\n\n // Toggle hidden links open.\n $tocContent.toggleClass('open');\n $button.toggleClass('open');\n\n // Toggle button text.\n $button.text($buttonText === \"show less\" ? \"show more\" : \"show less\");\n });\n\n $(window).resize(function () {\n // Reset menu for each form factor on resize.\n $('.ma__sticky-toc__link').removeAttr('style');\n $tocContent.removeClass('open');\n $tocFooter.find('button').removeClass('open').text('Show More');\n });\n\n // Set title bar to 'Related since the scroll never makes it that far'\n $('body').on('click', '.ma__sticky-toc__link a[text=\"' + lastHeading + '\"]', function() {\n $('.ma__sticky-toc__current-section').text(lastHeading);\n });\n\n $(window).scroll(function () {\n const windowTop = $(window).scrollTop();\n const windowBottom = window.innerHeight;\n const docHeight = $(document).height();\n const stickyNavActive = $toc.offset().top + $toc.outerHeight() - 20;\n\n // Active Sticky TOC when on page TOC scrolls past.\n if (stickyNavActive > windowTop) {\n $toc.removeClass('stuck');\n } else {\n $toc.addClass('stuck');\n\n if (windowTop + windowBottom === docHeight) {\n $stickyToc.text(lastHeading);\n }\n else {\n // Identify the section to show for the heading.\n const active = $tocSections.filter((index, section) => {\n const $target = $(section).siblings('.sticky-toc-jump-target');\n const top = $target.offset().top;\n // Works with Firefox.\n return top - windowTop < 20;\n });\n $stickyToc.text($(active.last()).text());\n }\n }\n });\n // Back to top button\n $(\".stickyTOC-top\").on('click',function(e) {\n e.preventDefault();\n try {\n $(\"html, body\").stop(true,true).animate({scrollTop:0}, '750');\n }\n catch(e) {\n $('body').scrollTop(0);\n }\n // Bring keyboard focus back to top as well.\n $(\"#main-content\").focus();\n return false;\n });\n\n function menuToggle() {\n $('.ma__sticky-toc__stuck-menu').toggleClass('sticky-nav-open');\n $('.ma__sticky-toc__overlay').toggle();\n $('.ma__floating-action').toggle();\n }\n\n $tocToggle.on('click', function() {\n // Append sticky menu when first called\n if ($('.ma__sticky-toc__stuck-menu').length == 0) {\n $tocColumn.clone(true).addClass('ma__sticky-toc__stuck-menu').appendTo('#main-content');\n\n // wait a beat so the slide in can work on first click\n setTimeout(function(){\n menuToggle();\n }, 100);\n }\n else {\n menuToggle();\n }\n\n });\n\n // Close button\n $('.secondary-label-close').on('click', function() {\n menuToggle();\n });\n\n // Close sticky menu on click off, include tools buttons\n $('body').on('click', function(event) {\n if(!$(event.target).closest('.ma__sticky-toc__stuck-menu').length && !$(event.target).closest('.ma__sticky-toc__tools').length) {\n console.log(\"click\");\n if($('.ma__sticky-toc__stuck-menu').hasClass('sticky-nav-open')) {\n menuToggle();\n }\n }\n });\n\n // close menu when link clicked\n $('body').on('click', '.ma__sticky-toc__stuck-menu a', function() {\n menuToggle();\n });\n });\n}\n(window,document,jQuery);\n","export default function (window, document, $, undefined) {\n\n let $toggle, $root, $sections;\n let hiddenClass = 'is-initially-hidden';\n\n function bindVars () {\n $root = $('.js-teaser-listing-group');\n $toggle = $root.find('.js-teaser-listing-group-toggle');\n $sections = $root.find('.ma__teaser-listing');\n }\n\n function markForAccordion () {\n let totalShown = $root.data('totalVisible');\n let teaserItems = $root.find('.ma__general-teaser');\n\n // Hide the toggle if the number of items is less than or equal to the number shown.\n if (teaserItems.length <= totalShown) {\n $toggle.hide();\n }\n\n // set excess items to be hidden\n teaserItems.slice(totalShown, teaserItems.length).each((i, el) => {\n // Items can be siblings or within an
  • , add class to the
  • if present\n if ($(el).parent().prop('tagName') === \"LI\") {\n $(el).parent().addClass(hiddenClass);\n } else {\n $(el).addClass(hiddenClass);\n }\n });\n\n $sections.each( (i, el) => {\n let $section = $(el);\n let totalTeaserItems = $section.find('.ma__general-teaser');\n let hiddenItems = $section.find('.'+hiddenClass);\n // If the total number of teasers and total number of hidden things are the same, hide the whole section.\n if (totalTeaserItems.length === hiddenItems.length) {\n $section.addClass(hiddenClass);\n }\n });\n\n\n }\n\n function handleToggle () {\n $toggle.click(() => {\n $root.toggleClass('is-open');\n });\n }\n\n\n\n $(document).ready( () => {\n bindVars();\n markForAccordion();\n handleToggle();\n });\n\n} (window, document, jQuery);\n","export default function (window,document,$,undefined) {\n\n $('.ma__featured-item .ma__featured-item__title span').each(function() {\n const $this = $(this);\n const $thisParent = $this.parent();\n const $thisWrapper = $thisParent.closest('.ma__featured-item');\n let thisTitle = $this.text();\n\n // Links are truncated to 60 characters\n // The wrappers only accommodate 50 with ellipses and the icon\n if (thisTitle.length > 50) {\n // Add a class for styling.\n $thisParent.addClass('truncated');\n // Add the full title to the aria label to keep value\n $thisWrapper.attr('aria-label', thisTitle);\n\n // Truncate title at last full word before 50th character\n var truncatedTitle = thisTitle.substring(0, 50);\n truncatedTitle = truncatedTitle.substr(0, Math.min(truncatedTitle.length, truncatedTitle.lastIndexOf(\" \")));\n thisTitle = truncatedTitle;\n }\n $this.text(thisTitle);\n });\n\n}(window,document,jQuery);\n","export default function (window,document,$,undefined) {\r\n\r\n $('.js-util-nav').each(function() {\r\n let openClass = \"is-open\",\r\n closeClass = \"is-closed\",\r\n submenuClass = \"show-utilmenu\",\r\n $parent = $(this),\r\n waitForIt = null;\r\n\r\n $('.js-close-sub-nav').on('click', function(){\r\n let $openContent = $parent.find('.js-util-nav-content.' + openClass);\r\n hide($openContent);\r\n });\r\n\r\n $parent.find('.js-util-nav-toggle > a').on('click', function(e) {\r\n e.preventdefault;\r\n\r\n let open = $(this).hasClass(openClass),\r\n $content = $(this).next('.js-util-nav-content'),\r\n $openContent = $parent.find('.js-util-nav-content.' + openClass);\r\n\r\n // hide other content\r\n hide($openContent);\r\n\r\n if(open) {\r\n return;\r\n }\r\n // add open class to this item\r\n $(this).addClass(openClass);\r\n // add open class to the correct content based on index\r\n $content.attr(\"aria-hidden\",\"false\");\r\n\r\n setTimeout(function(){\r\n $content\r\n .removeClass(closeClass)\r\n .addClass(openClass);\r\n $('body').addClass(submenuClass)\r\n }, .1);\r\n });\r\n\r\n $parent.find('.js-close-util-nav').on('click', function(e){\r\n e.preventDefault;\r\n\r\n hide( $(this).closest('.js-util-nav-content') );\r\n });\r\n\r\n $('.js-header-menu-button, .js-close-sub-nav').on('click', function(){\r\n let $openContent = $parent.find('.js-util-nav-content.' + openClass);\r\n hide($openContent);\r\n });\r\n\r\n function hide($content) {\r\n $('body').removeClass(submenuClass)\r\n $parent.find(\".\" + openClass).removeClass(openClass);\r\n $content\r\n .removeClass(openClass)\r\n .addClass(closeClass);\r\n\r\n if(waitForIt) {\r\n clearTimeout(waitForIt);\r\n }\r\n waitForIt = setTimeout(function(){\r\n $content.attr(\"aria-hidden\",\"true\");\r\n }, 1000);\r\n }\r\n\r\n });\r\n\r\n}(window,document,jQuery);\r\n"]}