{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./js/trip-planner-location-controls.js","webpack:///./js/algolia-embedded-search-options.js","webpack:///./js/algolia-embedded-search.js","webpack:///./ts/helpers/query.ts","webpack:///./js/cookies.js","webpack:////root/deps/phoenix/priv/static/phoenix.js","webpack:///./js/alert-item.js","webpack:///./js/algolia-result.js","webpack:///./js/cr-timetable-train-icons.js","webpack:///./js/cr-timetable-tooltips.js","webpack:///./js/google-maps-helpers.js","webpack:///./js/google-maps-loaded.js","webpack:///./ts/helpers/keyboard-events.ts","webpack:///./js/google-analytics.js","webpack:///./js/submit-on-events.js","webpack:///./js/select-modal.js","webpack:///./js/collapse.js","webpack:///./js/header-dropdowns.js","webpack:///./js/modal.js","webpack:///./js/turbolinks-mods.js","webpack:///./js/support-form.js","webpack:///./js/fixedsticky.js","webpack:///./js/menu-ctrl-click.js","webpack:///./js/carousel.js","webpack:///./js/geolocation.js","webpack:///./js/address-search.js","webpack:///./js/autocomplete-setup.js","webpack:///./js/google-translate.js","webpack:///./js/scroll-to.js","webpack:///./js/sticky-tooltip.js","webpack:///./js/timetable-scroll.js","webpack:///./js/timetable-style.js","webpack:///./js/timetable-stick.js","webpack:///./js/menu-close.js","webpack:///./js/algolia-search.js","webpack:///./js/date-picker.js","webpack:///./js/toggle-on-click.js","webpack:///./js/time-controls/time-controls.js","webpack:///./js/datepicker-input.js","webpack:///./js/stop-bubbles.js","webpack:///./js/search.js","webpack:///./js/photo-gallery.js","webpack:///./js/algolia-homepage-search.js","webpack:///./js/algolia-global-search.js","webpack:///./js/algolia-search-with-geo.js","webpack:///./js/algolia-results.js","webpack:///./js/fullstory.js","webpack:///./js/input-focus.js","webpack:///./js/channels.js","webpack:///./js/cr-timetable-trains.js","webpack:///./ts/app/dismiss-fullscreen-error.ts","webpack:///./js/trip-planner-widget.js","webpack:///./js/event-page-setup.js","webpack:///./js/view-previous-events.js","webpack:///./js/facet-item.js","webpack:///./js/facet-group.js","webpack:///./js/facet-bar.js","webpack:///./js/facet-location-group.js","webpack:///./js/algolia-facets.js","webpack:///./js/algolia-autocomplete-with-geo.js","webpack:///./js/geolocation-promise.js","webpack:///./js/app.js","webpack:///./js/algolia-autocomplete.js","webpack:///./vendor/fixedsticky.js","webpack:///./vendor/accessible-date-picker.js","webpack:///./ts/helpers/debounce.ts","webpack:///./js/icons.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","2","exports","module","l","e","Promise","resolve","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","oe","err","console","error","jsonpArray","window","oldJsonpFunction","slice","init","document","addEventListener","doWhenGoogleMapsIsReady","TripPlannerLocControls","containerEl","this","containerElement","toInput","getById","SELECTORS","to","input","fromInput","from","toLat","lat","toLng","lng","fromLat","fromLng","controller","markers","ac","errorContainer","getElementById","_selectors","locationError","innerHTML","id","querySelector","toController","Algolia","INDICES","PARAMS","fromController","toAutocomplete","AlgoliaAutocompleteWithGeo","selectors","indices","keys","locationParams","position","hitLimit","popular","POPULAR","parent","fromAutocomplete","autocompletes","forEach","renderFooterTemplate","setError","onHitSelected","_resetButton","removeMarker","showLocation","useMyLocation","addWidget","reverseTrip","setupFormValidation","swapMarkers","resetResetButtons","onSubmit","onInvalidAddress","onAutocompleteShown","onInputReset","onInputChange","on","ev","missingFrom","missingTo","preventDefault","toggleError","srcElement","autocomplete","errorType","required","container","classList","add","remove","setAttribute","Error","updateErrorContent","title","detail","latitude","longitude","label","_input","getAttribute","event","Event","dispatchEvent","resetResetButton","fromVal","getValue","toVal","updateMarker","address","originalEvent","_args","hit","type","setAutocompleteValue","stop","_geoloc","GoogleMapsHelpers","place_id","then","res","resetSessionToken","description","blur","useMyLocationSearch","latEl","lngEl","setValue","indexName","AlgoliaResult","poweredByGoogleLogo","render","logo","fromAc","toAc","fromError","toError","stops","query","resetButton","locationLoadingIndicator","announcer","map","hitsPerPage","facets","facetFilters","icon","features","url","PAGE_IDS","PAGE_IDS_WITHOUT_GOOGLE","FACET_MAP","FACET_FILTER_MAP","buildOptions","pageId","goBtn","params","index","isStopSearch","isProjectsSearch","determineIndex","AlgoliaEmbeddedSearch","withGoogle","onClickGoBtn","AlgoliaAutocomplete","addEventListeners","removeEventListener","QueryHelpers","showmore","indexNames","encodeURIComponent","Turbolinks","visit","buildSearchParams","join","initWithoutGoogle","paramsToString","encoder","parseQuery","decoder","substring","split","reduce","kvString","val","replace","queryReducer","getCookie","getCookieFromString","cookie","cookies","cookieArray","trim","Phoenix","Function","eval","iterator","constructor","TypeError","a","configurable","writable","b","R","w","C","S","u","self","h","f","v","y","g","k","channel","payload","receivedResp","timeout","timeoutTimer","recHooks","sent","reset","send","hasReceived","startTimeout","socket","topic","ref","join_ref","joinRef","response","status","callback","cancelRefEvent","refEvent","filter","off","clearTimeout","cancelTimeout","makeRef","replyEventName","matchReceive","setTimeout","trigger","state","bindings","bindingRef","joinedOnce","joinPush","pushBuffer","rejoinTimer","T","rejoinUntilConnected","reconnectAfterMs","receive","onClose","hasLogger","log","concat","onError","isLeaving","isClosed","scheduleTimeout","isJoining","isConnected","rejoin","arguments","isJoined","canPush","indexOf","isLifecycleEvent","resend","sendJoin","onMessage","JSON","stringify","Array","isArray","next","done","parse","stateChangeCallbacks","open","close","message","channels","sendBuffer","transport","WebSocket","defaultEncoder","defaultDecoder","encode","decode","heartbeatIntervalMs","logger","longpollerTimeout","endPoint","heartbeatTimer","pendingHeartbeatRef","reconnectTimer","teardown","connect","location","protocol","match","appendParams","vsn","charAt","host","conn","endPointURL","onopen","onConnOpen","onerror","onConnError","onmessage","onConnMessage","onclose","onConnClose","flushSendBuffer","resetHeartbeat","skipHeartbeat","clearInterval","setInterval","sendHeartbeat","triggerChanError","code","readyState","connectionState","toString","isMember","token","pollEndpoint","normalizeEndpoint","poll","RegExp","closeAndRetry","request","endpointURL","ontimeout","messages","XDomainRequest","xdomainRequest","XMLHttpRequest","ActiveXObject","xhrRequest","onload","parseJSON","responseText","onprogress","setRequestHeader","onreadystatechange","states","complete","serialize","events","diff","pendingDiffs","caller","onJoin","onLeave","onSync","syncState","syncDiff","inPendingSyncState","list","clone","metas","phx_ref","joins","leaves","unshift","getOwnPropertyNames","timerCalc","timer","tries","define","addAlertItemEventHandlers","passive","querySelectorAll","alertItem","handleAlertItemClick","handleAlertItemKeyPress","removeAlertItemEventHandlers","isEnter","keyCode","target","tagName","doHandleAlertItemClick","getParentsUntil","el","batchDomMutations","opened","toggleOpenClass","toggleAriaAttribute","selector","contains","parentNode","TEMPLATES","hogan","compile","fontAwesomeIcon","formattedDate","locations","usemylocation","projects","default","iconsFromGTFSAncestries","ancestries","anc","toLowerCase","Icons","_subwayRouteIcon","routeId","includes","Green","Red","Orange","Blue","Mattapan","iconFromGTFSId","toSubway","iconFromGTFS","ancestry","icons","iconsFromGTFSIds","Set","iconsFromGTFSAncestry","_contentIcon","search_api_datasource","_file_type","_fileIcon","search_result","news_entry","project","project_update","page","landing_page","person","_content_type","getIcon","_getStopOrStationIcon","route","_iconFromRoute","getPopularIcon","related_transit_gtfs_id","related_transit_gtfs_ancestry","getTransitIcons","getUrl","_file_uri","_search_result_url","_content_url","_contentUrl","getTitle","orig","matched_substrings","offset","_highlightResult","long_name","getRouteTitle","search_result_title","file_name_raw","content_title","_contentTitle","_getAlertIcon","routesWithAlertsDiv","stopsWithAlertsDiv","hasAlert","dataset","stopsWithAlerts","routesWithAlerts","_featuresToIcons","feature","_standardizeFeatureName","_stopIcons","filteredFeatures","allIcons","featuresWithoutBranches","branches","greenLinePosition","findIndex","_sortFeatures","zoneIcon","zone","_getCommuterRailZone","_formatDate","date","toLocaleDateString","year","month","day","getFeatureIcons","alertFeature","_content_posted_on","Date","projectsDate","undefined","_file_created","pagesdocumentsDate","dateString","dateStringWithTime","_contentDate","parseResult","assign","hitIcon","hitUrl","hitTitle","hasDate","hitFeatureIcons","renderResult","removeTrain","getElementsByClassName","removeTooltip","CRTimetableTrainIcons","props","priorStops","schedules","vehicleStruct","vehicle","stopName","stop_name","tooltip_text","marker","vehicleContainerId","vehicleContainer","addTrain","text","addOrUpdateTooltip","trip_id","stopSequence","stop_sequence","vehicleTooltip","containerId","vehicleTooltipId","currentTooltip","stopTooltip","tooltipVisible","tooltip","parentId","tooltipId","removeAttribute","sessionToken","reject","tokenObj","getJSON","Pf","processAutocompleteResults","fail","lookupPlace","placeId","processPlacesCallback","reverseGeocode","processGeocodeCallback","predictions","predictionResults","hits","nbHits","results","parsedResults","formatted","callbacks","isMapReady","mapsCallback","isEscape","handleNativeEnterKeyPress","cb","handleNativeEscapeKeyPress","handleReactEnterKeyPress","onClick","handleReactExitKeyPress","track","dataLayer","$","onEvent","siblings","find","removeClass","form","parents","action","attr","serialized","pathname","replacedHash","mergeAction","addClass","appendTo","openModal","stopPropagation","selectName","currentTarget","$select","selectData","$el","children","_index","option","$option","html","selected","disabled","keyOption","suffix","dataFromOption","dataFromSelect","options","search","optionsFromSelect","$modal","modalId","$existing","$div","append","$newModal","placeholder","item","firstEnabledName","renderSearch","renderOption","Sifter","renderModal","modal","keyboard","show","openRemoteModal","searchChanged","$target","sifter","newData","fields","items","sort","first","second","filterData","searchSubmitted","click","optionSelected","$parent","change","modalShown","exec","navigator","userAgent","focus","modalHidden","convertSelects","requestAnimationFrame","each","style","display","$cover","css","width","outerWidth","height","outerHeight","background","cursor","before","removeAttr","$replacementText","selectedIndex","$replacement","hide","after","className","nextTick","handler","extraClass","collapseEvent","collapse","toggle","addCarets","child","doAddCarets","caret","createElement","appendChild","addCaret","initCarets","samePathWithQueryString","samePath","path","suffix_char","withAnchor","urlString","getCurrentUrl","focusAndExpand","nodeName","hash","turbolinks","doc","lastScrollPosition","scrollBehavior","redirectTimeout","navigationEventType","currentUrl","href","scrollX","scrollY","activeElement","scroll","documentElement","scrollTo","refreshHeader","xhr","getResponseHeader","refreshUrl","refreshDelay","handleModeChangeSelection","modeOptionsEl","modeOptions","vehicleLabels","bus","commuter_rail","subway","ferry","empty","routeSelect","selectedOptions","innerText","opts","element","opt","clearFallbacks","$photoLink","$photoInput","setupPhotoPreviews","toUpload","$container","files","resizeAndHandleUploadedFile","setupTextArea","setupRequestResponse","setupSubject","setupValidation","handleSubmitClick","handleSubjectChange","file","test","resizeImage","newFile","hideOrShowPreviews","preview","PhotoPreview","addClickHandler","div","handleUploadedPhoto","displayError","fr","FileReader","abort","DOMException","img","Image","dim","ratio","rescale","canvas","getContext","drawImage","msToBlob","toBlob","blob","src","readAsDataURL","require","reader","onloadend","commentsNode","formTextNode","node","nextElementSibling","findSiblingWithClass","commentLength","support_service_opts","selectedCategory","nextAll","is","validators","comments","support_subject","service","first_name","responseRequested","last_name","email","privacy","prop","recaptcha","checked","displaySuccess","rootSelector","reactivateSubmitButton","FormData","valid","subject","errors","focusError","validateForm","deactivateSubmitButton","formData","Filter","serializeArray","clean","encodedSubjectValue","set","decodeURIComponent","photo","ajax","method","processData","contentType","success","fixedsticky","clickHandler","ctrlKey","metaKey","setupCarousel","carousel","activateCarouselItem","$item","delegateTarget","beforeVisit","$btn","geolocationTarget","locationButton","$errorEl","$indicator","toggleLoadingIndicator","geolocation","getCurrentPosition","locationHandler","TIMEOUT","POSITION_UNAVAILABLE","PERMISSION_DENIED","addLocationChangedEventListener","google","maps","addListener","locationUrl","place","query_str","loc","location_url","addr","geometry","constructUrl","getPlace","encodeURI","addLocationChangeCallback","geolocationCallback","qs","coords","transitNearMeInput","sParam","search_string","sParameterName","sURLVariables","getUrlParameter","reload","validateLocationForm","setupAutocomplete","$elements","strictBounds","bounds","LatLngBounds","LatLng","idx","places","Autocomplete","$latInput","$lngInput","onPlaceChanged","placeChangedCallback","addLatLngListeners","domMutateCallback","currentLanguage","languages","handleTranslation","getTranslateElement","translateEl","registerEvents","_err","pollDomForGoogleTranslateEl","delay","getSelectedTranslation","updatedLanguage","renderCustomDesktopSelect","renderCustomDesktopMenu","renderCustomMobileSelect","renderCustomMobileMenu","triggerClick","registerLinkEvents","toUpperCase","linkEl","language","bubbles","cancelable","createEvent","initEvent","setTranslation","which","initialElToScrollTo","doScrollTo","scrollLeft","offsetLeft","firstSibling","clientWidth","table","sibling","firstChild","nodeType","wasTouchedRecently","lastTouch","timeStamp","hideTooltip","touchStart","touchEnd","$this","Math","abs","pageX","pageY","animating","direction","animate","duration","step","scrollCallback","adjustTimetableStyle","resizeRows","timetableContainerEl","borderTop","headerEl","toggleScrollButtons","resizeRow","rowEl","offsetHeight","cell","maxScrollLeft","scrollWidth","leftBtnEl","rightBtnEl","trainLabelRow","trainLabels","tableEl","tableBodyEl","stickyHeaderEl","removedLabels","isStuck","sideScrollStickyHeader","setUp","getBoundingClientRect","tableTop","top","tableBottom","bottom","body","tableRight","right","tableWidth","labelEl","getComputedStyle","fontSize","stickyLabelEl","cloneNode","minWidth","maxWidth","showStickyLabels","removeChild","stickyLabels","childNodes","trainLabel","resizeStickyHeader","checkMenuCollapse","canBeSimulated","isSimulated","queries","defaultParams","_queries","_activeQueryIds","_defaultParams","_viewMoreInc","_lastQuery","_doBlankSearch","_widgets","resetDefaultParams","resetWidgets","queryId","group","allQueries","_buildAllQueries","_doSearch","updateWidgets","_sendQueries","_processAlgoliaResults","analyticsData","queryID","objectID","requests","dataType","requestedQueryIds","_buildQuery","_buildFacetQuery","currentQuery","clickAnalytics","queryIds","filters","widget","searchedQueries","facetLength","searchResults","facetResults","_addAnalyticsData","hasError","firstLoad","slideUp","slideDown","toggleDatePicker","expand","hasAttribute","datePickerEl","route_id","TimeControls","dateEl","resetPlanType","DatePicker","DatePickerInput","onUpdateCallback","updateControlTitleCallback","timeInput","controlSetup","datetime","amPm","hour","getHours","minute","getMinutes","depart","updateControlTitle","arrive","updateTime","getStateFromQuery","formatQueryPlanType","time","hour12","parseInt","timeLabel","timeEl","ariaMessage","setHours","setMinutes","friendlyTime","getFriendlyTime","getPlanType","controlTitle","formDataEl","matchMedia","matches","getMonth","getDate","getFullYear","substr","dateInput","dateLabel","actualMonth","minAllowedDate","maxAllowedDate","getShortDate","updateDateFormatToShort","updateDateFormatToLong","datepicker","outputFormat","getDateFormatbyMediaQuery","onUpdate","updateDate","min","max","gainFocusOnConstruction","setDatePickerFormat","format","datepickerDate","updateDateSelects","updateSelect","select","currentOpt","newOpt","stopBubbles","targetId","clickedLink","toggleClass","link","branch","toggleBranch","breakpoints","eq","submit","md","$header","$listContainer","hasClass","setupFilterToggleOnMobile","galleries","photoGallery","$galleryEl","galleryId","images","output","_offset","guid","makeGallery","initializeData","handlePageLoad","handleClickImage","handleClickNavigation","figures","imageOffset","pageOffset","lastPage","calculateLastPage","photoCount","ceil","setGalleryImageOffset","lastOffset","image","activeImage","activeImageName","firstImage","replaceActiveImage","imageByOffset","getGalleryImageByOffset","increment","focusEl","isVisible","setGalleryPageOffset","getTime","floor","random","focusId","main","_el","pop","mainImage","mainCaption","totalImages","lastImage","pagination","imgSource","attributes","nodeValue","imgAlt","alt","markUp","firstImg","renderImages","renderNavigation","routes","pages","LOCATION_PARAMS","doInit","AlgoliaGlobalSearch","_facetsWidget","_bind","_showMoreList","_queryParams","onKeyup","onFocusInput","AlgoliaWithGeo","INITIAL_QUERIES","DEFAULT_PARAMS","LATLNGBOUNDS","AlgoliaFacets","_resultsWidget","AlgoliaResults","resultsContainer","loadState","inputField","showMoreState","addPage","facetState","enableLocationSearch","_toggleResetButton","updateHistory","setSessionToken","selectedFacetNames","history","replaceState","documents","news","facetsContainer","closeModalButton","showFacetsButton","west","north","east","south","_locationEnabled","_hitLimit","algoliaResults","googleResults","all","resultsList","acc","enabled","AutocompleteSessionToken","contentResults","_parent","_groups","_container","_googleLogo","onClickShowMore","onClickResult","addResultClickHandler","_showLocation","elem","_locationSearch","useLocation","_useMyLocation","pos","_locationSearchByGeo","groupName","post","onClickResultCallback","getParams","parseFloat","_renderGroup","_addShowMoreListener","_addLocationListeners","indexTitles","isLocation","hasHits","showMore","googleLogo","groupData","fullstory","mbtaIdCookie","Cookies","getUniqueId","q","_api","async","crossOrigin","_fs_script","getElementsByTagName","insertBefore","identify","uid","setUserVars","anonymize","shutdown","restart","consent","identifyAccount","acctId","clearUserCookie","_w","_v","initChannel","channelId","onData","reason","direction_id","leave","Socket","initAll","CRTimetableTrains","dataEl","getData","schedulesInfo","textContent","stopMap","onVehicles","onRemoveVehicles","addOrUpdateTrain","removeEventListeners","sched","dataEls","hideAlert","dismissEl","widgets","addInternetExplorerPolyfills","Element","toggleAttribute","force","stickyfilljs","elements","composedPath","viewPreviousEventsLink","documentMode","dateSelects","eventsListing","control","prevScroll","scrollTop","prevDirection","monthHeaders","stickyStyleTop","curScroll","controlHeight","sections","section","MakeCollapsedHeadersSticky","capture","activeMonthElement","scrollIntoView","setupEventsListing","eventPopups","dialog","A11yDialog","hideDialogLogicListener","eventClicked","x","eventIdClicked","a11yDialogShow","_id","setupEventPopups","button","parentElement","FacetItem","_name","_iconHTML","_facets","_prefix","prefix","_count","facet","addToMap","_checkbox","_counter","_textDisplay","_childrenDiv","_icon","_children","_triangleRightIcon","textDisplay","checkbox","counter","childrenDiv","checkboxLabel","expansionContainer","checkboxControlContainer","tabToExpand","facetItem","getActiveFacets","isChecked","_checkboxLabel","setupListeners","check","uncheck","updateCount","uncheckUI","update","updateState","allChildrenStatus","every","count","sumChildren","total","num","itemStyle","templates","class","iconClass","gatherElements","toggleCheck","toggleExpansion","setupAllListeners","loadFacet","FacetGroup","facetData","_facetMap","_item","shouldDisableQuery","updateFacetFilters","getFacetsForQuery","addActiveQuery","facetGroupClasses","FacetLocationGroup","FacetBar","_search","_items","_facetPrefixes","_parseFacets","updateCounts","facetName","groupClass","cls","_resetQueries","updateActiveQueries","modifySearch","_selectedFacetsReducer","values","_closeModalBtn","_showFacetsBtn","_facetsContainer","_faIcon","_facetBar","onClickCloseModalBtn","onClickShowFacetsBtn","startsWith","addFilterParam","debounceInterval","_popular","_loadingIndicator","addUseMyLocationErrorEl","_locationParams","DEFAULT_LOCATION_PARAMS","_indices","onFocus","useMyLocationErrorEl","debounce","_locationSource","_useMyLocationSource","_popularSource","_onResults","_doLocationSearch","visibility","onUseMyLocationResults","onGeolocationError","_onLocationSearchResult","onReverseGeocodeResults","toStr","isCallable","maxSafeInteger","toLength","start","webkitRequestAnimationFrame","mozRequestAnimationFrame","previousSibling","nextSibling","A","O","len","kValue","mappedValue","fn","pow","number","Number","isNaN","isFinite","toInteger","arrayLike","mapFn","predicate","thisArg","CharacterData","SVGElement","msMatchesSelector","webkitMatchesSelector","closest","submitOnEvents","googleAnalytics","googleMapsLoaded","selectModal","headerDropdowns","alertItemLoad","turbolinksMods","supportForm","objectFitImages","menuCtrlClick","inputFocus","geoLocation","addressSearch","autocompleteSetup","googleTranslate","timetableScroll","timetableStyle","timetableStick","menuClose","datePicker","toggleBtn","xs","sm","lg","xxl","stickyTooltip","globalSearch","homepageSearch","embeddedSearchInit","TripPlannerLocationControls","CRTrains","dismissFullscreenError","tripPlannerWidget","eventPageSetup","previousEventsButton","_resultsContainer","_searchContainer","_datasets","_results","_highlightedHit","_autocomplete","onClickSuggestion","onCursorChanged","onCursorRemoved","onOpen","clear","_client","client","_addResultsContainer","_buildDataset","debug","autoselectOnBlur","openOnFocus","hint","minLength","cssClasses","root","_addErrorMsg","_addListeners","getVal","dropdown","errorMsg","acDialog","positionDropdown","announceResults","borderWidth","offsetTop","offsetWidth","marginLeft","marginTop","clickFirstResult","firstIndex","onHitSelectedCallback","source","_datasetSource","displayKey","DISPLAY_KEYS","maxLength","suggestion","footer","setVal","win","featureTest","noPrefixes","mStyle","cssText","getPx","unit","uniqueIdCounter","classes","plugin","active","inactive","withoutFixedFixed","tests","sticky","fixed","getScrollTop","bypass","optOut","FixedFixed","skipSettingToFixed","elTop","elBottom","initialOffset","isAlreadyOn","turnOn","viewportHeight","parentOffset","parentHeight","destroy","unbind","removeData","_this","FixedSticky","jQuery","dp_locales","datepickerButton","datepickerCalendar","Datepicker","extend","DEFAULTS","locales","startView","inputFormat","parseDate","calendar","wrap","$label","$group","$button","theme","$calendar","inline","hideObject","left","initializeDate","buttonLabel","buttonTitle","$monthObj","$prev","$next","$fastprev","$fastnext","$grid","directionality","drawCalendarHeader","$close","closeButtonTitle","closeButtonLabel","tab","enter","esc","space","pageup","pagedown","end","home","up","down","bindHandlers","selectGridCell","keydown","VERSION","firstDayOfWeek","firstday_of_week","weekDayFormat","daysOfWeekDisabled","short_format","titleFormat","full_format","texts","prevButtonLabel","prevMonthButtonLabel","prevYearButtonLabel","nextButtonLabel","nextMonthButtonLabel","nextYearButtonLabel","changeMonthButtonLabel","changeYearButtonLabel","changeRangeButtonLabel","setDate","newDate","dateObj","curYear","curMonth","populateMonthsCalendar","populateYearsCalendar","populateDaysCalendar","$days","weekday","day_names","day_names_short","day_names_narrow","previousMonth","nextMonth","showObject","numDays","getDaysInMonth","numPrevDays","startWeekday","getDay","lastDayOfWeek","curDay","rowCount","month_names","gridCells","numEmpties","longdate","formatDate","curDayClass","inArray","$tbody","gridType","month_names_abbreviated","startYear","endYear","curPos","showDaysOfPrevMonth","showDaysOfMonth","$active","showMonthsOfPrevYear","showMonthsOfYear","showYearsOfPrevRange","showDaysOfNextMonth","showMonthsOfNextYear","showYearsOfNextRange","showDaysOfPrevYear","showDaysOfNextYear","handleFastPrevClick","handlePrevClick","handleNextClick","handleFastNextClick","handleMonthClick","handleMonthKeyDown","handleFastPrevKeyDown","handlePrevKeyDown","handleNextKeyDown","handleFastNextKeyDown","handleCloseClick","handleCloseKeyDown","handleGridKeyDown","keypress","handleGridKeyPress","handleGridFocus","handleGridBlur","delegate","handleGridClick","changeGrid","altKey","shiftKey","$curCell","$cells","colCount","handleTabOut","$prevCell","cellIndex","unSelectGridCell","$nextCell","ok","stopImmediatePropagation","$lastCell","$firstCell","$cell","cellId","$curDay","$element","greyOut","zIndex","proxy","handleDocumentClick","groupOffsetTop","groupOffsetLeft","parentPaddingLeft","calendarHeight","groupTop","groupHeight","roomBefore","roomAfter","fadeIn","refresh","omitSettingFocus","fadeOut","$overlay","zmax","cur","absolutePosition","box","docElem","pageYOffset","pageXOffset","clientTop","clientLeft","round","offsetParent","zeroPad","getMillisecondsInDay","date1","M","D","getDayOfYear","E","H","getSeconds","onejan","getWeekOfYear","W","getWeekOfMonth","F","Q","era","month_names_narrow","day_names_abbreviated","era_names_abbreviated","era_names","era_names_narrow","quarter_names_abbreviated","quarter_names","quarter_names_narrow","day_periods","pm","am","mask","createDateFromFormat","extractInteger","str","minlength","maxlength","integer","skipName","names","now","getYear","hh","mm","ss","ampm","month_name","amlength","pmlength","setLocales","calendarHelp","old","Constructor","noConflict","getFeatureIcon"],"mappings":"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mBACnB,qBAAwB,sBACxB,oBAAuB,8BACvB,uBAA0B,mEAC1B,sBAAyB,kEACzB,uBAA0B,8EAC1B,iBAAoB,QACpB,iBAAoB,qBACpB,aAAgB,g4BAEpB,eAAkB,MAClB,YAAe,CACX,UACA,WACA,QACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,YAEJ,wBAA2B,CACvB,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEJ,mBAAsB,CAClB,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEJ,UAAa,CACT,SACA,SACA,UACA,YACA,WACA,SACA,YAEJ,sBAAyB,CACrB,MACA,MACA,MACA,MACA,MACA,MACA,OAEJ,gBAAmB,CACf,KACA,KACA,KACA,KACA,KACA,KACA,MAEJ,iBAAoB,CAChB,IACA,IACA,IACA,IACA,IACA,IACA,KAEJ,YAAe,CACX,GAAM,KACN,KAAQ,OACR,GAAM,MAEV,wBAA2B,CACvB,GAAM,KACN,KAAQ,OACR,GAAM,MAEV,mBAAsB,CAClB,GAAM,IACN,KAAQ,IACR,GAAM,KAEV,cAAiB,CACb,cACA,cACA,cACA,eAEJ,0BAA6B,CACzB,KACA,KACA,KACA,MAEJ,qBAAwB,CACpB,IACA,IACA,IACA,KAEJ,UAAa,CACT,gBACA,eAEJ,sBAAyB,CACrB,KACA,MAEJ,iBAAoB,CAChB,IACA,KAEJ,YAAe,kBACf,YAAe,YACf,cAAiB,WACjB,aAAgB,SAChB,iBAAoB,GAGxB,IAAIC,EAAmB,CACtB,wJACA,uCACA,QAEGC,EAAqB,CACxB,4FACA,wCACA,uMACA,oMACA,uMACA,kMACA,mOACA,WACA,sLACA,kCACA,oDACA,yJACA,yJACA,2JACA,+JACA,6JACA,yJACA,6JACA,cACA,eACA,kCACA,aACA,6FACA,cACA,eACA,aACA,wCACA,8IACA,WACA,qKACA,wHACA,oHACA,iIACA,6HACA,2HACA,UAGGC,EAAa,SAAbA,EAAuBlqC,EAAQ2N,GAClC,IAAI9Y,EAAOhM,KAIX,OAHAA,KAAK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","file":"./app-8db66c481f37535c4b6ebb670da02afd.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({}[chunkId]||chunkId) + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// The chunk loading function for additional chunks\n \t// Since all referenced chunks are already included\n \t// in this file, this function is empty here.\n \t__webpack_require__.e = function requireEnsure() {\n \t\treturn Promise.resolve();\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([304,0]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import { doWhenGoogleMapsIsReady } from \"./google-maps-loaded\";\nimport * as GoogleMapsHelpers from \"./google-maps-helpers\";\nimport Algolia from \"./algolia-search\";\nimport * as AlgoliaResult from \"./algolia-result\";\nimport AlgoliaAutocompleteWithGeo from \"./algolia-autocomplete-with-geo\";\n\nexport function init() {\n  document.addEventListener(\"turbolinks:load\", () => {\n    doWhenGoogleMapsIsReady(() => {\n      new TripPlannerLocControls();\n    });\n  });\n}\n\nexport class TripPlannerLocControls {\n  constructor({ containerEl } = {}) {\n    this.containerElement = containerEl;\n    this.toInput = this.getById(TripPlannerLocControls.SELECTORS.to.input);\n    this.fromInput = this.getById(TripPlannerLocControls.SELECTORS.from.input);\n    this.toLat = this.getById(TripPlannerLocControls.SELECTORS.to.lat);\n    this.toLng = this.getById(TripPlannerLocControls.SELECTORS.to.lng);\n    this.fromLat = this.getById(TripPlannerLocControls.SELECTORS.from.lat);\n    this.fromLng = this.getById(TripPlannerLocControls.SELECTORS.from.lng);\n    this.controller = null;\n\n    this.markers = {\n      from: null,\n      to: null\n    };\n\n    this.bind();\n    if (this.toInput && this.fromInput) {\n      this.init();\n    }\n  }\n\n  getById(id) {\n    return this.containerElement\n      ? this.containerElement.querySelector(`#${id}`)\n      : document.getElementById(id);\n  }\n\n  init() {\n    this.toController = new Algolia(\n      TripPlannerLocControls.INDICES.to,\n      TripPlannerLocControls.PARAMS\n    );\n    this.fromController = new Algolia(\n      TripPlannerLocControls.INDICES.from,\n      TripPlannerLocControls.PARAMS\n    );\n    this.toAutocomplete = new AlgoliaAutocompleteWithGeo({\n      id: \"trip-planner__autocomplete--to\",\n      selectors: TripPlannerLocControls.SELECTORS.to,\n      indices: Object.keys(TripPlannerLocControls.INDICES.to),\n      locationParams: { position: 1, hitLimit: 3 },\n      popular: TripPlannerLocControls.POPULAR,\n      parent: this,\n      containerEl: this.containerElement\n    });\n\n    this.fromAutocomplete = new AlgoliaAutocompleteWithGeo({\n      id: \"trip-planner__autocomplete--from\",\n      selectors: TripPlannerLocControls.SELECTORS.from,\n      indices: Object.keys(TripPlannerLocControls.INDICES.from),\n      locationParams: { position: 1, hitLimit: 3 },\n      popular: TripPlannerLocControls.POPULAR,\n      parent: this,\n      containerEl: this.containerElement\n    });\n    this.autocompletes = [this.toAutocomplete, this.fromAutocomplete];\n\n    this.autocompletes.forEach(ac => {\n      ac.renderFooterTemplate = this.renderFooterTemplate;\n      ac.setError(null);\n      ac.onHitSelected = this.onHitSelected(\n        ac,\n        this.getById(ac._selectors.lat),\n        this.getById(ac._selectors.lng)\n      );\n      ac._resetButton.addEventListener(\"click\", () => {\n        this.removeMarker(ac);\n      });\n      ac.showLocation = this.useMyLocation(ac);\n    });\n\n    this.toController.addWidget(this.toAutocomplete);\n    this.fromController.addWidget(this.fromAutocomplete);\n    this.getById(\"trip-plan-reverse-control\").addEventListener(\n      \"click\",\n      this.reverseTrip\n    );\n    this.setupFormValidation();\n  }\n\n  bind() {\n    this.removeMarker = this.removeMarker.bind(this);\n    this.reverseTrip = this.reverseTrip.bind(this);\n    this.swapMarkers = this.swapMarkers.bind(this);\n    this.resetResetButtons = this.resetResetButtons.bind(this);\n    this.useMyLocation = this.useMyLocation.bind(this);\n    this.onSubmit = this.onSubmit.bind(this);\n    this.onInvalidAddress = this.onInvalidAddress.bind(this);\n    this.onAutocompleteShown = this.onAutocompleteShown.bind(this);\n    this.onInputReset = this.onInputReset.bind(this);\n  }\n\n  setupFormValidation() {\n    this.getById(\"planner-form\").addEventListener(\"submit\", this.onSubmit);\n\n    this.autocompletes.forEach(ac => {\n      this.getById(ac._selectors.input).addEventListener(\n        \"change\",\n        this.onInputChange(ac)\n      );\n      this.getById(ac._selectors.input).addEventListener(\n        \"input\",\n        this.onInputChange(ac)\n      );\n    });\n\n    document.addEventListener(\"autocomplete:empty\", this.onInvalidAddress);\n    document.addEventListener(\"autocomplete:shown\", this.onAutocompleteShown);\n    window.$(document).on(\"autocomplete:reset\", this.onInputReset);\n  }\n\n  onSubmit(ev) {\n    const missingFrom = this.getById(\"from\").value === \"\";\n    const missingTo = this.getById(\"to\").value === \"\";\n\n    if (\n      this.fromAutocomplete.error ||\n      this.toAutocomplete.error ||\n      missingFrom ||\n      missingTo\n    ) {\n      ev.preventDefault();\n\n      if (missingFrom) this.toggleError(this.fromAutocomplete, \"missing\");\n      if (missingTo) this.toggleError(this.toAutocomplete, \"missing\");\n\n      return false;\n    }\n    return true;\n  }\n\n  onAutocompleteShown({ srcElement }) {\n    if (srcElement && (srcElement.id === \"from\" || srcElement.id === \"to\")) {\n      const ac = this[`${srcElement.id}Autocomplete`];\n      this.toggleError(ac, null);\n    }\n  }\n\n  onInputReset(ev, { autocomplete }) {\n    if (\n      autocomplete.id === this.fromAutocomplete.id ||\n      autocomplete.id === this.toAutocomplete.id\n    ) {\n      this.toggleError(autocomplete, null);\n    }\n  }\n\n  onInputChange(ac) {\n    return () => {\n      if (ac.error === \"invalid\") {\n        return;\n      }\n\n      this.toggleError(ac, null);\n    };\n  }\n\n  onInvalidAddress({ srcElement }) {\n    if (srcElement && (srcElement.id === \"from\" || srcElement.id === \"to\")) {\n      const ac = this[`${srcElement.id}Autocomplete`];\n      this.toggleError(ac, \"invalid\");\n    }\n  }\n\n  toggleError(ac, errorType) {\n    const required = this.getById(ac._selectors.required);\n    const container = this.getById(ac._selectors.container);\n    const input = this.getById(ac._selectors.input);\n    if (required && container && input) {\n      if (errorType === \"missing\" || errorType === \"invalid\") {\n        container.classList.add(\"c-form__input-container--error\");\n        required.classList.remove(\"m-trip-plan__hidden\");\n        input.setAttribute(\"aria-invalid\", \"true\");\n      } else if (errorType === null) {\n        container.classList.remove(\"c-form__input-container--error\");\n        required.classList.add(\"m-trip-plan__hidden\");\n        input.setAttribute(\"aria-invalid\", \"false\");\n      } else {\n        throw new Error(`unrecognized error type: ${errorType}`);\n      }\n      ac.setError(errorType);\n      TripPlannerLocControls.updateErrorContent(ac);\n    }\n  }\n\n  static updateErrorContent(ac) {\n    const errorContainer = document.getElementById(ac._selectors.locationError);\n\n    if (errorContainer) {\n      errorContainer.innerHTML = \"\";\n\n      if (ac.error === \"invalid\") {\n        errorContainer.innerHTML =\n          \"We're sorry, but we couldn't find that address.\";\n      }\n    }\n  }\n\n  updateMarker(ac, lat, lng, title) {\n    const label = ac._input.getAttribute(\"data-label\");\n    const detail = {\n      latitude: lat,\n      longitude: lng,\n      label,\n      title\n    };\n    const event = new Event(\"trip-plan:update-marker\");\n    event.detail = detail;\n    document.dispatchEvent(event);\n  }\n\n  removeMarker(ac) {\n    const label = ac._input.getAttribute(\"data-label\");\n    const detail = { label };\n    const event = new Event(\"trip-plan:remove-marker\");\n    event.detail = detail;\n    document.dispatchEvent(event);\n  }\n\n  resetResetButtons() {\n    const from = this.fromAutocomplete;\n    const to = this.toAutocomplete;\n    from.resetResetButton();\n    to.resetResetButton();\n  }\n\n  swapMarkers() {\n    const from = this.fromAutocomplete;\n    const to = this.toAutocomplete;\n\n    const fromVal = from.getValue();\n    const toVal = to.getValue();\n\n    if (fromVal) {\n      this.updateMarker(\n        from,\n        this.getById(\"from_latitude\").value,\n        this.getById(\"from_longitude\").value,\n        fromVal\n      );\n    } else {\n      this.removeMarker(from);\n    }\n\n    if (toVal) {\n      this.updateMarker(\n        to,\n        this.getById(\"to_latitude\").value,\n        this.getById(\"to_longitude\").value,\n        to\n      );\n    } else {\n      this.removeMarker(to);\n    }\n  }\n\n  useMyLocation(ac) {\n    return (lat, lng) => {\n      this.getById(ac._selectors.lat).value = lat;\n      this.getById(ac._selectors.lng).value = lng;\n      const address = ac._input.value;\n      this.updateMarker(ac, lat, lng, address);\n    };\n  }\n\n  onHitSelected(ac, lat, lng) {\n    return ({\n      originalEvent: {\n        _args: [hit, type]\n      }\n    }) => {\n      switch (type) {\n        case \"stops\":\n          this.setAutocompleteValue(\n            ac,\n            hit.stop.name,\n            lat,\n            lng,\n            hit._geoloc.lat,\n            hit._geoloc.lng\n          );\n          break;\n        case \"locations\":\n          GoogleMapsHelpers.lookupPlace(hit.place_id)\n            .then(res => {\n              ac.resetSessionToken();\n\n              const { latitude, longitude } = res;\n              this.setAutocompleteValue(\n                ac,\n                hit.description,\n                lat,\n                lng,\n                latitude,\n                longitude\n              );\n              ac._input.blur();\n            })\n            .catch(() => {\n              // TODO: we should display an error here but NOT log to the console\n            });\n          break;\n        case \"usemylocation\":\n          ac.useMyLocationSearch();\n          break;\n        case \"popular\":\n          this.setAutocompleteValue(\n            ac,\n            hit.name,\n            lat,\n            lng,\n            hit.latitude,\n            hit.longitude\n          );\n          break;\n        default:\n          console.error(`onHitSelected not implemented for ${type}.`);\n      }\n    };\n  }\n\n  setAutocompleteValue(ac, name, latEl, lngEl, lat, lng) {\n    ac.setValue(name);\n    latEl.value = lat;\n    lngEl.value = lng;\n    this.updateMarker(ac, lat, lng, name);\n    this.resetResetButtons();\n  }\n\n  renderFooterTemplate(indexName) {\n    if (indexName === \"locations\") {\n      return AlgoliaResult.TEMPLATES.poweredByGoogleLogo.render({\n        logo: document.getElementById(\"powered-by-google-logo\").innerHTML\n      });\n    }\n    return null;\n  }\n\n  reverseTrip(e) {\n    // Prevent default click behavior bc the target area overlaps with the dropdown\n    e.preventDefault();\n    const fromAc = this.fromAutocomplete;\n    const toAc = this.toAutocomplete;\n    const fromError = fromAc.error;\n    const toError = toAc.error;\n    const from = fromAc.getValue();\n    const to = toAc.getValue();\n    const fromLat = this.getById(\"from_latitude\").value;\n    const fromLng = this.getById(\"from_longitude\").value;\n    const toLat = this.getById(\"to_latitude\").value;\n    const toLng = this.getById(\"to_longitude\").value;\n    this.getById(\"from_latitude\").value = toLat;\n    this.getById(\"from_longitude\").value = toLng;\n    this.getById(\"to_latitude\").value = fromLat;\n    this.getById(\"to_longitude\").value = fromLng;\n    fromAc.setValue(to);\n    toAc.setValue(from);\n    this.swapMarkers();\n    this.resetResetButtons();\n    this.toggleError(toAc, fromError);\n    this.toggleError(fromAc, toError);\n  }\n}\n\nTripPlannerLocControls.INDICES = {\n  to: {\n    stops: {\n      indexName: \"stops\",\n      query: \"\"\n    }\n  },\n  from: {\n    stops: {\n      indexName: \"stops\",\n      query: \"\"\n    }\n  }\n};\n\nTripPlannerLocControls.SELECTORS = {\n  to: {\n    input: \"to\",\n    lat: \"to_latitude\",\n    lng: \"to_longitude\",\n    resetButton: \"trip-plan__reset--to\",\n    container: \"trip-plan__container--to\",\n    locationLoadingIndicator: \"trip-plan__loading-indicator--to\",\n    required: \"trip-plan__required--to\",\n    locationError: \"trip-plan__location-error--to\",\n    announcer: \"trip-plan__announcer--to\"\n  },\n  from: {\n    input: \"from\",\n    lat: \"from_latitude\",\n    lng: \"from_longitude\",\n    resetButton: \"trip-plan__reset--from\",\n    container: \"trip-plan__container--from\",\n    locationLoadingIndicator: \"trip-plan__loading-indicator--from\",\n    required: \"trip-plan__required--from\",\n    locationError: \"trip-plan__location-error--from\",\n    announcer: \"trip-plan__announcer--from\"\n  },\n  map: \"trip-plan-map--initial\"\n};\n\nTripPlannerLocControls.PARAMS = {\n  stops: {\n    hitsPerPage: 3,\n    facets: [\"*\"],\n    facetFilters: [[]]\n  }\n};\n\nTripPlannerLocControls.POPULAR = [\n  {\n    icon: \"airplane\",\n    name: \"Boston Logan Airport\",\n    features: [],\n    latitude: 42.365396,\n    longitude: -71.017547,\n    url: \"#\"\n  },\n  {\n    icon: \"station\",\n    name: \"South Station\",\n    features: [\"red_line\", \"bus\", \"commuter_rail\", \"access\"],\n    latitude: 42.352271,\n    longitude: -71.055242,\n    url: \"#\"\n  },\n  {\n    icon: \"station\",\n    name: \"North Station\",\n    features: [\n      \"orange_line\",\n      \"green-line-c\",\n      \"green-line-e\",\n      \"bus\",\n      \"commuter_rail\",\n      \"access\"\n    ],\n    latitude: 42.365577,\n    longitude: -71.06129,\n    url: \"#\"\n  }\n];\n","export const PAGE_IDS = [\n  \"search-stop\",\n  \"search-route\",\n  \"search-route--subway\",\n  \"search-route--commuter_rail\",\n  \"search-route--bus\",\n  \"search-route--ferry\"\n];\n\nexport const PAGE_IDS_WITHOUT_GOOGLE = [\"search-projects\"];\n\nexport const FACET_MAP = {\n  \"search-stop\": \"stations,stops,locations\",\n  \"search-route\": \"subway,commuter-rail,bus,ferry,locations\",\n  \"search-route--subway\": \"subway,stations,stops,locations\",\n  \"search-route--commuter_rail\": \"commuter-rail,stations,stops,locations\",\n  \"search-route--bus\": \"bus,stations,stops,locations\",\n  \"search-route--ferry\": \"ferry,stations,stops,locations\",\n  \"search-projects\": \"projects\"\n};\n\nconst FACET_FILTER_MAP = {\n  \"search-stop\": [],\n  \"search-route\": [0, 1, 2, 3, 4].map(type => `route.type:${type}`),\n  \"search-route--subway\": [\"route.type:0\", \"route.type:1\"],\n  \"search-route--commuter_rail\": [\"route.type:2\"],\n  \"search-route--bus\": [\"route.type:3\"],\n  \"search-route--ferry\": [\"route.type:4\"],\n  \"search-projects\": [\"_content_type:project\", \"_content_type:project_update\"]\n};\n\nconst determineIndex = (isStopSearch, isProjectsSearch) => {\n  if (isStopSearch) return \"stops\";\n  if (isProjectsSearch) return \"drupal\";\n  return \"routes\";\n};\n\nexport const buildOptions = pageId => {\n  const selectors = {\n    input: `${pageId}__input`,\n    container: `${pageId}__container`,\n    goBtn: `${pageId}__input-go-btn`,\n    locationLoadingIndicator: `${pageId}__loading-indicator`,\n    resetButton: `${pageId}__reset`,\n    announcer: `${pageId}__announcer`\n  };\n\n  const params = {};\n\n  const indices = {};\n\n  const isStopSearch = pageId === \"search-stop\";\n  const isProjectsSearch = pageId === \"search-projects\";\n\n  const index = determineIndex(isStopSearch, isProjectsSearch);\n\n  params[index] = {\n    hitsPerPage: 5,\n    facets: [FACET_MAP[pageId]],\n    facetFilters: [FACET_FILTER_MAP[pageId]]\n  };\n\n  indices[index] = {\n    indexName: index,\n    query: \"\"\n  };\n\n  return {\n    selectors,\n    params,\n    indices\n  };\n};\n","import { doWhenGoogleMapsIsReady } from \"./google-maps-loaded\";\nimport Algolia from \"./algolia-search\";\nimport * as AlgoliaResult from \"./algolia-result\";\nimport AlgoliaAutocompleteWithGeo from \"./algolia-autocomplete-with-geo\";\nimport AlgoliaAutocomplete from \"./algolia-autocomplete\";\n// eslint-disable-next-line import/no-unresolved\nimport * as QueryHelpers from \"../ts/helpers/query\";\n\nimport {\n  PAGE_IDS,\n  PAGE_IDS_WITHOUT_GOOGLE,\n  FACET_MAP,\n  buildOptions\n} from \"./algolia-embedded-search-options\";\n\nexport class AlgoliaEmbeddedSearch {\n  constructor({\n    pageId,\n    withGoogle,\n    selectors,\n    params,\n    indices,\n    locationParams\n  }) {\n    this.withGoogle = withGoogle;\n    this.pageId = pageId;\n    this.selectors = selectors;\n    this.params = params;\n    this.indices = indices;\n    this.locationParams = locationParams || {\n      position: Object.keys(indices).length,\n      hitLimit: 3\n    };\n    this.input = document.getElementById(selectors.input);\n    this.controller = null;\n    this.autocomplete = null;\n    this.goBtn = document.getElementById(selectors.goBtn);\n    this.bind();\n    if (this.input) {\n      this.init();\n    }\n  }\n\n  bind() {\n    this.onClickGoBtn = this.onClickGoBtn.bind(this);\n  }\n\n  init() {\n    this.input.value = \"\";\n    this.controller = new Algolia(this.indices, this.params);\n    this.autocomplete = this.withGoogle\n      ? new AlgoliaAutocompleteWithGeo({\n          id: this.pageId,\n          selectors: this.selectors,\n          indices: Object.keys(this.indices),\n          locationParams: this.locationParams,\n          popular: [],\n          parent: this\n        })\n      : new AlgoliaAutocomplete({\n          id: this.pageId,\n          selectors: this.selectors,\n          indices: Object.keys(this.indices),\n          locationParams: this.locationParams,\n          popular: [],\n          parent: this\n        });\n    this.autocomplete.renderFooterTemplate =\n      AlgoliaEmbeddedSearch.renderFooterTemplate;\n    this.addEventListeners();\n    this.controller.addWidget(this.autocomplete);\n  }\n\n  addEventListeners() {\n    this.goBtn.removeEventListener(\"click\", this.onClickGoBtn);\n    this.goBtn.addEventListener(\"click\", this.onClickGoBtn);\n  }\n\n  buildSearchParams() {\n    return QueryHelpers.paramsToString(\n      {\n        query: this.input.value,\n        facets: this.facets(),\n        showmore: this.indexNames()\n      },\n      window.encodeURIComponent\n    );\n  }\n\n  onClickGoBtn() {\n    return window.Turbolinks.visit(`/search${this.buildSearchParams()}`);\n  }\n\n  indexNames() {\n    return Object.keys(this.indices).join(\",\");\n  }\n\n  facets() {\n    return FACET_MAP[this.pageId];\n  }\n\n  getParams() {\n    return {\n      from: this.pageId,\n      query: this.input.value\n    };\n  }\n\n  static renderFooterTemplate(indexName) {\n    if (indexName === \"locations\") {\n      return AlgoliaResult.TEMPLATES.poweredByGoogleLogo.render({\n        logo: document.getElementById(\"powered-by-google-logo\").innerHTML\n      });\n    }\n    return null;\n  }\n}\n\nexport const initWithoutGoogle = () => {\n  PAGE_IDS_WITHOUT_GOOGLE.forEach(pageId => {\n    const { selectors, params, indices } = buildOptions(pageId);\n\n    /* eslint-disable no-new */\n    new AlgoliaEmbeddedSearch({\n      pageId,\n      selectors,\n      params,\n      indices,\n      withGoogle: false\n    });\n  });\n};\n\nexport const init = () => {\n  PAGE_IDS.forEach(pageId => {\n    const { selectors, params, indices } = buildOptions(pageId);\n    document.addEventListener(\"turbolinks:load\", () => {\n      doWhenGoogleMapsIsReady(\n        () =>\n          new AlgoliaEmbeddedSearch({\n            pageId,\n            selectors,\n            params,\n            indices,\n            withGoogle: true\n          })\n      );\n    });\n  });\n};\n","export interface QueryParams {\n  [key: string]: string;\n}\n\n// The encoder/decoder functions must be injected\n// because this helper is used by some vanilla JS files,\n// and MochaJS insists that the window object does not\n// include encodeURIComponent or decodeURIComponent,\n// which causes a compiler error. If/when there are\n// no more JS modules using these helpers, the\n// injections should be removed.\ntype EncoderDecoder = (str: string) => string;\n\nexport const paramsToString = (\n  params: QueryParams,\n  encoder: EncoderDecoder\n): string => {\n  if (!params || Object.keys(params).length === 0) {\n    return \"\";\n  }\n\n  return `?${Object.keys(params)\n    .map(key => `${key}=${encoder(params[key])}`)\n    .join(\"&\")}`;\n};\n\ntype QueryReducer = (params: QueryParams, kvString: string) => QueryParams;\n\nconst queryReducer = (decoder: EncoderDecoder): QueryReducer => (\n  params: QueryParams,\n  kvString: string\n) => {\n  const [key, val] = kvString.split(\"=\");\n  return { ...params, [decoder(key)]: decoder(val.replace(/\\+/g, \" \")) };\n};\n\nexport const parseQuery = (\n  query: string,\n  decoder: EncoderDecoder\n): QueryParams =>\n  query\n    ? query\n        .substring(1)\n        .split(\"&\")\n        .reduce(queryReducer(decoder), {})\n    : {};\n","export function getCookie(name) {\n  return getCookieFromString(document.cookie, name);\n}\n\nexport function getCookieFromString(cookies, name) {\n  const cookieArray = cookies.split(\";\");\n\n  for (let cookie in cookieArray) {\n    let key;\n    let value;\n    [key, value] = cookieArray[cookie].split(\"=\");\n    if (key && key.trim() === name) {\n      return value.trim();\n    }\n  }\n\n  return null;\n}\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Phoenix=t():e.Phoenix=t()}(this,function(){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"\",n(n.s=0)}([function(e,t,n){(function(t){e.exports=t.Phoenix=n(2)}).call(this,n(1))},function(e,t){var n;n=function(){return this}();try{n=n||Function(\"return this\")()||(0,eval)(\"this\")}catch(e){\"object\"==typeof window&&(n=window)}e.exports=n},function(e,t,n){\"use strict\";function i(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}()}function o(e){return(o=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function r(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],i=!0,o=!1,r=void 0;try{for(var s,a=e[Symbol.iterator]();!(i=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);i=!0);}catch(e){o=!0,r=e}finally{try{i||null==a.return||a.return()}finally{if(o)throw r}}return n}(e,t)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}()}function s(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function a(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function c(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),e}n.r(t),n.d(t,\"Channel\",function(){return b}),n.d(t,\"Socket\",function(){return R}),n.d(t,\"LongPoll\",function(){return w}),n.d(t,\"Ajax\",function(){return C}),n.d(t,\"Presence\",function(){return S});var u=\"undefined\"!=typeof self?self:null,h=\"undefined\"!=typeof window?window:null,l=u||h||void 0,f={connecting:0,open:1,closing:2,closed:3},p=1e4,d={closed:\"closed\",errored:\"errored\",joined:\"joined\",joining:\"joining\",leaving:\"leaving\"},v={close:\"phx_close\",error:\"phx_error\",join:\"phx_join\",reply:\"phx_reply\",leave:\"phx_leave\"},y=[v.close,v.error,v.join,v.reply,v.leave],g={longpoll:\"longpoll\",websocket:\"websocket\"},m=function(e){if(\"function\"==typeof e)return e;return function(){return e}},k=function(){function e(t,n,i,o){s(this,e),this.channel=t,this.event=n,this.payload=i||function(){return{}},this.receivedResp=null,this.timeout=o,this.timeoutTimer=null,this.recHooks=[],this.sent=!1}return c(e,[{key:\"resend\",value:function(e){this.timeout=e,this.reset(),this.send()}},{key:\"send\",value:function(){this.hasReceived(\"timeout\")||(this.startTimeout(),this.sent=!0,this.channel.socket.push({topic:this.channel.topic,event:this.event,payload:this.payload(),ref:this.ref,join_ref:this.channel.joinRef()}))}},{key:\"receive\",value:function(e,t){return this.hasReceived(e)&&t(this.receivedResp.response),this.recHooks.push({status:e,callback:t}),this}},{key:\"reset\",value:function(){this.cancelRefEvent(),this.ref=null,this.refEvent=null,this.receivedResp=null,this.sent=!1}},{key:\"matchReceive\",value:function(e){var t=e.status,n=e.response;e.ref;this.recHooks.filter(function(e){return e.status===t}).forEach(function(e){return e.callback(n)})}},{key:\"cancelRefEvent\",value:function(){this.refEvent&&this.channel.off(this.refEvent)}},{key:\"cancelTimeout\",value:function(){clearTimeout(this.timeoutTimer),this.timeoutTimer=null}},{key:\"startTimeout\",value:function(){var e=this;this.timeoutTimer&&this.cancelTimeout(),this.ref=this.channel.socket.makeRef(),this.refEvent=this.channel.replyEventName(this.ref),this.channel.on(this.refEvent,function(t){e.cancelRefEvent(),e.cancelTimeout(),e.receivedResp=t,e.matchReceive(t)}),this.timeoutTimer=setTimeout(function(){e.trigger(\"timeout\",{})},this.timeout)}},{key:\"hasReceived\",value:function(e){return this.receivedResp&&this.receivedResp.status===e}},{key:\"trigger\",value:function(e,t){this.channel.trigger(this.refEvent,{status:e,response:t})}}]),e}(),b=function(){function e(t,n,i){var o=this;s(this,e),this.state=d.closed,this.topic=t,this.params=m(n||{}),this.socket=i,this.bindings=[],this.bindingRef=0,this.timeout=this.socket.timeout,this.joinedOnce=!1,this.joinPush=new k(this,v.join,this.params,this.timeout),this.pushBuffer=[],this.rejoinTimer=new T(function(){return o.rejoinUntilConnected()},this.socket.reconnectAfterMs),this.joinPush.receive(\"ok\",function(){o.state=d.joined,o.rejoinTimer.reset(),o.pushBuffer.forEach(function(e){return e.send()}),o.pushBuffer=[]}),this.onClose(function(){o.rejoinTimer.reset(),o.socket.hasLogger()&&o.socket.log(\"channel\",\"close \".concat(o.topic,\" \").concat(o.joinRef())),o.state=d.closed,o.socket.remove(o)}),this.onError(function(e){o.isLeaving()||o.isClosed()||(o.socket.hasLogger()&&o.socket.log(\"channel\",\"error \".concat(o.topic),e),o.state=d.errored,o.rejoinTimer.scheduleTimeout())}),this.joinPush.receive(\"timeout\",function(){o.isJoining()&&(o.socket.hasLogger()&&o.socket.log(\"channel\",\"timeout \".concat(o.topic,\" (\").concat(o.joinRef(),\")\"),o.joinPush.timeout),new k(o,v.leave,m({}),o.timeout).send(),o.state=d.errored,o.joinPush.reset(),o.rejoinTimer.scheduleTimeout())}),this.on(v.reply,function(e,t){o.trigger(o.replyEventName(t),e)})}return c(e,[{key:\"rejoinUntilConnected\",value:function(){this.rejoinTimer.scheduleTimeout(),this.socket.isConnected()&&this.rejoin()}},{key:\"join\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;if(this.joinedOnce)throw new Error(\"tried to join multiple times. 'join' can only be called a single time per channel instance\");return this.joinedOnce=!0,this.rejoin(e),this.joinPush}},{key:\"onClose\",value:function(e){this.on(v.close,e)}},{key:\"onError\",value:function(e){return this.on(v.error,function(t){return e(t)})}},{key:\"on\",value:function(e,t){var n=this.bindingRef++;return this.bindings.push({event:e,ref:n,callback:t}),n}},{key:\"off\",value:function(e,t){this.bindings=this.bindings.filter(function(n){return!(n.event===e&&(void 0===t||t===n.ref))})}},{key:\"canPush\",value:function(){return this.socket.isConnected()&&this.isJoined()}},{key:\"push\",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.timeout;if(!this.joinedOnce)throw new Error(\"tried to push '\".concat(e,\"' to '\").concat(this.topic,\"' before joining. Use channel.join() before pushing events\"));var i=new k(this,e,function(){return t},n);return this.canPush()?i.send():(i.startTimeout(),this.pushBuffer.push(i)),i}},{key:\"leave\",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;this.state=d.leaving;var n=function(){e.socket.hasLogger()&&e.socket.log(\"channel\",\"leave \".concat(e.topic)),e.trigger(v.close,\"leave\")},i=new k(this,v.leave,m({}),t);return i.receive(\"ok\",function(){return n()}).receive(\"timeout\",function(){return n()}),i.send(),this.canPush()||i.trigger(\"ok\",{}),i}},{key:\"onMessage\",value:function(e,t,n){return t}},{key:\"isLifecycleEvent\",value:function(e){return y.indexOf(e)>=0}},{key:\"isMember\",value:function(e,t,n,i){return this.topic===e&&(!i||i===this.joinRef()||!this.isLifecycleEvent(t)||(this.socket.hasLogger()&&this.socket.log(\"channel\",\"dropping outdated message\",{topic:e,event:t,payload:n,joinRef:i}),!1))}},{key:\"joinRef\",value:function(){return this.joinPush.ref}},{key:\"sendJoin\",value:function(e){this.state=d.joining,this.joinPush.resend(e)}},{key:\"rejoin\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;this.isLeaving()||this.sendJoin(e)}},{key:\"trigger\",value:function(e,t,n,i){var o=this.onMessage(e,t,n,i);if(t&&!o)throw new Error(\"channel onMessage callbacks must return the payload, modified or unmodified\");for(var r=0;r<this.bindings.length;r++){var s=this.bindings[r];s.event===e&&s.callback(o,n,i||this.joinRef())}}},{key:\"replyEventName\",value:function(e){return\"chan_reply_\".concat(e)}},{key:\"isClosed\",value:function(){return this.state===d.closed}},{key:\"isErrored\",value:function(){return this.state===d.errored}},{key:\"isJoined\",value:function(){return this.state===d.joined}},{key:\"isJoining\",value:function(){return this.state===d.joining}},{key:\"isLeaving\",value:function(){return this.state===d.leaving}}]),e}(),j={encode:function(e,t){var n=[e.join_ref,e.ref,e.topic,e.event,e.payload];return t(JSON.stringify(n))},decode:function(e,t){var n=r(JSON.parse(e),5);return t({join_ref:n[0],ref:n[1],topic:n[2],event:n[3],payload:n[4]})}},R=function(){function e(t){var n=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};s(this,e),this.stateChangeCallbacks={open:[],close:[],error:[],message:[]},this.channels=[],this.sendBuffer=[],this.ref=0,this.timeout=i.timeout||p,this.transport=i.transport||l.WebSocket||w,this.defaultEncoder=j.encode,this.defaultDecoder=j.decode,this.transport!==w?(this.encode=i.encode||this.defaultEncoder,this.decode=i.decode||this.defaultDecoder):(this.encode=this.defaultEncoder,this.decode=this.defaultDecoder),this.heartbeatIntervalMs=i.heartbeatIntervalMs||3e4,this.reconnectAfterMs=i.reconnectAfterMs||function(e){return[1e3,2e3,5e3,1e4][e-1]||1e4},this.logger=i.logger||null,this.longpollerTimeout=i.longpollerTimeout||2e4,this.params=m(i.params||{}),this.endPoint=\"\".concat(t,\"/\").concat(g.websocket),this.heartbeatTimer=null,this.pendingHeartbeatRef=null,this.reconnectTimer=new T(function(){n.teardown(function(){return n.connect()})},this.reconnectAfterMs)}return c(e,[{key:\"protocol\",value:function(){return location.protocol.match(/^https/)?\"wss\":\"ws\"}},{key:\"endPointURL\",value:function(){var e=C.appendParams(C.appendParams(this.endPoint,this.params()),{vsn:\"2.0.0\"});return\"/\"!==e.charAt(0)?e:\"/\"===e.charAt(1)?\"\".concat(this.protocol(),\":\").concat(e):\"\".concat(this.protocol(),\"://\").concat(location.host).concat(e)}},{key:\"disconnect\",value:function(e,t,n){this.reconnectTimer.reset(),this.teardown(e,t,n)}},{key:\"connect\",value:function(e){var t=this;e&&(console&&console.log(\"passing params to connect is deprecated. Instead pass :params to the Socket constructor\"),this.params=m(e)),this.conn||(this.conn=new this.transport(this.endPointURL()),this.conn.timeout=this.longpollerTimeout,this.conn.onopen=function(){return t.onConnOpen()},this.conn.onerror=function(e){return t.onConnError(e)},this.conn.onmessage=function(e){return t.onConnMessage(e)},this.conn.onclose=function(e){return t.onConnClose(e)})}},{key:\"log\",value:function(e,t,n){this.logger(e,t,n)}},{key:\"hasLogger\",value:function(){return null!==this.logger}},{key:\"onOpen\",value:function(e){this.stateChangeCallbacks.open.push(e)}},{key:\"onClose\",value:function(e){this.stateChangeCallbacks.close.push(e)}},{key:\"onError\",value:function(e){this.stateChangeCallbacks.error.push(e)}},{key:\"onMessage\",value:function(e){this.stateChangeCallbacks.message.push(e)}},{key:\"onConnOpen\",value:function(){this.hasLogger()&&this.log(\"transport\",\"connected to \".concat(this.endPointURL())),this.flushSendBuffer(),this.reconnectTimer.reset(),this.resetHeartbeat(),this.stateChangeCallbacks.open.forEach(function(e){return e()})}},{key:\"resetHeartbeat\",value:function(){var e=this;this.conn.skipHeartbeat||(this.pendingHeartbeatRef=null,clearInterval(this.heartbeatTimer),this.heartbeatTimer=setInterval(function(){return e.sendHeartbeat()},this.heartbeatIntervalMs))}},{key:\"teardown\",value:function(e,t,n){this.conn&&(this.conn.onclose=function(){},t?this.conn.close(t,n||\"\"):this.conn.close(),this.conn=null),e&&e()}},{key:\"onConnClose\",value:function(e){this.hasLogger()&&this.log(\"transport\",\"close\",e),this.triggerChanError(),clearInterval(this.heartbeatTimer),e&&1e3!==e.code&&this.reconnectTimer.scheduleTimeout(),this.stateChangeCallbacks.close.forEach(function(t){return t(e)})}},{key:\"onConnError\",value:function(e){this.hasLogger()&&this.log(\"transport\",e),this.triggerChanError(),this.stateChangeCallbacks.error.forEach(function(t){return t(e)})}},{key:\"triggerChanError\",value:function(){this.channels.forEach(function(e){return e.trigger(v.error)})}},{key:\"connectionState\",value:function(){switch(this.conn&&this.conn.readyState){case f.connecting:return\"connecting\";case f.open:return\"open\";case f.closing:return\"closing\";default:return\"closed\"}}},{key:\"isConnected\",value:function(){return\"open\"===this.connectionState()}},{key:\"remove\",value:function(e){this.channels=this.channels.filter(function(t){return t.joinRef()!==e.joinRef()})}},{key:\"channel\",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=new b(e,t,this);return this.channels.push(n),n}},{key:\"push\",value:function(e){var t=this;if(this.hasLogger()){var n=e.topic,i=e.event,o=e.payload,r=e.ref,s=e.join_ref;this.log(\"push\",\"\".concat(n,\" \").concat(i,\" (\").concat(s,\", \").concat(r,\")\"),o)}this.isConnected()?this.encode(e,function(e){return t.conn.send(e)}):this.sendBuffer.push(function(){return t.encode(e,function(e){return t.conn.send(e)})})}},{key:\"makeRef\",value:function(){var e=this.ref+1;return e===this.ref?this.ref=0:this.ref=e,this.ref.toString()}},{key:\"sendHeartbeat\",value:function(){if(this.isConnected()){if(this.pendingHeartbeatRef)return this.pendingHeartbeatRef=null,this.hasLogger()&&this.log(\"transport\",\"heartbeat timeout. Attempting to re-establish connection\"),void this.conn.close(1e3,\"hearbeat timeout\");this.pendingHeartbeatRef=this.makeRef(),this.push({topic:\"phoenix\",event:\"heartbeat\",payload:{},ref:this.pendingHeartbeatRef})}}},{key:\"flushSendBuffer\",value:function(){this.isConnected()&&this.sendBuffer.length>0&&(this.sendBuffer.forEach(function(e){return e()}),this.sendBuffer=[])}},{key:\"onConnMessage\",value:function(e){var t=this;this.decode(e.data,function(e){var n=e.topic,i=e.event,o=e.payload,r=e.ref,s=e.join_ref;r&&r===t.pendingHeartbeatRef&&(t.pendingHeartbeatRef=null),t.hasLogger()&&t.log(\"receive\",\"\".concat(o.status||\"\",\" \").concat(n,\" \").concat(i,\" \").concat(r&&\"(\"+r+\")\"||\"\"),o);for(var a=0;a<t.channels.length;a++){var c=t.channels[a];c.isMember(n,i,o,s)&&c.trigger(i,o,r,s)}for(var u=0;u<t.stateChangeCallbacks.message.length;u++)t.stateChangeCallbacks.message[u](e)})}}]),e}(),w=function(){function e(t){s(this,e),this.endPoint=null,this.token=null,this.skipHeartbeat=!0,this.onopen=function(){},this.onerror=function(){},this.onmessage=function(){},this.onclose=function(){},this.pollEndpoint=this.normalizeEndpoint(t),this.readyState=f.connecting,this.poll()}return c(e,[{key:\"normalizeEndpoint\",value:function(e){return e.replace(\"ws://\",\"http://\").replace(\"wss://\",\"https://\").replace(new RegExp(\"(.*)/\"+g.websocket),\"$1/\"+g.longpoll)}},{key:\"endpointURL\",value:function(){return C.appendParams(this.pollEndpoint,{token:this.token})}},{key:\"closeAndRetry\",value:function(){this.close(),this.readyState=f.connecting}},{key:\"ontimeout\",value:function(){this.onerror(\"timeout\"),this.closeAndRetry()}},{key:\"poll\",value:function(){var e=this;this.readyState!==f.open&&this.readyState!==f.connecting||C.request(\"GET\",this.endpointURL(),\"application/json\",null,this.timeout,this.ontimeout.bind(this),function(t){if(t){var n=t.status,i=t.token,o=t.messages;e.token=i}else n=0;switch(n){case 200:o.forEach(function(t){return e.onmessage({data:t})}),e.poll();break;case 204:e.poll();break;case 410:e.readyState=f.open,e.onopen(),e.poll();break;case 0:case 500:e.onerror(),e.closeAndRetry();break;default:throw new Error(\"unhandled poll status \".concat(n))}})}},{key:\"send\",value:function(e){var t=this;C.request(\"POST\",this.endpointURL(),\"application/json\",e,this.timeout,this.onerror.bind(this,\"timeout\"),function(e){e&&200===e.status||(t.onerror(e&&e.status),t.closeAndRetry())})}},{key:\"close\",value:function(e,t){this.readyState=f.closed,this.onclose()}}]),e}(),C=function(){function e(){s(this,e)}return c(e,null,[{key:\"request\",value:function(e,t,n,i,o,r,s){if(l.XDomainRequest){var a=new XDomainRequest;this.xdomainRequest(a,e,t,i,o,r,s)}else{var c=l.XMLHttpRequest?new l.XMLHttpRequest:new ActiveXObject(\"Microsoft.XMLHTTP\");this.xhrRequest(c,e,t,n,i,o,r,s)}}},{key:\"xdomainRequest\",value:function(e,t,n,i,o,r,s){var a=this;e.timeout=o,e.open(t,n),e.onload=function(){var t=a.parseJSON(e.responseText);s&&s(t)},r&&(e.ontimeout=r),e.onprogress=function(){},e.send(i)}},{key:\"xhrRequest\",value:function(e,t,n,i,o,r,s,a){var c=this;e.open(t,n,!0),e.timeout=r,e.setRequestHeader(\"Content-Type\",i),e.onerror=function(){a&&a(null)},e.onreadystatechange=function(){if(e.readyState===c.states.complete&&a){var t=c.parseJSON(e.responseText);a(t)}},s&&(e.ontimeout=s),e.send(o)}},{key:\"parseJSON\",value:function(e){if(!e||\"\"===e)return null;try{return JSON.parse(e)}catch(t){return console&&console.log(\"failed to parse JSON response\",e),null}}},{key:\"serialize\",value:function(e,t){var n=[];for(var i in e)if(e.hasOwnProperty(i)){var r=t?\"\".concat(t,\"[\").concat(i,\"]\"):i,s=e[i];\"object\"===o(s)?n.push(this.serialize(s,r)):n.push(encodeURIComponent(r)+\"=\"+encodeURIComponent(s))}return n.join(\"&\")}},{key:\"appendParams\",value:function(e,t){if(0===Object.keys(t).length)return e;var n=e.match(/\\?/)?\"&\":\"?\";return\"\".concat(e).concat(n).concat(this.serialize(t))}}]),e}();C.states={complete:4};var S=function(){function e(t){var n=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};s(this,e);var o=i.events||{state:\"presence_state\",diff:\"presence_diff\"};this.state={},this.pendingDiffs=[],this.channel=t,this.joinRef=null,this.caller={onJoin:function(){},onLeave:function(){},onSync:function(){}},this.channel.on(o.state,function(t){var i=n.caller,o=i.onJoin,r=i.onLeave,s=i.onSync;n.joinRef=n.channel.joinRef(),n.state=e.syncState(n.state,t,o,r),n.pendingDiffs.forEach(function(t){n.state=e.syncDiff(n.state,t,o,r)}),n.pendingDiffs=[],s()}),this.channel.on(o.diff,function(t){var i=n.caller,o=i.onJoin,r=i.onLeave,s=i.onSync;n.inPendingSyncState()?n.pendingDiffs.push(t):(n.state=e.syncDiff(n.state,t,o,r),s())})}return c(e,[{key:\"onJoin\",value:function(e){this.caller.onJoin=e}},{key:\"onLeave\",value:function(e){this.caller.onLeave=e}},{key:\"onSync\",value:function(e){this.caller.onSync=e}},{key:\"list\",value:function(t){return e.list(this.state,t)}},{key:\"inPendingSyncState\",value:function(){return!this.joinRef||this.joinRef!==this.channel.joinRef()}}],[{key:\"syncState\",value:function(e,t,n,i){var o=this,r=this.clone(e),s={},a={};return this.map(r,function(e,n){t[e]||(a[e]=n)}),this.map(t,function(e,t){var n=r[e];if(n){var i=t.metas.map(function(e){return e.phx_ref}),c=n.metas.map(function(e){return e.phx_ref}),u=t.metas.filter(function(e){return c.indexOf(e.phx_ref)<0}),h=n.metas.filter(function(e){return i.indexOf(e.phx_ref)<0});u.length>0&&(s[e]=t,s[e].metas=u),h.length>0&&(a[e]=o.clone(n),a[e].metas=h)}else s[e]=t}),this.syncDiff(r,{joins:s,leaves:a},n,i)}},{key:\"syncDiff\",value:function(e,t,n,o){var r=t.joins,s=t.leaves,a=this.clone(e);return n||(n=function(){}),o||(o=function(){}),this.map(r,function(e,t){var o=a[e];if(a[e]=t,o){var r,s=a[e].metas.map(function(e){return e.phx_ref}),c=o.metas.filter(function(e){return s.indexOf(e.phx_ref)<0});(r=a[e].metas).unshift.apply(r,i(c))}n(e,o,t)}),this.map(s,function(e,t){var n=a[e];if(n){var i=t.metas.map(function(e){return e.phx_ref});n.metas=n.metas.filter(function(e){return i.indexOf(e.phx_ref)<0}),o(e,n,t),0===n.metas.length&&delete a[e]}}),a}},{key:\"list\",value:function(e,t){return t||(t=function(e,t){return t}),this.map(e,function(e,n){return t(e,n)})}},{key:\"map\",value:function(e,t){return Object.getOwnPropertyNames(e).map(function(n){return t(n,e[n])})}},{key:\"clone\",value:function(e){return JSON.parse(JSON.stringify(e))}}]),e}(),T=function(){function e(t,n){s(this,e),this.callback=t,this.timerCalc=n,this.timer=null,this.tries=0}return c(e,[{key:\"reset\",value:function(){this.tries=0,clearTimeout(this.timer)}},{key:\"scheduleTimeout\",value:function(){var e=this;clearTimeout(this.timer),this.timer=setTimeout(function(){e.tries=e.tries+1,e.callback()},this.timerCalc(this.tries+1))}}]),e}()}])});","const ITEM_SELECTOR = \"js-toggle-alert\";\n\nexport const onload = () =>\n  document.addEventListener(\"turbolinks:load\", addAlertItemEventHandlers, {\n    passive: true\n  });\n\nexport const addAlertItemEventHandlers = () => {\n  if (typeof document !== \"undefined\") {\n    [...document.querySelectorAll(`.${ITEM_SELECTOR}`)].forEach(alertItem => {\n      alertItem.addEventListener(\"click\", handleAlertItemClick);\n      alertItem.addEventListener(\"keydown\", handleAlertItemKeyPress);\n    });\n  }\n};\n\nexport const removeAlertItemEventHandlers = () => {\n  if (typeof document !== \"undefined\") {\n    [...document.querySelectorAll(`.${ITEM_SELECTOR}`)].forEach(alertItem => {\n      alertItem.removeEventListener(\"click\", handleAlertItemClick);\n      alertItem.removeEventListener(\"keydown\", handleAlertItemKeyPress);\n    });\n  }\n};\n\nconst handleAlertItemKeyPress = e =>\n  isEnter(e.key || e.keyCode) ? handleAlertItemClick(e) : () => {};\n\nconst isEnter = key => key === \"Enter\" || key === 13;\n\nconst handleAlertItemClick = e =>\n  e.target.tagName !== \"A\" &&\n  doHandleAlertItemClick(getParentsUntil(e.target, ITEM_SELECTOR));\n\nconst doHandleAlertItemClick = el =>\n  batchDomMutations(el, el.getAttribute(\"aria-expanded\") === \"true\");\n\nconst batchDomMutations = (el, opened) => {\n  toggleOpenClass(el, opened);\n  toggleAriaAttribute(el, opened);\n};\n\nconst toggleOpenClass = (el, opened) =>\n  opened === true\n    ? el.classList.remove(\"c-alert-item--open\")\n    : el.classList.add(\"c-alert-item--open\");\n\nconst toggleAriaAttribute = (el, opened) =>\n  opened === true\n    ? el.setAttribute(\"aria-expanded\", \"false\")\n    : el.setAttribute(\"aria-expanded\", \"true\");\n\nconst getParentsUntil = (el, selector) =>\n  el.classList.contains(selector) === true\n    ? el\n    : getParentsUntil(el.parentNode, selector);\n","import hogan from \"hogan.js\";\nimport * as Icons from \"./icons\";\n\n/* eslint-disable no-underscore-dangle */\n\nexport const SELECTORS = {\n  result: \"js-search-result\"\n};\n\nexport const TEMPLATES = {\n  poweredByGoogleLogo: hogan.compile(\n    `<div class=\"c-search-result__hit c-search-result__google\">{{{logo}}}</div>`\n  ),\n  fontAwesomeIcon: hogan.compile(\n    `<span aria-hidden=\"true\" class=\"c-search-result__content-icon fa {{icon}}\"></span>`\n  ),\n  formattedDate: hogan.compile(\n    `<span class=\"c-search-result__event-date\">{{date}}</span>`\n  ),\n  locations: hogan.compile(`\n    <a id=\"hit-{{id}}\" class=\"c-search-result__link u-no-underline\" url={{hitUrl}}>\n      <span>{{{hitIcon}}}</span>\n      <span class=\"c-search-result__hit-name\">{{{hitTitle}}}</span>\n    </a>\n  `),\n  usemylocation: hogan.compile(`\n    <a id=\"search-bar__my-location\" class=\"c-search-bar__my-location\">\n      <i aria-hidden=\"true\" class=\"fa fa-location-arrow \"></i>\n      Use my location\n      <i aria-hidden=\"true\" id=\"search-result__loading-indicator\" class=\"fa fa-cog fa-spin c-search-result__loading-indicator\"></i>\n    </a>\n  `),\n  projects: hogan.compile(`\n    {{#hasDate}}\n    <div class=\"c-search-result__hit--vertical\">\n    {{/hasDate}}\n    {{#id}}\n    <a id=\"hit-{{id}}\" class=\"${\n      SELECTORS.result\n    } c-search-result__link\" href=\"{{hitUrl}}\">\n    {{/id}}\n    {{^id}}\n    <a class=\"${\n      SELECTORS.result\n    } c-search-result__link u-no-underline\" href=\"{{hitUrl}}\" data-queryid=\"{{analyticsData.queryID}}\" data-hit-position=\"{{analyticsData.position}}\" data-objectid=\"{{analyticsData.objectID}}\">\n    {{/id}}\n      <span class=\"c-search-result__hit-name\">{{{hitTitle}}}</span>\n    </a>\n    <span>{{{hitIcon}}}</span>\n    {{#hasDate}}\n    </div>\n    {{/hasDate}}\n  `),\n  default: hogan.compile(`\n    {{#hasDate}}\n    <div class=\"c-search-result__hit--vertical\">\n    {{/hasDate}}\n    {{#id}}\n    <a id=\"hit-{{id}}\" class=\"${\n      SELECTORS.result\n    } c-search-result__link\" href=\"{{hitUrl}}\">\n    {{/id}}\n    {{^id}}\n    <a class=\"${\n      SELECTORS.result\n    } c-search-result__link u-no-underline\" href=\"{{hitUrl}}\" data-queryid=\"{{analyticsData.queryID}}\" data-hit-position=\"{{analyticsData.position}}\" data-objectid=\"{{analyticsData.objectID}}\">\n    {{/id}}\n      <span>{{{hitIcon}}}</span>\n      <span class=\"c-search-result__hit-name\">{{{hitTitle}}}</span>\n    </a>\n    <span class=\"c-search-result__feature-icons\">\n      {{#hitFeatureIcons}}\n        {{{.}}}\n      {{/hitFeatureIcons}}\n    </span>\n    {{#hasDate}}\n    </div>\n    {{/hasDate}}\n  `)\n};\n\nfunction iconsFromGTFSAncestries(ancestries) {\n  return ancestries\n    .map(anc => anc.toLowerCase())\n    .filter(anc => anc !== \"subway\")\n    .map(anc => Icons.getFeatureIcon(anc));\n}\n\nfunction iconsFromGTFSAncestry(ancestry) {\n  if (Array.isArray(ancestry)) {\n    return iconsFromGTFSAncestries(ancestry);\n  }\n  return iconsFromGTFSAncestries([ancestry]);\n}\n\nfunction _subwayRouteIcon(routeId) {\n  if (routeId.includes(\"Green-\")) {\n    return routeId.toLowerCase().replace(\"-\", \"_line_\");\n  }\n\n  const mapper = {\n    Green: \"green_line\",\n    Red: \"red_line\",\n    Orange: \"orange_line\",\n    Blue: \"blue_line\",\n    Mattapan: \"mattapan_line\"\n  };\n\n  return mapper[routeId];\n}\n\nfunction iconFromGTFSId(id) {\n  const toSubway = _subwayRouteIcon(id);\n  if (toSubway) {\n    return Icons.getFeatureIcon(toSubway);\n  }\n  if (id === \"Silver Line\") return Icons.getFeatureIcon(\"bus\");\n  if (id in [\"commuter_rail\", \"bus\", \"ferry\"]) {\n    return Icons.getFeatureIcon(id);\n  }\n  if (id.includes(\"CR-\")) {\n    return Icons.getFeatureIcon(\"commuter_rail\");\n  }\n  return Icons.getFeatureIcon(id);\n}\n\nfunction iconsFromGTFSIds(id) {\n  if (Array.isArray(id)) {\n    return id.map(icon => iconFromGTFSId(icon));\n  }\n  return [iconFromGTFSId(id)];\n}\n\nexport function iconFromGTFS(id, ancestry) {\n  if (!id) {\n    return TEMPLATES.fontAwesomeIcon.render({ icon: \"fa-info\" });\n  }\n  let icons = iconsFromGTFSIds(id);\n  if (ancestry) {\n    icons = [...new Set([...icons, ...iconsFromGTFSAncestry(ancestry)])];\n  }\n  return icons;\n}\n\nfunction _fileIcon(hit) {\n  switch (hit._file_type) {\n    case \"application/pdf\":\n      return \"fa-file-pdf-o\";\n\n    case \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n    case \"application/vnd.ms-powerpoint\":\n      return \"fa-file-powerpoint-o\";\n\n    case \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\":\n    case \"application/vnd.ms-excel\":\n      return \"fa-file-excel-o\";\n\n    case \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":\n    case \"application/msword\":\n      return \"fa-file-word-o\";\n\n    default:\n      return \"fa-file-o\";\n  }\n}\n\nfunction _contentIcon(hit) {\n  let icon;\n\n  if (hit.search_api_datasource === \"entity:file\") {\n    icon = _fileIcon(hit);\n  } else {\n    const iconMapper = {\n      search_result: \"fa-info\",\n      news_entry: \"fa-newspaper-o\",\n      event: \"fa-calendar\",\n      project: \"fa-wrench\",\n      project_update: \"fa-wrench\",\n      page: \"fa-info\",\n      landing_page: \"fa-info\",\n      person: \"fa-user\",\n      locations: \"fa-map-marker\"\n    };\n    icon = iconMapper[hit._content_type] || \"fa-info\";\n  }\n\n  return TEMPLATES.fontAwesomeIcon.render({ icon });\n}\n\nfunction _getStopOrStationIcon(hit) {\n  if (hit.stop[\"station?\"]) {\n    return Icons.getFeatureIcon(\"station\");\n  }\n  return Icons.getFeatureIcon(\"stop\");\n}\n\nfunction _iconFromRoute(route) {\n  switch (route.type) {\n    case 2:\n      return \"commuter_rail\";\n\n    case 3:\n      return \"bus\";\n\n    case 4:\n      return \"ferry\";\n\n    default:\n      return _subwayRouteIcon(route.id);\n  }\n}\n\nfunction getPopularIcon(icon) {\n  switch (icon) {\n    case \"airplane\":\n      return TEMPLATES.fontAwesomeIcon.render({ icon: \"fa-plane\" });\n    default:\n      return Icons.getFeatureIcon(icon);\n  }\n}\n\nexport function getIcon(hit, type) {\n  switch (type) {\n    case \"locations\":\n      return _contentIcon({ ...hit, _content_type: \"locations\" });\n    case \"stops\":\n      return _getStopOrStationIcon(hit);\n\n    case \"routes\":\n      return Icons.getFeatureIcon(_iconFromRoute(hit.route));\n\n    case \"popular\":\n      return getPopularIcon(hit.icon);\n\n    case \"projects\":\n      return getTransitIcons(hit);\n\n    case \"drupal\":\n    case \"pages\":\n    case \"documents\":\n    case \"events\":\n    case \"news\":\n      return _contentIcon(hit);\n\n    case \"usemylocation\":\n      return \"\";\n\n    default:\n      return \"\";\n  }\n}\n\nfunction getTransitIcons(hit) {\n  if (\n    hit.related_transit_gtfs_id === null &&\n    hit.related_transit_gtfs_ancestry == null\n  ) {\n    return \"\";\n  }\n  const icons = iconFromGTFS(\n    hit.related_transit_gtfs_id,\n    hit.related_transit_gtfs_ancestry\n  );\n  if (Array.isArray(icons)) {\n    return icons.join(\" \");\n  }\n  return icons;\n}\n\nfunction _contentUrl(hit) {\n  if (hit.search_api_datasource === \"entity:file\") {\n    return `/sites/default/files/${hit._file_uri.replace(/public:\\/\\//, \"\")}`;\n  }\n  if (hit._content_type === \"search_result\") {\n    return hit._search_result_url.replace(/internal:/, \"\");\n  }\n  return hit._content_url;\n}\n\nexport function getUrl(hit, index) {\n  switch (index) {\n    case \"stops\":\n      return `/stops/${hit.stop.id}`;\n\n    case \"routes\":\n      return `/schedules/${hit.route.id}`;\n\n    case \"popular\":\n      return hit.url;\n\n    case \"drupal\":\n    case \"projects\":\n    case \"pages\":\n    case \"documents\":\n    case \"events\":\n    case \"news\":\n      return _contentUrl(hit);\n\n    case \"locations\":\n      return \"\";\n    case \"usemylocation\":\n      return \"#\";\n\n    default:\n      return \"#\";\n  }\n}\n\nfunction getRouteTitle(hit) {\n  const name = hit._highlightResult.route.name.value;\n  switch (hit.route.type) {\n    case 3:\n      return `${name} <span class=\"c-search-result__long-name\">${\n        hit._highlightResult.route.long_name.value\n      }</span>`;\n    default:\n      return name;\n  }\n}\n\nfunction _contentTitle(hit) {\n  if (hit._content_type === \"search_result\") {\n    return hit._highlightResult.search_result_title.value;\n  }\n  if (hit.search_api_datasource === \"entity:file\") {\n    return hit._highlightResult.file_name_raw.value;\n  }\n  return hit._highlightResult.content_title.value;\n}\n\nexport function getTitle(hit, type) {\n  let orig;\n  switch (type) {\n    case \"locations\":\n      orig = hit.description.split(\"\");\n      hit.matched_substrings.forEach(match => {\n        orig[match.offset] = `<em>${orig[match.offset]}`;\n        if (match.offset + match.length < orig.length) {\n          orig[match.offset + match.length] = `</em>${\n            orig[match.offset + match.length]\n          }`;\n        }\n      });\n      return orig.join(\"\");\n    case \"stops\":\n      return hit._highlightResult.stop.name.value;\n\n    case \"routes\":\n      return getRouteTitle(hit);\n\n    case \"popular\":\n      return hit.name;\n\n    case \"drupal\":\n    case \"projects\":\n    case \"pages\":\n    case \"documents\":\n    case \"events\":\n    case \"news\":\n      return _contentTitle(hit);\n\n    case \"usemylocation\":\n      return \"\";\n\n    default:\n      return \"\";\n  }\n}\n\nfunction _stopsWithAlerts() {\n  const stopsWithAlertsDiv = document.getElementById(\"stops-with-alerts\");\n  if (!stopsWithAlertsDiv) return \"\";\n  const {\n    dataset: { stopsWithAlerts }\n  } = stopsWithAlertsDiv;\n  return stopsWithAlerts;\n}\n\nfunction _routesWithAlerts() {\n  const routesWithAlertsDiv = document.getElementById(\"routes-with-alerts\");\n  if (!routesWithAlertsDiv) return \"\";\n  const {\n    dataset: { routesWithAlerts }\n  } = routesWithAlertsDiv;\n  return routesWithAlerts;\n}\n\nfunction _getAlertIcon(hit, type) {\n  let hasAlert = false;\n  switch (type) {\n    case \"stops\":\n      hasAlert = _stopsWithAlerts().includes(hit.stop.id);\n      break;\n\n    case \"routes\":\n      hasAlert = _routesWithAlerts().includes(hit.route.id);\n      break;\n\n    default:\n      hasAlert = false;\n  }\n\n  return hasAlert ? [\"alert\"] : [];\n}\n\nfunction _standardizeFeatureName(feature) {\n  switch (feature) {\n    case \"Red\":\n    case \"Blue\":\n    case \"Orange\":\n    case \"Green\":\n    case \"Green-B\":\n    case \"Green-C\":\n    case \"Green-D\":\n    case \"Green-E\":\n    case \"Mattapan\":\n      return _subwayRouteIcon(feature);\n\n    default:\n      return feature;\n  }\n}\n\nfunction _featuresToIcons(features) {\n  return features.map(feature =>\n    Icons.getFeatureIcon(_standardizeFeatureName(feature))\n  );\n}\n\nfunction _sortFeatures(features) {\n  const featuresWithoutBranches = features.filter(\n    feature => !feature.includes(\"Green-\")\n  );\n  const branches = features.filter(feature => feature.includes(\"Green-\"));\n  if (branches.length > 0) {\n    const greenLinePosition = featuresWithoutBranches.findIndex(\n      feature => feature === \"green_line\"\n    );\n\n    featuresWithoutBranches.splice(greenLinePosition + 1, 0, ...branches);\n    return featuresWithoutBranches;\n  }\n  return features;\n}\n\nfunction _getCommuterRailZone(hit) {\n  if (hit.zone) {\n    return [`<span class=\"c-icon__cr-zone\">Zone ${hit.zone}</span>`];\n  }\n  return [];\n}\n\nfunction _stopIcons(hit, type) {\n  const filteredFeatures = hit.features.filter(\n    feature => feature !== \"access\" && feature !== \"parking_lot\"\n  );\n\n  const alertFeature = _getAlertIcon(hit, type);\n  const allFeatures = alertFeature.concat(filteredFeatures);\n  const allFeaturesSorted = _sortFeatures(allFeatures);\n  const allIcons = _featuresToIcons(allFeaturesSorted);\n\n  const zoneIcon = _getCommuterRailZone(hit);\n\n  return allIcons.concat(zoneIcon);\n}\n\nfunction _formatDate(date) {\n  const formattedDate = date.toLocaleDateString(\"en-US\", {\n    year: \"numeric\",\n    month: \"short\",\n    day: \"numeric\"\n  });\n  return TEMPLATES.formattedDate.render({ date: formattedDate });\n}\n\nfunction pagesdocumentsDate(hit) {\n  if (hit._file_created !== undefined) {\n    const date = new Date(hit._file_created * 1000);\n    return [_formatDate(date)];\n  }\n  return [];\n}\n\nfunction projectsDate(hit) {\n  if (hit._content_posted_on) {\n    const date = new Date(hit._content_posted_on * 1000);\n    return [_formatDate(date)];\n  }\n  return [];\n}\n\nfunction _contentDate(hit) {\n  const dateString = hit._content_url.split(\"/\")[2];\n  try {\n    const dateStringWithTime = `${dateString}T01:00:00`;\n    const date = new Date(dateStringWithTime);\n    return [_formatDate(date)];\n  } catch (err) {\n    return [];\n  }\n}\n\nexport function getFeatureIcons(hit, type) {\n  const alertFeature = _getAlertIcon(hit, type);\n  switch (type) {\n    case \"popular\":\n    case \"stops\":\n      return _stopIcons(hit, type);\n\n    case \"routes\":\n      return _featuresToIcons(alertFeature);\n\n    case \"projects\":\n      return projectsDate(hit);\n\n    case \"pages\":\n    case \"documents\":\n      return pagesdocumentsDate(hit);\n    case \"events\":\n    case \"news\":\n      return _contentDate(hit);\n\n    default:\n      return [];\n  }\n}\n\nexport function parseResult(hit, index) {\n  return Object.assign(hit, {\n    hitIcon: getIcon(hit, index),\n    hitUrl: getUrl(hit, index),\n    hitTitle: getTitle(hit, index),\n    hasDate:\n      index === \"events\" ||\n      index === \"news\" ||\n      index === \"pages\" ||\n      index === \"documents\" ||\n      index === \"projects\" ||\n      null,\n    hitFeatureIcons: getFeatureIcons(hit, index),\n    id: hit.place_id || null\n  });\n}\n\nexport function renderResult(hit, index) {\n  if (hit._content_type == \"project\" || hit._content_type == \"project_update\") {\n    return TEMPLATES.projects.render(parseResult(hit, \"projects\"));\n  }\n  if (TEMPLATES[index]) {\n    return TEMPLATES[index].render(parseResult(hit, index));\n  }\n  return TEMPLATES.default.render(parseResult(hit, index));\n}\n","import { addOrUpdateTooltip, removeTooltip } from \"./cr-timetable-tooltips\";\n\nexport const allTrainsClass = \"js-train-icon\";\nexport const trainIcon = id =>\n  `<div class=\"${id} ${allTrainsClass}\"><span class=\"notranslate c-svg__icon-commuter-rail-default\"><svg viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m36.54 11.28a1.8073 1.8073 0 0 1 -.81-1.54v-4.79a3.03356 3.03356 0 0 0 -2.38-2.89 75.79021 75.79021 0 0 0 -8.71-2 3.37685 3.37685 0 0 0 -1.38.01c-2.6.57-5.22 1.08-7.8 1.8-1.52.42-3.12 1.26-3.12 3.08v4.76a1.78965 1.78965 0 0 1 -.83 1.54 3.14612 3.14612 0 0 0 -1.5 2.69v20.22a3.14244 3.14244 0 0 0 1.18 2.43l5.12 3.75-4.13 7.66h3.37l.58-1.06h15.81l.59 1.06h3.34l-4.09-7.66h.01l5.01-3.71a3.17036 3.17036 0 0 0 1.19-2.47v-20.22a3.17047 3.17047 0 0 0 -1.45-2.66zm-10.08-7.48a.99881.99881 0 0 1 1.21-.98l4.94 1.04a.98623.98623 0 0 1 .79.97v2.94a.99652.99652 0 0 1 -1.19.98l-4.94-.96a.99672.99672 0 0 1 -.81-.98zm-2.46 11.28a2.69727 2.69727 0 1 1 -1.91.79 2.69913 2.69913 0 0 1 1.91-.79zm-9.1-10.25a.98522.98522 0 0 1 .8-.97l4.94-1.04a.99473.99473 0 0 1 1.2.98v3.01a.99775.99775 0 0 1 -.8.98l-4.95.96a1.00066 1.00066 0 0 1 -1.19-.98zm1.0938 29.67a1.955 1.955 0 1 1 1.95-1.96 1.96318 1.96318 0 0 1 -1.95 1.96zm3.7062 5.97h8.63l.88995 1.6h-10.39995zm-2.68 4.86.91-1.65h12.19l.92 1.65zm15.98-10.83a1.955 1.955 0 1 1 1.95-1.96 1.96319 1.96319 0 0 1 -1.95 1.96z\"></path></svg></span></div>`;\nconst emptySpaceForIcon = \"&nbsp;\";\n\nexport const removeTrain = id => {\n  const vehicleIcons = Array.from(document.getElementsByClassName(id));\n  vehicleIcons.forEach(i => {\n    // eslint-disable-next-line no-param-reassign\n    i.innerHTML = emptySpaceForIcon;\n    return removeTooltip(i.parentNode.id);\n  });\n};\n\nexport class CRTimetableTrainIcons {\n  constructor(props) {\n    this.priorStops = props.priorStops;\n    this.schedules = props.schedules;\n  }\n\n  addOrUpdateTrain(data) {\n    // Splat together vehicle struct and stop name data\n    const {\n      data: { vehicle: vehicleStruct, stop_name: stopName },\n      marker: { tooltip_text }\n    } = data;\n    const vehicle = { ...vehicleStruct, stop_name: stopName };\n\n    const vehicleContainerId = this.vehicleContainerId(vehicle);\n    const vehicleContainer = document.getElementById(vehicleContainerId);\n\n    if (!vehicleContainer) {\n      // This happens on \"Via Haverhill\" etc vehicles\n      return;\n    }\n\n    // If the train isn't currently in this container, remove the other instance\n    if (vehicleContainer.innerHTML.trim() === emptySpaceForIcon) {\n      removeTrain(vehicle.id);\n    }\n\n    this.addTrain(vehicle, vehicleContainer);\n    const text = \"<p class='prediction-tooltip'>\" + tooltip_text + \"</p>\";\n    addOrUpdateTooltip(text, vehicleContainerId);\n  }\n\n  addTrain(vehicle, vehicleContainer) {\n    // eslint-disable-next-line no-param-reassign\n    vehicleContainer.innerHTML = trainIcon(vehicle.id);\n  }\n\n  vehicleContainerId(vehicle) {\n    const stop = `${vehicle.stop_name}-${vehicle.trip_id}`;\n    if (vehicle.status !== \"in_transit\") {\n      return stop;\n    }\n    // For vehicles in transit with prior stop data, put the vehicle in the prior stop container\n    const stopSequence = this.schedules[stop].stop_sequence || 1;\n    return this.priorStops[`${vehicle.trip_id}-${stopSequence - 1}`];\n  }\n}\n","const tooltipDivider = \"<hr class='tooltip-divider'>\";\nconst vehicleTooltipId = vehicleContainerId => `${vehicleContainerId}-tooltip`;\n\nexport const addOrUpdateTooltip = (vehicleTooltip, vehicleContainerId) => {\n  const containerId = vehicleTooltipId(vehicleContainerId);\n  const container = document.getElementById(containerId);\n  const currentTooltip = container.getAttribute(\"data-original-title\");\n  const stopTooltip = container.getAttribute(\"data-stop\");\n  // If the tooltip is visible, it will have an aria-describedby attribute\n  const tooltipVisible = container.getAttribute(\"aria-describedby\");\n\n  if (stopTooltip) {\n    const tooltip = [vehicleTooltip, stopTooltip].join(tooltipDivider);\n    // Avoid unnecessary updates\n    if (tooltip === currentTooltip) {\n      return;\n    }\n    container.setAttribute(\"data-original-title\", tooltip);\n  } else {\n    // Avoid unnecessary updates\n    if (vehicleTooltip === currentTooltip) {\n      return;\n    }\n    container.setAttribute(\"data-original-title\", vehicleTooltip);\n  }\n\n  if (tooltipVisible) {\n    window.jQuery(container).tooltip(\"show\");\n  }\n};\n\nexport const removeTooltip = parentId => {\n  const tooltipId = `${parentId}-tooltip`;\n  const container = document.getElementById(tooltipId);\n  const stopTooltip = container.getAttribute(\"data-stop\");\n  window.jQuery(container).tooltip(\"hide\");\n  if (stopTooltip) {\n    container.setAttribute(\"data-original-title\", stopTooltip);\n  } else {\n    container.removeAttribute(\"data-original-title\");\n  }\n};\n","const sessionTokenValue = tokenObj => (tokenObj ? tokenObj.Pf : null);\n\nexport function autocomplete({ input, hitLimit, sessionToken }) {\n  if (input.length === 0) {\n    return Promise.resolve({});\n  }\n\n  return new Promise((resolve, reject) => {\n    window.jQuery\n      .getJSON(\n        `/places/autocomplete/${encodeURIComponent(\n          input\n        )}/${hitLimit}/${sessionTokenValue(sessionToken)}`\n      )\n      .done(processAutocompleteResults(resolve))\n      .fail(reject);\n  });\n}\n\nexport const lookupPlace = placeId =>\n  new Promise((resolve, reject) => {\n    window.jQuery\n      .getJSON(`/places/details/${placeId}`)\n      .done(processPlacesCallback(resolve))\n      .fail(reject);\n  });\n\nexport const reverseGeocode = (latitude, longitude) =>\n  new Promise((resolve, reject) => {\n    window.jQuery\n      .getJSON(`/places/reverse-geocode/${latitude}/${longitude}`)\n      .done(processGeocodeCallback(resolve, reject))\n      .fail(reject);\n  });\n\nconst processAutocompleteResults = resolve => ({ predictions }) =>\n  resolve(predictionResults(JSON.parse(predictions)));\n\nconst predictionResults = predictions => ({\n  locations: {\n    hits: predictions,\n    nbHits: predictions.length\n  }\n});\n\nconst processPlacesCallback = resolve => ({ result }) =>\n  resolve(JSON.parse(result));\n\nconst processGeocodeCallback = (resolve, reject) => ({ results }) => {\n  const parsedResults = JSON.parse(results);\n  if (parsedResults[0]) {\n    resolve(parsedResults[0].formatted);\n  } else {\n    reject(\"No results\");\n  }\n};\n","let callbacks = [];\n\nexport default function() {\n  callbacks = [];\n  window.mapsCallback = function() {\n    window.isMapReady = true;\n    callbacks.forEach(callback => callback());\n    callbacks = [];\n  };\n}\n\nexport function doWhenGoogleMapsIsReady(callback) {\n  // If the map is not ready, add it to an array of callback that will get called soon.\n  // If the map is ready, call the callback, but with a timeout.\n  // The reason for the timeout is so that this function works similar in both cases -- always with a delay, never\n  // immediately.\n  window.isMapReady ? window.setTimeout(callback, 0) : callbacks.push(callback);\n}\n","import { KeyboardEvent as ReactKeyboardEvent } from \"react\";\n\nexport const isEnter = (key: number | string): boolean =>\n  key === \"Enter\" || key === 13;\n\nexport const isEscape = (key: number | string): boolean =>\n  key === \"Escape\" || key === 27;\n\n// for vanilla JS\nexport const handleNativeEnterKeyPress = (\n  e: KeyboardEvent,\n  cb: Function\n): void => (isEnter(e.key || e.keyCode) ? cb(e) : () => {});\n\nexport const handleNativeEscapeKeyPress = (\n  e: KeyboardEvent,\n  cb: Function\n): void => (isEscape(e.key || e.keyCode) ? cb(e) : () => {});\n\n// for React\nexport const handleReactEnterKeyPress = (\n  e: ReactKeyboardEvent,\n  onClick: Function\n): void => {\n  if (e.key === \"Enter\") {\n    onClick();\n  }\n};\n\nexport const handleReactExitKeyPress = (\n  e: ReactKeyboardEvent,\n  onClick: Function\n): void => {\n  if (e.key === \"Escape\") {\n    onClick();\n  }\n};\n","const track = () => {\n  if (window.dataLayer) {\n    window.dataLayer.push({\n      event: \"pageView\"\n    });\n  }\n};\n\nexport default () => {\n  document.addEventListener(\"turbolinks:load\", track);\n};\n","export default function(events, $) {\n  $ = $ || window.jQuery;\n  events.forEach(event => {\n    function onEvent(ev) {\n      $(ev.target)\n        .siblings(\"label\")\n        .find(\".loading-indicator\")\n        .removeClass(\"hidden-xs-up\");\n      const form = $(ev.target).parents(\"form\");\n      const action = form.attr(\"action\");\n      const serialized = form.serialize();\n\n      window.Turbolinks.visit(mergeAction(action, serialized));\n    }\n\n    function hideLoading(ev) {\n      $(`[data-submit-on-${event}] label .loading-indicator`).addClass(\n        \"hidden-xs-up\"\n      );\n    }\n\n    function hideSubmits() {\n      $(\n        '<style type=\"text/css\">[data-submit-on-' +\n          event +\n          \"] [type=submit] {display: none;}</style>\"\n      ).appendTo($(\"head\"));\n    }\n\n    $(document).on(event, \"[data-submit-on-\" + event + \"] select\", onEvent);\n    $(document).on(event, \"[data-submit-on-\" + event + \"] input\", onEvent);\n    document.addEventListener(\"turbolinks:before-cache\", hideLoading, {\n      passive: true\n    });\n    hideSubmits();\n  });\n}\n\nexport function mergeAction(action, params, pathname) {\n  if (!pathname) {\n    if (typeof window !== \"undefined\") {\n      // not set in tests\n      pathname = window.location.pathname;\n    }\n  }\n  if (typeof action === \"undefined\" || action === \"\" || action === \"#\") {\n    return pathname + \"?\" + params;\n  }\n  if (action.charAt(0) == \"#\") {\n    return pathname + \"?\" + params + action;\n  }\n  const replacedHash = action.replace(/#/, \"?\" + params + \"#\");\n  if (replacedHash === action) {\n    return action + \"?\" + params;\n  }\n  return replacedHash;\n}\n","import Sifter from \"sifter\";\n\nexport default function($ = window.jQuery) {\n  // create the modal when we click on the fake select\n  $(document).on(\"click openModal\", \"[data-select-modal]\", ev =>\n    openModal(ev, $)\n  );\n\n  $(document).on(\"keyup\", \".select-modal-search input\", ev =>\n    searchChanged(ev, $)\n  );\n\n  $(document).on(\"submit\", \".select-modal\", ev => searchSubmitted(ev, $));\n\n  $(document).on(\"click\", \".select-modal .select-modal-option\", ev =>\n    optionSelected(ev, $)\n  );\n\n  $(document).on(\"shown.bs.modal\", \".select-modal\", ev => modalShown(ev, $));\n\n  $(document).on(\"hidden.bs.modal\", \".select-modal\", ev => modalHidden(ev, $));\n\n  $(document).on(\"click\", \"[data-select-modal-open]\", ev =>\n    openRemoteModal(ev, $)\n  );\n\n  document.addEventListener(\n    \"turbolinks:load\",\n    () => window.nextTick(() => convertSelects($)),\n    { passive: true }\n  );\n}\n\nfunction openModal(ev, $) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  const $target = $(ev.currentTarget); // the button we clicked\n  const selectName = $target.data(\"select-modal\");\n  const $select = $(`select[name=\"${selectName}\"]`); // the <select>\n  const selectData = dataFromSelect($select, $);\n  const options = optionsFromSelect($select, $);\n  const $modal = $newModal($select.attr(\"name\"), $);\n  renderModal($modal, selectName, selectData, options);\n  $modal.data(\"select-modal-select\", $select).modal({\n    keyboard: true,\n    show: true\n  });\n  return false;\n}\n\nfunction openRemoteModal(ev, $) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  const name = $(ev.currentTarget).data(\"select-modal-open\");\n  $(`[data-select-modal=${name}]`).trigger(\"openModal\");\n  return false;\n}\n\nfunction searchChanged(ev, $) {\n  const $target = $(ev.currentTarget);\n  const $modal = $target.parents(\".select-modal\");\n  const data = $modal.data(\"select-modal-data\");\n  const sifter = $modal.data(\"select-modal-sifter\");\n\n  // filter the data and re-render those options\n  const newData = filterData(data, $target.val(), sifter);\n  $modal.find(\".select-modal-options\").html(newData.map(renderOption).join(\"\"));\n}\n\nfunction searchSubmitted(ev, $) {\n  // find the first non-disabled button and click it\n  ev.preventDefault();\n  ev.stopPropagation();\n  $(ev.currentTarget)\n    .find(\".select-modal-option:first-child:not(.select-modal-option-disabled)\")\n    .click();\n}\n\nfunction optionSelected(ev, $) {\n  // update the original select and the fake select when we click on an option\n  ev.preventDefault();\n  ev.stopPropagation();\n\n  const $target = $(ev.currentTarget),\n    $parent = $target.parents(\".select-modal\"),\n    value = $target.data(\"value\");\n\n  $parent\n    .data(\"select-modal-select\")\n    .siblings(\".select-modal-text\")\n    .text($target.text());\n  $parent\n    .data(\"select-modal-select\")\n    .val(value)\n    .change();\n  $parent.modal(\"hide\");\n  return false;\n}\n\nfunction modalShown(ev, $) {\n  if (!/iPad|iPhone|Android/.exec(navigator.userAgent)) {\n    // focus search when the modal is open (desktop)\n    $(ev.currentTarget)\n      .find(\".select-modal-search label\")\n      .focus();\n  }\n}\n\nfunction modalHidden(ev, $) {\n  // remove the generated modal once it's closed\n  $(ev.currentTarget).remove();\n}\n\n// public so that it can be re-run separately from the global event handlers\nexport function convertSelects($) {\n  // if there are select toggles, show them\n  window.requestAnimationFrame(() => {\n    $(\".select-modal-toggle\").each((_index, el) => {\n      el.style.display = \"block\";\n    });\n  });\n  window.requestAnimationFrame(() => {\n    $(\".select-modal-hidden-label\").each((_index, el) => {\n      el.style.display = \"none\";\n    });\n  });\n  window.requestAnimationFrame(() => {\n    $(\"select[data-select-modal][data-no-conversion]\").each((_index, el) => {\n      const $el = $(el),\n        $cover = $(`<div/>`)\n          .attr(\"data-select-modal\", $el.attr(\"name\"))\n          .addClass(\"select-cover\")\n          .css({\n            width: $el.outerWidth(),\n            height: $el.outerHeight(),\n            background: \"rgba(0, 0, 0, 0)\",\n            position: \"absolute\",\n            cursor: \"pointer\"\n          });\n      $el.before($cover).removeAttr(\"data-select-modal\");\n\n      // if the select had toggle button nearby, hide the select\n      if ($el.siblings(\".select-modal-toggle\").length) {\n        $el.addClass(\"select-converted-to-modal\");\n      }\n    });\n  });\n  window.requestAnimationFrame(() => {\n    $(\"select[data-select-modal]:not([data-no-conversion])\").each(\n      (_index, el) => {\n        // creates a text container (based on the select value) and a button\n        // (based on the text of the submit button for the form).\n        const $el = $(el),\n          $replacementText = $(`<span/>`)\n            .addClass(\"select-modal-text\")\n            .text(el.options[el.selectedIndex].text),\n          $replacement = $(\n            `<button data-select-modal=\"${$el.attr(\"name\")}\" type=button />`\n          )\n            .addClass(\"btn btn-link btn-select-modal\")\n            .text(\n              buttonText(\n                $el\n                  .parents(\"form\")\n                  .find(\"[type=submit]\")\n                  .text()\n              )\n            )\n            .data(\"select-modal-select\", $el);\n        $el\n          .hide()\n          .removeAttr(\"data-select-modal\")\n          .after($replacementText)\n          .parents(\"form\")\n          .find(\"[type=submit]\")\n          .after($replacement);\n      }\n    );\n  });\n}\n\nfunction buttonText(text) {\n  // The buttons have text like 'Change Departure', but we want the text to\n  // be lower case and be wrapped in parens: '(change departure)'\n  return `(${text.toLowerCase()})`;\n}\n\nexport function dataFromSelect($el, $) {\n  return $el\n    .children(\"option\")\n    .map(dataFromOption($))\n    .get()\n    .filter(({ value: value }) => value !== \"\");\n}\n\nexport function optionsFromSelect($el, $) {\n  return {\n    label: $(`label[for=\"${$el.attr(\"id\")}\"]`).html(),\n    // make search enabled the default\n    search: typeof $el.data(\"no-search\") === \"undefined\"\n  };\n}\n\nexport function $newModal(id, $) {\n  const modalId = id + \"Modal\";\n  const $existing = $(\"#\" + modalId);\n  if ($existing.length > 0) {\n    return $existing;\n  }\n\n  const $div = $(`<div\nclass='modal select-modal'\nid='${modalId}'\ntabindex=\"-1\"\nrole=\"dialog\"\ndata-original-id='#${id}'>\n</div>`);\n  $(\"body\").append($div);\n  return $div;\n}\n\nexport function renderModal($modal, selectName, data, options) {\n  $modal\n    .html(\n      `\n<div class='modal-dialog role='document'>\n  <div class=\"modal-content\">\n    <div class=\"modal-body\">\n      ${renderCloseButton()}\n      <form class=\"select-modal-search\">\n        ${renderSearch(selectName, data, options)}\n      </form>\n      <div class=\"select-modal-options list-group list-group-flush\">\n        ${data.map(renderOption).join(\"\")}\n      </div>\n    </div>\n  </div>\n</div>\n`\n    )\n    .data(\"select-modal-data\", data)\n    .data(\"select-modal-sifter\", new Sifter(data));\n}\n\nfunction renderCloseButton() {\n  return `\n<button type=\"button\" class=\"close btn-link pull-right p-t-0\" data-dismiss=\"modal\" aria-label=\"Close\">\n  <i class=\"fa fa-close\" aria-hidden=\"true\"/> Close\n</button>`;\n}\n\nfunction dataFromOption($) {\n  return (_index, option) => {\n    const $option = $(option);\n    const data = {\n      name: $option\n        .text()\n        .replace(/\\(.+\\)/, \"\")\n        .trim(),\n      html: $option.html(),\n      value: $option.val()\n    };\n    if ($option.attr(\"selected\")) {\n      data.selected = true;\n    }\n    if ($option.attr(\"disabled\")) {\n      data.disabled = true;\n    }\n    if ($option.data(\"key-option\")) {\n      data.keyOption = true;\n    }\n    if ($option.data(\"suffix\")) {\n      data.suffix = $option.data(\"suffix\");\n    }\n    return data;\n  };\n}\n\nfunction renderSearch(selectName, data, options) {\n  if (options.search === false) {\n    return `<label class=\"modal-label\" id=\"select-modal-label\" for=\"${selectName}\">${\n      options.label\n    }</label>`;\n  }\n  const placeholder = firstEnabledName(data);\n  return `\n<label id=\"select-modal-label\" for=\"select-modal-search\">${\n    options.label\n  }</label>\n<input id=\"select-modal-search\" name=\"select-modal-search\" class=\"form-control\" type=\"search\" autocomplete=\"off\" placeholder=\"Ex ${placeholder}\"/>\n<span>Or select from route stops:</span>\n`;\n}\n\nfunction firstEnabledName(data) {\n  // this would be Array.prototype.find but that doesn't exist in IE. -ps\n  var item;\n  for (var i = 0; i < data.length; i++) {\n    item = data[i];\n    if (!item.disabled) {\n      return item.name;\n    }\n  }\n  return \"\";\n}\n\nfunction renderOption(option) {\n  const className = [\n    \"select-modal-option\",\n    \"list-group-item\",\n    \"list-group-item-flush\",\n    option.selected ? \"selected\" : \"\",\n    option.disabled ? \"disabled\" : \"\",\n    option.keyOption ? \"key-option\" : \"\"\n  ].join(\" \");\n  return `\n<button class='${className}' data-value='${option.value}' ${\n    option.disabled ? \"disabled\" : \"\"\n  }>\n  <div class='select-modal-option-name'>\n    ${\n      option.selected\n        ? '<span class=\"fa fa-check-circle\" aria-hidden=true/>'\n        : \"\"\n    }\n    ${option.html}\n    ${\n      option.suffix\n        ? '<span class=\"pull-xs-right font-weight-normal\">' +\n          option.suffix +\n          \"</span>\"\n        : \"\"\n    }\n  </div>\n</button>\n`;\n}\n\nexport function filterData(data, query, sifter) {\n  if (typeof sifter === \"undefined\") {\n    sifter = new Sifter(data);\n  }\n  const search = sifter.search(query, {\n    fields: [\"name\"]\n  });\n\n  // sort the items by ID\n  search.items.sort((first, second) => first.id - second.id);\n\n  return search.items.map(({ id: id }) => data[id]);\n}\n","export default function($) {\n  $ = $ || window.jQuery;\n\n  function handler(extraClass, collapseEvent) {\n    return function(ev) {\n      ev.preventDefault();\n      ev.stopPropagation();\n      const selector = $(ev.currentTarget).data(\"target\");\n      $(selector)\n        .addClass(\"collapse\")\n        .addClass(extraClass)\n        .collapse({ toggle: false })\n        .collapse(collapseEvent);\n    };\n  }\n  $(document).on(\"click\", \"[data-hide=collapse]\", handler(\"in\", \"hide\"));\n  $(document).on(\"click\", \"[data-show=collapse]\", handler(\"\", \"show\"));\n\n  // focus after expansion of collapsible elements that have the js-focus-on-expand class\n  $(document).on(\"shown.bs.collapse\", \".js-focus-on-expand\", ev => {\n    ev.target.focus();\n  });\n}\n","export default function addCarets() {\n  document.addEventListener(\"turbolinks:load\", () => {\n    initCarets();\n  });\n}\n\nexport function initCarets() {\n  Array.from(document.getElementsByClassName(\"js-header-link\")).forEach(init);\n\n  function init(el) {\n    el.classList.add(\"navbar-toggle\", \"toggle-up-down\");\n    el.setAttribute(\"data-toggle\", \"collapse\");\n    el.setAttribute(\"aria-expanded\", \"false\");\n    Array.from(el.children)\n      .filter(child => child.classList.contains(\"js-header-link__content\"))\n      .forEach(addCarets);\n  }\n\n  function addCarets(el) {\n    Array.from(el.children)\n      .filter(child => child.classList.contains(\"js-header-link__carets\"))\n      .forEach(doAddCarets);\n  }\n\n  function doAddCarets(el) {\n    [\"up\", \"down\"].forEach(name => addCaret(name, el));\n  }\n\n  function addCaret(name, container) {\n    if (container.getElementsByClassName(name).item(0) == null) {\n      const caret = document.createElement(\"i\");\n\n      caret.classList.add(\"fa\");\n      caret.classList.add(\"fa-angle-\" + name);\n      caret.classList.add(name);\n      caret.setAttribute(\"aria-hidden\", true);\n\n      container.appendChild(caret);\n    }\n  }\n}\n","export default function($) {\n  $ = $ || window.jQuery;\n\n  function closeModals() {\n    $(\".modal.in\").modal(\"hide\");\n  }\n\n  document.addEventListener(\"turbolinks:before-cache\", closeModals, {\n    passive: true\n  });\n}\n","const turbolinks = ($, w = window, doc = document) => {\n  var lastScrollPosition = null;\n  var scrollBehavior = null;\n  var redirectTimeout = null;\n  var navigationEventType = \"push\";\n  var currentUrl = getCurrentUrl();\n\n  w.addEventListener(\n    \"popstate\",\n    ev => {\n      navigationEventType = \"pop\";\n      var url = w.location.href;\n      if (redirectTimeout && !url.match(/redirect/)) {\n        w.clearTimeout(redirectTimeout);\n        redirectTimeout = null;\n      }\n      currentUrl = url;\n    },\n    { passive: true }\n  );\n\n  doc.addEventListener(\n    \"turbolinks:before-visit\",\n    ev => {\n      // cancel a previously set redirect timeout\n      if (redirectTimeout) {\n        w.clearTimeout(redirectTimeout);\n        redirectTimeout = null;\n      }\n\n      // for every visit, there is an active element. That active element probably doesn't say much about whether the\n      // page should scroll or not after it is loaded, so the default behaviour is to consider if the link is to the\n      // same page, and if it is, retain the same position. But if the active element indicated what scroll action to take\n      // then that preference should override the default behavior\n      lastScrollPosition = [w.scrollX, w.scrollY];\n      switch (\n        ev.srcElement.activeElement &&\n          ev.srcElement.activeElement.dataset &&\n          ev.srcElement.activeElement.dataset.scroll\n      ) {\n        // allow the page to scroll on focus, or not at all if there is no focus\n        case \"true\":\n          scrollBehavior = \"none\";\n          break;\n\n        // prevent any scrolling for any reason\n        case \"false\":\n          scrollBehavior = \"remember\";\n          break;\n\n        // decide remember the position if the current page and next page have the same path\n        // allow scroll if the new url is an anchor link on the same page\n        default:\n          if (samePathWithQueryString(ev.data.url, currentUrl)) {\n            scrollBehavior = \"remember\";\n          } else if (withAnchor(ev.data.url)) {\n            scrollBehavior = \"scroll\";\n          } else {\n            scrollBehavior = \"top\";\n          }\n      }\n    },\n    { passive: true }\n  );\n\n  doc.addEventListener(\n    \"turbolinks:render\",\n    () => {\n      // if it's cached render, not a real one, set the scroll/focus positions,\n      // but don't clear them until we have the true rendering.\n      const cachedRender =\n        doc.documentElement.getAttribute(\"data-turbolinks-preview\") === \"\";\n      if (!cachedRender && w.location.hash) {\n        const el = doc.getElementById(w.location.hash.slice(1));\n        if (el) {\n          focusAndExpand(el, $);\n        }\n      }\n\n      // scroll page depeneding on previously determined conditions\n      // only do this on pushes, if the user is going back in their history, let turbolinks restore the scroll position\n      if (navigationEventType == \"push\") {\n        switch (scrollBehavior) {\n          case \"remember\":\n            w.scrollTo.apply(window, lastScrollPosition);\n            break;\n\n          case \"top\":\n            w.scrollTo.apply(window, [0, 0]);\n        }\n      }\n\n      // reset history state to default\n      navigationEventType = \"push\";\n    },\n    { passive: true }\n  );\n\n  doc.addEventListener(\n    \"turbolinks:request-end\",\n    ev => {\n      // update the current url\n      currentUrl = getCurrentUrl();\n\n      // if a refresh header was receieved, enforce via javascript\n      var refreshHeader = ev.data.xhr.getResponseHeader(\"Refresh\");\n      if (!refreshHeader) {\n        return;\n      }\n\n      // parse data from the header\n      var refreshUrl = refreshHeader.substring(refreshHeader.indexOf(\"=\") + 1);\n      var refreshDelay = refreshHeader.split(\";\")[0] * 1000;\n\n      // redirect after 5 seconds\n      redirectTimeout = w.setTimeout(() => {\n        doc.location = refreshUrl;\n      }, refreshDelay);\n    },\n    { passive: true }\n  );\n};\n\nexport function samePathWithQueryString(first, second) {\n  return (\n    samePath(first, second, \"?\") &&\n    // Don't consider it the same path if we are switching tabs\n    !includesTabParam(first)\n  );\n}\n\nexport function samePathWithAnchor(first, second) {\n  return samePath(first, second, \"#\");\n}\n\nfunction samePath(first, second, suffix_char) {\n  return (\n    first.slice(0, second.length) === second &&\n    (first.length == second.length || first[second.length] === suffix_char)\n  );\n}\n\nfunction withAnchor(urlString) {\n  return urlString.includes(\"#\");\n}\n\nfunction includesTabParam(path) {\n  return path.split(\"?\").length >= 2 && path.split(\"?\")[1].includes(\"tab=\");\n}\n\nfunction getCurrentUrl() {\n  return `${window.location.protocol}//${window.location.host}${\n    window.location.pathname\n  }`;\n}\n\nfunction focusAndExpand(el, $) {\n  const nodeName = el.nodeName;\n  // if tabindex has been explicitly set, or if we're focusing a\n  // link, select, or input, then focus it directly. otherwise, find\n  // the first child link and focus that.\n  if (\n    el.getAttribute(\"tabindex\") === \"0\" ||\n    nodeName === \"A\" ||\n    nodeName === \"SELECT\" ||\n    nodeName === \"INPUT\"\n  ) {\n    el.focus();\n  } else {\n    const a = el.querySelector(\"a\");\n    if (a != null) {\n      a.focus();\n      // if the link we focused is the target for a collapse, then show\n      // the collapsed element\n      if (a.getAttribute(\"data-target\") == window.location.hash) {\n        $(el).collapse(\"show\");\n      }\n    }\n  }\n}\n\nexport default turbolinks;\n","/* eslint-disable */\nimport Filter from \"bad-words\";\n\n// Some FormData methods like .set or .get are not supported in IE:\n// (https://developer.mozilla.org/en-US/docs/Web/API/FormData#Browser_compatibility)\n// so we need to make use of a polyfill:\nimport FormData from \"formdata-polyfill\";\n\nexport default function($ = window.jQuery) {\n  document.addEventListener(\n    \"turbolinks:load\",\n    () => {\n      // TODO: create a way to run page-specific JS so that this hack isn't needed.\n      if (!document.getElementById(\"support-form\")) {\n        return;\n      }\n\n      window.nextTick(() => {\n        clearFallbacks($);\n\n        const toUpload = [];\n        setupPhotoPreviews($, toUpload);\n        setupTextArea();\n        setupRequestResponse($);\n        setupSubject($);\n        setupValidation($);\n\n        handleSubmitClick($, toUpload);\n        handleModeChangeSelection($);\n        handleSubjectChange($);\n      });\n    },\n    { passive: true }\n  );\n}\n\nexport function handleModeChangeSelection($) {\n  const modeOptionsEl = document.getElementById(\"js-routes-by-mode\");\n  const modeOptions = JSON.parse(modeOptionsEl.innerHTML);\n\n  const vehicleLabels = {\n    bus: \"Bus\",\n    commuter_rail: \"Train\",\n    subway: \"Vehicle\",\n    ferry: \"Boat\"\n  };\n\n  // initially hide the choices for route and vehicle\n  $(\"#route-and-vehicle\").hide();\n\n  const modeSelect = document.getElementById(\"support_mode\");\n  modeSelect.addEventListener(\n    \"change\",\n    ev => {\n      // empty contents of the select first:\n      $(\"#support_route\").empty();\n\n      const routeSelect = document.getElementById(\"support_route\");\n\n      // Get the text property of the <option> selected\n      // and build key in order to access the 'modeOptions' object\n\n      // .selectedOptions is not supported by IE so a workaround is needed:\n      const selectedText = ev.target.selectedOptions\n        ? ev.target.selectedOptions[0].text\n        : ev.target.options[ev.target.selectedIndex].innerText;\n\n      const key = selectedText\n        .split(\" \")\n        .map(el => el.toLowerCase())\n        .join(\"_\");\n\n      const opts = modeOptions[`${key}_options`];\n\n      if (!!opts) {\n        $(\"#route-and-vehicle\").show();\n        // update label:\n        $(\"#vehicleLabel\").text(`${vehicleLabels[key]} number`);\n\n        // Create options for the select (prepending an extra one for 'Select'):\n        const option = document.createElement(\"option\");\n        option.text = \"Select\";\n        option.value = \" \";\n        routeSelect.appendChild(option);\n\n        opts.forEach(element => {\n          const opt = document.createElement(\"option\");\n          opt.text = element;\n          opt.value = element;\n          routeSelect.appendChild(opt);\n        });\n      } else {\n        $(\"#route-and-vehicle\").hide();\n      }\n    },\n    { passive: true }\n  );\n}\n\n// Set a few things since we know we don't need the no-JS fallbacks\nexport function clearFallbacks($) {\n  const $photoLink = $(\"#upload-photo-link\"),\n    $photoInput = $(\"#photo\");\n  // Remove tabindex manipulation for screenreaders\n  $photoLink.removeAttr(\"tabindex\");\n  // Forward clicks from the button to the input\n  $photoLink.click(function(event) {\n    event.preventDefault();\n    $photoInput.click();\n  });\n}\n\n// Adds the uploaded photo previews\nfunction setupPhotoPreviews($, toUpload) {\n  const $container = $(\".photo-preview-container\");\n  $(\"#photo\").change(function() {\n    if (this.files.length >= 1) {\n      resizeAndHandleUploadedFile($, this.files[0], $container, toUpload);\n    }\n  });\n}\n\nconst resizeAndHandleUploadedFile = ($, file, $container, toUpload) => {\n  if (/image\\//.test(file.type)) {\n    resizeImage(file)\n      .then(newFile => {\n        newFile.name = file.name;\n        handleUploadedPhoto($, newFile, $container, toUpload);\n        $(\"#support-upload-error-container\").addClass(\"hidden-xs-up\");\n      })\n      .catch(err => {\n        displayError($, \"#upload\");\n        $(\"#upload-photo-error\").html(\n          \"Sorry. We had trouble uploading your image. Please try again.\"\n        );\n      });\n  } else {\n    displayError($, \"#upload\");\n    $(\"#upload-photo-error\").html(\n      \"We couldn't upload your file. Please make sure it's an image and try again.\"\n    );\n  }\n  $container.focus();\n};\n\n// Split out for testing, since the content of a file input can't be\n// changed programmatically for security reasons\nexport function handleUploadedPhoto($, file, $container, toUpload) {\n  toUpload.push(file);\n  hideOrShowPreviews($container, toUpload);\n\n  let preview = new PhotoPreview($, file)\n    .addClickHandler($container, toUpload)\n    .div();\n  $container.append(preview);\n}\n\nconst resizeImage = file =>\n  new Promise((resolve, reject) => {\n    const fr = new FileReader();\n    fr.onerror = () => {\n      fr.abort();\n      reject(new DOMException(\"Error parsing file.\"));\n    };\n    fr.onload = () => {\n      const img = new Image();\n      img.onload = () => {\n        const dim = rescale({ width: img.width, height: img.height });\n        const canvas = document.createElement(\"canvas\");\n        canvas.width = dim.width;\n        canvas.height = dim.height;\n        const ctx = canvas.getContext(\"2d\");\n        ctx.drawImage(img, 0, 0, dim.width, dim.height);\n        if (canvas.msToBlob) {\n          // Special for IE\n          resolve(canvas.msToBlob());\n        } else {\n          // Works for all other browsers\n          canvas.toBlob(blob => {\n            resolve(blob);\n          }, \"image/jpeg\");\n        }\n      };\n      img.src = fr.result;\n    };\n    fr.readAsDataURL(file);\n  });\n\nexport function rescale(dim) {\n  const maxDim = 1000;\n  if (dim.width <= maxDim && dim.height <= maxDim) {\n    return dim;\n  }\n  if (dim.width > dim.height) {\n    const ratio = dim.height / dim.width;\n    dim.width = maxDim;\n    dim.height = maxDim * ratio;\n  } else {\n    const ratio = dim.width / dim.height;\n    dim.height = maxDim;\n    dim.width = maxDim * ratio;\n  }\n  return dim;\n}\n\nfunction hideOrShowPreviews($container, toUpload) {\n  if (toUpload.length > 0) {\n    $container.removeClass(\"hidden-xs-up\");\n  } else {\n    $container.addClass(\"hidden-xs-up\");\n  }\n}\n\nfunction PhotoPreview($, file) {\n  const filesize = require(\"filesize\");\n\n  let $div = $(`\n    <div class=\"photo-preview\">\n      <div class=\"clear-upload-container\">\n        <img height=\"64\" class=\"m-r-1\" alt=\"Uploaded image ${\n          file.name\n        } preview\"></img>\n        <div class=\"clear-photo\">\n          <i class=\"fa fa-circle fa-stack-1x\" style=\"color: white\" aria-hidden=\"true\"></i>\n          <i class=\"fa fa-times-circle fa-stack-1x\" aria-hidden=\"true\"></i>\n          <span class=\"sr-only\">Clear Photo Upload</span>\n        </div>\n      </div>\n    </div>\n  `);\n\n  let reader = new FileReader();\n  reader.onloadend = () => {\n    $div.find(\"img\")[0].src = reader.result;\n  };\n  reader.readAsDataURL(file);\n\n  this.addClickHandler = function($container, toUpload) {\n    $div.find(\".clear-photo\").click(event => {\n      event.preventDefault();\n\n      let index = toUpload.indexOf(file);\n      toUpload.splice(index, 1);\n      $div.remove();\n\n      hideOrShowPreviews($container, toUpload);\n    });\n    return this;\n  };\n\n  this.div = function() {\n    return $div;\n  };\n}\n\nexport function setupTextArea() {\n  // Track the number of characters in the main <textarea>\n  const commentsNode = document.getElementById(\"comments\"),\n    formTextNode = findSiblingWithClass(commentsNode, \"form-text\");\n  commentsNode.addEventListener(\n    \"keyup\",\n    ev => {\n      // .textLength is not supported in IE\n      // (https://developer.mozilla.org/en-US/docs/Web/API/HTMLTextAreaElement#Browser_compatibility)\n      const commentLength = commentsNode.value.length;\n      formTextNode.innerHTML = commentLength + \"/3000 characters\";\n      if (commentLength > 0) {\n        formTextNode.className += \" support-comment-success\";\n        formTextNode.parentNode.className += \" has-success\";\n      } else {\n        removeClass(formTextNode, \"support-comment-success\");\n        removeClass(formTextNode.parentNode, \"has-success\");\n      }\n    },\n    { passive: true }\n  );\n}\n\nexport function setupSubject($) {\n  const support_service_opts = JSON.parse(\n    document.getElementById(\"js-subjects-by-service\").innerHTML\n  );\n\n  // initially hide the choices for subject\n  $(\"#subject\").hide();\n\n  // show the field once a category is selected\n  $(\"[name='support[service]']\").change(function() {\n    const selectedCategory = $(\"[name='support[service]']:checked\").val();\n    const selectedOptions = support_service_opts[selectedCategory];\n    if (selectedOptions) {\n      // remove all <options> except the first\n      $(\"#support_subject option\")\n        .nextAll()\n        .remove();\n      $(\"#support_subject\").append(\n        selectedOptions.map(\n          opt => `<option value=${encodeURIComponent(opt)}>${opt}</option>`\n        )\n      );\n      $(\"#subject\").show();\n    } else {\n      $(\"#subject\").hide();\n    }\n  });\n}\n\nfunction findSiblingWithClass(node, className) {\n  node = node.nextElementSibling;\n  while (node && node.className.indexOf(className) === -1) {\n    node = node.nextElementSibling;\n  }\n  return node;\n}\nfunction removeClass(node, className) {\n  node.className = node.className.replace(className, \"\");\n}\n\nexport function setupRequestResponse($) {\n  $(\"#no_request_response\").change(function() {\n    $(\"#contactInfoForm\").toggle(!$(this).is(\":checked\"));\n  });\n}\n\nconst validators = {\n  comments: function($) {\n    return $(\"#comments\").val().length !== 0;\n  },\n  support_subject: function($) {\n    return $(\"#support_subject\").val().length !== 0;\n  },\n  service: function($) {\n    return !!$(\"[name='support[service]']:checked\").val();\n  },\n  first_name: function($) {\n    if (responseRequested($)) {\n      return $(\"#first_name\").val().length !== 0;\n    }\n    return true;\n  },\n  last_name: function($) {\n    if (responseRequested($)) {\n      return $(\"#last_name\").val().length !== 0;\n    }\n    return true;\n  },\n  email: function($) {\n    if (responseRequested($)) {\n      return (\n        $(\"#email\")\n          .val()\n          .trim()\n          .match(/.+\\@.+\\..+/) !== null\n      );\n    }\n    return true;\n  },\n  privacy: function($) {\n    if (responseRequested($)) {\n      return $(\"#privacy\").prop(\"checked\");\n    }\n    return true;\n  },\n  recaptcha: function($) {\n    return !!$(\"#g-recaptcha-response\").val();\n  },\n  vehicle: function($) {\n    const value = $(\"#vehicle\").val();\n    return /^[0-9]*$/.test(value);\n  }\n};\n\nfunction responseRequested($) {\n  return !$(\"#no_request_response\")[0].checked;\n}\n\nfunction setupValidation($) {\n  [\n    \"#privacy\",\n    \"#support_subject\",\n    \"#comments\",\n    \"#email\",\n    \"#first_name\",\n    \"#last_name\",\n    \"#vehicle\"\n  ].forEach(selector => {\n    const $selector = $(selector);\n    $selector.on(\"keyup blur input change\", () => {\n      if (validators[selector.slice(1)]($)) {\n        displaySuccess($, selector);\n      }\n    });\n  });\n}\n\nfunction displayError($, selector) {\n  const rootSelector = selector.slice(1);\n  $(`.support-${rootSelector}-error-container`).removeClass(\"hidden-xs-up\");\n  $(selector)\n    .parent()\n    .addClass(\"has-danger\")\n    .removeClass(\"has-success\");\n}\n\nfunction displaySuccess($, selector) {\n  $(`.support-${selector.slice(1)}-error-container`).addClass(\"hidden-xs-up\");\n  $(selector)\n    .parent()\n    .removeClass(\"has-danger\")\n    .addClass(\"has-success\");\n}\n\nfunction validateForm($) {\n  const privacy = \"#privacy\",\n    subject = \"#support_subject\",\n    comments = \"#comments\",\n    service = \"#service\",\n    vehicle = \"#vehicle\",\n    email = \"#email\",\n    first_name = \"#first_name\",\n    last_name = \"#last_name\",\n    recaptcha = \"#g-recaptcha-response\",\n    errors = [];\n  // Service\n  if (!validators.service($)) {\n    displayError($, service);\n    errors.push(service);\n  } else {\n    displaySuccess($, service);\n  }\n  // Subject\n  if (!validators.support_subject($)) {\n    displayError($, subject);\n    errors.push(subject);\n  } else {\n    displaySuccess($, subject);\n  }\n  // Main textarea\n  if (!validators.comments($)) {\n    displayError($, comments);\n    errors.push(comments);\n  } else {\n    displaySuccess($, comments);\n  }\n  // Name\n  if (!validators.first_name($)) {\n    displayError($, first_name);\n    errors.push(first_name);\n  } else {\n    displaySuccess($, first_name);\n  }\n  if (!validators.last_name($)) {\n    displayError($, last_name);\n    errors.push(last_name);\n  } else {\n    displaySuccess($, last_name);\n  }\n  // Vehicle number\n  if (!validators.vehicle($)) {\n    displayError($, vehicle);\n    errors.push(vehicle);\n  } else {\n    displaySuccess($, vehicle);\n  }\n  // Phone and email\n  if (!validators.email($)) {\n    displayError($, email);\n    errors.push(email);\n  } else {\n    displaySuccess($, email);\n  }\n  // Privacy checkbox\n  if (!validators.privacy($)) {\n    displayError($, privacy);\n    errors.push(privacy);\n  } else {\n    displaySuccess($, privacy);\n  }\n  // reCAPTCHA\n  if (!validators.recaptcha($)) {\n    displayError($, recaptcha);\n    errors.push(recaptcha);\n  } else {\n    displaySuccess($, recaptcha);\n  }\n  focusError($, errors);\n  return errors.length === 0;\n}\n\nfunction focusError($, errors) {\n  if (errors.length > 0) {\n    $(`.support-${errors[0].slice(1)}-error-container`).focus();\n  }\n}\n\nfunction deactivateSubmitButton($) {\n  $(\"#support-submit\").prop(\"disabled\", true);\n  $(\".waiting\").removeAttr(\"hidden\");\n  $(\"#support-submit\").trigger(\"waiting:start\");\n}\n\nfunction reactivateSubmitButton($) {\n  $(\"#support-submit\").prop(\"disabled\", false);\n  $(\".waiting\").attr(\"hidden\", \"hidden\");\n  $(\"#support-submit\").trigger(\"waiting:end\");\n}\n\nexport function handleSubmitClick($, toUpload) {\n  $(\"#support-submit\").click(function(event) {\n    // Use an npm-installed library for testing\n    const FormData = window.FormData ? window.FormData : require(\"form-data\"),\n      valid = validateForm($);\n    event.preventDefault();\n    if (!valid) {\n      return;\n    }\n    deactivateSubmitButton($);\n    const formData = new FormData();\n    const filter = new Filter();\n    $(\"#support-form\")\n      .serializeArray()\n      .forEach(({ name: name, value: value }) => {\n        if (name === \"support[comments]\") {\n          value = filter.clean(value);\n        }\n        formData.append(name, value);\n      });\n\n    // overwrite subject value with the decoded content:\n    const encodedSubjectValue = formData.get(\"support[subject]\");\n    formData.set(\"support[subject]\", decodeURIComponent(encodedSubjectValue));\n\n    toUpload.forEach(photo => {\n      formData.append(\"support[photos][]\", photo, photo.name);\n    });\n    $.ajax({\n      url: $(\"#support-form\").attr(\"action\"),\n      method: \"POST\",\n      processData: false,\n      data: formData,\n      contentType: false,\n      success: () => {\n        $(\".support-confirmation--success\")\n          .removeClass(\"hidden-xs-up\")\n          .focus();\n        $(\".support-confirmation--error\").addClass(\"hidden-xs-up\");\n        reactivateSubmitButton($);\n        $(\"#support-form\").remove();\n      },\n      error: () => {\n        $(\".support-confirmation--error\")\n          .removeClass(\"hidden-xs-up\")\n          .focus();\n        reactivateSubmitButton($);\n      }\n    });\n  });\n}\n\nexport function handleSubjectChange($) {\n  $(\"#charlie-card-or-ticket-number\").hide();\n  const subjectEl = document.getElementById(\"support_subject\");\n  subjectEl.addEventListener(\"change\", ev => {\n    const optionText = ev.target.options[ev.target.selectedIndex].text;\n    if (ev.target.value === encodeURIComponent(\"CharlieCards & Tickets\")) {\n      $(\"#charlie-card-or-ticket-number\").show();\n    } else {\n      $(\"#charlie-card-or-ticket-number\").hide();\n    }\n  });\n}\n","// Sets up event listeners that activate the fixedSticky plugin at ../vendor/fixedsticky.js\n\nexport default function($) {\n  $ = $ || window.jQuery;\n\n  function fixedsticky() {\n    $(\".fixedsticky\").fixedsticky(\"destroy\");\n    $(\".fixedsticky\").fixedsticky();\n  }\n  document.addEventListener(\n    \"turbolinks:load\",\n    () => window.nextTick(fixedsticky),\n    { passive: true }\n  );\n  document.addEventListener(\n    \"shown.bs.collapse\",\n    () => window.nextTick(fixedsticky),\n    { passive: true }\n  );\n}\n","export default function($ = window.jQuery) {\n  $('.desktop-nav-link[data-parent=\"#desktop-menu\"]').click(clickHandler($));\n}\n\n// Exported for testing\nexport function clickHandler($) {\n  return function(event) {\n    if (event.ctrlKey || event.metaKey) {\n      // ctrl for Windows, meta for others\n      const $this = $(this),\n        href = $(this).attr(\"href\");\n      event.preventDefault();\n      event.stopPropagation();\n      window.open(href, \"_blank\");\n    }\n  };\n}\n","export default function($) {\n  $ = $ || window.jQuery;\n\n  function setupCarousel() {\n    $(\".carousel\").each((_index, carousel) => {\n      $(carousel)\n        .on(\"click\", \".carousel-item\", activateCarouselItem)\n        .on(\"keydown\", \".carousel-item\", ev => {\n          if (ev.keyCode === 13 || ev.keyCode === 32) {\n            activateCarouselItem(ev);\n          }\n        })\n        .find(\".carousel-item:first-child\")\n        .click();\n    });\n  }\n\n  function activateCarouselItem(ev) {\n    ev.preventDefault();\n    const $item = $(ev.currentTarget);\n    const $target = $(ev.delegateTarget.getAttribute(\"data-target\"));\n    $target.html($item.children().clone());\n  }\n\n  document.addEventListener(\n    \"turbolinks:load\",\n    () => window.nextTick(setupCarousel),\n    { passive: true }\n  );\n}\n","export default function(\n  $ = window.jQuery,\n  doc = document,\n  navigator = window.navigator\n) {\n  if (\"geolocation\" in navigator) {\n    doc.addEventListener(\"turbolinks:before-visit\", beforeVisit($), {\n      passive: true\n    });\n    $(document).on(\n      \"click\",\n      \"[data-geolocation-target]\",\n      clickHandler($, navigator)\n    );\n  } else {\n    doc.documentElement.className += \" geolocation-disabled\";\n  }\n}\n\nfunction beforeVisit($) {\n  return () => {\n    $(\".loading-indicator, .location-error\").addClass(\"hidden-xs-up\");\n  };\n}\n\n// These functions are exported for testing\nexport function clickHandler($, navigator) {\n  return event => {\n    event.preventDefault();\n    const $btn = locationButton($(event.target));\n    const $errorEl = $(`#${$btn.data(\"id\")}-geolocation-error`);\n    toggleLoadingIndicator($, $btn);\n    $errorEl.addClass(\"hidden-xs-up\");\n    navigator.geolocation.getCurrentPosition(\n      locationHandler($, $btn, $errorEl),\n      locationError($, $btn, $errorEl)\n    );\n  };\n}\n\nexport function locationHandler($, $btn, $errorEl) {\n  return location => {\n    const id = $btn.data(\"id\");\n    const field = $btn.data(\"field\");\n    $(`#${id}`).trigger(\"geolocation:complete\", location);\n  };\n}\n\nexport function locationError($, $btn, $errorEl) {\n  return error => {\n    $btn.find(\".loading-indicator\").addClass(\"hidden-xs-up\");\n    if (\n      error.code == error.TIMEOUT ||\n      error.code == error.POSITION_UNAVAILABLE\n    ) {\n      $errorEl.removeClass(\"hidden-xs-up\");\n      $errorEl.html(\n        \"We couldn't fetch your location &mdash; please wait a minute and try again, or enter your address.\"\n      );\n    } else if (error.code == error.PERMISSION_DENIED) {\n      $errorEl.removeClass(\"hidden-xs-up\");\n      $errorEl.html(\n        \"It looks like you haven't granted permission to fetch your location &mdash; to use geolocation, update your browser's settings and try again.\"\n      );\n    }\n  };\n}\n\nfunction toggleLoadingIndicator($, $btn) {\n  const id = $btn.data(\"id\");\n  const $indicator = $btn.find(\".loading-indicator\");\n  $indicator.removeClass(\"hidden-xs-up\");\n  $(`#${id}`).on(\"geolocation:complete\", () => {\n    $indicator.addClass(\"hidden-xs-up\");\n  });\n}\n\nfunction locationButton($el) {\n  var target = $el;\n  while (!target.data().geolocationTarget) {\n    target = target.parent();\n  }\n  return target;\n}\n","export default function() {\n  function setupLocationInput() {\n    const transitNearMeInput = document.getElementById(\"address-search-input\");\n\n    // only load on pages that are using the location input\n    if (!transitNearMeInput) {\n      return;\n    }\n\n    transitNearMeInput.form.addEventListener(\"submit\", ev =>\n      validateLocationForm(ev, window.location, transitNearMeInput)\n    );\n  }\n\n  document.addEventListener(\"turbolinks:load\", setupLocationInput, {\n    passive: true\n  });\n  $(document).on(\n    \"autocomplete:added\",\n    \"#address-search-input\",\n    addLocationChangeCallback\n  );\n  $(document).on(\n    \"geolocation:complete\",\n    \"#address-search-input\",\n    geolocationCallback\n  );\n}\n\n// Functions exported for testing //\n\nexport function getUrlParameter(sParam, search_string) {\n  const sPageURL = decodeURIComponent(search_string.substring(1)),\n    sURLVariables = sPageURL.split(\"&\");\n  var sParameterName, i;\n\n  for (i = 0; i < sURLVariables.length; i++) {\n    sParameterName = sURLVariables[i].split(\"=\");\n\n    if (sParameterName[0] === sParam) {\n      return sParameterName[1] === undefined ? true : sParameterName[1];\n    }\n  }\n  return null;\n}\n\n// Determines if form should be re-submitted. If place name has not changed\n// Do not resubmit the form\n// This is done to preserve the names of landmarks\nexport function validateLocationForm(event, location, input) {\n  const val = input.value;\n  const name = input.getAttribute(\"name\");\n  if (val === getUrlParameter(name, location.search)) {\n    event.preventDefault();\n    location.reload();\n    return false;\n  }\n  return true;\n}\n\nexport function constructUrl(place, input) {\n  const id = input.getAttribute(\"id\");\n  const name = input.getAttribute(\"name\");\n  var query_str;\n  const loc = window.location,\n    location_url = loc.protocol + \"//\" + loc.host + loc.pathname,\n    addr = input.value;\n\n  if (place.geometry) {\n    const lat = place.geometry.location.lat();\n    const lng = place.geometry.location.lng();\n    query_str =\n      \"?latitude=\" +\n      lat +\n      \"&longitude=\" +\n      lng +\n      \"&\" +\n      name +\n      \"=\" +\n      addr +\n      \"#\" +\n      id;\n  } else {\n    query_str = \"?\" + name + \"=\" + place.name + \"#\" + id;\n  }\n  return location_url + query_str;\n}\n\nexport function addLocationChangedEventListener(autocomplete, input) {\n  function onPlaceChanged() {\n    const locationUrl = constructUrl(autocomplete.getPlace(), input);\n    window.location.href = encodeURI(locationUrl);\n  }\n  google.maps.event.addListener(autocomplete, \"place_changed\", onPlaceChanged);\n}\n\nfunction addLocationChangeCallback(ev, autocomplete) {\n  addLocationChangedEventListener(autocomplete, ev.target);\n}\n\nfunction geolocationCallback(ev, location) {\n  const path = `${window.location.protocol}//${window.location.host}${\n    window.location.pathname\n  }`;\n  const qs = `?latitude=${location.coords.latitude}&longitude=${\n    location.coords.longitude\n  }`;\n  window.location.href = encodeURI(path + qs + \"#address-search-input\");\n}\n","import { doWhenGoogleMapsIsReady } from \"./google-maps-loaded\";\n\nexport default function() {\n  doWhenGoogleMapsIsReady(() => {\n    document.addEventListener(\"turbolinks:load\", setupAutocomplete, {\n      passive: true\n    });\n    setupAutocomplete();\n  });\n}\n\nfunction setupAutocomplete() {\n  const $elements = $(\"[data-autocomplete=true]\");\n\n  // do nothing if there are no autocomplete elements on the page\n  if ($elements.length == 0) {\n    return;\n  }\n\n  // these are the same bounds we use for OpenTripPlanner\n  const mbtaWatershedBounds = new google.maps.LatLngBounds(\n    new google.maps.LatLng(41.3193, -71.938),\n    new google.maps.LatLng(42.8266, -69.6189)\n  );\n  const options = {\n    strictBounds: true,\n    bounds: mbtaWatershedBounds\n  };\n\n  $elements.each(function(idx, input) {\n    const autocomplete = new google.maps.places.Autocomplete(input, options);\n    $(input).trigger(\"autocomplete:added\", autocomplete);\n\n    addLatLngListeners($, google.maps.event, autocomplete, input.id);\n  });\n}\n\nexport function addLatLngListeners($, event, autocomplete, id) {\n  const $latInput = $(`#${id}_latitude`);\n  const $lngInput = $(`#${id}_longitude`);\n\n  if ($latInput.length && $lngInput.length) {\n    const onPlaceChanged = placeChangedCallback(\n      autocomplete,\n      $latInput,\n      $lngInput\n    );\n\n    event.addListener(autocomplete, \"place_changed\", onPlaceChanged);\n  }\n}\n\nfunction placeChangedCallback(autocomplete, $latInput, $lngInput) {\n  return function() {\n    const place = autocomplete.getPlace();\n\n    if (place.geometry) {\n      const lat = place.geometry.location.lat();\n      const lng = place.geometry.location.lng();\n\n      $latInput.val(lat);\n      $lngInput.val(lng);\n    } else {\n      $latInput.val(\"\");\n      $lngInput.val(\"\");\n    }\n  };\n}\n","// maximum wait time to get a reference to Google Translate select DOM element\nconst domPollLimitMilliseconds = 10000;\n\n// default value for language\nlet currentLanguage = \"en\";\n\n// setTimeout callback for tracking mutations\n// this is used because the Google Translate component mutates the DOM\nlet domMutateCallback;\n\nconst languages = [\n  [\"ar\", \"Arabic\"],\n  [\"zh-CN\", \"Chinese (Simplified)\"],\n  [\"zh-TW\", \"Chinese (Traditional)\"],\n  [\"fr\", \"French\"],\n  [\"en\", \"English\"],\n  [\"ht\", \"Haitian Creole\"],\n  [\"it\", \"Italian\"],\n  [\"km\", \"Khmer\"],\n  [\"ko\", \"Korean\"],\n  [\"pl\", \"Polish\"],\n  [\"pt\", \"Portuguese\"],\n  [\"ru\", \"Russian\"],\n  [\"es\", \"Spanish\"],\n  [\"vi\", \"Vietnamese\"]\n];\n\nexport default () =>\n  document.addEventListener(\"turbolinks:load\", handleTranslation);\n\n// await reading the google translate component\nconst handleTranslation = () =>\n  getTranslateElement()\n    .then(translateEl => {\n      registerEvents(translateEl);\n      render();\n    })\n    .catch(_err => {\n      // catch, but ignore errors\n    });\n\nconst getTranslateElement = () =>\n  new Promise((resolve, reject) => {\n    pollDomForGoogleTranslateEl(200, resolve, reject);\n  });\n\n// if the dom element couldn't be found in 10 seconds (6 iterations), stop trying\nconst pollDomForGoogleTranslateEl = (delay, resolve, reject) =>\n  delay > domPollLimitMilliseconds\n    ? reject(\"taking too long to find element\")\n    : setTimeout(() => {\n        const translateEl = document.querySelector(\".goog-te-combo\");\n        if (translateEl) {\n          resolve(translateEl);\n        } else {\n          // double the delay and retry\n          pollDomForGoogleTranslateEl(delay * 2, resolve, reject);\n        }\n      }, delay);\n\nconst registerEvents = translateEl => {\n  // initialize current language\n  currentLanguage = getSelectedTranslation(translateEl);\n\n  // detect when the language has been changed from outside\n  // this works because Google's JS mutates the DOM\n  translateEl.addEventListener(\"DOMNodeInserted\", () => {\n    if (domMutateCallback) {\n      clearTimeout(domMutateCallback);\n    }\n    domMutateCallback = setTimeout(() => {\n      const updatedLanguage = getSelectedTranslation(translateEl);\n      if (currentLanguage !== updatedLanguage) {\n        currentLanguage = updatedLanguage;\n        render();\n      }\n    }, 500);\n  });\n};\n\n// read select DOM el, if possible\nconst getSelectedTranslation = el =>\n  el &&\n  el.options &&\n  el.options[el.selectedIndex] &&\n  el.options[el.selectedIndex].value\n    ? el.options[el.selectedIndex].value\n    : \"en\";\n\n// change the language in the component, trigger and event for it\nconst setTranslation = (translateEl, language) => {\n  currentLanguage = language;\n  translateEl.value = language;\n\n  let event;\n  if (typeof Event === \"function\") {\n    event = new Event(\"change\", { bubbles: true, cancelable: false });\n  } else {\n    event = document.createEvent(\"Event\");\n    event.initEvent(\"change\", true, false);\n  }\n  translateEl.dispatchEvent(event);\n};\n\nconst render = () => {\n  // render desktop\n  document.getElementById(\n    \"custom-language-selector\"\n  ).innerHTML = `${renderCustomDesktopSelect()}${renderCustomDesktopMenu()}`;\n\n  // render mobile\n  document.getElementById(\n    \"custom-language-button-mobile\"\n  ).innerHTML = renderCustomMobileSelect();\n\n  document.getElementById(\n    \"custom-language-menu-mobile\"\n  ).innerHTML = renderCustomMobileMenu();\n\n  // handle keyboard events on links\n  document\n    .getElementById(\"custom-language-selector\")\n    .addEventListener(\"keyup\", triggerClick(\"language-menu-toggle\"));\n  document\n    .getElementById(\"custom-language-selector-mobile\")\n    .addEventListener(\"keyup\", triggerClick(\"custom-language-selector-mobile\"));\n\n  // add DOM event handling to rendered links in menu\n  registerLinkEvents();\n};\n\nconst renderCustomDesktopSelect = () =>\n  `<a tabindex=\"0\" id=\"language-menu-toggle\" class=\"notranslate desktop-nav-link js-header-link navbar-toggle toggle-up-down collapsed\" aria-expanded=\"false\" aria-controls=\"languageMenu\" data-parent=\"#desktop-menu\" data-target=\"#languageMenu\" role=\"tab\" data-toggle=\"collapse\">\n    <div class=\"nav-link-content js-header-link__content\">\n      <span class=\"nav-link-name\"><i class=\"fa fa-globe\" aria-hidden=\"true\"></i> ${currentLanguage.toUpperCase()}</span>\n      <div class=\"nav-link-arrows js-header-link__carets\">\n        <i class=\"fa fa-angle-up up\" aria-hidden=\"true\"></i>\n        <i class=\"fa fa-angle-down down\" aria-hidden=\"true\"></i>\n      </div>\n    </div>\n  </a>`;\n\nconst renderCustomDesktopMenu = () => `\n  <div class=\"desktop-menu desktop-menu--language\">\n    <div class=\"container\">\n      <div class=\"desktop-menu-body panel\">\n        <div class=\"collapse\" id=\"languageMenu\" role=\"tabpanel\" aria-expanded=\"false\">\n          <div class=\"col-xs-4 header-column\">\n            <div class=\"col-xs-12 p-a-0\">\n              <ul class=\"language__linkcontainer\">\n              ${languages\n                .map(\n                  ([code, name]) =>\n                    `<li><a tabindex=\"0\" class=\"language__link ${\n                      code === currentLanguage ? \"language__link--active\" : \"\"\n                    }\" data-toggle=\"language\" data-lang=\"${code}\">${name}</a></li>`\n                )\n                .join(\"\")}\n              </ul>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n`;\n\nconst renderCustomMobileSelect = () =>\n  `<button id=\"custom-language-selector-mobile\" tabindex=\"0\" class=\"u-pointer navbar-toggle-moble--language navbar-toggle navbar-toggle-mobile collapsed toggle-up-down\" aria-expanded=\"false\" type=\"button\" data-toggle=\"collapse\" data-target=\"#languageMenuMobile\">\n    <div class=\"nav-link-content js-header-link__content\">\n      <span class=\"nav-link-name notranslate\"><i class=\"fa fa-globe\" aria-hidden=\"true\"></i> ${currentLanguage.toUpperCase()}</span>\n      <div class=\"nav-link-arrows js-header-link__carets\">\n        <i class=\"fa fa-angle-up up\" aria-hidden=\"true\"></i>\n        <i class=\"fa fa-angle-down down\" aria-hidden=\"true\"></i>\n      </div>\n    </div>\n  </button>`;\n\nconst renderCustomMobileMenu = () => `\n  <nav class=\"row collapse\" id=\"languageMenuMobile\" role=\"navigation\" aria-expanded=\"true\">\n    <ul class=\"mobile-nav\">\n    ${languages\n      .map(\n        ([code, name]) =>\n          `<li class=\"mobile-nav-item\"><a tabindex=\"0\" class=\"language__link language__link--mobile ${\n            code === currentLanguage ? \"language__link--mobile-active\" : \"\"\n          }\" data-toggle=\"language\" data-lang=\"${code}\">${name}</a></li>`\n      )\n      .join(\"\")}\n    </ul>\n  </nav>\n`;\n\nconst registerLinkEvents = () => {\n  const translateEl = document.querySelector(\".goog-te-combo\");\n  [...document.querySelectorAll(\"a[data-toggle='language']\")].forEach(\n    linkEl => {\n      linkEl.addEventListener(\n        \"click\",\n        event => {\n          setTranslation(translateEl, event.target.getAttribute(\"data-lang\"));\n          render();\n        },\n        false\n      );\n      linkEl.addEventListener(\"keyup\", triggerClick());\n    }\n  );\n};\n\nconst triggerClick = target => event => {\n  // pressing enter is a click\n  if ((event.keyCode || event.which) !== 13) {\n    return;\n  }\n  event.preventDefault();\n  event.stopPropagation();\n  target ? document.getElementById(target).click() : event.target.click();\n};\n","export default () => {\n  document.addEventListener(\"turbolinks:load\", scrollTo, { passive: true });\n};\n\nconst scrollTo = () => {\n  window.requestAnimationFrame(() => {\n    const initialElToScrollTo = document.querySelector(\"[data-scroll-to]\");\n    if (initialElToScrollTo) {\n      doScrollTo(initialElToScrollTo);\n    }\n  });\n};\n\nconst doScrollTo = el => {\n  const childLeft = el.offsetLeft;\n  const parentLeft = el.parentNode.offsetLeft;\n  const firstSiblingWidth = firstSibling(el).clientWidth;\n\n  // childLeft - parentLeft scrolls the first row to the start of the\n  // visible area.\n  const scrollLeft = childLeft - parentLeft - firstSiblingWidth;\n  let table = el.parentNode;\n  while (table.nodeName !== \"TABLE\") {\n    table = table.parentNode;\n  }\n  table.parentNode.scrollLeft = scrollLeft;\n};\n\nconst firstSibling = element => {\n  const sibling = element.parentNode.firstChild;\n  if (sibling.nodeType === 1) {\n    return sibling;\n  } else if (sibling) {\n    return sibling.nextElementSibling;\n  } else {\n    return null;\n  }\n};\n","// Sourced from https://gist.github.com/alekseyg/d2261e42a9b5335a8ce0774b4d92f129 with small\n// modifications. Fixes being unable to dismiss tooltips on iOS devices.\n\nexport default function($) {\n  $ = $ || window.jQuery;\n  const selector = '[data-toggle=\"tooltip\"]';\n\n  const wasTapped = element => {\n    const touchStart = element.data(\"lastTouchStart\");\n    const touchEnd = element.data(\"lastTouchEnd\");\n    return (\n      touchStart &&\n      touchEnd &&\n      touchEnd.timeStamp - touchStart.timeStamp <= 500 && // duration\n      Math.abs(touchEnd.pageX - touchStart.pageX) <= 10 && // deltaX\n      Math.abs(touchEnd.pageY - touchStart.pageY) <= 10 // deltaY\n    );\n  };\n\n  const wasTouchedRecently = element => {\n    const lastTouch =\n      element.data(\"lastTouchEnd\") || element.data(\"lastTouchStart\");\n    return lastTouch && new Date() - lastTouch.timeStamp <= 550;\n  };\n\n  const hideTooltip = element => {\n    window.setTimeout(() => {\n      element.tooltip(\"hide\");\n    }, 10);\n  };\n\n  const initTooltip = () => {\n    $(selector).each(function(i, el) {\n      $(el).tooltip({ container: $(el).parent() });\n    });\n\n    $(document).on(\"touchstart\", selector, function(e) {\n      $(this).data(\"lastTouchStart\", e.originalEvent);\n    });\n    $(document).on(\"touchend\", selector, function(e) {\n      e.stopPropagation();\n      const $this = $(this);\n      $this.data(\"lastTouchEnd\", e.originalEvent);\n\n      if (wasTapped($this)) {\n        $this.tooltip(\"toggle\");\n      }\n    });\n    $(document).on(\"mouseenter\", selector, function(e) {\n      const $this = $(this);\n      if (wasTouchedRecently($this)) {\n        return;\n      }\n      $this.tooltip(\"show\");\n    });\n    $(document).on(\"mouseleave\", selector, function(e) {\n      const $this = $(this);\n      if (wasTouchedRecently($this)) {\n        return;\n      }\n\n      hideTooltip($this);\n    });\n\n    $(document).on(\"touchend\", \"body\", () => {\n      hideTooltip($('[data-toggle=\"tooltip\"]'));\n    });\n  };\n\n  function clearTooltips() {\n    $(selector).tooltip(\"dispose\");\n  }\n\n  document.addEventListener(\"turbolinks:before-cache\", clearTooltips, {\n    passive: true\n  });\n  document.addEventListener(\"turbolinks:load\", initTooltip, { passive: true });\n}\n","export default $ => {\n  $ = $ || window.jQuery;\n  const state = {\n    animating: false\n  };\n\n  const scroll = direction => {\n    if (state.animating === true) {\n      return;\n    }\n    // determine the scrolling increment based on the width of an existing column\n    // get the second column (the first is a header) and add 1 for the border\n    const offset =\n      ([...document.querySelectorAll(\".js-tt-cell\")].slice(1, 2)[0]\n        .clientWidth +\n        1) *\n      direction;\n\n    // find the container element that will be scrolled\n    const $el = $(\"[data-sticky-container]\");\n\n    // animate the scroll event\n    $el.animate(\n      { scrollLeft: $el.scrollLeft() + offset },\n      {\n        duration: 200,\n        step: () => {\n          state.animating = true;\n        },\n        done: () => {\n          state.animating = false;\n        }\n      }\n    );\n  };\n\n  $(document).on(\"click\", \"button[data-scroll='earlier']\", () => scroll(-1));\n  $(document).on(\"click\", \"button[data-scroll='later']\", () => scroll(1));\n};\n","let scrollCallback = false;\n\nexport default () => {\n  document.addEventListener(\"turbolinks:load\", adjustTimetableStyle, {\n    passive: true\n  });\n  window.addEventListener(\"resize\", resizeRows);\n};\n\nconst adjustTimetableStyle = () => {\n  // return if there is no timetable available\n  const timetableContainerEl = document.getElementById(\"timetable\");\n  if (!timetableContainerEl) {\n    return;\n  }\n\n  // remove border around container because timetable \"hat\" is visible\n  timetableContainerEl.style.borderTop = 0;\n\n  // make headers absolutely position so they stick when table is scrolled\n  [...document.querySelectorAll(\"th[data-absolute]\")].forEach(headerEl => {\n    headerEl.style.position = \"absolute\";\n  });\n\n  resizeRows();\n\n  // register an on-scroll event to enable / disable buttons\n  timetableContainerEl.addEventListener(\"scroll\", toggleScrollButtons);\n};\n\nconst resizeRow = rowEl => {\n  const height = rowEl.querySelector(\".js-tt-stop-name\").offsetHeight;\n  [...rowEl.querySelectorAll(\".js-tt-cell\")].forEach(\n    cell => (cell.style.height = `${height}px`)\n  );\n};\n\nconst resizeRows = () => {\n  // adjust heights of rows where text may be\n  // overflowing absolutely positioned container\n  [...document.querySelectorAll(\".js-tt-row\")].forEach(resizeRow);\n};\n\nconst toggleScrollButtons = event => {\n  if (scrollCallback !== false) {\n    clearTimeout(scrollCallback);\n  }\n  scrollCallback = setTimeout(() => {\n    const maxScrollLeft = event.target.scrollWidth - event.target.clientWidth;\n    const scrollLeft = event.target.scrollLeft;\n    const leftBtnEl = document.querySelector(\"button[data-scroll='earlier']\");\n    const rightBtnEl = document.querySelector(\"button[data-scroll='later']\");\n\n    if (leftBtnEl) {\n      scrollLeft === 0\n        ? leftBtnEl.setAttribute(\"disabled\", \"\")\n        : leftBtnEl.removeAttribute(\"disabled\");\n    }\n    if (rightBtnEl) {\n      scrollLeft === maxScrollLeft\n        ? rightBtnEl.setAttribute(\"disabled\", \"\")\n        : rightBtnEl.removeAttribute(\"disabled\");\n    }\n  }, 250);\n};\n","/**\n * When scrolling down the timetable,\n * ensure the train numbers are always visible on screen\n */\n\nconst trainLabelRow = document.querySelector(\".js-timetable-train-labels\");\nconst trainLabels = trainLabelRow ? Array.from(trainLabelRow.children) : [];\nconst tableEl = document.getElementById(\"timetable\");\nconst tableBodyEl = document.querySelector(\".m-timetable tbody\");\nconst stickyHeaderEl = document.createElement(\"div\");\nstickyHeaderEl.setAttribute(\n  \"style\",\n  \"border: 1px solid #b0b5c0; overflow: hidden; position: fixed; top: 0;\"\n);\nstickyHeaderEl.setAttribute(\"aria-hidden\", \"true\");\nlet removedLabels = null;\nlet isStuck = false;\n\nconst sideScrollStickyHeader = () => {\n  window.requestAnimationFrame(() => {\n    stickyHeaderEl.scrollLeft = tableEl.scrollLeft;\n  });\n};\n\nconst showStickyLabels = () => {\n  sideScrollStickyHeader();\n\n  if (removedLabels) {\n    document.body.appendChild(removedLabels);\n  } else {\n    const {\n      right: tableRight,\n      width: tableWidth\n    } = tableEl.getBoundingClientRect();\n\n    stickyHeaderEl.style.right = `${tableRight - tableWidth}px`;\n    stickyHeaderEl.style.width = `${tableWidth}px`;\n    trainLabels.forEach(labelEl => {\n      const { fontSize, width } = window.getComputedStyle(labelEl);\n      const stickyLabelEl = labelEl.cloneNode(true);\n      stickyLabelEl.className = \"m-timetable__header-cell\";\n      stickyLabelEl.style.fontSize = fontSize;\n      stickyLabelEl.style.minWidth = width;\n      stickyLabelEl.style.maxWidth = width;\n      stickyHeaderEl.appendChild(stickyLabelEl);\n    });\n\n    document.body.appendChild(stickyHeaderEl);\n  }\n\n  /**\n   *  listen to the table scroll event to handle sticky header positioning\n   */\n  tableEl.addEventListener(\"scroll\", sideScrollStickyHeader);\n  isStuck = true;\n};\n\nconst hideStickyLabels = () => {\n  if (removedLabels) {\n    stickyHeaderEl.parentNode.removeChild(stickyHeaderEl);\n  } else {\n    removedLabels = stickyHeaderEl.parentNode.removeChild(stickyHeaderEl);\n  }\n\n  tableEl.removeEventListener(\"scroll\", sideScrollStickyHeader);\n  isStuck = false;\n};\n\nconst resizeStickyHeader = () => {\n  const {\n    right: tableRight,\n    width: tableWidth\n  } = tableEl.getBoundingClientRect();\n  stickyHeaderEl.style.right = `${tableRight - tableWidth}px`;\n  stickyHeaderEl.style.width = `${tableWidth}px`;\n  const stickyLabels = stickyHeaderEl.childNodes;\n  if (stickyLabels.length > 0) {\n    trainLabels.forEach((trainLabel, index) => {\n      const { fontSize, width } = window.getComputedStyle(trainLabel);\n      stickyLabels[index].style.fontSize = fontSize;\n      stickyLabels[index].style.minWidth = width;\n      stickyLabels[index].style.maxWidth = width;\n    });\n  }\n};\n\nconst setUp = () => {\n  if (trainLabelRow && tableEl) {\n    /**\n     *  listen to the scroll event to check whether we need to pin the train\n     *  labels to the top of the screen\n     */\n    document.addEventListener(\"scroll\", () => {\n      window.requestAnimationFrame(() => {\n        const {\n          top: tableTop,\n          bottom: tableBottom\n        } = tableBodyEl.getBoundingClientRect();\n\n        if (!isStuck && (tableTop < 0 && tableBottom > 20)) {\n          showStickyLabels();\n        } else if (isStuck && (tableTop >= 0 || tableBottom < 20)) {\n          hideStickyLabels();\n        }\n      });\n    });\n\n    /**\n     * listen to the resize event in case we need to resize the sticky header\n     */\n    window.addEventListener(\"resize\", () => {\n      window.requestAnimationFrame(() => {\n        if (\n          stickyHeaderEl.getBoundingClientRect().right !==\n          tableBodyEl.getBoundingClientRect().right\n        ) {\n          resizeStickyHeader();\n        }\n      });\n    });\n  }\n};\n\nexport default () => {\n  document.addEventListener(\"turbolinks:load\", setUp, {\n    passive: true\n  });\n};\n","export default function($) {\n  $ = $ || window.jQuery;\n\n  function checkMenuCollapse(canBeSimulated) {\n    return ev => {\n      if (!canBeSimulated && ev.isSimulated) {\n        // ignore fake click events\n        return;\n      }\n      const element = ev.target;\n      // if the focus moves outside the menu and there's still an open menu,\n      // click it (which closes it).\n      if (element && $(element).parents(\"#desktop-menu\").length) {\n        return;\n      }\n\n      $(\"#desktop-menu [aria-expanded=true]\").click();\n    };\n  }\n\n  $(document).on(\"focusin\", \"body\", checkMenuCollapse(true));\n  $(document).on(\"click\", \"body\", checkMenuCollapse());\n}\n","class Algolia {\n  constructor(queries, defaultParams) {\n    this._queries = queries;\n    this._activeQueryIds = Object.keys(queries);\n    this._defaultParams = defaultParams;\n    this._viewMoreInc = 20;\n    this._lastQuery = \"\";\n    this._doBlankSearch = true;\n    this._widgets = [];\n    this.errorContainer = document.getElementById(\"algolia-error\");\n    this.reset();\n  }\n\n  get widgets() {\n    return this._widgets;\n  }\n\n  reset() {\n    Object.keys(this._queries).forEach(this.resetDefaultParams());\n    this._lastQuery = \"\";\n    this.resetWidgets();\n  }\n\n  resetDefaultParams() {\n    return queryId => {\n      if (this._defaultParams[queryId]) {\n        this._queries[queryId].params = JSON.parse(\n          JSON.stringify(this._defaultParams[queryId])\n        );\n      } else {\n        console.error(\n          \"default params not set for queryId\",\n          queryId,\n          this._defaultParams\n        );\n      }\n    };\n  }\n\n  addPage(group) {\n    if (this._queries[group]) {\n      this._queries[group].params.hitsPerPage += this._viewMoreInc;\n    }\n  }\n\n  search(opts = {}) {\n    this.toggleError(false);\n\n    if (!(typeof opts.query == \"string\")) {\n      opts.query = this._lastQuery;\n    }\n\n    if (opts.query.length > 0) {\n      const allQueries = this._buildAllQueries(opts);\n      this._lastQuery = opts.query;\n      return this._doSearch(allQueries);\n    } else {\n      this.updateWidgets({});\n\n      // This code handles the case where the user backspaces to an empty search string\n      if (this._lastQuery.length > 0) {\n        this.reset();\n      }\n      return Promise.resolve({});\n    }\n  }\n\n  _doSearch(allQueries) {\n    return this._sendQueries(allQueries)\n      .then(this._processAlgoliaResults())\n      .then(results => {\n        this.updateWidgets(results);\n        return results;\n      })\n      .catch(err => console.log(err));\n  }\n\n  _addAnalyticsData(result) {\n    result.hits.forEach((hit, i) => {\n      hit.analyticsData = {\n        queryID: result.queryID,\n        position: result.hitsPerPage * result.page + i + 1,\n        objectID: hit.objectID\n      };\n    });\n  }\n\n  _sendQueries(queries) {\n    const body = { requests: queries };\n    return new Promise((resolve, reject) => {\n      window.jQuery\n        .ajax({\n          type: \"POST\",\n          url: \"/search/query\",\n          data: JSON.stringify(body),\n          dataType: \"json\",\n          contentType: \"application/json\"\n        })\n        .done(resolve)\n        .fail(reject);\n    });\n  }\n\n  _buildAllQueries(opts) {\n    const requestedQueryIds =\n      this._activeQueryIds.length > 0\n        ? this._activeQueryIds\n        : Object.keys(this._queries);\n    const queries = [];\n    requestedQueryIds.forEach(queryId => {\n      queries.push(this._buildQuery(queryId, opts));\n    });\n    Object.keys(this._queries).forEach(queryId => {\n      queries.push(this._buildFacetQuery(queryId, opts));\n    });\n    return queries;\n  }\n\n  _buildFacetQuery(queryId, opts) {\n    return {\n      indexName: this._queries[queryId].indexName,\n      query: opts.query,\n      params: {\n        hitsPerPage: 0,\n        facets: [\"*\"]\n      }\n    };\n  }\n\n  _buildQuery(queryId, { query }) {\n    const currentQuery = this._queries[queryId];\n    currentQuery.query = query;\n    currentQuery.params = currentQuery.params || {};\n    currentQuery.params.clickAnalytics = true;\n    return currentQuery;\n  }\n\n  updateAllParams(key, value) {\n    Object.keys(this._queries).forEach(\n      key => (this._queries[key].params[key] = value)\n    );\n  }\n\n  updateActiveQueries(queryIds) {\n    this._activeQueryIds = queryIds;\n  }\n\n  removeActiveQuery(queryId) {\n    const i = this._activeQueryIds.indexOf(queryId);\n    if (i != -1) {\n      this._activeQueryIds.splice(i, 1);\n    }\n  }\n\n  addActiveQuery(queryId) {\n    if (this._activeQueryIds.indexOf(queryId) == -1) {\n      this._activeQueryIds.push(queryId);\n    }\n  }\n\n  updateFacetFilters(queryId, filters) {\n    this._queries[queryId].params[\"facetFilters\"][0] = filters;\n  }\n\n  addFacetFilter(queryId, filter) {\n    if (\n      this._queries[queryId].params[\"facetFilters\"][0].indexOf(filter) == -1\n    ) {\n      this._queries[queryId].params[\"facetFilters\"][0].push(filter);\n    }\n  }\n\n  removeFacetFilter(queryId, filter) {\n    const i = this._queries[queryId].params[\"facetFilters\"][0].indexOf(filter);\n    if (i != -1) {\n      this._queries[queryId].params[\"facetFilters\"][0].splice(i, 1);\n    }\n  }\n\n  updateParams(queryId, params) {\n    this._queries[queryId].params = params;\n  }\n\n  updateParamsByKey(queryId, key, value) {\n    this._queries[queryId].params[key] = value;\n  }\n\n  getParams(queryId) {\n    return this._queries[queryId].params;\n  }\n\n  addWidget(widget) {\n    widget.init(this);\n    this._widgets.push(widget);\n  }\n\n  updateWidgets(results) {\n    if (results[\"error\"]) {\n      this.toggleError(true);\n    } else {\n      this._widgets.forEach(function(widget) {\n        if (typeof widget.render === \"function\") {\n          widget.render(results);\n        }\n      });\n    }\n  }\n\n  resetWidgets() {\n    this._widgets.forEach(function(widget) {\n      if (typeof widget.reset === \"function\") {\n        widget.reset();\n      }\n    });\n  }\n\n  _processAlgoliaResults() {\n    return response => {\n      if (response[\"error\"]) {\n        return Promise.resolve(response);\n      } else {\n        let searchedQueries = this._activeQueryIds.slice(0);\n        if (this._activeQueryIds.length == 0) {\n          searchedQueries = Object.keys(this._queries);\n        }\n        const facetLength = Object.keys(this._queries).length;\n        const searchResults = response.results.slice(0, searchedQueries.length);\n        const facetResults = response.results.slice(\n          searchedQueries.length,\n          searchedQueries.length + facetLength\n        );\n        const results = {};\n        searchResults.forEach((result, i) => {\n          this._addAnalyticsData(result);\n          results[searchedQueries[i]] = result;\n        });\n        facetResults.forEach((result, i) => {\n          results[`facets-${Object.keys(this._queries)[i]}`] = result;\n        });\n        return Promise.resolve(results);\n      }\n    };\n  }\n\n  toggleError(hasError) {\n    if (hasError === true) {\n      this.errorContainer.style.display = \"block\";\n    } else {\n      this.errorContainer.style.display = \"none\";\n    }\n  }\n}\n\nexport default Algolia;\n","export default function($) {\n  $ = $ || window.jQuery;\n\n  // hide the elements\n  const hide = firstLoad => {\n    if (firstLoad) {\n      $(\".direction-filter\").removeAttr(\"hidden\");\n      $(\".date-picker-container\").attr(\"hidden\", \"hidden\");\n    } else {\n      $(\".date-picker-container\").slideUp(\"slow\", () => {\n        $(\".date-picker-container\").attr(\"hidden\", \"hidden\");\n        $(\".direction-filter\")\n          .hide()\n          .removeAttr(\"hidden\")\n          .slideDown(\"fast\");\n      });\n    }\n    $(\".calendar-cover\").attr(\"hidden\", \"hidden\");\n  };\n\n  // show the elements\n  const show = () => {\n    $(\".direction-filter\").attr(\"hidden\", \"hidden\");\n    $(\".date-picker-container\")\n      .hide()\n      .removeAttr(\"hidden\")\n      .slideDown(\"slow\");\n    $(\".calendar-cover\").removeAttr(\"hidden\");\n  };\n\n  // event handler for toggling\n  const toggleDatePicker = ev => {\n    ev.preventDefault();\n    const expand = document\n      .querySelector(\".date-picker-container\")\n      .hasAttribute(\"hidden\");\n    const datePickerEl = document.getElementById(\"date-filter\");\n    if (expand) {\n      show();\n      document.getElementById(\"date-picker-calendar\").focus();\n    } else {\n      hide(false);\n      datePickerEl.focus();\n    }\n    datePickerEl.setAttribute(\"aria-expanded\", expand);\n  };\n\n  // setup toggle behavior\n  const setupDatePicker = () => {\n    hide(true);\n    $(document).on(\"click\", \".date-picker-toggle\", toggleDatePicker);\n  };\n\n  // when the month is shifted, the page will be reloaded, needs to be shown (or re-initialized)\n  const displayOnLoad = () => {\n    // don't do anything if the container is not available\n    if (!document.getElementById(\"date-filter\")) {\n      return;\n    }\n\n    // check if the shift variable is in the query string\n    if (window.location.search.indexOf(\"shift=\") === -1) {\n      // re-initialize the page\n      requestAnimationFrame(() => hide(true));\n    } else {\n      // show onload\n      requestAnimationFrame(show);\n    }\n  };\n\n  // events\n  setupDatePicker();\n  document.addEventListener(\"turbolinks:load\", displayOnLoad, {\n    passive: true\n  });\n}\n","export default function($) {\n  $ = $ || window.jQuery;\n\n  $(document).on(\"turbolinks:load\", function() {\n    $(\"[toggle-element-collapse]\").addClass(\"collapse\");\n  });\n  $(document).on(\"click\", \"[data-toggle-collapse]\", function() {\n    const route_id = $(this).attr(\"data-toggle-collapse\");\n    const toggle_elements = \"[data-toggle-route=\" + route_id + \"]\";\n    $(toggle_elements).toggle();\n  });\n\n  $(document).on(\"click\", \"[data-toggle-hide]\", function() {\n    $(\"[data-toggle-hide]\").hide();\n  });\n}\n","import DatePickerInput from \"../datepicker-input\";\nimport * as QueryHelpers from \"../../ts/helpers/query\";\n\n/**\nHow to use this TimeControls module on the frontend to create date and time selectors:\n(needs to go together with `DateTimeSelector.custom_date_time_select` in the backend)\n\n- In your .eex template file, pass a (perhaps nested) map containing the specific fields of the date and time selector in a <script> tag with the following parameters.\n<script id=\"form-data\" type=\"text/plain\">\n  <%= raw(Poison.encode!(<map with the fields>)) %>\n</script>\nThese field names are created by the Elixir module DateTimeSelector in your form.\n\n- Then, use DateTimeSelector.custom_date_time_select passing the form and a date range, i.e.:\n<% date_ranges = %{min_date: ..., max_date: ...} %>\n<%= DateTimeSelector.custom_date_time_select(form, date_ranges) %>\n*/\n\nexport class TimeControls {\n  constructor() {\n    const { dateEl, month, day, year } = TimeControls.SELECTORS;\n    if (document.getElementById(dateEl.input)) {\n      this.resetPlanType();\n      this.DatePicker = new DatePickerInput({\n        selectors: { dateEl, month, day, year },\n        onUpdateCallback: this.updateControlTitleCallback.bind(this)\n      });\n      this.timeInput();\n      this.controlSetup();\n    }\n  }\n\n  resetPlanType() {\n    const title = document.getElementById(TimeControls.SELECTORS.title);\n    if (title) {\n      title.setAttribute(\"data-prefix\", \"\");\n    }\n  }\n\n  controlSetup() {\n    const depart = document.getElementById(TimeControls.SELECTORS.depart);\n    if (depart) {\n      depart.addEventListener(\"click\", () => {\n        this.updateControlTitle(\"Depart at\");\n      });\n    }\n\n    const arrive = document.getElementById(TimeControls.SELECTORS.arrive);\n    if (arrive) {\n      arrive.addEventListener(\"click\", () => {\n        this.updateControlTitle(\"Arrive by\");\n      });\n    }\n  }\n\n  timeInput() {\n    document\n      .getElementById(TimeControls.SELECTORS.hour)\n      .addEventListener(\"change\", this.updateTime.bind(this));\n    document\n      .getElementById(TimeControls.SELECTORS.minute)\n      .addEventListener(\"change\", this.updateTime.bind(this));\n    document\n      .getElementById(TimeControls.SELECTORS.amPm)\n      .addEventListener(\"change\", this.updateTime.bind(this));\n  }\n\n  // eslint-disable-next-line class-methods-use-this\n  getStateFromQuery() {\n    return QueryHelpers.parseQuery(\n      window.location.search,\n      window.decodeURIComponent\n    );\n  }\n\n  formatQueryPlanType() {\n    const planTime = this.getStateFromQuery()[\"plan[time]\"];\n    if (planTime === \"arrive\") {\n      return \"Arrive by\";\n    }\n    return \"Depart at\";\n  }\n\n  getPlanType() {\n    const title = document.getElementById(TimeControls.SELECTORS.title);\n    if (title) {\n      return title.getAttribute(\"data-prefix\") || this.formatQueryPlanType();\n    }\n    return \"\";\n  }\n\n  updateTime() {\n    const time = new Date();\n    const hour12 =\n      parseInt(document.getElementById(TimeControls.SELECTORS.hour).value, 10) %\n      12;\n    const amPm = document.getElementById(TimeControls.SELECTORS.amPm).value;\n    const hour = amPm === \"PM\" ? hour12 + 12 : hour12;\n    const timeLabel = document.getElementById(\n      TimeControls.SELECTORS.timeEl.label\n    );\n    const ariaMessage = timeLabel.getAttribute(\"aria-label\").split(\", \")[1];\n    time.setHours(hour);\n    time.setMinutes(\n      document.getElementById(TimeControls.SELECTORS.minute).value\n    );\n    const friendlyTime = TimeControls.getFriendlyTime(time);\n\n    timeLabel.setAttribute(\"data-time\", friendlyTime);\n    timeLabel.setAttribute(\"aria-label\", `${friendlyTime}, ${ariaMessage}`);\n    this.updateControlTitle(this.getPlanType());\n  }\n\n  updateControlTitle(text) {\n    const controlTitle = document.getElementById(TimeControls.SELECTORS.title);\n    if (controlTitle) {\n      const time = document\n        .getElementById(TimeControls.SELECTORS.timeEl.label)\n        .getAttribute(\"data-time\");\n      const date = document\n        .getElementById(TimeControls.SELECTORS.dateEl.label)\n        .getAttribute(\"data-date\");\n      const title = `${text} ${time}, ${date}`;\n      controlTitle.innerHTML = title;\n      controlTitle.setAttribute(\"data-prefix\", text);\n    }\n  }\n\n  updateControlTitleCallback() {\n    this.updateControlTitle(this.getPlanType());\n  }\n\n  static getFriendlyTime(datetime) {\n    let amPm = \"AM\";\n    let hour = datetime.getHours();\n    let minute = datetime.getMinutes();\n\n    if (hour > 11) {\n      amPm = \"PM\";\n    }\n    if (hour > 12) {\n      hour -= 12;\n    }\n    if (hour === 0) {\n      hour = 12;\n    }\n\n    if (minute < 10) {\n      minute = `0${minute}`;\n    }\n\n    return `${hour}:${minute} ${amPm}`;\n  }\n}\n\nexport function init() {\n  const $ = window.jQuery;\n  $(document).on(\"turbolinks:load\", () => {\n    const formDataEl = document.getElementById(\"form-data\");\n\n    if (!formDataEl) return;\n\n    TimeControls.SELECTORS = JSON.parse(formDataEl.innerHTML);\n    const timeControl = new TimeControls();\n  });\n}\n","export default class DatePickerInput {\n  constructor(options) {\n    this.selectors = options.selectors;\n    this.onUpdateCallback = options.onUpdateCallback;\n    this.init();\n  }\n\n  init() {\n    this.dateInput = $(`#${this.selectors.dateEl.input}`); // Must use JQuery for the datepicker plugin\n    const dateLabel = document.getElementById(this.selectors.dateEl.label);\n    const actualMonth = parseInt(\n      document.getElementById(this.selectors.month).value,\n      10\n    );\n    const minAllowedDate = this.dateInput.data(\"min-date\");\n    const maxAllowedDate = this.dateInput.data(\"max-date\");\n    const date = new Date(\n      document.getElementById(this.selectors.year).value,\n      actualMonth - 1,\n      document.getElementById(this.selectors.day).value\n    );\n\n    dateLabel.setAttribute(\"data-date\", DatePickerInput.getShortDate(date));\n\n    this.updateDateFormatToShort = this.updateDateFormatToShort.bind(this);\n    this.updateDateFormatToLong = this.updateDateFormatToLong.bind(this);\n    this.dateInput.datepicker({\n      outputFormat: DatePickerInput.getDateFormatbyMediaQuery(),\n      onUpdate: this.updateDate.bind(this),\n      min: minAllowedDate,\n      max: maxAllowedDate,\n      gainFocusOnConstruction: false\n    });\n\n    // disable clicking on the month to change the grid type\n    $(\".datepicker-month\").off();\n\n    // remove fast-skip buttons\n    $(\".datepicker-month-fast-next\").remove();\n    $(\".datepicker-month-fast-prev\").remove();\n\n    // replace default datepicker arrow icons\n    $(\".datepicker-calendar\")\n      .find(\".glyphicon\")\n      .removeClass(\"glyphicon\")\n      .addClass(\"fa\");\n    $(\".datepicker-calendar\")\n      .find(\".glyphicon-triangle-right\")\n      .removeClass(\"glyphicon-triangle-right\")\n      .addClass(\"fa-caret-right\");\n    $(\".datepicker-calendar\")\n      .find(\".glyphicon-triangle-left\")\n      .removeClass(\"glyphicon-triangle-left\")\n      .addClass(\"fa-caret-left\");\n\n    $(document).on(\"click\", `#${this.selectors.dateEl.input}`, ev => {\n      ev.preventDefault();\n      ev.stopPropagation();\n      $(`#${this.selectors.dateEl.input}`).datepicker(\"show\"); // jQuery plugin that requires this syntax\n    });\n\n    window\n      .matchMedia(\"(min-width: 1344px)\")\n      .addListener(this.updateDateFormatToLong);\n\n    window\n      .matchMedia(\"(min-width: 1087px) and (max-width: 1344px)\")\n      .addListener(this.updateDateFormatToShort);\n\n    window\n      .matchMedia(\"(min-width: 800px) and (max-width: 1087px)\")\n      .addListener(this.updateDateFormatToShort);\n\n    window\n      .matchMedia(\"(min-width: 544px) and (max-width: 800px)\")\n      .addListener(this.updateDateFormatToLong);\n\n    window\n      .matchMedia(\"(max-width: 544px)\")\n      .addListener(this.updateDateFormatToShort);\n\n    this.dateInput.datepicker(\"setDate\", date);\n  }\n\n  static getDateFormatbyMediaQuery() {\n    if (window.matchMedia(\"(min-width: 1344px)\").matches) {\n      return \"EEEE, MMMM dd, yyyy\";\n    }\n    if (\n      window.matchMedia(\"(min-width: 544px) and (max-width: 800px)\").matches\n    ) {\n      return \"EEEE, MMMM dd, yyyy\";\n    }\n    return \"EE, MMMM dd, yyyy\";\n  }\n\n  updateDateFormatToShort(e) {\n    return e.matches ? this.setDatePickerFormat(\"EE, MMMM dd, yyyy\") : false;\n  }\n\n  updateDateFormatToLong(e) {\n    return e.matches ? this.setDatePickerFormat(\"EEEE, MMMM dd, yyyy\") : false;\n  }\n\n  setDatePickerFormat(format) {\n    this.dateInput.datepicker(\"outputFormat\", format);\n    this.dateInput.datepicker(\"update\");\n  }\n\n  updateDate(datepickerDate) {\n    const date = new Date(datepickerDate);\n    const dateLabel = document.getElementById(this.selectors.dateEl.label);\n    const ariaMessage = dateLabel.getAttribute(\"aria-label\").split(\", \")[3];\n    dateLabel.setAttribute(\"data-date\", DatePickerInput.getShortDate(date));\n    dateLabel.setAttribute(\"aria-label\", `${datepickerDate}, ${ariaMessage}`);\n    this.updateDateSelects(date);\n\n    this.dateInput.datepicker(\"hide\");\n    this.onUpdateCallback();\n  }\n\n  updateDateSelects(date) {\n    const year = date.getFullYear().toString();\n    const month = (date.getMonth() + 1).toString();\n    const day = date.getDate().toString();\n    this.updateSelect({ month });\n    this.updateSelect({ day });\n    this.updateSelect({ year });\n  }\n\n  updateSelect(select) {\n    const type = Object.keys(select)[0];\n    const options = document.getElementById(this.selectors[type]);\n    const currentOpt = options.querySelector(\"option[selected='selected']\");\n    const newOpt = options.querySelector(`option[value='${select[type]}']`);\n    if (currentOpt) currentOpt.removeAttribute(\"selected\");\n    if (!newOpt) {\n      options.append(\n        $(\n          `<option value=\"${select[type]}\" selected=\"selected\">${\n            select[type]\n          }</option>`\n        )\n      );\n    } else {\n      newOpt.setAttribute(\"selected\", \"selected\");\n    }\n  }\n\n  static getShortDate(date) {\n    return `${date.getMonth() + 1}/${date.getDate()}/${date\n      .getFullYear()\n      .toString()\n      .substr(2)}`;\n  }\n}\n","export default function stopBubbles($) {\n  $ = $ || window.jQuery;\n\n  function toggleStopList(e) {\n    const targetId = $(e.target).attr(\"id\");\n    const clickedLink = $(\"[data-target='#\" + targetId + \"']\");\n\n    toggleArrow(clickedLink);\n    toggleBranch(clickedLink);\n  }\n\n  function toggleArrow(link) {\n    link.find(\".fa\").toggleClass(\"fa-angle-down fa-angle-up\");\n  }\n\n  function toggleBranch(link) {\n    const branch = link.data(\"target-branch\");\n    $(\"[data-branch='\" + branch + \"']\").toggleClass(\"expanded\");\n    link.parents(\".route-branch-stop\").toggleClass(\"expanded\");\n  }\n\n  $(document).on(\n    \"hide.bs.collapse show.bs.collapse\",\n    \".collapse.stop-list\",\n    toggleStopList\n  );\n}\n","export default function search($, breakpoints) {\n  // focus the search input once the menu is fully expanded\n  $(document).on(\"shown.bs.collapse\", \"#search\", ev => {\n    $(\"[data-input=search]\")\n      .eq(0)\n      .focus();\n  });\n\n  document.addEventListener(\n    \"turbolinks:load\",\n    () => {\n      setupFilterToggleOnMobile($, breakpoints);\n    },\n    { passive: true }\n  );\n}\n\nfunction setupFilterToggleOnMobile($, breakpoints) {\n  // submit form every time a checkbox value is changed\n  $(\"[data-facet=search] input[type='checkbox']\").change(() => {\n    $(\"[data-form='search-filter']\").submit();\n  });\n\n  // hide search filter options on mobile\n  $(\"[data-container='search-filter']\").addClass(\"hidden-sm-down\");\n\n  // toggle filter options when clicking the header on mobile\n  $(\"[data-heading='search-filter']\")\n    .addClass(\"closed\")\n    .click(ev => {\n      // this functionality is only relevent to our smallest breakpoint\n      if ($(window).width() > breakpoints.md) {\n        return;\n      }\n\n      const $header = $(ev.target);\n      const $listContainer = $header\n        .siblings(\"[data-container='search-filter']\")\n        .eq(0);\n      if ($listContainer.hasClass(\"hidden-sm-down\")) {\n        $listContainer\n          .hide()\n          .removeClass(\"hidden-sm-down\")\n          .slideDown(\"fast\");\n        $header.addClass(\"open\").removeClass(\"closed\");\n      } else {\n        $header.removeClass(\"open\").addClass(\"closed\");\n        $listContainer.slideUp(\"fast\", () => {\n          $listContainer.addClass(\"hidden-sm-down\").css({ display: \"block\" });\n        });\n      }\n    });\n}\n","// galleries is global to this function and keeps track of 1 or more galleries on a single page\nlet galleries = {};\nconst PAGE_SIZE = 10;\n\nexport default function photoGallery($) {\n  $ = $ || window.jQuery;\n  document.addEventListener(\"turbolinks:load\", () => handlePageLoad($), {\n    passive: true\n  });\n\n  // event handler for changing image\n  $(document).on(\"click\", '[data-image=\"gallery\"]', handleClickImage);\n\n  // event handler for previous / next page\n  $(document).on(\"click\", '[data-image=\"navigation\"]', handleClickNavigation);\n}\n\n/* DATA FUNCTIONS */\nfunction initializeData($) {\n  const output = {};\n  let $galleryEl;\n  let galleryId;\n  let images;\n\n  $('[data-component=\"photo-gallery\"]').each((_offset, el) => {\n    $galleryEl = $(el);\n\n    // create a unique id for each gallery on a page\n    galleryId = guid();\n    $galleryEl.attr(\"data-gallery-id\", galleryId);\n\n    // find all images/captions that belong to a gallery\n    images = $galleryEl.find(\"figure\").get();\n\n    // create an object to keep track of image gallery parameters\n    output[galleryId] = makeGallery($galleryEl, images);\n  });\n\n  return output;\n}\n\n// In IE11, images get overwritten with empty content, so as backup we also save the HTML content inside the <figure>'s in 'figures':\nconst makeGallery = ($el, images) => ({\n  el: $el,\n  images,\n  figures: images.map(img => img.innerHTML),\n  imageOffset: 0,\n  pageOffset: 0,\n  lastPage: calculateLastPage(images.length)\n});\n\nconst calculateLastPage = photoCount =>\n  Math.max(0, Math.ceil(photoCount / PAGE_SIZE) - 1);\n\nconst getGalleryImageByOffset = (id, offset) => {\n  const imageByOffset = galleries[id].images[offset];\n\n  // empty content will likely happen for IE11\n  if (!imageByOffset.innerHTML) {\n    imageByOffset.innerHTML = galleries[id].figures[offset];\n  }\n\n  return imageByOffset;\n};\n\nfunction setGalleryImageOffset(id, offset) {\n  const lastOffset = galleries[id].images.length - 1;\n  if (offset === -1) {\n    offset = lastOffset;\n  } else if (offset > lastOffset) {\n    offset = 0;\n  }\n  galleries[id].imageOffset = offset;\n  return offset;\n}\n\nfunction setGalleryPageOffset(id, increment) {\n  let page = galleries[id].pageOffset + increment;\n  if (page === -1) {\n    page = galleries[id].lastPage;\n  } else if (page > galleries[id].lastPage) {\n    page = 0;\n  }\n  galleries[id].pageOffset = page;\n  return page;\n}\n\n/* EVENT HANDLERS */\nexport function handlePageLoad($) {\n  galleries = initializeData($);\n  Object.keys(galleries).forEach(galleryId => render(galleryId));\n}\n\nfunction handleClickImage(ev) {\n  ev.preventDefault();\n  const id = ev.currentTarget.getAttribute(\"data-gallery\");\n  const offset = ev.currentTarget.getAttribute(\"data-offset\");\n  const actualOffset = setGalleryImageOffset(id, offset);\n  replaceActiveImage(id, getGalleryImageByOffset(id, actualOffset));\n}\n\nfunction handleClickNavigation(ev) {\n  ev.preventDefault();\n  const id = ev.currentTarget.getAttribute(\"data-gallery\");\n  const increment = parseInt(ev.currentTarget.getAttribute(\"data-increment\"));\n  const focusEl = increment === 1 ? \"next\" : \"prev\";\n  const isDesktop = isVisible(`${id}images`);\n\n  // when on desktop: navigate between sets of images\n  // when on mobile: navigate between images\n  if (isDesktop) {\n    // change the page and set the image to the first one on the page\n    const page = setGalleryPageOffset(id, increment);\n    setGalleryImageOffset(id, page * PAGE_SIZE);\n  } else {\n    // set the image to the next or previous\n    setGalleryImageOffset(id, galleries[id].imageOffset + increment);\n  }\n  render(id, id.concat(focusEl));\n}\n\n/* UTILITY FUNCTIONS */\nconst isVisible = id => document.getElementById(id).offsetLeft > 0;\nconst guid = () =>\n  new Date().getTime().toString() + Math.floor(Math.random() * 1000000);\n\n/* RENDERING FUNCTIONS */\nfunction render(id, focusId) {\n  // get main image\n  const main = galleries[id].images\n    .filter((_el, offset) => offset == galleries[id].imageOffset)\n    .pop();\n\n  const mainImage = main.querySelectorAll(\"img\").item(0);\n\n  const mainCaption = main.querySelectorAll(\"figcaption\").item(0);\n\n  // get pages of images\n  const totalImages = galleries[id].images.length;\n  const firstImage = galleries[id].pageOffset * PAGE_SIZE;\n  const lastImage = firstImage + PAGE_SIZE;\n  const pagination = galleries[id].images.length > PAGE_SIZE;\n  const images = galleries[id].images.filter(\n    (_el, offset) => offset >= firstImage && offset < lastImage\n  );\n\n  // IE returns null for getAttribute(...) whereas other browsers do return a value --> using .nodeValue as fallback for these specific cases\n  const imgSource =\n    mainImage.getAttribute(\"src\") || mainImage.attributes.src.nodeValue;\n  const imgAlt =\n    mainImage.getAttribute(\"alt\") || mainImage.attributes.alt.nodeValue;\n\n  // render group of images\n  const markUp = `\n    <div class=\"c-photo-gallery__main-container\">\n      <figure>\n        <div class=\"c-photo-gallery__main-window\">\n          <img class=\"c-photo-gallery__main-image\"\n            id=\"${`${id}primary`}\"\n            alt=\"${imgAlt}\"\n            src=\"${imgSource}\">\n        </div>\n        <figcaption id=\"${`${id}name`}\" class=\"c-photo-gallery__main-title\">${\n    mainCaption.innerHTML\n  }</figcaption>\n      </figure>\n    </div>\n    <div id=\"${`${id}images`}\" class=\"c-photo-gallery__thumbnails c-thumbnail-count--${\n    images.length\n  } c-thumbnail-total--${totalImages}\">\n      ${renderImages(images, firstImage, id)}\n    </div>\n    ${renderNavigation(id, pagination)}\n  `;\n\n  // replace HTML in the page\n  galleries[id].el.html(markUp);\n\n  // if an element was passed in to focus on, set focus\n  focusId ? document.getElementById(focusId).focus() : null;\n}\n\nfunction renderNavigation(id, pagination) {\n  const hideOnDesktop = pagination ? \"\" : \" hidden-md-up\";\n  return `<div class=\"c-photo-gallery__nav-btns${hideOnDesktop}\">\n      <a href=\"#gallery-previous\"\n        title=\"previous photos\"\n        role=\"navigation\"\n        id=\"${`${id}prev`}\"\n        data-gallery=\"${id}\"\n        data-image=\"navigation\"\n        data-increment=\"-1\"><i class=\"fa fa-caret-left\" aria-hidden=\"true\"></i> Previous</a>\n      <a href=\"#gallery-next\"\n        title=\"next photos\"\n        role=\"navigation\"\n        id=\"${`${id}next`}\"\n        data-gallery=\"${id}\"\n        data-image=\"navigation\"\n        data-increment=\"1\">Next <i class=\"fa fa-caret-right\" aria-hidden=\"true\"></i></a>\n    </div>`;\n}\n\nfunction renderImages(images, firstImage, id) {\n  return images\n    .map((image, offset) => {\n      const firstImg = image.querySelectorAll(\"img\").item(0);\n\n      // IE returns null for getAttribute(...) whereas other browsers do return a value --> using .nodeValue as fallback for these specific cases\n      const imgSource =\n        firstImg.getAttribute(\"src\") || firstImg.attributes.src.nodeValue;\n\n      const imgAlt =\n        firstImg.getAttribute(\"alt\") || firstImg.attributes.alt.nodeValue;\n\n      return `<a href=\"#gallery-image\"\n        data-image=\"gallery\"\n        data-gallery=\"${id}\"\n        id=\"${id + (firstImage + offset)}\"\n        role=\"navigation\"\n        title=\"change photo to '${imgAlt}'\"\n        data-offset=\"${firstImage + offset}\">\n          <img\n            class=\"c-photo-gallery__thumbnail\"\n            alt=\"${imgAlt}\"\n            src=\"${imgSource}\"></a>`;\n    })\n    .join(\"\");\n}\n\nfunction replaceActiveImage(id, image) {\n  const activeImage = document.getElementById(`${id}primary`);\n  const activeImageName = document.getElementById(`${id}name`);\n\n  const firstImage = image.querySelectorAll(\"img\").item(0);\n\n  activeImage.setAttribute(\"src\", firstImage.getAttribute(\"src\"));\n  activeImage.setAttribute(\"alt\", firstImage.getAttribute(\"alt\"));\n  activeImageName.innerHTML = image\n    .querySelectorAll(\"figcaption\")\n    .item(0).innerHTML;\n}\n","import { doWhenGoogleMapsIsReady } from \"./google-maps-loaded\";\nimport { AlgoliaEmbeddedSearch } from \"./algolia-embedded-search\";\n// eslint-disable-next-line import/no-unresolved\nimport * as QueryHelpers from \"../ts/helpers/query\";\n\nconst INDICES = {\n  routes: {\n    indexName: \"routes\",\n    query: \"\"\n  },\n  stops: {\n    indexName: \"stops\",\n    query: \"\"\n  },\n  pages: {\n    indexName: \"drupal\",\n    query: \"\"\n  }\n};\n\n// exported for testing\nexport const SELECTORS = {\n  input: \"search-homepage__input\",\n  container: \"search-homepage__container\",\n  goBtn: \"search-homepage__input-go-btn\",\n  locationLoadingIndicator: \"search-homepage__loading-indicator\",\n  resetButton: \"search-homepage__reset\",\n  announcer: \"search-homepage__announcer\"\n};\n\nconst PARAMS = {\n  stops: {\n    hitsPerPage: 2,\n    facets: [\"*\"],\n    facetFilters: [[]]\n  },\n  routes: {\n    hitsPerPage: 5,\n    facets: [\"*\"],\n    facetFilters: [[]]\n  },\n  pages: {\n    hitsPerPage: 2,\n    facets: [\"*\"],\n    facetFilters: [\n      [\n        \"_content_type:page\",\n        \"_content_type:search_result\",\n        \"_content_type:diversion\",\n        \"_content_type:landing_page\",\n        \"_content_type:person\",\n        \"_content_type:project\",\n        \"_content_type:project_update\"\n      ]\n    ]\n  }\n};\n\nconst LOCATION_PARAMS = {\n  position: 3,\n  hitLimit: 2\n};\n\n// exported for testing\nexport const doInit = () => {\n  const input = document.getElementById(SELECTORS.input);\n  if (!input) return null;\n  // The global search page expects the query param to be ?query=foo, but\n  // the &Phoenix.HTML.Form.text_input/3 helper that builds this input\n  // requires the input's name to be a nested value (i.e. name=\"query[input]\"),\n  // Fixing this at the source would require more refactoring than we could\n  // justify; hence, this dirty hack. -kh\n  input.setAttribute(\"name\", \"query\");\n\n  const search = new AlgoliaEmbeddedSearch({\n    pageId: \"search-homepage\",\n    indices: INDICES,\n    params: PARAMS,\n    selectors: SELECTORS,\n    locationParams: LOCATION_PARAMS,\n    withGoogle: true\n  });\n\n  search.buildSearchParams = () =>\n    QueryHelpers.paramsToString(\n      {\n        query: search.input.value\n      },\n      window.encodeURIComponent\n    );\n\n  return search;\n};\n\nexport function init() {\n  document.addEventListener(\"turbolinks:load\", () => {\n    doWhenGoogleMapsIsReady(doInit);\n  });\n}\n","import { doWhenGoogleMapsIsReady } from \"./google-maps-loaded\";\nimport { AlgoliaWithGeo } from \"./algolia-search-with-geo\";\nimport { AlgoliaFacets } from \"./algolia-facets\";\nimport { AlgoliaResults } from \"./algolia-results\";\nimport * as QueryHelpers from \"../ts/helpers/query\";\n\nexport function init() {\n  const search = new AlgoliaGlobalSearch();\n  document.addEventListener(\n    \"turbolinks:load\",\n    () => {\n      doWhenGoogleMapsIsReady(() => {\n        search.init();\n      });\n    },\n    { passive: true }\n  );\n  return search;\n}\n\nexport class AlgoliaGlobalSearch {\n  constructor() {\n    this.container = null;\n    this.controller = null;\n    this._facetsWidget = null;\n    this._bind();\n    this._showMoreList = [];\n    this._queryParams = {};\n  }\n\n  _bind() {\n    this.reset = this.reset.bind(this);\n    this.onKeyup = this.onKeyup.bind(this);\n    this.onFocusInput = this.onFocusInput.bind(this);\n  }\n\n  init() {\n    this.container = document.getElementById(\n      AlgoliaGlobalSearch.SELECTORS.input\n    );\n    this._resetButton = document.getElementById(\n      AlgoliaGlobalSearch.SELECTORS.resetButton\n    );\n    if (!this.container) {\n      return false;\n    }\n    if (!this.controller) {\n      this.controller = new AlgoliaWithGeo(\n        AlgoliaGlobalSearch.INITIAL_QUERIES,\n        AlgoliaGlobalSearch.DEFAULT_PARAMS,\n        AlgoliaGlobalSearch.LATLNGBOUNDS\n      );\n    }\n\n    this._facetsWidget = new AlgoliaFacets(\n      AlgoliaGlobalSearch.SELECTORS,\n      this.controller,\n      this\n    );\n    this._facetsWidget.reset();\n    this.controller.addWidget(this._facetsWidget);\n\n    this._resultsWidget = new AlgoliaResults(\n      AlgoliaGlobalSearch.SELECTORS.resultsContainer,\n      this\n    );\n    this.controller.addWidget(this._resultsWidget);\n\n    this.addEventListeners();\n    this.loadState(window.location.search);\n    this.controller.search({ query: this.container.value });\n  }\n\n  addEventListeners() {\n    this._resetButton.removeEventListener(\"click\", this.reset);\n    this._resetButton.addEventListener(\"click\", this.reset);\n\n    const inputField = document.getElementById(\n      AlgoliaGlobalSearch.SELECTORS.input\n    );\n    window.jQuery(document).on(\"keyup\", `#${inputField.id}`, this.onKeyup);\n\n    inputField.addEventListener(\"focus\", this.onFocusInput);\n\n    document.addEventListener(\"turbolinks:before-render\", () => {\n      window.jQuery(document).off(\"keyup\", `#${inputField.id}`, this.onKeyup);\n    });\n  }\n\n  loadState(query) {\n    this._queryParams = QueryHelpers.parseQuery(\n      query,\n      window.decodeURIComponent\n    );\n    this.container.value = this._queryParams.query || \"\";\n\n    const showMoreState = this._queryParams.showmore || \"\";\n    if (showMoreState != \"\") {\n      showMoreState.split(\",\").forEach(group => {\n        this.addPage(group);\n      });\n    }\n\n    const facetState = this._queryParams.facets || \"\";\n    this._facetsWidget.loadState(facetState.split(\",\"));\n    if (facetState != \"\") {\n      this.controller.enableLocationSearch(facetState.includes(\"locations\"));\n    }\n  }\n\n  reset(ev) {\n    this.container.value = \"\";\n    this.controller.reset();\n    this._toggleResetButton(false);\n    this._queryParams = {};\n    this.updateHistory();\n    window.jQuery(this.container).focus();\n  }\n\n  _toggleResetButton(show) {\n    this._resetButton.style.display = show ? \"block\" : \"none\";\n  }\n\n  onKeyup(ev) {\n    const inputField = document.getElementById(\n      AlgoliaGlobalSearch.SELECTORS.input\n    );\n    this._toggleResetButton(inputField.value != \"\");\n    this.controller.search({ query: this.container.value });\n    this.updateHistory();\n  }\n\n  onFocusInput(ev) {\n    this.controller.setSessionToken();\n  }\n\n  getSessionToken() {\n    return this.controller.sessionToken;\n  }\n\n  resetSessionToken() {\n    this.controller.resetSessionToken();\n  }\n\n  updateHistory() {\n    this._queryParams.query = this.container.value;\n    this._queryParams.facets = this._facetsWidget\n      .selectedFacetNames()\n      .join(\",\");\n    this._queryParams.showmore = this._showMoreList.join(\",\");\n    window.history.replaceState(\n      window.history.state,\n      \"\",\n      window.location.pathname +\n        QueryHelpers.paramsToString(\n          this._queryParams,\n          window.encodeURIComponent\n        )\n    );\n  }\n\n  onClickShowMore(group) {\n    this.addPage(group);\n    this.updateHistory();\n    this.controller.search({});\n  }\n\n  addPage(group) {\n    this.controller.addPage(group);\n    this._showMoreList.push(group);\n  }\n\n  getParams() {\n    return {\n      from: \"global-search\",\n      query: this.container.value,\n      facets: this._facetsWidget.selectedFacetNames().join(\",\")\n    };\n  }\n}\n\nAlgoliaGlobalSearch.INITIAL_QUERIES = {\n  routes: {\n    indexName: \"routes\",\n    query: \"\"\n  },\n  stops: {\n    indexName: \"stops\",\n    query: \"\"\n  },\n  projects: {\n    indexName: \"drupal\",\n    query: \"\"\n  },\n  pages: {\n    indexName: \"drupal\",\n    query: \"\"\n  },\n  documents: {\n    indexName: \"drupal\",\n    query: \"\"\n  },\n  events: {\n    indexName: \"drupal\",\n    query: \"\"\n  },\n  news: {\n    indexName: \"drupal\",\n    query: \"\"\n  }\n};\n\nAlgoliaGlobalSearch.DEFAULT_PARAMS = {\n  routes: {\n    hitsPerPage: 5,\n    facets: [\"*\"],\n    facetFilters: [[]]\n  },\n  stops: {\n    hitsPerPage: 5,\n    facets: [\"*\"],\n    facetFilters: [[]]\n  },\n  projects: {\n    hitsPerPage: 5,\n    facets: [\"*\"],\n    facetFilters: [[\"_content_type:project\", \"_content_type:project_update\"]]\n  },\n  pages: {\n    hitsPerPage: 5,\n    facets: [\"*\"],\n    facetFilters: [\n      [\n        \"_content_type:page\",\n        \"_content_type:diversion\",\n        \"_content_type:search_result\",\n        \"_content_type:landing_page\",\n        \"_content_type:person\"\n      ]\n    ]\n  },\n  documents: {\n    hitsPerPage: 5,\n    facets: [\"*\"],\n    facetFilters: [[\"search_api_datasource:entity:file\"]]\n  },\n  events: {\n    hitsPerPage: 5,\n    facets: [\"_content_type\"],\n    facetFilters: [[\"_content_type:event\"]]\n  },\n  news: {\n    hitsPerPage: 5,\n    facets: [\"_content_type\"],\n    facetFilters: [[\"_content_type:news_entry\"]]\n  }\n};\n\nAlgoliaGlobalSearch.SELECTORS = {\n  facetsContainer: \"search-facets-container\",\n  resultsContainer: \"search-results-container\",\n  closeModalButton: \"close-facets-modal\",\n  showFacetsButton: \"show-facets\",\n  resetButton: \"search-global__reset\",\n  input: \"search-global__input\"\n};\n\nAlgoliaGlobalSearch.LATLNGBOUNDS = {\n  west: 41.3193,\n  north: -71.938,\n  east: 42.8266,\n  south: -69.6189\n};\n","import Algolia from \"./algolia-search\";\nimport * as GoogleMapsHelpers from \"./google-maps-helpers\";\n\nexport class AlgoliaWithGeo extends Algolia {\n  constructor(indices, defaultParams, bounds, hitLimit) {\n    super(indices, defaultParams);\n    this._locationEnabled = true;\n    this._hitLimit = hitLimit ? hitLimit : 5;\n  }\n\n  /*\n   * Writing a comment because this logic is confusing:\n   * Here is the table of when things should be disabled\n   * or enabled based on the state of things\n   *\n   * loc_enabled | activeQueryIds len > 0 | enableLocation | enableAlgolia\n   * true          true                    true             true\n   * true          false                   true             false\n   * false         false                   true             true\n   * false         true                    false            true\n   */\n  _doSearch(allQueries) {\n    let algoliaResults = {};\n    let googleResults = {};\n    if (!(this._locationEnabled && this._activeQueryIds.length == 0)) {\n      algoliaResults = this._sendQueries(allQueries)\n        .then(this._processAlgoliaResults())\n        .catch(err => console.error(err));\n    }\n\n    if (!(!this._locationEnabled && this._activeQueryIds.length > 0)) {\n      googleResults = GoogleMapsHelpers.autocomplete({\n        input: this._lastQuery,\n        hitLimit: this._hitLimit,\n        sessionToken: this.sessionToken\n      }).catch(error =>\n        console.error(\"Error while contacting google places API:\", error)\n      );\n    }\n\n    return Promise.all([algoliaResults, googleResults])\n      .then(resultsList => {\n        this.updateWidgets(\n          resultsList.reduce((acc, res) => Object.assign(acc, res))\n        );\n      })\n      .catch(err => console.error(err));\n  }\n\n  reset() {\n    super.reset();\n    this._locationEnabled = false;\n  }\n\n  enableLocationSearch(enabled) {\n    this._locationEnabled = enabled;\n  }\n\n  setSessionToken() {\n    if (!this.sessionToken) {\n      this.sessionToken = new window.google.maps.places.AutocompleteSessionToken();\n    }\n  }\n\n  resetSessionToken() {\n    this.sessionToken = null;\n  }\n}\n","import hogan from \"hogan.js\";\nimport * as AlgoliaResult from \"./algolia-result\";\nimport * as GoogleMapsHelpers from \"./google-maps-helpers\";\nimport * as QueryHelpers from \"../ts/helpers/query\";\n\nconst TEMPLATES = {\n  contentResults: hogan.compile(`\n    <div class=\"c-search-results__section\">\n      {{#hasHits}}\n        <div class=\"c-search-result__header\">\n          {{title}}\n          {{#isLocation}}\n          <div id=\"search-result__use-my-location\" class=\"c-search-result__header--location\">\n          <i aria-hidden=\"true\" class=\"fa fa-location-arrow \"></i>\n          Use my location\n          <i aria-hidden=\"true\" id=\"search-result__loading-indicator\" class=\"fa fa-cog fa-spin c-search-result__loading-indicator\"></i>\n          </div>\n          {{/isLocation}}\n        </div>\n        <div class=\"c-search-results__hits\">\n          {{#hits}}\n              {{{.}}}\n          {{/hits}}\n          {{#isLocation}}\n            {{{googleLogo}}}\n          {{/isLocation}}\n          {{#showMore}}\n            <div id=\"show-more--{{group}}\" class=\"c-search-results__show-more\" data-group=\"{{group}}\">\n              Show more\n            </div>\n          {{/showMore}}\n        </div>\n      {{/hasHits}}\n    </div>\n `)\n};\n\nexport class AlgoliaResults {\n  constructor(id, parent) {\n    this._parent = parent;\n    this._groups = [\n      \"locations\",\n      \"routes\",\n      \"stops\",\n      \"projects\",\n      \"pages\",\n      \"documents\",\n      \"events\",\n      \"news\"\n    ];\n    this._container = document.getElementById(id);\n    this._googleLogo = document.getElementById(\n      \"powered-by-google-logo\"\n    ).innerHTML;\n    if (!this._container) {\n      console.error(`could not find results container with id: ${id}`);\n    }\n    this._container.innerHTML = \"\";\n    this._bind();\n  }\n\n  _bind() {\n    this.onClickShowMore = this.onClickShowMore.bind(this);\n    this.onClickResult = this.onClickResult.bind(this);\n    this.addResultClickHandler = this.addResultClickHandler.bind(this);\n    this._showLocation = this._showLocation.bind(this);\n  }\n\n  _addLocationListeners(results) {\n    if (results[\"locations\"]) {\n      results[\"locations\"].hits.forEach(hit => {\n        const elem = document.getElementById(`hit-${hit.place_id}`);\n        if (elem) {\n          elem.addEventListener(\"click\", this._locationSearch(hit.place_id));\n        }\n      });\n      const useLocation = document.getElementById(\n        \"search-result__use-my-location\"\n      );\n      if (useLocation) {\n        useLocation.addEventListener(\"click\", () => {\n          this._useMyLocation()\n            .then(pos => {\n              this._locationSearchByGeo(\n                pos.coords.latitude,\n                pos.coords.longitude\n              );\n            })\n            .catch(err => {\n              console.error(err);\n            });\n        });\n      }\n    }\n  }\n\n  _addShowMoreListener(groupName) {\n    const el = document.getElementById(\"show-more--\" + groupName);\n    if (el) {\n      el.removeEventListener(\"click\", this.onClickShowMore);\n      el.addEventListener(\"click\", this.onClickShowMore);\n    }\n  }\n\n  onClickResult(ev) {\n    if (ev.currentTarget.href) {\n      ev.preventDefault();\n\n      window.jQuery.post(\n        \"/search/click\",\n        {\n          queryID: ev.currentTarget.getAttribute(\"data-queryid\"),\n          position: ev.currentTarget.getAttribute(\"data-hit-position\"),\n          objectID: ev.currentTarget.getAttribute(\"data-objectid\")\n        },\n        this.onClickResultCallback(ev.currentTarget.href)\n      );\n    }\n  }\n\n  onClickResultCallback(href) {\n    return response => {\n      this.reset();\n      window.Turbolinks.visit(\n        href +\n          QueryHelpers.paramsToString(\n            this._parent.getParams(),\n            window.encodeURIComponent\n          )\n      );\n    };\n  }\n\n  onClickShowMore(ev) {\n    this._parent.onClickShowMore(ev.target.getAttribute(\"data-group\"));\n  }\n\n  _showLocation(latitude, longitude, address) {\n    const params = this._parent.getParams();\n    params.latitude = latitude;\n    params.longitude = longitude;\n    params.address = address;\n    const qs = QueryHelpers.paramsToString(params, window.encodeURIComponent);\n    window.Turbolinks.visit(`/transit-near-me${qs}`);\n  }\n\n  _locationSearchByGeo(latitude, longitude) {\n    GoogleMapsHelpers.reverseGeocode(\n      parseFloat(latitude),\n      parseFloat(longitude)\n    )\n      .then(result => {\n        document.getElementById(\n          \"search-result__loading-indicator\"\n        ).style.display = \"none\";\n        this._showLocation(latitude, longitude, result);\n      })\n      .catch(err => {\n        console.error(\n          \"Problem with retrieving location using the Google Maps API.\"\n        );\n      });\n  }\n\n  _locationSearch(placeId) {\n    return () => {\n      GoogleMapsHelpers.lookupPlace(placeId)\n        .then(result => {\n          this._parent.resetSessionToken();\n          this._showLocation(\n            result.latitude,\n            result.longitude,\n            result.formatted\n          );\n        })\n        .catch(err => {\n          console.error(err);\n        });\n    };\n  }\n\n  _useMyLocation() {\n    document.getElementById(\"search-result__loading-indicator\").style.display =\n      \"inline-block\";\n    return new Promise((resolve, reject) => {\n      navigator.geolocation.getCurrentPosition(\n        pos => {\n          return resolve(pos);\n        },\n        err => {\n          return reject(err);\n        }\n      );\n    });\n  }\n\n  init() {}\n\n  reset() {\n    this.render({});\n  }\n\n  render(results) {\n    if (this._container) {\n      this._container.innerHTML = this._groups\n        .map(group => this._renderGroup(results, group))\n        .join(\"\");\n\n      Array.from(\n        document.getElementsByClassName(AlgoliaResult.SELECTORS.result)\n      ).forEach(this.addResultClickHandler);\n\n      this._groups.forEach(group => this._addShowMoreListener(group));\n      this._addLocationListeners(results);\n    }\n  }\n\n  _renderGroup(results, group) {\n    if (!results[group]) {\n      return \"\";\n    }\n\n    return TEMPLATES.contentResults.render({\n      title: AlgoliaResults.indexTitles[group] || \"\",\n      isLocation: group == \"locations\" || null,\n      nbHits: results[group].nbHits,\n      hasHits: results[group].nbHits > 0,\n      showMore: results[group].hits.length < results[group].nbHits,\n      group: group,\n      googleLogo: AlgoliaResult.TEMPLATES.poweredByGoogleLogo.render({\n        logo: document.getElementById(\"powered-by-google-logo\").innerHTML\n      }),\n      hits: results[group].hits.map(this.renderResult(group, results[group]))\n    });\n  }\n\n  renderResult(index, groupData) {\n    return (hit, idx) => {\n      return `\n        <div class=\"c-search-result__hit\">\n          ${AlgoliaResult.renderResult(hit, index)}\n        </div>\n      `;\n    };\n  }\n\n  addResultClickHandler(el) {\n    el.removeEventListener(\"click\", this.onClickResult);\n    el.addEventListener(\"click\", this.onClickResult);\n  }\n}\n\nAlgoliaResults.indexTitles = {\n  locations: \"Locations\",\n  stops: \"Stations and Stops\",\n  routes: \"Lines and Routes\",\n  projects: \"Projects\",\n  pages: \"Pages\",\n  documents: \"Documents\",\n  events: \"Events\",\n  news: \"News\"\n};\n","import * as Cookies from \"./cookies\";\n\nexport default function fullstory() {\n  const MODULO_SAMPLE = 50;\n  const id = getUniqueId();\n\n  // Only execute the FullStory code if the id is a multiple of the selected modulo\n  if (id % MODULO_SAMPLE == 0) {\n    fullStoryInit();\n  }\n}\n\n// This is the snippet that was generated by FullStory. No changes were made to\n// this auto-generated code.\nfunction fullStoryInit() {\n  window[\"_fs_debug\"] = false;\n  window[\"_fs_host\"] = \"fullstory.com\";\n  window[\"_fs_script\"] = \"edge.fullstory.com/s/fs.js\";\n  window[\"_fs_org\"] = \"AQKVD\";\n  window[\"_fs_namespace\"] = \"FS\";\n  (function(m, n, e, t, l, o, g, y) {\n    if (e in m) {\n      if (m.console && m.console.log) {\n        m.console.log(\n          'FullStory namespace conflict. Please set window[\"_fs_namespace\"].'\n        );\n      }\n      return;\n    }\n    g = m[e] = function(a, b, s) {\n      g.q ? g.q.push([a, b, s]) : g._api(a, b, s);\n    };\n    g.q = [];\n    o = n.createElement(t);\n    o.async = 1;\n    o.crossOrigin = \"anonymous\";\n    o.src = \"https://\" + _fs_script;\n    y = n.getElementsByTagName(t)[0];\n    y.parentNode.insertBefore(o, y);\n    g.identify = function(i, v, s) {\n      g(l, { uid: i }, s);\n      if (v) g(l, v, s);\n    };\n    g.setUserVars = function(v, s) {\n      g(l, v, s);\n    };\n    g.event = function(i, v, s) {\n      g(\"event\", { n: i, p: v }, s);\n    };\n    g.anonymize = function() {\n      g.identify(!!0);\n    };\n    g.shutdown = function() {\n      g(\"rec\", !1);\n    };\n    g.restart = function() {\n      g(\"rec\", !0);\n    };\n    g.log = function(a, b) {\n      g(\"log\", [a, b]);\n    };\n    g.consent = function(a) {\n      g(\"consent\", !arguments.length || a);\n    };\n    g.identifyAccount = function(i, v) {\n      o = \"account\";\n      v = v || {};\n      v.acctId = i;\n      g(o, v);\n    };\n    g.clearUserCookie = function() {};\n    g._w = {};\n    y = \"XMLHttpRequest\";\n    g._w[y] = m[y];\n    y = \"fetch\";\n    g._w[y] = m[y];\n    if (m[y])\n      m[y] = function() {\n        return g._w[y].apply(this, arguments);\n      };\n    g._v = \"1.2.0\";\n  })(window, document, window[\"_fs_namespace\"], \"script\", \"user\");\n}\n\nfunction getUniqueId() {\n  const mbtaIdCookie = Cookies.getCookie(\"mbta_id\");\n\n  let id = 1;\n  if (mbtaIdCookie) {\n    try {\n      id = parseInt(mbtaIdCookie);\n    } catch (err) {\n      console.error(\n        \"Cookies.getUniqueId: Unable to parse mbta_id cookie as integer.\"\n      );\n    }\n  }\n\n  return id;\n}\n","export default function init() {\n  const $ = window.jQuery;\n\n  function onFocus(ev) {\n    $(ev.target.parentNode).addClass(\"c-form__input-focused\");\n  }\n\n  function onBlur(ev) {\n    $(ev.target.parentNode).removeClass(\"c-form__input-focused\");\n  }\n\n  $(document).on(\"focus\", \".js-form__input\", onFocus);\n  $(document).on(\"blur\", \".js-form__input\", onBlur);\n}\n","import { Socket } from \"phoenix\";\n\nlet channels = {};\n\nfunction onData(channelId) {\n  return data => {\n    window.$(document).trigger(channelId, data);\n  };\n}\n\nfunction initChannel(channelId, socket) {\n  if (!channels[channelId]) {\n    const channel = socket.channel(channelId, {});\n    channels[channelId] = channel;\n    channel.on(\"data\", onData(channelId));\n    channel\n      .join()\n      .receive(\"error\", ({ reason }) =>\n        console.error(`failed to join ${channelId}`, reason)\n      )\n      .receive(\"timeout\", () => console.error(`timeout joining ${channelId}`))\n      .receive(\"ok\", () => {\n        if (channelId !== \"vehicles:remove\") {\n          const route = channelId.split(\":\");\n          channel.push(\"init\", { route_id: route[1], direction_id: route[2] });\n        }\n      });\n  }\n}\n\nfunction initAll(socket) {\n  Array.from(document.querySelectorAll(\"[data-channel]\")).forEach(el => {\n    const channelId = el.getAttribute(\"data-channel\");\n    initChannel(channelId, socket);\n    if (channelId.includes(\"vehicles:\")) {\n      initChannel(\"vehicles:remove\", socket);\n    }\n  });\n}\n\nfunction teardown() {\n  Object.keys(channels).forEach(id => {\n    if (channels[id]) {\n      channels[id].leave();\n      channels[id] = null;\n    }\n  });\n  channels = {};\n}\n\nexport default function() {\n  const socket = new Socket(\"/socket\", {});\n  socket.connect();\n  document.addEventListener(\"turbolinks:load\", () => initAll(socket), {\n    passive: true\n  });\n  document.addEventListener(\"turbolinks:before-render\", teardown, {\n    passive: true\n  });\n}\n","import {\n  CRTimetableTrainIcons,\n  removeTrain,\n  allTrainsClass\n} from \"./cr-timetable-train-icons\";\n\n/* eslint-disable class-methods-use-this */\nexport const channelDataId = \"js-cr-vehicle-data\";\nconst vehicleScheduleDataId = \"js-cr-vehicle-schedules-data\";\nconst vehicleStopSequenceDataId = \"js-cr-vehicle-prior-stops-data\";\n\nexport class CRTimetableTrains {\n  constructor(dataEl) {\n    // Don't render trains on days that are not today\n    if (window.location.search.includes(\"date\")) {\n      return;\n    }\n    this.data = {};\n    try {\n      this.getData();\n    } catch (e) {\n      throw new Error(\n        \"Not able to parse initial data from Commuter Rail Timetable\",\n        e.message\n      );\n    }\n    this.bind();\n    this.channelId = dataEl.getAttribute(\"data-channel\");\n    this.addEventListeners();\n    this.icons = new CRTimetableTrainIcons({\n      schedules: this.schedules,\n      priorStops: this.priorStops\n    });\n  }\n\n  getData() {\n    const schedules = document.getElementById(vehicleScheduleDataId);\n    this.data.schedulesInfo = JSON.parse(schedules.textContent);\n    const priorStops = document.getElementById(vehicleStopSequenceDataId);\n    this.data.stopMap = JSON.parse(priorStops.textContent);\n  }\n\n  get schedules() {\n    return this.data.schedulesInfo;\n  }\n\n  set schedules(sched) {\n    this.data.schedulesInfo = sched;\n  }\n\n  get priorStops() {\n    return this.data.stopMap;\n  }\n\n  set priorStops(stops) {\n    this.data.stopMap = stops;\n  }\n\n  bind() {\n    this.onVehicles = this.onVehicles.bind(this);\n    this.onRemoveVehicles = this.onRemoveVehicles.bind(this);\n  }\n\n  addEventListeners() {\n    window.$(document).on(this.channelId, this.onVehicles);\n    window.$(document).on(\"vehicles:remove\", this.onRemoveVehicles);\n    document.addEventListener(\n      \"turbolinks:before-render\",\n      this.teardown.bind(this),\n      {\n        passive: true\n      }\n    );\n  }\n\n  removeEventListeners() {\n    window.$(document).off(this.channelId, this.onVehicles);\n    window.$(document).off(\"vehicles:remove\", this.onRemoveVehicles);\n  }\n\n  onVehicles(ev, { data }) {\n    // eslint-disable-next-line no-shadow\n    data.forEach(vehicle => this.icons.addOrUpdateTrain(vehicle));\n  }\n\n  onRemoveVehicles(ev, { data }) {\n    data.forEach(d => removeTrain(d.toString().split(\"-\")[1]));\n  }\n\n  teardown() {\n    this.removeEventListeners();\n  }\n}\n\nexport default function() {\n  document.addEventListener(\n    \"turbolinks:load\",\n    () => {\n      const dataEls = document.getElementById(channelDataId);\n      if (dataEls) {\n        return new CRTimetableTrains(dataEls);\n      }\n      return {};\n    },\n    { passive: true }\n  );\n}\n","import { handleNativeEnterKeyPress } from \"../helpers/keyboard-events\";\n\nconst hideAlert = (containerEl: HTMLElement): void => {\n  containerEl.setAttribute(\"style\", \"display: none\");\n};\n\nexport default (): void => {\n  const dismissEl: HTMLElement | null = document.querySelector(\n    \".js-fullscreen-error__dismiss\"\n  );\n  const containerEl: HTMLElement | null = document.querySelector(\n    \".js-fullscreen-error\"\n  );\n  if (!dismissEl || !containerEl) {\n    return;\n  }\n  dismissEl.addEventListener(\"click\", () => hideAlert(containerEl));\n  dismissEl.addEventListener(\"keydown\", (e: KeyboardEvent) =>\n    handleNativeEnterKeyPress(e, () => {\n      hideAlert(containerEl);\n    })\n  );\n};\n","/**\n * Enable Algolia-based autocomplete on location fields in Trip Planner-based\n * widgets that are outside the Trip Planner page. Because there may be more\n * than one widget on a page, this is done by invoking the\n * TripPlannerLocControls class once per widget\n */\nimport { TripPlannerLocControls } from \"./trip-planner-location-controls\";\n\nexport default function() {\n  document.addEventListener(\"turbolinks:load\", () => {\n    const widgets = document.getElementsByClassName(\n      \"c-paragraph--trip-plan-widget\"\n    );\n    Array.from(widgets).forEach(widget => {\n      const t = new TripPlannerLocControls({ containerEl: widget });\n    });\n  });\n}\n","import A11yDialog from \"a11y-dialog\";\n\nfunction toggleAttributePolyfill() {\n  if (!Element.prototype.toggleAttribute) {\n    Element.prototype.toggleAttribute = function(name, force) {\n      if (force !== void 0) force = !!force;\n\n      if (this.hasAttribute(name)) {\n        if (force) return true;\n\n        this.removeAttribute(name);\n        return false;\n      }\n      if (force === false) return false;\n\n      this.setAttribute(name, \"\");\n      return true;\n    };\n  }\n}\n\nfunction composedPathPolyfill() {\n  // Taken from:\n  // https://gist.github.com/rockinghelvetica/00b9f7b5c97a16d3de75ba99192ff05c\n  (function(e, d, w) {\n    if (!e.composedPath) {\n      e.composedPath = function() {\n        if (this.path) {\n          return this.path;\n        }\n        let { target } = this;\n\n        this.path = [];\n        while (target.parentNode !== null) {\n          this.path.push(target);\n          target = target.parentNode;\n        }\n        this.path.push(d, w);\n        return this.path;\n      };\n    }\n  })(Event.prototype, document, window);\n}\n\nfunction stickyPolyfill() {\n  import(\"stickyfilljs\").then(stickyfilljs => {\n    const elements = document.querySelectorAll(\".sticky-month\");\n    stickyfilljs.add(elements);\n  });\n}\n\nfunction addInternetExplorerPolyfills() {\n  toggleAttributePolyfill();\n  stickyPolyfill();\n  composedPathPolyfill();\n}\n\nexport function setupEventPopups() {\n  /**\n   * Why not use Bootstrap's popover? It's not equipped to handle having lots of\n   * interactive content, doesn't support a close button, and as implemented the\n   * UX for assistive tech users probably isn't ideal. For more, see \"Making\n   * popovers work for keyboard and assistive technology users\" in\n   * https://getbootstrap.com/docs/4.6/components/popovers/\n   *\n   * This implementation uses ally-dialog (https://a11y-dialog.netlify.app) as a\n   * base to create accessible dialog windows for various use cases.\n   */\n  const calendarView = document.querySelector(\".m-events-hub\");\n\n  // find all the event popup HTML elements\n  const eventPopups = calendarView.querySelectorAll(\".m-event-overlay\");\n  for (let i = 0; i < eventPopups.length; i++) {\n    const el = eventPopups[i];\n    const dialog = new A11yDialog(el);\n\n    // Hide popup when user clicks outside popup, or on a different event\n    const hideDialogLogicListener = function(event) {\n      const path = event.composedPath();\n      const eventClicked = path.find(function(x) {\n        return x.className === \"m-event-calendar__event\";\n      });\n      const eventIdClicked =\n        eventClicked && eventClicked.dataset.a11yDialogShow;\n      if (eventIdClicked) {\n        if (dialog._id !== eventIdClicked) dialog.hide();\n      } else if (\n        !path.find(function(x) {\n          return x.className === \"m-event-overlay\";\n        })\n      ) {\n        dialog.hide();\n      }\n    };\n    document.addEventListener(\"click\", hideDialogLogicListener);\n    document.addEventListener(\"turbolinks:before-render\", () =>\n      document.removeEventListener(\"click\", hideDialogLogicListener)\n    );\n  }\n}\n\nfunction MakeCollapsedHeadersSticky(eventsListing) {\n  const sections = eventsListing.querySelectorAll(\".m-event-list__month\");\n  for (let i = 0; i < sections.length; i++) {\n    const section = sections[i];\n    const header = section.querySelectorAll(\".c-expandable-block__link\");\n    if (header[0].getAttribute(\"aria-expanded\") == \"false\") {\n      section.classList.add(\"sticky-top\");\n    } else {\n      section.classList.remove(\"sticky-top\");\n    }\n  }\n}\n\nexport function setupEventsListing() {\n  const eventsHubPage = document.querySelector(\".m-events-hub\");\n  // add event listener to navigate to page on dropdown select\n  const dateSelects = eventsHubPage.querySelectorAll(\".m-event-list__select\");\n\n  for (let i = 0; i < dateSelects.length; i++) {\n    const select = dateSelects[i];\n    select.addEventListener(\"change\", ({ target }) => {\n      window.location.assign(target.value);\n    });\n  }\n\n  const eventsListing = document.querySelector(\".m-events-hub\");\n  if (!eventsListing) return;\n  const control = eventsListing.querySelector(\n    \".m-event-list__nav--mobile-controls\"\n  );\n  let prevScroll = window.scrollY || document.documentElement.scrollTop;\n  let prevDirection = 0;\n  let direction = 0; // 0 - initial, 1 - up, 2 - down\n\n  // add event listeners on scroll (and wheel on mobile)\n  [\"scroll\", \"wheel\"].forEach(ev => {\n    document.addEventListener(\n      ev,\n      () => {\n        window.requestAnimationFrame(() => {\n          // 1. toggle a shadow on the month header depending on if it's sticky\n          const monthHeaders = eventsListing.querySelectorAll(\n            \".c-expandable-block__link\"\n          );\n          for (let i = 0; i < monthHeaders.length; i++) {\n            const el = monthHeaders[i];\n            const stickyStyleTop = parseInt(\n              window.getComputedStyle(el).top.replace(\"px\", \"\"),\n              10\n            ); // px defined in CSS\n            const isStuck = el.getBoundingClientRect().top === stickyStyleTop;\n            el.toggleAttribute(\"stuck\", isStuck);\n          }\n\n          // 2. show or hide the month/year dropdowns on mobile depending on\n          // whether the user scrolls up or down\n          const curScroll =\n            window.scrollY || document.documentElement.scrollTop;\n          direction =\n            // eslint-disable-next-line no-nested-ternary\n            curScroll > prevScroll ? 2 : curScroll < prevScroll ? 1 : 0;\n\n          const controlHeight = control.getBoundingClientRect().height;\n          if (direction !== prevDirection) {\n            // toggle the controls\n            if (direction === 2 && curScroll > controlHeight) {\n              // hide the controls\n              eventsListing.classList.add(\"js-nav-down\");\n              eventsListing.classList.remove(\"js-nav-up\");\n            } else if (direction === 1) {\n              // show the controls\n              eventsListing.classList.add(\"js-nav-up\");\n              eventsListing.classList.remove(\"js-nav-down\");\n            }\n            prevDirection = direction;\n          }\n\n          prevScroll = curScroll;\n\n          MakeCollapsedHeadersSticky(eventsListing);\n        });\n      },\n      { capture: false, passive: true }\n    );\n  });\n\n  // scroll to active heading if available\n  const activeMonthElement = eventsListing.querySelector(\n    \".m-event-list__month--active\"\n  );\n  if (activeMonthElement) activeMonthElement.scrollIntoView();\n}\n\nexport default function() {\n  document.addEventListener(\n    \"turbolinks:load\",\n    () => {\n      const viewPreviousEventsLink = document.querySelector(\n        \".m-view-previous-events\"\n      );\n      if (viewPreviousEventsLink) {\n        viewPreviousEventsLink.classList.remove(\"hidden\");\n      }\n      if (document.querySelector(\".m-events-hub\")) {\n        const isIE = !!document.documentMode;\n        if (isIE) {\n          addInternetExplorerPolyfills();\n        }\n\n        setupEventsListing();\n        setupEventPopups();\n      }\n    },\n    { passive: true }\n  );\n}\n","export function setupViewPreviousEventsButton() {\n  const viewPreviousEventsButtons = [\n    ...document.querySelectorAll(\"a.m-previous-events-button\")\n  ];\n\n  viewPreviousEventsButtons.forEach(button => {\n    button.addEventListener(\"click\", () => {\n      // show hidden events for this button\n      const groupName = button.dataset.group;\n      const hiddenEventsForGroup = document.querySelectorAll(\n        `.m-event.hidden[data-group=\"${groupName}\"]`\n      );\n      [...hiddenEventsForGroup].forEach(event => {\n        event.classList.remove(\"hidden\");\n      });\n      button.parentElement.classList.add(\"hidden\");\n    });\n    // If the user navigates by keyboard, simulate click on enter-key press\n    button.addEventListener(\"keyup\", e => {\n      if (e.keyCode === 13) {\n        button.click();\n      }\n    });\n  });\n}\n\nexport default function() {\n  document.addEventListener(\n    \"turbolinks:load\",\n    () => {\n      setupViewPreviousEventsButton();\n    },\n    { passive: true }\n  );\n}\n","import hogan from \"hogan.js\";\n\nexport class FacetItem {\n  get selectors() {\n    return {\n      textDisplay: `facet-text-${this._id}`,\n      checkbox: `checkbox-item-${this._id}`,\n      counter: `facet-item-counter-${this._id}`,\n      childrenDiv: `facet-children-${this._id}`,\n      checkboxLabel: `facet-label-${this._id}`,\n      icon: `facet-icon-${this._id}`,\n      expansionContainer: `expansion-container-${this._id}`,\n      checkboxControlContainer: `checkbox-container-${this._id}`\n    };\n  }\n\n  get templates() {\n    const tabbable = this._children.length > 0;\n    const tabToExpand = tabbable\n      ? `role=\"button\" aria-expanded=\"false\" tabindex=\"0\"`\n      : \"\";\n    return {\n      facetItem: hogan.compile(`\n        <div class=\"{{class}}\">\n          <div id=\"${\n            this.selectors.expansionContainer\n          }\" class=\"c-facets__flex-container--normal\" ${tabToExpand}>\n            <div class=\"c-facets__icon\">\n              {{#iconClass}}\n                {{{iconClass}}}\n              {{/iconClass}}\n            </div>\n            <div id=\"${\n              this.selectors.textDisplay\n            }\" class=\"c-facets__title\">{{text}}</div>\n          </div>\n          <div id=\"${\n            this.selectors.checkboxControlContainer\n          }\" class=\"c-facets__flex-container--wide\">\n            <div class=\"c-facets__facet-item\" id=\"${\n              this.selectors.counter\n            }\"></div>\n            <div class=\"c-checkbox\">\n              <input id=\"${\n                this.selectors.checkbox\n              }\" class=\"c-checkbox__input\" type=\"checkbox\" name=\"{{text}}\" aria-labelledby=\"${\n        this.selectors.textDisplay\n      }\">\n              <label id=\"${\n                this.selectors.checkboxLabel\n              }\" class=\"c-checkbox__label\" for=\"${\n        this.selectors.checkbox\n      }\"></label>\n            </div>\n          </div>\n        </div>\n        <div id=\"${this.selectors.childrenDiv}\"></div>\n      `)\n    };\n  }\n\n  constructor(data, parent) {\n    this._id = data.id;\n    this._name = data.name;\n    this._parent = parent;\n    this._iconHTML = data.icon;\n    this._facets = data.facets || [];\n    this._prefix = data.prefix;\n    this._count = 0;\n    this._facets = this._facets.map(facet => {\n      return `${this._prefix}:${facet}`;\n    });\n    if (this._facets.length > 0) {\n      this.addToMap(this._facets, this);\n    }\n\n    this._checkbox = null;\n    this._counter = null;\n    this._textDisplay = null;\n    this._childrenDiv = null;\n    this._icon = null;\n    this._children = [];\n    if (data.items) {\n      this._iconHTML = this._triangleRightIcon(this._id);\n      this._children = data.items.map(item => {\n        if (!item.prefix) {\n          item.prefix = this._prefix;\n        }\n        return new FacetItem(item, this);\n      });\n    }\n  }\n\n  addToMap(facets, facetItem) {\n    this._parent.addToMap(facets, facetItem);\n  }\n\n  getActiveFacets() {\n    const children = [].concat.apply(\n      [],\n      this._children.map(child => child.getActiveFacets())\n    );\n    if (this.isChecked()) {\n      return this._facets.concat(children);\n    }\n    return children;\n  }\n\n  isChecked() {\n    return this._checkbox.checked;\n  }\n\n  _triangleRightIcon(id) {\n    return `<span id=\"${\n      this.selectors.icon\n    }\" class=\"c-facets__triangle--right\"></span>`;\n  }\n\n  toggleExpansion() {\n    if (this._childrenDiv.style.display == \"none\") {\n      document\n        .getElementById(this.selectors.expansionContainer)\n        .setAttribute(\"aria-expanded\", \"true\");\n      document\n        .getElementById(this.selectors.expansionContainer)\n        .setAttribute(\"aria-controls\", this._childrenDiv.id);\n      this._childrenDiv.style.display = \"block\";\n      this._icon.classList.remove(\"c-facets__triangle--right\");\n      this._icon.classList.add(\"c-facets__triangle--down\");\n    } else {\n      document\n        .getElementById(this.selectors.expansionContainer)\n        .setAttribute(\"aria-expanded\", \"false\");\n      document\n        .getElementById(this.selectors.expansionContainer)\n        .setAttribute(\"aria-controls\", this._childrenDiv.id);\n      this._childrenDiv.style.display = \"none\";\n      this._icon.classList.remove(\"c-facets__triangle--down\");\n      this._icon.classList.add(\"c-facets__triangle--right\");\n    }\n  }\n\n  gatherElements() {\n    this._textDisplay = document.getElementById(this.selectors.textDisplay);\n    this._checkbox = document.getElementById(this.selectors.checkbox);\n    this._counter = document.getElementById(this.selectors.counter);\n    this._childrenDiv = document.getElementById(this.selectors.childrenDiv);\n    this._checkboxLabel = document.getElementById(this.selectors.checkboxLabel);\n    this._icon = document.getElementById(this.selectors.icon);\n    this._checkbox.checked = false;\n    this.setupListeners();\n  }\n\n  check() {\n    this._checkbox.checked = true;\n    this._children.forEach(child => {\n      child.check();\n    });\n  }\n\n  uncheckUI() {\n    this._checkbox.checked = false;\n  }\n\n  reset() {\n    this.uncheck();\n    this._children.forEach(child => child.reset());\n    this.updateCount(0);\n  }\n\n  uncheck() {\n    this.uncheckUI();\n    this._children.forEach(child => {\n      child.uncheck();\n    });\n  }\n\n  isChecked() {\n    return this._checkbox.checked;\n  }\n\n  toggleCheck() {\n    if (this._checkbox.checked) {\n      this.uncheck();\n    } else {\n      this.check();\n    }\n    this._parent.update();\n  }\n\n  update() {\n    this.updateState();\n    this._parent.update();\n  }\n\n  updateState() {\n    if (this.allChildrenStatus(true)) {\n      this.check();\n    } else {\n      this.uncheckUI();\n    }\n    this._parent.updateState();\n  }\n\n  allChildrenStatus(status) {\n    if (this._children.length == 0) {\n      return this._checkbox.checked == status;\n    }\n    return this._children.every(child => {\n      return child.allChildrenStatus(status);\n    });\n  }\n\n  updateCount(count) {\n    if (count === undefined) {\n      count = 0;\n    }\n    this._count = count;\n    this._counter.innerHTML = count ? count : \"\";\n    this._parent.updateCount(this._parent.sumChildren());\n  }\n\n  sumChildren(count) {\n    if (this._children.length == 0) {\n      return this._count;\n    }\n    return this._children\n      .map(child => {\n        return child.sumChildren();\n      })\n      .reduce(function(total, num) {\n        return total + num;\n      }, 0);\n  }\n\n  render(container, itemStyle) {\n    const div = document.createElement(\"div\");\n    div.id = `facet-item-${this._id}`;\n    div.innerHTML = this.templates.facetItem.render({\n      class: itemStyle,\n      text: this._name,\n      iconClass: this._iconHTML\n    });\n    container.appendChild(div);\n    this.gatherElements();\n    this._childrenDiv.style.display = \"none\";\n    this._childrenDiv = document.getElementById(`facet-children-${this._id}`);\n    this._children.forEach(child => {\n      child.render(this._childrenDiv, \"c-facets__search-facet-child\");\n    });\n  }\n\n  setupListeners() {\n    const expansionContainer = document.getElementById(\n      this.selectors.expansionContainer\n    );\n    const checkboxControlContainer = document.getElementById(\n      this.selectors.checkboxControlContainer\n    );\n    const checkbox = document.getElementById(this.selectors.checkbox);\n    checkboxControlContainer.addEventListener(\"click\", e => {\n      this.toggleCheck();\n    });\n    checkbox.addEventListener(\"keydown\", e => {\n      const key = e.key || e.keyCode;\n      if (key === \" \" || key === \"Spacebar\" || key === 32) {\n        this.toggleCheck();\n      }\n    });\n    if (this._children.length > 0) {\n      expansionContainer.addEventListener(\"keydown\", e => {\n        const key = e.key || e.keyCode;\n        if (key === \" \" || key === \"Spacebar\" || key === 32) {\n          e.preventDefault(); // Don't scroll down page on spacebar, just expand\n          this.toggleExpansion();\n        }\n        if (key === \"Enter\" || key === \"Enter\" || key === 13) {\n          this.toggleExpansion();\n        }\n      });\n      expansionContainer.addEventListener(\"click\", () => {\n        this.toggleExpansion();\n      });\n    }\n  }\n\n  setupAllListeners() {\n    this.setupListeners();\n    this._children.forEach(function(child) {\n      child.setupAllListeners();\n    });\n  }\n\n  selectedFacetNames(acc) {\n    if (this.isChecked()) {\n      acc.push(this._id);\n    }\n    this._children.forEach(child => child.selectedFacetNames(acc));\n    return acc;\n  }\n\n  loadFacet(id) {\n    if (this._children.length > 0) {\n      this._children.forEach(child => child.loadFacet(id));\n    }\n    if (this._id == id) {\n      this.check();\n      this.updateState();\n    }\n  }\n}\n","import { FacetItem } from \"./facet-item\";\n\nexport class FacetGroup {\n  constructor(facetData, parent) {\n    this._facetMap = {};\n    this._parent = parent;\n    this._item = new FacetItem(facetData, this);\n  }\n\n  addToMap(facets, facetItem) {\n    this._facetMap[facets] = facetItem;\n  }\n\n  render(container, style) {\n    this._item.render(container, style);\n  }\n\n  sumChildren() {\n    return true;\n  }\n\n  updateCount() {\n    return true;\n  }\n\n  updateCounts(facetResults) {\n    Object.keys(this._facetMap).forEach(key => {\n      let count = 0;\n      key.split(\",\").forEach(facet => {\n        if (facetResults[facet]) {\n          count += facetResults[facet];\n        }\n      });\n      this._facetMap[key].updateCount(count);\n    });\n  }\n\n  update() {\n    this._parent.update();\n  }\n\n  updateState() {\n    this._parent.updateState();\n  }\n\n  getFacetsForQuery() {\n    return this._item.getActiveFacets();\n  }\n\n  shouldDisableQuery() {\n    return this._item.allChildrenStatus(false);\n  }\n\n  modifySearch(search, queryId) {\n    if (!this.shouldDisableQuery()) {\n      search.updateFacetFilters(queryId, this.getFacetsForQuery());\n      search.addActiveQuery(queryId);\n    }\n  }\n\n  reset() {\n    this._item.reset();\n  }\n\n  selectedFacetNames() {\n    return this._item.selectedFacetNames([]);\n  }\n\n  loadFacet(id) {\n    this._item.loadFacet(id);\n  }\n}\n","import hogan from \"hogan.js\";\nimport { FacetGroup } from \"./facet-group\";\nimport { FacetLocationGroup } from \"./facet-location-group\";\n\nconst facetGroupClasses = { FacetGroup, FacetLocationGroup };\n\nexport class FacetBar {\n  constructor(container, search, facets, parent) {\n    this._container = document.getElementById(container);\n    this._search = search;\n    this._parent = parent;\n    this._items = {};\n    this._facetPrefixes = [];\n    if (this._container) {\n      this._container.innerHTML = \"\";\n      this._parseFacets(facets);\n    }\n  }\n\n  updateCounts(facetResults) {\n    Object.keys(this._items).forEach(queryId => {\n      this._items[queryId].updateCounts(facetResults);\n    });\n  }\n\n  _parseFacets(facets) {\n    Object.keys(facets).forEach(queryId => {\n      const facetData = facets[queryId].item;\n      if (!facetData.prefix) {\n        facetData.prefix = facets[queryId].facetName;\n      }\n      const groupClass = facetGroupClasses[facetData.cls || \"FacetGroup\"];\n      this._items[queryId] = new groupClass(facetData, this);\n      this._items[queryId].render(this._container, \"c-facets__search-facet\");\n    });\n  }\n\n  reset() {\n    const items = this._items;\n\n    for (let item in items) {\n      items[item].reset();\n    }\n    this._resetQueries();\n  }\n\n  _resetQueries() {\n    this._search.updateActiveQueries([]);\n    for (const item in this._items) {\n      this._items[item].modifySearch(this._search, item);\n    }\n  }\n\n  update() {\n    this.updateState();\n    this._search.search();\n  }\n\n  updateState() {\n    this._resetQueries();\n    this._parent.updateState();\n  }\n\n  selectedFacetNames() {\n    return Object.keys(this._items).reduce(\n      (acc, key) => this._selectedFacetsReducer(key, acc),\n      []\n    );\n  }\n\n  _selectedFacetsReducer(key, acc) {\n    this._items[key].selectedFacetNames().forEach(name => acc.push(name));\n    return acc;\n  }\n\n  loadState(facets) {\n    facets.forEach(id => {\n      Object.values(this._items).forEach(item => item.loadFacet(id));\n    });\n  }\n}\n","import { FacetGroup } from \"./facet-group\";\n\nexport class FacetLocationGroup extends FacetGroup {\n  constructor(data, parent) {\n    super(data, parent);\n  }\n\n  modifySearch(search, queryId) {\n    search.enableLocationSearch(this._item.isChecked());\n  }\n\n  updateCounts(facetResults) {\n    this._item.updateCount(facetResults[\"locations\"]);\n  }\n}\n","import { FacetBar } from \"./facet-bar\";\nimport * as Icons from \"./icons\";\n\nexport class AlgoliaFacets {\n  constructor(selectors, search, parent) {\n    this.selectors = selectors;\n    this._closeModalBtn = null;\n    this._showFacetsBtn = null;\n    this._parent = parent;\n    this._facetsContainer = null;\n    this._bind();\n    const facets = {\n      locations: {\n        queryId: \"locations\",\n        item: {\n          id: \"locations\",\n          name: \"Locations\",\n          cls: \"FacetLocationGroup\",\n          icon: this._faIcon(\"fa-map-marker\")\n        }\n      },\n      routes: {\n        queryId: \"routes\",\n        facetName: \"route.type\",\n        item: {\n          id: \"lines-routes\",\n          name: \"Lines and Routes\",\n          items: [\n            {\n              id: \"subway\",\n              name: \"Subway\",\n              facets: [\"0\", \"1\"],\n              icon: Icons.getFeatureIcon(\"subway\")\n            },\n            {\n              id: \"bus\",\n              name: \"Bus\",\n              facets: [\"3\"],\n              icon: Icons.getFeatureIcon(\"bus\")\n            },\n            {\n              id: \"commuter-rail\",\n              name: \"Commuter Rail\",\n              facets: [\"2\"],\n              icon: Icons.getFeatureIcon(\"commuter_rail\")\n            },\n            {\n              id: \"ferry\",\n              name: \"Ferry\",\n              facets: [\"4\"],\n              icon: Icons.getFeatureIcon(\"ferry\")\n            }\n          ]\n        }\n      },\n      stops: {\n        queryId: \"stops\",\n        facetName: \"stop.station?\",\n        item: {\n          id: \"stops\",\n          name: \"Stations and Stops\",\n          items: [\n            {\n              id: \"facet-station\",\n              name: \"Stations\",\n              facets: [\"true\"],\n              icon: Icons.getFeatureIcon(\"station\")\n            },\n            {\n              id: \"facet-stop\",\n              name: \"Stops\",\n              facets: [\"false\"],\n              icon: Icons.getFeatureIcon(\"stop\")\n            }\n          ]\n        }\n      },\n      projects: {\n        queryId: \"projects\",\n        facetName: \"_content_type\",\n        item: {\n          id: \"projects\",\n          name: \"Projects\",\n          facets: [\"project\", \"project_update\"],\n          icon: this._faIcon(\"fa-info\")\n        }\n      },\n      pages: {\n        queryId: \"pages\",\n        facetName: \"_content_type\",\n        item: {\n          id: \"page\",\n          name: \"Pages\",\n          facets: [\n            \"page\",\n            \"search_result\",\n            \"landing_page\",\n            \"person\",\n            \"diversion\"\n          ],\n          icon: this._faIcon(\"fa-info\")\n        }\n      },\n      documents: {\n        queryId: \"documents\",\n        facetName: \"_content_type\",\n        item: {\n          id: \"document\",\n          name: \"Documents\",\n          prefix: \"search_api_datasource\",\n          facets: [\"entity:file\"],\n          icon: this._faIcon(\"fa-file-o\")\n        }\n      },\n      events: {\n        queryId: \"events\",\n        facetName: \"_content_type\",\n        item: {\n          id: \"event\",\n          name: \"Events\",\n          icon: this._faIcon(\"fa-calendar\"),\n          facets: [\"event\"]\n        }\n      },\n      news: {\n        queryId: \"news\",\n        facetName: \"_content_type\",\n        item: {\n          id: \"news\",\n          name: \"News\",\n          icon: this._faIcon(\"fa-newspaper-o\"),\n          facets: [\"news_entry\"]\n        }\n      }\n    };\n    this._facetBar = new FacetBar(\"search-facets\", search, facets, this);\n  }\n\n  _bind() {\n    this.onClickCloseModalBtn = this.onClickCloseModalBtn.bind(this);\n    this.onClickShowFacetsBtn = this.onClickShowFacetsBtn.bind(this);\n  }\n\n  onClickShowFacetsBtn(ev) {\n    this._facetsContainer.classList.add(\"c-search__facets-container--open\");\n    this._closeModalBtn.classList.add(\"c-search__close-modal-button--open\");\n    document.body.classList.add(\"c-search__open-modal\");\n  }\n\n  onClickCloseModalBtn(ev) {\n    this._facetsContainer.classList.remove(\"c-search__facets-container--open\");\n    this._closeModalBtn.classList.remove(\"c-search__close-modal-button--open\");\n    document.body.classList.remove(\"c-search__open-modal\");\n  }\n\n  _faIcon(icon) {\n    return `<span aria-hidden=\"true\" class=\"c-search-result__content-icon fa ${icon}\"></span>`;\n  }\n\n  init() {\n    this._closeModalBtn = document.getElementById(\n      this.selectors.closeModalButton\n    );\n    this._showFacetsBtn = document.getElementById(\n      this.selectors.showFacetsButton\n    );\n    this._facetsContainer = document.getElementById(\n      this.selectors.facetsContainer\n    );\n    if (this._closeModalBtn && this._showFacetsBtn && this._facetsContainer) {\n      this.addEventListeners();\n    }\n  }\n\n  addEventListeners() {\n    this._closeModalBtn.removeEventListener(\"click\", this.onClickCloseModalBtn);\n    this._closeModalBtn.addEventListener(\"click\", this.onClickCloseModalBtn);\n\n    this._showFacetsBtn.removeEventListener(\"click\", this.onClickShowFacetsBtn);\n    this._showFacetsBtn.addEventListener(\"click\", this.onClickShowFacetsBtn);\n  }\n\n  reset() {\n    this._facetBar.reset();\n  }\n\n  render(results) {\n    const facetResults = {};\n    Object.keys(results).forEach(key => {\n      if (key.startsWith(\"facets-\")) {\n        const facets = results[key].facets;\n        Object.keys(facets).forEach(prefix => {\n          const values = facets[prefix];\n          Object.keys(values).forEach(facet => {\n            facetResults[`${prefix}:${facet}`] = values[facet];\n          });\n        });\n      } else if (key == \"locations\") {\n        facetResults[\"locations\"] = results[\"locations\"].hits.length;\n      }\n    });\n\n    this._facetBar.updateCounts(facetResults);\n  }\n\n  selectedFacetNames() {\n    return this._facetBar.selectedFacetNames();\n  }\n\n  loadState(facets) {\n    this._facetBar.loadState(facets);\n  }\n\n  updateState() {\n    this._parent.updateHistory();\n  }\n}\n","import AlgoliaAutocomplete from \"./algolia-autocomplete\";\nimport * as GoogleMapsHelpers from \"./google-maps-helpers\";\n// eslint-disable-next-line\nimport * as QueryHelpers from \"../ts/helpers/query\";\nimport geolocationPromise from \"./geolocation-promise\";\nimport debounce from \"../ts/helpers/debounce.ts\";\n\n/* eslint-disable no-underscore-dangle */\n\nexport const addFilterParam = (params, path) => {\n  switch (path) {\n    case \"/schedules/commuter-rail\":\n    case \"/schedules/commuter-rail/\":\n      return Object.assign(params, { filter: \"commuter_rail\" });\n\n    case \"/schedules/subway\":\n    case \"/schedules/subway/\":\n      return Object.assign(params, { filter: \"subway\" });\n\n    case \"/schedules/bus\":\n    case \"/schedules/bus/\":\n      return Object.assign(params, { filter: \"bus\" });\n\n    default:\n      return params;\n  }\n};\n\nclass AlgoliaAutocompleteWithGeo extends AlgoliaAutocomplete {\n  constructor({\n    id,\n    selectors,\n    indices,\n    locationParams,\n    popular,\n    parent,\n    containerEl = null\n  }) {\n    super({ id, selectors, indices, parent, containerEl });\n    this.sessionToken = null;\n    this.debounceInterval = 250;\n    if (!this._parent.getParams) {\n      this._parent.getParams = () => ({});\n    }\n    this._popular = popular;\n    this._loadingIndicator = this.getById(selectors.locationLoadingIndicator);\n    this.addUseMyLocationErrorEl();\n    this._locationParams = Object.assign(\n      AlgoliaAutocompleteWithGeo.DEFAULT_LOCATION_PARAMS,\n      locationParams\n    );\n    this._indices.splice(this._locationParams.position, 0, \"locations\");\n    this._indices.push(\"usemylocation\");\n    this._indices.push(\"popular\");\n  }\n\n  bind() {\n    super.bind();\n    this.onFocus = this.onFocus.bind(this);\n  }\n\n  _addListeners() {\n    super._addListeners();\n    this._input.addEventListener(\"focus\", this.onFocus);\n  }\n\n  onFocus() {\n    if (!this.sessionToken) {\n      this.sessionToken = new window.google.maps.places.AutocompleteSessionToken();\n    }\n  }\n\n  resetSessionToken() {\n    this.sessionToken = null;\n  }\n\n  addUseMyLocationErrorEl() {\n    const container = this.getById(this._selectors.container);\n    this.useMyLocationErrorEl = document.createElement(\"div\");\n    this.useMyLocationErrorEl.classList.add(\"u-error\");\n    this.useMyLocationErrorEl.style.display = \"none\";\n    this.useMyLocationErrorEl.innerHTML = `${\n      window.location.host\n    } needs permission to use your location.\n      Please update your browser's settings or refresh the page and try again.`;\n    container.parentNode.appendChild(this.useMyLocationErrorEl);\n  }\n\n  _datasetSource(index) {\n    switch (index) {\n      case \"locations\":\n        return debounce(\n          this._locationSource(\"locations\"),\n          this.debounceInterval\n        );\n      case \"usemylocation\":\n        return this._useMyLocationSource();\n      case \"popular\":\n        return this._popularSource();\n      default:\n        return debounce(super._datasetSource(index), this.debounceInterval);\n    }\n  }\n\n  _locationSource(index) {\n    return (input, callback) =>\n      GoogleMapsHelpers.autocomplete({\n        input,\n        sessionToken: this.sessionToken,\n        hitLimit: this._locationParams.hitLimit\n      }).then(results => this._onResults(callback, index, results));\n  }\n\n  _popularSource() {\n    return (query, callback) => {\n      const results = { popular: { hits: this._popular } };\n      return this._onResults(callback, \"popular\", results);\n    };\n  }\n\n  _useMyLocationSource() {\n    return (query, callback) => {\n      const results = { usemylocation: { hits: [{}] } };\n      return this._onResults(callback, \"usemylocation\", results);\n    };\n  }\n\n  // eslint-disable-next-line class-methods-use-this\n  minLength(index) {\n    switch (index) {\n      case \"usemylocation\":\n      case \"popular\":\n        return 0;\n      default:\n        return 1;\n    }\n  }\n\n  // eslint-disable-next-line class-methods-use-this\n  maxLength(index) {\n    switch (index) {\n      case \"usemylocation\":\n      case \"popular\":\n        return 0;\n      default:\n        return null;\n    }\n  }\n\n  onHitSelected(ev) {\n    // placesService can be injected in tests\n    const hit = ev.originalEvent;\n    const index = hit._args[1];\n    switch (index) {\n      case \"locations\":\n        this._input.value = hit._args[0].description;\n        this._doLocationSearch(hit._args[0].id);\n        break;\n      case \"usemylocation\":\n        this.useMyLocationSearch();\n        break;\n      default:\n        super.onHitSelected(ev);\n    }\n  }\n\n  useMyLocationSearch() {\n    this.useMyLocationErrorEl.style.display = \"none\";\n    this._input.disabled = true;\n    this.setValue(\"Getting your location...\");\n    this._loadingIndicator.style.visibility = \"visible\";\n    return geolocationPromise()\n      .then(pos => this.onUseMyLocationResults(pos))\n      .catch(err => this.onGeolocationError(err));\n  }\n\n  onGeolocationError(err) {\n    this._input.disabled = false;\n    this.setValue(\"\");\n    this._loadingIndicator.style.visibility = \"hidden\";\n    if (err.code && err.code === 1) {\n      this.useMyLocationErrorEl.style.display = \"block\";\n    }\n  }\n\n  _doLocationSearch(placeId) {\n    return GoogleMapsHelpers.lookupPlace(placeId).then(result =>\n      this._onLocationSearchResult(result)\n    );\n  }\n\n  _onLocationSearchResult(result) {\n    this.resetSessionToken();\n    return this.showLocation(result.latitude, result.longitude);\n  }\n\n  onUseMyLocationResults({ coords: { latitude, longitude } }) {\n    return GoogleMapsHelpers.reverseGeocode(\n      parseFloat(latitude),\n      parseFloat(longitude)\n    ).then(result => this.onReverseGeocodeResults(result, latitude, longitude));\n  }\n\n  onReverseGeocodeResults(result, latitude, longitude) {\n    this._input.disabled = false;\n    this.setValue(result);\n    this._loadingIndicator.style.visibility = \"hidden\";\n    this._input.value = result;\n    this.showLocation(latitude, longitude);\n  }\n\n  showLocation(latitude, longitude) {\n    const params = this._parent.getParams();\n    params.latitude = latitude;\n    params.longitude = longitude;\n    params.address = this._input.value;\n    const qs = QueryHelpers.paramsToString(\n      addFilterParam(params, window.location.pathname),\n      window.encodeURIComponent\n    );\n    window.Turbolinks.visit(`/transit-near-me${qs}`);\n  }\n}\n\nAlgoliaAutocompleteWithGeo.DEFAULT_LOCATION_PARAMS = {\n  position: 0,\n  hitLimit: 5\n};\n\nexport default AlgoliaAutocompleteWithGeo;\n","export default function() {\n  return new Promise(function(resolve, reject) {\n    if (window.navigator && window.navigator.geolocation) {\n      window.navigator.geolocation.getCurrentPosition(resolve, reject);\n    } else {\n      reject(\"window.navigator.geolocation not enabled\");\n    }\n  });\n}\n","/* eslint-disable */\nimport \"../vendor/fixedsticky\";\nimport \"../vendor/accessible-date-picker\";\nimport \"bootstrap/dist/js/umd/collapse\";\nimport \"bootstrap/dist/js/umd/modal\";\nimport \"bootstrap/dist/js/umd/tooltip\";\nimport \"bootstrap/dist/js/umd/dropdown\";\nimport objectFitImages from \"object-fit-images\";\nimport googleAnalytics from \"./google-analytics\";\nimport googleMapsLoaded from \"./google-maps-loaded\";\nimport submitOnEvents from \"./submit-on-events\";\nimport selectModal from \"./select-modal\";\nimport collapse from \"./collapse\";\nimport headerDropdowns from \"./header-dropdowns\";\nimport modal from \"./modal\";\nimport turbolinksMods from \"./turbolinks-mods\";\nimport supportForm from \"./support-form\";\nimport fixedsticky from \"./fixedsticky\";\nimport menuCtrlClick from \"./menu-ctrl-click\";\nimport carousel from \"./carousel\";\nimport geoLocation from \"./geolocation\";\nimport addressSearch from \"./address-search\";\nimport autocompleteSetup from \"./autocomplete-setup\";\nimport googleTranslate from \"./google-translate\";\nimport scrollTo from \"./scroll-to\";\nimport stickyTooltip from \"./sticky-tooltip\";\nimport timetableScroll from \"./timetable-scroll\";\nimport timetableStyle from \"./timetable-style\";\nimport timetableStick from \"./timetable-stick\";\nimport menuClose from \"./menu-close\";\nimport datePicker from \"./date-picker\";\nimport toggleBtn from \"./toggle-on-click\";\nimport * as TimeControls from \"./time-controls/time-controls\";\nimport * as TripPlannerLocationControls from \"./trip-planner-location-controls\";\nimport stopBubbles from \"./stop-bubbles\";\nimport search from \"./search\";\nimport photoGallery from \"./photo-gallery\";\nimport { init as embeddedSearchInit } from \"./algolia-embedded-search\";\nimport * as homepageSearch from \"./algolia-homepage-search\";\nimport * as globalSearch from \"./algolia-global-search\";\nimport fullstory from \"./fullstory\";\nimport inputFocus from \"./input-focus\";\nimport channels from \"./channels\";\nimport CRTrains from \"./cr-timetable-trains\";\nimport { onload as alertItemLoad } from \"./alert-item\";\nimport dismissFullscreenError from \"../ts/app/dismiss-fullscreen-error\";\nimport tripPlannerWidget from \"./trip-planner-widget\";\nimport eventPageSetup from \"./event-page-setup\";\nimport previousEventsButton from \"./view-previous-events\";\n\ndocument.body.className = document.body.className.replace(\"no-js\", \"js\");\n\n// Extra steps for non-modular javascript\nTurbolinks.start();\n// Won't work as ProvidePlugin due to above\nwindow.Turbolinks = Turbolinks;\n\n// Doesn't work with ProvidePlugin due to window.zepto dep\nwindow.autocomplete = autocomplete;\n\n// Polyfills\nwindow.nextTick = function nextTick(f) {\n  window.setTimeout(f, 0);\n};\n\nwindow.requestAnimationFrame =\n  window.requestAnimationFrame ||\n  window.webkitRequestAnimationFrame ||\n  window.mozRequestAnimationFrame ||\n  function(f) {\n    window.setTimeout(f, 15);\n  };\n\n// Source: https://github.com/Alhadis/Snippets/blob/master/js/polyfills/IE8-child-elements.js\nif (!(\"previousElementSibling\" in document.documentElement)) {\n  Object.defineProperty(Element.prototype, \"previousElementSibling\", {\n    get() {\n      let e = this.previousSibling;\n      while (e && e.nodeType !== 1) {\n        e = e.previousSibling;\n      }\n      return e;\n    }\n  });\n}\n\nif (!(\"nextElementSibling\" in document.documentElement)) {\n  Object.defineProperty(Element.prototype, \"nextElementSibling\", {\n    get() {\n      let e = this.nextSibling;\n      while (e && e.nodeType !== 1) {\n        e = e.nextSibling;\n      }\n      return e;\n    }\n  });\n}\n\n// Production steps of ECMA-262, Edition 5, 15.4.4.19\n// Reference: http://es5.github.io/#x15.4.4.19\nif (!Array.prototype.map) {\n  Array.prototype.map = function(callback /* , thisArg */) {\n    let T;\n    let A;\n    let k;\n    if (this == null) {\n      throw new TypeError(\"this is null or not defined\");\n    }\n    const O = Object(this);\n    const len = O.length >>> 0;\n    if (typeof callback !== \"function\") {\n      throw new TypeError(`${callback} is not a function`);\n    }\n    if (arguments.length > 1) {\n      T = arguments[1];\n    }\n    A = new Array(len);\n    // 7. Let k be 0\n    while (k < len) {\n      var kValue;\n      var mappedValue;\n      if (k in O) {\n        kValue = O[k];\n        mappedValue = callback.call(T, kValue, k, O);\n        A[k] = mappedValue;\n      }\n      k++;\n    }\n    return A;\n  };\n}\n\n// Production steps of ECMA-262, Edition 6, 22.1.2.1\n// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from\nif (!Array.from) {\n  Array.from = (function() {\n    const toStr = Object.prototype.toString;\n    const isCallable = function(fn) {\n      return typeof fn === \"function\" || toStr.call(fn) === \"[object Function]\";\n    };\n    const toInteger = function(value) {\n      const number = Number(value);\n      if (isNaN(number)) {\n        return 0;\n      }\n      if (number === 0 || !isFinite(number)) {\n        return number;\n      }\n      return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));\n    };\n    const maxSafeInteger = Math.pow(2, 53) - 1;\n    const toLength = function(value) {\n      const len = toInteger(value);\n      return Math.min(Math.max(len, 0), maxSafeInteger);\n    };\n\n    // The length property of the from method is 1.\n    return function from(arrayLike /* , mapFn, thisArg */) {\n      // 1. Let C be the this value.\n      const C = this;\n\n      // 2. Let items be ToObject(arrayLike).\n      const items = Object(arrayLike);\n\n      // 3. ReturnIfAbrupt(items).\n      if (arrayLike == null) {\n        throw new TypeError(\n          \"Array.from requires an array-like object - not null or undefined\"\n        );\n      }\n\n      // 4. If mapfn is undefined, then let mapping be false.\n      const mapFn = arguments.length > 1 ? arguments[1] : void undefined;\n      let T;\n      if (typeof mapFn !== \"undefined\") {\n        // 5. else\n        // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.\n        if (!isCallable(mapFn)) {\n          throw new TypeError(\n            \"Array.from: when provided, the second argument must be a function\"\n          );\n        }\n\n        // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.\n        if (arguments.length > 2) {\n          T = arguments[2];\n        }\n      }\n\n      // 10. Let lenValue be Get(items, \"length\").\n      // 11. Let len be ToLength(lenValue).\n      const len = toLength(items.length);\n\n      // 13. If IsConstructor(C) is true, then\n      // 13. a. Let A be the result of calling the [[Construct]] internal method\n      // of C with an argument list containing the single item len.\n      // 14. a. Else, Let A be ArrayCreate(len).\n      const A = isCallable(C) ? Object(new C(len)) : new Array(len);\n\n      // 16. Let k be 0.\n      let k = 0;\n      // 17. Repeat, while k < len… (also steps a - h)\n      let kValue;\n      while (k < len) {\n        kValue = items[k];\n        if (mapFn) {\n          A[k] =\n            typeof T === \"undefined\"\n              ? mapFn(kValue, k)\n              : mapFn.call(T, kValue, k);\n        } else {\n          A[k] = kValue;\n        }\n        k += 1;\n      }\n      // 18. Let putStatus be Put(A, \"length\", len, true).\n      A.length = len;\n      // 20. Return A.\n      return A;\n    };\n  })();\n}\n\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find\nif (!Array.prototype.find) {\n  Object.defineProperty(Array.prototype, \"find\", {\n    value(predicate) {\n      // 1. Let O be ? ToObject(this value).\n      if (this == null) {\n        throw new TypeError('\"this\" is null or not defined');\n      }\n\n      const o = Object(this);\n\n      // 2. Let len be ? ToLength(? Get(O, \"length\")).\n      const len = o.length >>> 0;\n\n      // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n      if (typeof predicate !== \"function\") {\n        throw new TypeError(\"predicate must be a function\");\n      }\n\n      // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n      const thisArg = arguments[1];\n\n      // 5. Let k be 0.\n      let k = 0;\n\n      // 6. Repeat, while k < len\n      while (k < len) {\n        // a. Let Pk be ! ToString(k).\n        // b. Let kValue be ? Get(O, Pk).\n        // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\n        // d. If testResult is true, return kValue.\n        const kValue = o[k];\n        if (predicate.call(thisArg, kValue, k, o)) {\n          return kValue;\n        }\n        // e. Increase k by 1.\n        k++;\n      }\n\n      // 7. Return undefined.\n      return undefined;\n    }\n  });\n}\n\n// Source: https://github.com/jserz/js_piece/blob/master/DOM/NonDocumentTypeChildNode/nextElementSibling/nextElementSibling.md\n(function(arr) {\n  arr.forEach(item => {\n    if (item.hasOwnProperty(\"nextElementSibling\")) {\n      return;\n    }\n    Object.defineProperty(item, \"nextElementSibling\", {\n      configurable: true,\n      enumerable: true,\n      get() {\n        let el = this;\n        while ((el = el.nextSibling)) {\n          if (el.nodeType === 1) {\n            return el;\n          }\n        }\n        return null;\n      },\n      set: undefined\n    });\n  });\n})([Element.prototype, CharacterData.prototype]);\n\nif (\"outerHTML\" in SVGElement.prototype) {\n  Object.defineProperty(SVGElement.prototype, \"outerHTML\", {\n    get() {\n      const container = document.createElement(\"div\");\n      container.appendChild(this.cloneNode(true));\n      return container.innerHTML;\n    },\n    enumerable: false,\n    configurable: true\n  });\n}\n\n// Element.closest() support for older browsers\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\nif (!Element.prototype.matches) {\n  Element.prototype.matches =\n    Element.prototype.msMatchesSelector ||\n    Element.prototype.webkitMatchesSelector;\n}\n\nif (!Element.prototype.closest) {\n  Element.prototype.closest = function(s) {\n    var el = this;\n\n    do {\n      if (el.matches(s)) return el;\n      el = el.parentElement || el.parentNode;\n    } while (el !== null && el.nodeType === 1);\n    return null;\n  };\n}\n\n// breakpoints defined in assets/css/_variables.scss\nconst breakpoints = { xs: 0, sm: 544, md: 800, lg: 1088, xxl: 1344 };\n\nsubmitOnEvents([\"blur\", \"change\"]);\ngoogleAnalytics();\ngoogleMapsLoaded();\nselectModal();\nheaderDropdowns();\ncollapse();\nalertItemLoad();\nmodal();\nturbolinksMods();\nsupportForm();\nfixedsticky();\nobjectFitImages(); // Polyfill for IE object-fit support\nmenuCtrlClick();\ncarousel();\ninputFocus();\ngeoLocation();\naddressSearch();\nautocompleteSetup();\ngoogleTranslate();\nscrollTo();\ntimetableScroll();\ntimetableStyle();\ntimetableStick();\nmenuClose();\ndatePicker();\ntoggleBtn();\nstopBubbles();\nsearch(window.$, breakpoints);\nphotoGallery();\nstickyTooltip();\nglobalSearch.init();\nhomepageSearch.init();\nembeddedSearchInit();\nTripPlannerLocationControls.init();\nTimeControls.init();\nfullstory();\nchannels();\nCRTrains();\ndismissFullscreenError();\ntripPlannerWidget();\neventPageSetup();\npreviousEventsButton();\n","import * as AlgoliaResult from \"./algolia-result\";\n// eslint-disable-next-line import/no-unresolved\nimport * as QueryHelpers from \"../ts/helpers/query\";\n\n/* eslint-disable no-underscore-dangle */\n/* eslint-disable class-methods-use-this */\n\nexport default class AlgoliaAutocomplete {\n  constructor({ id, selectors, indices, parent, containerEl = null }) {\n    if (typeof id !== \"string\") {\n      throw new window.Error(\"autocomplete must have an id\");\n    }\n    this.id = id;\n    this.containerElement = containerEl;\n    this._parent = parent;\n    this.error = null;\n    this._selectors = Object.assign(selectors, {\n      resultsContainer: `${selectors.input}-autocomplete-results`\n    });\n    this._input = this.getById(this._selectors.input);\n    this._resultsContainer = this.getById(this._selectors.resultsContainer);\n    this._searchContainer = this.getById(this._selectors.container);\n    this._resetButton = this.getById(this._selectors.resetButton);\n    this.announcer = this.getById(this._selectors.announcer);\n    this._indices = indices;\n    this._datasets = [];\n    this._results = {};\n    this._highlightedHit = null;\n    this._autocomplete = null;\n    this.bind();\n  }\n\n  getById(id) {\n    return this.containerElement\n      ? this.containerElement.querySelector(`#${id}`)\n      : document.getElementById(id);\n  }\n\n  bind() {\n    this.onClickSuggestion = this.onClickSuggestion.bind(this);\n    this.onHitSelected = this.onHitSelected.bind(this);\n    this.onCursorChanged = this.onCursorChanged.bind(this);\n    this.onCursorRemoved = this.onCursorRemoved.bind(this);\n    this.onOpen = this.onOpen.bind(this);\n    this.onKeyup = this.onKeyup.bind(this);\n    this.clear = this.clear.bind(this);\n    this._toggleResetButton = this._toggleResetButton.bind(this);\n  }\n\n  clear() {\n    this._autocomplete.autocomplete.close();\n    this.setValue(\"\");\n    this._toggleResetButton(false);\n    this._client.reset();\n    this._input.focus();\n\n    //\n    //  To access the autocomplete object sent with this event, use:\n    //\n    //   $(document).on(\"autocomplete:reset\", (ev, { autocomplete }) => {})\n    //\n    // The extra data argument is not passed to\n    // listeners set by document.addEventListener.\n    //\n    window.$(document).trigger(\"autocomplete:reset\", { autocomplete: this });\n  }\n\n  init(client) {\n    this._client = client;\n\n    if (!this._input) return;\n\n    if (!this._resetButton) return;\n\n    this._addResultsContainer();\n\n    this._resultsContainer.innerHTML = \"\";\n\n    this._datasets = this._indices.reduce(\n      (acc, index) => this._buildDataset(index, acc),\n      []\n    );\n\n    this._autocomplete = window.autocomplete(\n      this._input,\n      {\n        appendTo: this._resultsContainer,\n        debug: false,\n        autoselectOnBlur: false,\n        openOnFocus: true,\n        hint: false,\n        minLength: 0,\n        cssClasses: {\n          root: \"c-search-bar__autocomplete\",\n          prefix: \"c-search-bar__\"\n        }\n      },\n      this._datasets\n    );\n\n    this._addErrorMsg();\n    this._toggleResetButton(false);\n    this._addListeners();\n  }\n\n  resetResetButton() {\n    this._toggleResetButton(this._autocomplete.autocomplete.getVal() !== \"\");\n  }\n\n  setError(error) {\n    this.error = error;\n  }\n\n  _addListeners() {\n    window\n      .jQuery(document)\n      .on(\n        \"autocomplete:cursorchanged\",\n        `#${this._selectors.input}`,\n        this.onCursorChanged\n      );\n    window\n      .jQuery(document)\n      .on(\n        \"autocomplete:cursorremoved\",\n        `#${this._selectors.input}`,\n        this.onCursorRemoved\n      );\n    window\n      .jQuery(document)\n      .on(\n        \"autocomplete:selected\",\n        `#${this._selectors.input}`,\n        this.onHitSelected\n      );\n    window\n      .jQuery(document)\n      .on(\"autocomplete:shown\", `#${this._selectors.input}`, this.onOpen);\n\n    window.jQuery(document).on(\"keyup\", `#${this._input.id}`, this.onKeyup);\n\n    window.addEventListener(\"resize\", this.onOpen);\n\n    this._resetButton.removeEventListener(\"click\", this.clear);\n    this._resetButton.addEventListener(\"click\", this.clear);\n\n    // normally we would only use `.js-` prefixed classes for javascript selectors, but\n    // we make an exception here because this element and its class is generated entirely\n    // by the autocomplete widget.\n    window\n      .jQuery(document)\n      .on(\"click\", \".c-search-bar__-suggestion\", this.onClickSuggestion);\n\n    document.addEventListener(\"turbolink:before-render\", () => {\n      window\n        .jQuery(document)\n        .off(\n          \"autocomplete:cursorchanged\",\n          `#${this._selectors.input}`,\n          this.onCursorChanged\n        );\n      window\n        .jQuery(document)\n        .off(\n          \"autocomplete:cursorremoved\",\n          `#${this._selectors.input}`,\n          this.onCursorRemoved\n        );\n      window\n        .jQuery(document)\n        .off(\n          \"autocomplete:selected\",\n          `#${this._selectors.input}`,\n          this.onHitSelected\n        );\n      window\n        .jQuery(document)\n        .off(\"autocomplete:shown\", `#${this._selectors.input}`, this.onOpen);\n      window.removeEventListener(\"resize\", this.onOpen);\n      window.jQuery(document).off(\"keyup\", `#${this._input.id}`, this.onKeyup);\n      window\n        .jQuery(document)\n        .off(\"click\", \".c-search-bar__-suggestion\", this.onClickSuggestion);\n    });\n  }\n\n  _toggleResetButton(show) {\n    this._resetButton.style.display = show ? \"block\" : \"none\";\n  }\n\n  _addErrorMsg() {\n    if (this.getById(\"algolia-error\")) {\n      return;\n    }\n\n    const dropdown = document\n      .getElementsByClassName(\"c-search-bar__-dropdown-menu\")\n      .item(0);\n    const errorMsg = document.createElement(\"div\");\n\n    errorMsg.id = \"algolia-error\";\n    errorMsg.classList.add(\"c-search__error\");\n    errorMsg.innerHTML =\n      \"There was a problem performing your search; please try again in a few minutes.\";\n    dropdown.appendChild(errorMsg);\n    this._client.errorContainer = errorMsg;\n  }\n\n  onKeyup() {\n    this._toggleResetButton(this._autocomplete.autocomplete.getVal() !== \"\");\n  }\n\n  onOpen() {\n    const acDialog = window\n      .jQuery(this._resultsContainer)\n      .find(\".c-search-bar__-dropdown-menu\")[0];\n    if (acDialog) {\n      this.positionDropdown(acDialog);\n      this.announceResults(acDialog);\n    }\n  }\n\n  positionDropdown(acDialog) {\n    const borderWidth = parseInt(\n      $(`#${this._selectors.container}`).css(\"border-left-width\"),\n      10\n    );\n    const { offsetLeft } = this.getById(this._selectors.input);\n    const { offsetTop } = this.getById(this._selectors.input);\n\n    /* eslint-disable no-param-reassign */\n    acDialog.style.width = `${this._searchContainer.offsetWidth}px`;\n    acDialog.style.marginLeft = `${-borderWidth + -offsetLeft}px`;\n    acDialog.style.marginTop = `${borderWidth + offsetTop}px`;\n    /* eslint-enable no-param-reassign */\n  }\n\n  announceResults(dialog) {\n    const count = Array.from(dialog.querySelectorAll(\"a\")).reduce(\n      acc => acc + 1,\n      0\n    );\n    const s = count === 1 ? \"\" : \"s\";\n    this.announcer.innerHTML = `${count} result${s}`;\n  }\n\n  _addResultsContainer() {\n    if (!this._resultsContainer) {\n      this._resultsContainer = document.createElement(\"div\");\n      this._resultsContainer.id = this._selectors.resultsContainer;\n      this._input.parentNode.appendChild(this._resultsContainer);\n    }\n  }\n\n  onCursorChanged({\n    originalEvent: {\n      _args: [hit, index]\n    }\n  }) {\n    this._highlightedHit = {\n      hit,\n      index\n    };\n  }\n\n  onCursorRemoved() {\n    this._highlightedHit = null;\n  }\n\n  clickHighlightedOrFirstResult() {\n    if (this._highlightedHit) {\n      return this.onHitSelected({\n        originalEvent: {\n          _args: [this._highlightedHit.hit, this._highlightedHit.index]\n        }\n      });\n    }\n    return this.clickFirstResult();\n  }\n\n  clickFirstResult() {\n    const firstIndex = this._indices.find(\n      index => this._results[index] && this._results[index].hits.length > 0\n    );\n    if (firstIndex) {\n      return this.onHitSelected({\n        originalEvent: {\n          _args: [this._results[firstIndex].hits[0], firstIndex]\n        }\n      });\n    }\n    return false;\n  }\n\n  onClickSuggestion(ev) {\n    ev.preventDefault();\n  }\n\n  onHitSelected({\n    originalEvent: {\n      _args: [hit, type]\n    }\n  }) {\n    const params = this._parent.getParams();\n    if (this._input) {\n      this._input.value = \"\";\n    }\n\n    window.jQuery.post(\n      \"/search/click\",\n      hit.analyticsData,\n      this.onHitSelectedCallback(hit, type, params)\n    );\n  }\n\n  onHitSelectedCallback(hit, type, params) {\n    window.Turbolinks.visit(\n      AlgoliaResult.getUrl(hit, type) +\n        QueryHelpers.paramsToString(params, window.encodeURIComponent)\n    );\n  }\n\n  _buildDataset(indexName, acc) {\n    acc.push({\n      source: this._datasetSource(indexName),\n      displayKey: AlgoliaAutocomplete.DISPLAY_KEYS[indexName],\n      name: indexName,\n      hitsPerPage: 5,\n      minLength: this.minLength(indexName),\n      maxLength: this.maxLength(indexName),\n      templates: {\n        suggestion: this.renderResult(indexName),\n        footer: this.renderFooterTemplate(indexName)\n      }\n    });\n    return acc;\n  }\n\n  minLength() {\n    return 1;\n  }\n\n  maxLength() {\n    return null;\n  }\n\n  renderFooterTemplate() {\n    // Does not render a footer template by default.\n    // To render a footer template, override this method.\n    return null;\n  }\n\n  _datasetSource(index) {\n    return (query, callback) => {\n      this._client.reset();\n      return this._client\n        .search({ query })\n        .then(results => this._onResults(callback, index, results));\n    };\n  }\n\n  _emptySearchSource() {\n    return (query, callback) => callback([{ data: \"\" }]);\n  }\n\n  _onResults(callback, index, results) {\n    if (results.error) {\n      return;\n    }\n    if (results[index] && results[index].hits) {\n      this._results[index] = results[index];\n      callback(results[index].hits);\n    }\n  }\n\n  renderResult(index) {\n    return hit => AlgoliaResult.renderResult(hit, index);\n  }\n\n  setValue(value) {\n    this._autocomplete.autocomplete.setVal(value);\n    window.jQuery(this._input).change();\n    this._autocomplete.autocomplete.close();\n  }\n\n  getValue() {\n    return this._autocomplete.autocomplete.getVal();\n  }\n}\n\nAlgoliaAutocomplete.DISPLAY_KEYS = {\n  locations: \"hit.place_id\"\n};\n","// Plugin to handle adding fixedsticky for browsers in which 'position: sticky' is not supported (IE11)\n// To see the plugin at work, see the accordion dropdowns on this page in IE:  https://www.mbta.com/fares/bus-fares\n\n;(function( win, $ ) {\n\n\tfunction featureTest( property, value, noPrefixes ) {\n\t\t// Thanks Modernizr! https://github.com/phistuck/Modernizr/commit/3fb7217f5f8274e2f11fe6cfeda7cfaf9948a1f5\n\t\tvar prop = property + ':',\n\t\t\tel = document.createElement( 'test' ),\n\t\t\tmStyle = el.style;\n\n\t\tif( !noPrefixes ) {\n\t\t\tmStyle.cssText = prop + [ '-webkit-', '-moz-', '-ms-', '-o-', '' ].join( value + ';' + prop ) + value + ';';\n\t\t} else {\n\t\t\tmStyle.cssText = prop + value;\n\t\t}\n\t\treturn mStyle[ property ].indexOf( value ) !== -1;\n\t}\n\n\tfunction getPx( unit ) {\n\t\treturn parseInt( unit, 10 ) || 0;\n\t}\n\n\tvar uniqueIdCounter = 0;\n\n\tvar S = {\n\t\tclasses: {\n\t\t\tplugin: 'fixedsticky',\n\t\t\tactive: 'fixedsticky-on',\n\t\t\tinactive: 'fixedsticky-off',\n\t\t\tclone: 'fixedsticky-dummy',\n\t\t\twithoutFixedFixed: 'fixedsticky-withoutfixedfixed'\n\t\t},\n\t\tkeys: {\n\t\t\toffset: 'fixedStickyOffset',\n\t\t\tposition: 'fixedStickyPosition',\n\t\t\tid: 'fixedStickyId'\n\t\t},\n\t\ttests: {\n\t\t\tsticky: featureTest( 'position', 'sticky' ),\n\t\t\tfixed: featureTest( 'position', 'fixed', true )\n\t\t},\n\t\t// Thanks jQuery!\n\t\tgetScrollTop: function() {\n\t\t\tvar prop = 'pageYOffset',\n\t\t\t\tmethod = 'scrollTop';\n\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\twin.document.body[ method ];\n\t\t},\n\t\tbypass: function() {\n\t\t\t// Check native sticky, check fixed and if fixed-fixed is also included on the page and is supported\n\t\t\treturn ( S.tests.sticky && !S.optOut ) ||\n\t\t\t\t!S.tests.fixed ||\n\t\t\t\twin.FixedFixed && !$( win.document.documentElement ).hasClass( 'fixed-supported' );\n\t\t},\n\t\tupdate: function( el ) {\n\t\t\tif( !el.offsetWidth ) { return; }\n\n\t\t\tvar $el = $( el ),\n\t\t\t\theight = $el.outerHeight(),\n\t\t\t\tinitialOffset = $el.data( S.keys.offset ),\n\t\t\t\tscroll = S.getScrollTop(),\n\t\t\t\tisAlreadyOn = $el.is( '.' + S.classes.active ),\n\t\t\t\ttoggle = function( turnOn ) {\n\t\t\t\t\t$el[ turnOn ? 'addClass' : 'removeClass' ]( S.classes.active )\n\t\t\t\t\t\t[ !turnOn ? 'addClass' : 'removeClass' ]( S.classes.inactive );\n\t\t\t\t},\n\t\t\t\tviewportHeight = $( window ).height(),\n\t\t\t\tposition = $el.data( S.keys.position ),\n\t\t\t\tskipSettingToFixed,\n\t\t\t\telTop,\n\t\t\t\telBottom,\n\t\t\t\t$parent = $el.parent(),\n\t\t\t\tparentOffset = $parent.offset().top,\n\t\t\t\tparentHeight = $parent.outerHeight();\n\n\t\t\tif( initialOffset === undefined ) {\n\t\t\t\tinitialOffset = $el.offset().top;\n\t\t\t\t$el.data( S.keys.offset, initialOffset );\n\t\t\t\t$el.after( $( '<div>' ).addClass( S.classes.clone ).height( height ) );\n\t\t\t} else {\n\t\t\t\t$el.next( '.' + S.classes.clone ).height( height );\n\t\t\t}\n\n\t\t\tif( !position ) {\n\t\t\t\t// Some browsers require fixed/absolute to report accurate top/left values.\n\t\t\t\tskipSettingToFixed = $el.css( 'top' ) !== 'auto' || $el.css( 'bottom' ) !== 'auto';\n\n\t\t\t\tif( !skipSettingToFixed ) {\n\t\t\t\t\t$el.css( 'position', 'fixed' );\n\t\t\t\t}\n\n\t\t\t\tposition = {\n\t\t\t\t\ttop: $el.css( 'top' ) !== 'auto',\n\t\t\t\t\tbottom: $el.css( 'bottom' ) !== 'auto'\n\t\t\t\t};\n\n\t\t\t\tif( !skipSettingToFixed ) {\n\t\t\t\t\t$el.css( 'position', '' );\n\t\t\t\t}\n\n\t\t\t\t$el.data( S.keys.position, position );\n\t\t\t}\n\n\t\t\tfunction isFixedToTop() {\n\t\t\t\tvar offsetTop = scroll + elTop;\n\n\t\t\t\t// Initial Offset Top\n\t\t\t\treturn initialOffset < offsetTop &&\n\t\t\t\t\t// Container Bottom\n\t\t\t\t\toffsetTop + height <= parentOffset + parentHeight;\n\t\t\t}\n\n\t\t\tfunction isFixedToBottom() {\n\t\t\t\t// Initial Offset Top + Height\n\t\t\t\treturn initialOffset + ( height || 0 ) > scroll + viewportHeight - elBottom &&\n\t\t\t\t\t// Container Top\n\t\t\t\t\tscroll + viewportHeight - elBottom >= parentOffset + ( height || 0 );\n\t\t\t}\n\n\t\t\telTop = getPx( $el.css( 'top' ) );\n\t\t\telBottom = getPx( $el.css( 'bottom' ) );\n\n\t\t\tif( position.top && isFixedToTop() || position.bottom && isFixedToBottom() ) {\n\t\t\t\tif( !isAlreadyOn ) {\n\t\t\t\t\ttoggle( true );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif( isAlreadyOn ) {\n\t\t\t\t\ttoggle( false );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdestroy: function( el ) {\n\t\t\tvar $el = $( el );\n\t\t\tif (S.bypass()) {\n\t\t\t\treturn $el;\n\t\t\t}\n\n\t\t\treturn $el.each(function() {\n\t\t\t\tvar $this = $( this );\n\t\t\t\tvar id = $this.data( S.keys.id );\n\t\t\t\t$( win ).unbind( '.fixedsticky' + id );\n\n\t\t\t\t$this\n\t\t\t\t\t.removeData( [ S.keys.offset, S.keys.position, S.keys.id ] )\n\t\t\t\t\t.removeClass( S.classes.active )\n\t\t\t\t\t.removeClass( S.classes.inactive )\n\t\t\t\t\t.next( '.' + S.classes.clone ).remove();\n\t\t\t});\n\t\t},\n\t\tinit: function( el ) {\n\t\t\tvar $el = $( el );\n\n\t\t\tif( S.bypass() ) {\n\t\t\t\treturn $el;\n\t\t\t}\n\n\t\t\treturn $el.each(function() {\n\t\t\t\tvar _this = this;\n\t\t\t\tvar id = uniqueIdCounter++;\n\t\t\t\t$( this ).data( S.keys.id, id );\n\n\t\t\t\t$( win ).bind( 'scroll.fixedsticky' + id, function() {\n\t\t\t\t\tS.update( _this );\n\t\t\t\t}).trigger( 'scroll.fixedsticky' + id );\n\n\t\t\t\t$( win ).bind( 'resize.fixedsticky' + id , function() {\n\t\t\t\t\tif( $el.is( '.' + S.classes.active ) ) {\n\t\t\t\t\t\tS.update( _this );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t};\n\n\twin.FixedSticky = S;\n\n\t// Plugin\n\t$.fn.fixedsticky = function( method ) {\n\t\tif ( typeof S[ method ] === 'function') {\n\t\t\treturn S[ method ].call( S, this);\n\t\t} else if ( typeof method === 'object' || ! method ) {\n\t\t\treturn S.init.call( S, this );\n\t\t} else {\n\t\t\tthrow new Error( 'Method `' +  method + '` does not exist on jQuery.fixedsticky' );\n\t\t}\n\t};\n\n\t// Add fallback when fixed-fixed is not available.\n\tif( !win.FixedFixed ) {\n\t\t$( win.document.documentElement ).addClass( S.classes.withoutFixedFixed );\n\t}\n\n})( window, jQuery );\n",";(function(win, $) {\n\n/*\n * Accessible Datepicker v2.1.5\n * Copyright 2015 Eureka2, Jacques Archimède.\n * Based on the example of the Open AJAX Alliance Accessibility Tools Task Force : http://www.oaa-accessibility.org/examplep/datepicker1/\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Inspired by :\n * http://wet-boew.github.io/wet-boew/demos/datepicker/datepicker-fr.html\n * http://eternicode.github.io/bootstrap-datepicker\n */\n\n/**\n *\tDescription:\n *\t===========\n *\tThis DatePicker widget allows the user to select a date.\n *\tThe DatePicker shows one month at least.\n *\n *\tThe calendar portion of the date picker follows a table structure\n *\twhere days of the week and calendar day numbers are layed out in HTML table cells where WAI-ARIA semantics for a grid are applied.\n *\tThis provides context so an assistive technology can render the day of the week;\n *\tits corresponding numeric calendar day, and week number if necessary.\n *\n *\tThe calendar portion can be displayed in a numbers of ways, including as a popup associated with another widget,\n *\tor as a static region of a page.\n *\n * \tThis component complies with the recommendations of the guide http://www.w3.org/TR/wai-aria-practices/#datepicker of W3C, namely :\n *\n *\tKeyboard Interaction:\n *\t=====================\n *\n *\tKeyboard navigation on days that are not included the currently displayed month should move to the month automatically and lead to the day in the next or previous month.\n *\n *\t    - Tab - Like other widgets, the date picker widget receives focus by tabbing into it. Once focus is received, focus is repositioned on today's date in a grid of days and weeks. A second tab will take the user out of the date picker widget. Focus initially is placed on today's date.\n *\t    - Shift+Tab - reverses the direction of the tab order. Once in the widget, a Shift+Tab will take the user to the previous focusable element in the tab order.\n *\t    - Up Arrow and Down Arrow - goes to the same day of the week in the previous or next week respectively. If the user advances past the end of the month they continue into the next or previous month as appropriate.\n *\t    - Left Arrow and Right Arrow - advances one day to the next, also in a continuum. Visually focus is moved from day to day and wraps from row to row in a grid of days and weeks.\n *\t    - Control+Page Up - Moves to the same date in the previous year.\n *\t    - Control+Page Down - Moves to the same date in the next year.\n *\t    - Space -\n *\t        Singleton Mode: acts as a toggle either selecting or deselecting the date.\n *\t        Contiguous Mode: Similar to selecting a range of text. Space selects the first date. Shift+Arrows add to the selection. Pressing Space again deselects the previous selections and selects the current focused date.\n *\t    - Home - Moves to the first day of the current month.\n *\t    - End - Moves to the last day of the current month.\n *\t    - Page Up - Moves to the same date in the previous month.\n *\t    - Page Down - Moves to the same date in the next month.\n *\t    - Enter -\n *\t        If the the calendar is a popup attached to some other widget (e.g., a text field), then Enter dismisses the popup, and the selected date(s) are shown in the associated widget.\n *\t        If the calendar is a static region on the page, then Enter confirms the selected date(s).\n *\t    - Escape - in the case of a popup date picker, closes the widget without any action.\n *\n *\n *\tWAI-ARIA Roles, States, and Properties:\n *\t======================================\n *\n *\t    The current month has a label representing the month and year. It is advisable to use a role heading but is not essential. This \"label\" should have a unique ID.\n *\t    If the author would like to ensure that a label is announced by a screen reader, as the label changes, include live region properties with the label element: aria-live=\"assertive\" and aria-atomic=\"true\".\n *\t    The container for the day of week headers and numeric days of the week has a role of grid.\n *\t    The grid has an aria-labelledby property with a value equivalent to the id of the label for the grid.\n *\t    Each name for the day of the week has a role columnheader and is not navigable via the keyboard.\n *\t    Each numeric day of the week has the role gridcell.\n *\t    When a day is selected its aria-selected is set to true, otherwise it is set to false or removed.\n *\t    Changes in aria states, identified here, as well as focus, are clearly styled to show the user where their point of regard is and what days are selected.\n *\n *\tWhen the datepicker is active a calender day of the week always has focus.\n *\tThis can be achieved by setting the tabindex on that day as appropriate and then using script to give it focus.\n *\tThe grid container set aria-activedescendant to the id of the currently focused gridcell.\n *\n */\n\n\tDate.dp_locales = {\n\t    \"texts\": {\n\t        \"buttonTitle\": \"Select date ...\",\n\t        \"buttonLabel\": \"Click or press the Enter key or the spacebar to open the calendar\",\n\t        \"prevButtonLabel\": \"Go to previous month\",\n\t        \"prevMonthButtonLabel\": \"Go to the previous year\",\n\t        \"prevYearButtonLabel\": \"Go to the previous twenty years\",\n\t        \"nextButtonLabel\": \"Go to next month\",\n\t        \"nextMonthButtonLabel\": \"Go to the next year\",\n\t        \"nextYearButtonLabel\": \"Go to the next twenty years\",\n\t        \"changeMonthButtonLabel\": \"Click or press the Enter key or the spacebar to change the month\",\n\t        \"changeYearButtonLabel\": \"Click or press the Enter key or the spacebar to change the year\",\n\t        \"changeRangeButtonLabel\": \"Click or press the Enter key or the spacebar to go to the next twenty years\",\n\t        \"closeButtonTitle\": \"Close\",\n\t        \"closeButtonLabel\": \"Close the calendar\",\n\t        \"calendarHelp\": \"- Up Arrow and Down Arrow - goes to the same day of the week in the previous or next week respectively. If the end of the month is reached, continues into the next or previous month as appropriate.\\r\\n- Left Arrow and Right Arrow - advances one day to the next, also in a continuum. Visually focus is moved from day to day and wraps from row to row in the grid of days.\\r\\n- Control+Page Up - Moves to the same date in the previous year.\\r\\n- Control+Page Down - Moves to the same date in the next year.\\r\\n- Home - Moves to the first day of the current month.\\r\\n- End - Moves to the last day of the current month.\\r\\n- Page Up - Moves to the same date in the previous month.\\r\\n- Page Down - Moves to the same date in the next month.\\r\\n- Enter or Espace - closes the calendar, and the selected date is shown in the associated text box.\\r\\n- Escape - closes the calendar without any action.\"\n\t    },\n\t    \"directionality\": \"LTR\",\n\t    \"month_names\": [\n\t        \"January\",\n\t        \"February\",\n\t        \"March\",\n\t        \"April\",\n\t        \"May\",\n\t        \"June\",\n\t        \"July\",\n\t        \"August\",\n\t        \"September\",\n\t        \"October\",\n\t        \"November\",\n\t        \"December\"\n\t    ],\n\t    \"month_names_abbreviated\": [\n\t        \"Jan\",\n\t        \"Feb\",\n\t        \"Mar\",\n\t        \"Apr\",\n\t        \"May\",\n\t        \"Jun\",\n\t        \"Jul\",\n\t        \"Aug\",\n\t        \"Sep\",\n\t        \"Oct\",\n\t        \"Nov\",\n\t        \"Dec\"\n\t    ],\n\t    \"month_names_narrow\": [\n\t        \"J\",\n\t        \"F\",\n\t        \"M\",\n\t        \"A\",\n\t        \"M\",\n\t        \"J\",\n\t        \"J\",\n\t        \"A\",\n\t        \"S\",\n\t        \"O\",\n\t        \"N\",\n\t        \"D\"\n\t    ],\n\t    \"day_names\": [\n\t        \"Sunday\",\n\t        \"Monday\",\n\t        \"Tuesday\",\n\t        \"Wednesday\",\n\t        \"Thursday\",\n\t        \"Friday\",\n\t        \"Saturday\"\n\t    ],\n\t    \"day_names_abbreviated\": [\n\t        \"Sun\",\n\t        \"Mon\",\n\t        \"Tue\",\n\t        \"Wed\",\n\t        \"Thu\",\n\t        \"Fri\",\n\t        \"Sat\"\n\t    ],\n\t    \"day_names_short\": [\n\t        \"Su\",\n\t        \"Mo\",\n\t        \"Tu\",\n\t        \"We\",\n\t        \"Th\",\n\t        \"Fr\",\n\t        \"Sa\"\n\t    ],\n\t    \"day_names_narrow\": [\n\t        \"S\",\n\t        \"M\",\n\t        \"T\",\n\t        \"W\",\n\t        \"T\",\n\t        \"F\",\n\t        \"S\"\n\t    ],\n\t    \"day_periods\": {\n\t        \"am\": \"AM\",\n\t        \"noon\": \"noon\",\n\t        \"pm\": \"PM\"\n\t    },\n\t    \"day_periods_abbreviated\": {\n\t        \"am\": \"AM\",\n\t        \"noon\": \"noon\",\n\t        \"pm\": \"PM\"\n\t    },\n\t    \"day_periods_narrow\": {\n\t        \"am\": \"a\",\n\t        \"noon\": \"n\",\n\t        \"pm\": \"p\"\n\t    },\n\t    \"quarter_names\": [\n\t        \"1st quarter\",\n\t        \"2nd quarter\",\n\t        \"3rd quarter\",\n\t        \"4th quarter\"\n\t    ],\n\t    \"quarter_names_abbreviated\": [\n\t        \"Q1\",\n\t        \"Q2\",\n\t        \"Q3\",\n\t        \"Q4\"\n\t    ],\n\t    \"quarter_names_narrow\": [\n\t        \"1\",\n\t        \"2\",\n\t        \"3\",\n\t        \"4\"\n\t    ],\n\t    \"era_names\": [\n\t        \"Before Christ\",\n\t        \"Anno Domini\"\n\t    ],\n\t    \"era_names_abbreviated\": [\n\t        \"BC\",\n\t        \"AD\"\n\t    ],\n\t    \"era_names_narrow\": [\n\t        \"B\",\n\t        \"A\"\n\t    ],\n\t    \"full_format\": \"EEEE, MMMM d, y\",\n\t    \"long_format\": \"MMMM d, y\",\n\t    \"medium_format\": \"MMM d, y\",\n\t    \"short_format\": \"M/d/yy\",\n\t    \"firstday_of_week\": 0\n\t};\n\n\tvar datepickerButton = [\n\t\t'<a class=\"datepicker-button input-group-addon\" role=\"button\" aria-haspopup=\"true\" tabindex=\"0\" aria-labelledby=\"datepicker-bn-open-label-CALENDARID\">',\n\t\t'<span id=\"datepicker-button\"></span>',\n\t\t'</a>'\n\t];\n\tvar datepickerCalendar = [\n\t\t'<div class=\"datepicker-calendar\" id=\"datepicker-calendar-CALENDARID\" aria-hidden=\"false\">',\n\t\t'\t<div class=\"datepicker-month-wrap\">',\n\t\t'\t\t<div class=\"datepicker-month-fast-next pull-right\" role=\"button\" aria-labelledby=\"datepicker-bn-fast-next-label-CALENDARID\" tabindex=\"0\"><span class=\"glyphicon glyphicon-forward\"></span></div>',\n\t\t'\t\t<div class=\"datepicker-month-next pull-right\" role=\"button\" aria-labelledby=\"datepicker-bn-next-label-CALENDARID\" tabindex=\"0\"><span class=\"glyphicon glyphicon-triangle-right\"></span></div>',\n\t\t'\t\t<div class=\"datepicker-month-fast-prev pull-left\" role=\"button\" aria-labelledby=\"datepicker-bn-fast-prev-label-CALENDARID\" tabindex=\"0\"><span class=\"glyphicon glyphicon-backward\"></span></div>',\n\t\t'\t\t<div class=\"datepicker-month-prev pull-left\" role=\"button\" aria-labelledby=\"datepicker-bn-prev-label-CALENDARID\" tabindex=\"0\"><span class=\"glyphicon glyphicon-triangle-left\"></span></div>',\n\t\t'\t\t<div id=\"datepicker-month-CALENDARID\" class=\"datepicker-month\" tabindex=\"0\" role=\"heading\" aria-live=\"assertive\" aria-atomic=\"true\" title=\"Click or press the Enter key or the spacebar to change the month\">July 2015</div>',\n\t\t'\t</div>',\n\t\t'\t<table class=\"datepicker-grid\" role=\"grid\" aria-readonly=\"true\" aria-activedescendant=\"datepicker-err-msg-CALENDARID\" aria-labelledby=\"datepicker-month-CALENDARID\" tabindex=\"0\">',\n\t\t'\t\t<thead role=\"presentation\">',\n\t\t'\t\t\t<tr class=\"datepicker-weekdays\" role=\"row\">',\n\t\t'\t\t\t\t<th scope=\"col\" id=\"day0-header-CALENDARID\" class=\"datepicker-day\" role=\"columnheader\" aria-label=\"Sunday\"><abbr title=\"Sunday\">Su</abbr></th>',\n\t\t'\t\t\t\t<th scope=\"col\" id=\"day1-header-CALENDARID\" class=\"datepicker-day\" role=\"columnheader\" aria-label=\"Monday\"><abbr title=\"Monday\">Mo</abbr></th>',\n\t\t'\t\t\t\t<th scope=\"col\" id=\"day2-header-CALENDARID\" class=\"datepicker-day\" role=\"columnheader\" aria-label=\"Tuesday\"><abbr title=\"Tuesday\">Tu</abbr></th>',\n\t\t'\t\t\t\t<th scope=\"col\" id=\"day3-header-CALENDARID\" class=\"datepicker-day\" role=\"columnheader\" aria-label=\"Wednesday\"><abbr title=\"Wednesday\">We</abbr></th>',\n\t\t'\t\t\t\t<th scope=\"col\" id=\"day4-header-CALENDARID\" class=\"datepicker-day\" role=\"columnheader\" aria-label=\"Thursday\"><abbr title=\"Thursday\">Th</abbr></th>',\n\t\t'\t\t\t\t<th scope=\"col\" id=\"day5-header-CALENDARID\" class=\"datepicker-day\" role=\"columnheader\" aria-label=\"Friday\"><abbr title=\"Friday\">Fr</abbr></th>',\n\t\t'\t\t\t\t<th scope=\"col\" id=\"day6-header-CALENDARID\" class=\"datepicker-day\" role=\"columnheader\" aria-label=\"Saturday\"><abbr title=\"Saturday\">Sa</abbr></th>',\n\t\t'\t\t\t</tr>',\n\t\t'\t\t</thead>',\n\t\t'\t\t<tbody role=\"presentation\">',\n\t\t'\t\t\t<tr>',\n\t\t'\t\t\t\t<td id=\"datepicker-err-msg-CALENDARID\" colspan=\"7\">Javascript must be enabled</td>',\n\t\t'\t\t\t</tr>',\n\t\t'\t\t</tbody>',\n\t\t'\t</table>',\n\t\t'\t<div class=\"datepicker-close-wrap\">',\n\t\t'\t\t<button class=\"datepicker-close\" id=\"datepicker-close-CALENDARID\" aria-labelledby=\"datepicker-bn-close-label-CALENDARID\">Close</button>',\n\t\t'\t</div>',\n\t\t'\t<div id=\"datepicker-bn-open-label-CALENDARID\" class=\"datepicker-bn-open-label offscreen\">Click or press the Enter key or the spacebar to open the calendar</div>',\n\t\t'\t<div id=\"datepicker-bn-prev-label-CALENDARID\" class=\"datepicker-bn-prev-label offscreen\">Go to previous month</div>',\n\t\t'\t<div id=\"datepicker-bn-next-label-CALENDARID\" class=\"datepicker-bn-next-label offscreen\">Go to next month</div>',\n\t\t'\t<div id=\"datepicker-bn-fast-prev-label-CALENDARID\" class=\"datepicker-bn-fast-prev-label offscreen\">Go to previous year</div>',\n\t\t'\t<div id=\"datepicker-bn-fast-next-label-CALENDARID\" class=\"datepicker-bn-fast-next-label offscreen\">Go to next year</div>',\n\t\t'\t<div id=\"datepicker-bn-close-label-CALENDARID\" class=\"datepicker-bn-close-label offscreen\">Close the date picker</div>',\n\t\t'</div>'\n\t];\n\n\tvar Datepicker = function (target, options) {\n\t\tvar self = this;\n\t\tthis.$target = $(target); // textbox that will receive the selected date string and focus (if modal)\n\t\tthis.options = $.extend({}, Datepicker.DEFAULTS, options)\n\t\tthis.locales = Date.dp_locales;\n\t\tswitch (this.options.startView) {\n\t\t\tcase 1:\n\t\t\tcase 'months':\n\t\t\t\tthis.options.startView = 1;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\tcase 'years':\n\t\t\t\tthis.options.startView = 2;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.options.startView = 0;\n\t\t}\n\t\tif (typeof this.options.inputFormat === 'string') {\n\t\t\tthis.options.inputFormat = [this.options.inputFormat];\n\t\t}\n\t\tif (this.options.min != null) {\n\t\t\tthis.options.min = this.parseDate(this.options.min);\n\t\t} else if (this.$target.attr('min')) {\n\t\t\tthis.options.min = this.parseDate(this.$target.attr('min'));\n\t\t}\n\t\tif (this.options.max != null) {\n\t\t\tthis.options.max = this.parseDate(this.options.max);\n\t\t} else if (this.$target.attr('max')) {\n\t\t\tthis.options.max = this.parseDate(this.$target.attr('max'));\n\t\t}\n\t\tthis.id = this.$target.attr('id') || 'datepicker-' + Math.floor(Math.random() * 100000);\n\t\tvar calendar = datepickerCalendar.join(\"\");\n\t\tcalendar = calendar.replace(/CALENDARID/g, this.id + '');\n\n\t\t// complete the target textbox if any\n\t\tif (this.$target.parent('.input-group').length == 0) {\n\t\t\tthis.$target.wrap( '<div class=\"input-group\"></div>' );\n\t\t}\n\t\tthis.$label = this.$target.parents().find(\"label[for=\" + this.id + \"]\");\n\t\tthis.$group = this.$target.parent('.input-group');\n\t\tthis.$target.attr('aria-autocomplete', 'none')\n\t\tthis.$target.css('min-width', '7em')\n\t\tthis.$target.addClass('form-control');\n\n\t\tif (! this.$target.attr('placeholder')) {\n\t\t\tthis.$target.attr('placeholder', this.options.inputFormat[0]);\n\t\t}\n\n\t\tvar button = datepickerButton.join(\"\");\n\t\tbutton = button.replace(/CALENDARID/g, this.id + '');\n\t\tthis.$button = $(button);\n\t\tthis.$button.addClass(this.options.theme);\n\t\tthis.$calendar = $(calendar);\n\t\tthis.$calendar.addClass(this.options.theme);\n\t\tthis.$target.after(this.$button);\n\n\t\tif (this.options.inline != false) {\n\t\t\tthis.hideObject(this.$button);\n\t\t\tvar $container = typeof this.options.inline === 'string' ? $('#' + this.options.inline) : this.options.inline;\n\t\t\t$container.append(this.$calendar);\n\t\t\tthis.$calendar.css({position: 'relative', left: '0px'});\n\t\t\tthis.initializeDate();\n\t\t} else {\n\t\t\tthis.$target.parent().after(this.$calendar);\n\t\t\tthis.hide(!this.options.gainFocusOnConstruction);\n\t\t}\n\n\t\t// be sure parent of the calendar is positionned  to calculate the position of the calendar\n\t\tif (this.$calendar.parent().css('position') === 'static') {\n\t\t\tthis.$calendar.parent().css('position', 'relative');\n\t\t}\n\t\tthis.$calendar.find('.datepicker-bn-open-label').html(this.options.buttonLabel);\n\t\tif (this.$target.attr('id')) {\n\t\t\tthis.$calendar.attr('aria-controls', this.$target.attr('id'));\n\t\t}\n\t\tthis.$button.find('span').attr('title', this.options.buttonTitle);\n\t\tthis.$calendar.css('left', this.$target.parent().position().left + 'px');\n\t\tthis.$monthObj = this.$calendar.find('.datepicker-month');\n\t\tthis.$prev = this.$calendar.find('.datepicker-month-prev');\n\t\tthis.$next = this.$calendar.find('.datepicker-month-next');\n\t\tthis.$fastprev = this.$calendar.find('.datepicker-month-fast-prev');\n\t\tthis.$fastnext = this.$calendar.find('.datepicker-month-fast-next');\n\t\tthis.$grid = this.$calendar.find('.datepicker-grid');\n\t\tif (this.locales.directionality === 'RTL') {\n\t\t\tthis.$grid.addClass('rtl');\n\t\t}\n\t\tvar $days = this.$grid.find('th.datepicker-day abbr');\n\t\tthis.drawCalendarHeader();\n\t\tif (this.options.inline == false && this.options.modal == true) {\n\t\t\tthis.$close = this.$calendar.find('.datepicker-close');\n\t\t\tthis.$close.html(this.options.closeButtonTitle).attr('title', this.options.closeButtonLabel);\n\t\t\tthis.$calendar.find('.datepicker-bn-close-label').html(this.options.closeButtonLabel);\n\t\t} else {\n\t\t\tthis.hideObject(this.$calendar.find('.datepicker-close-wrap'));\n\t\t\tthis.hideObject(this.$calendar.find('.datepicker-bn-close-label'));\n\t\t}\n\n\t\tthis.keys = {\n\t\t\ttab: 9,\n\t\t\tenter: 13,\n\t\t\tesc: 27,\n\t\t\tspace: 32,\n\t\t\tpageup: 33,\n\t\t\tpagedown: 34,\n\t\t\tend: 35,\n\t\t\thome: 36,\n\t\t\tleft: 37,\n\t\t\tup: 38,\n\t\t\tright: 39,\n\t\t\tdown: 40\n\t\t};\n\n\t\tthis.bindHandlers();\n\t\tthis.$button.click(function(e) {\n\t\t\tif (self.$calendar.attr('aria-hidden') === 'true') {\n\t\t\t\tself.initializeDate();\n\t\t\t\tself.show();\n\t\t\t} else {\n\t\t\t\tself.hide();\n\t\t\t}\n\t\t\tself.selectGridCell(self.$grid.attr('aria-activedescendant'));\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t});\n\t\tthis.$button.keydown(function(e) {\n\t\t\tvar ev = e || event;\n\t\t\tif(ev.keyCode == self.keys.enter || ev.keyCode == self.keys.space) {\n\t\t\t\t$(this).trigger('click');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tthis.$calendar.on('blur', function(e) {\n\t\t\tif (self.$calendar.attr('aria-hidden') === 'false') {\n\t\t\t\tself.hide();\n\t\t\t}\n\n\t\t});\n\t}\n\n\tDatepicker.VERSION  = '2.1.1'\n\n\tDatepicker.DEFAULTS = {\n\t\tfirstDayOfWeek: Date.dp_locales.firstday_of_week, // Determines the first column of the calendar grid\n\t\tweekDayFormat: 'short', // Display format of the weekday names - values are 'short' or 'narrow'\n\t\tstartView: 0, // Initial calendar - values are 0 or 'days', 1 or 'months', 2 or 'years'\n\t\tdaysOfWeekDisabled: [],\n\t\tinputFormat: [Date.dp_locales.short_format],\n\t\toutputFormat: Date.dp_locales.short_format,\n\t\ttitleFormat: Date.dp_locales.full_format,\n\t\tbuttonTitle: Date.dp_locales.texts.buttonTitle,\n\t\tbuttonLabel: Date.dp_locales.texts.buttonLabel,\n\t\tprevButtonLabel: Date.dp_locales.texts.prevButtonLabel,\n\t\tprevMonthButtonLabel: Date.dp_locales.texts.prevMonthButtonLabel,\n\t\tprevYearButtonLabel: Date.dp_locales.texts.prevYearButtonLabel,\n\t\tnextButtonLabel: Date.dp_locales.texts.nextButtonLabel,\n\t\tnextMonthButtonLabel: Date.dp_locales.texts.nextMonthButtonLabel,\n\t\tnextYearButtonLabel: Date.dp_locales.texts.nextYearButtonLabel,\n\t\tchangeMonthButtonLabel: Date.dp_locales.texts.changeMonthButtonLabel,\n\t\tchangeYearButtonLabel: Date.dp_locales.texts.changeYearButtonLabel,\n\t\tchangeRangeButtonLabel: Date.dp_locales.texts.changeRangeButtonLabel,\n\t\tcloseButtonTitle: Date.dp_locales.texts.closeButtonTitle,\n\t\tcloseButtonLabel: Date.dp_locales.texts.closeButtonLabel,\n\t\tonUpdate: function (value) {},\n\t\ttheme: 'default',\n\t\tmodal: false,\n\t\tinline: false,\n\t\tgainFocusOnConstruction: true,\n\t\tmin: null,\n\t\tmax: null\n\t}\n\n\t/**\n\t *\tinitializeDate() is a member function to initialize the Datepicker date with the content of the target textbox\n\t *\n\t *\t@return N/A\n\t *\n\t */\n\tDatepicker.prototype.initializeDate = function() {\n\t\tvar val = this.$target.val();\n\t\tvar date = val === '' ? new Date() :  this.parseDate(val);\n\t\tthis.setDate(date);\n\t} // end initializeDate()\n\n\t/**\n\t * getDate() is a member function to retrieve the current Datepicker date.\n\t * @return the Date object\n\t */\n\tDatepicker.prototype.getDate = function () {\n\t\tvar val = this.$target.val();\n\t\tvar date = val === '' ? new Date() :  this.parseDate(val);\n\t\treturn date;\n\t} // end getDate()\n\n\t/**\n\t *\tsetDate() is a member function to set the Datepicker date with the content of newDate\n\t *\n\t *\t@param\t(newDate Date) the new value of the Datepicker date.\n\t *\t@return N/A\n\t *\n\t */\n\tDatepicker.prototype.setDate = function(newDate) {\n\t\tthis.dateObj = newDate;\n\t\tif (this.dateObj == null) {\n\t\t\tthis.$target.attr('aria-invalid', true);\n\t\t\tthis.$target.parents('.form-group').addClass('has-error');\n\t\t\tthis.dateObj = new Date();\n\t\t\tthis.dateObj.setHours(0, 0, 0, 0);\n\t\t}\n\t\tif (this.options.min != null && this.dateObj < this.options.min) {\n\t\t\tthis.$target.attr('aria-invalid', true);\n\t\t\tthis.$target.parents('.form-group').addClass('has-error');\n\t\t\tthis.dateObj = this.options.min;\n\t\t} else if (this.options.max != null && this.dateObj > this.options.max) {\n\t\t\tthis.$target.attr('aria-invalid', true);\n\t\t\tthis.$target.parents('.form-group').addClass('has-error');\n\t\t\tthis.dateObj = this.options.max;\n\t\t}\n\t\tthis.$target.val(this.format(this.dateObj));\n\t\tthis.curYear = this.dateObj.getFullYear();\n\t\tthis.year = this.curYear;\n\t\tthis.curMonth = this.dateObj.getMonth();\n\t\tthis.month = this.curMonth;\n\t\tthis.date = this.dateObj.getDate();\n\t\t// populate the calendar grid\n\t\tswitch (this.options.startView) {\n\t\t\tcase 1: // months\n\t\t\t\tthis.populateMonthsCalendar();\n\t\t\t\t// update the table's activedescdendant to point to the current month\n\t\t\t\tthis.$grid.attr('aria-activedescendant', this.$grid.find('.curMonth').attr('id'));\n\t\t\t\tbreak;\n\t\t\tcase 2: // years\n\t\t\t\tthis.populateYearsCalendar();\n\t\t\t\t// update the table's activedescdendant to point to the current year\n\t\t\t\tthis.$grid.attr('aria-activedescendant', this.$grid.find('.curYear').attr('id'));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.populateDaysCalendar();\n\t\t\t\t// update the table's activedescdendant to point to the current day\n\t\t\t\tthis.$grid.attr('aria-activedescendant', this.$grid.find('.curDay').attr('id'));\n\t\t}\n\t} // end setDate()\n\n\t/**\n\t *\tdrawCalendarHeader() is a member function to populate the calendar header with the days name.\n\t *\n\t *\t@return N/A\n\t */\n\tDatepicker.prototype.drawCalendarHeader = function() {\n\t\tvar $days = this.$grid.find('th.datepicker-day');\n\t\tvar weekday = this.options.firstDayOfWeek;\n\t\tfor (var i = 0; i < 7; i++) {\n\t\t\t$days.eq(i).attr('aria-label', this.locales.day_names[weekday])\n\t\t\t$days.children('abbr').eq(i).attr('title', this.locales.day_names[weekday]).text(\n\t\t\t\tthis.options.weekDayFormat === 'short' ?\n\t\t\t\t\tthis.locales.day_names_short[weekday] :\n\t\t\t\t\tthis.locales.day_names_narrow[weekday]\n\t\t\t);\n\t\t\tweekday = (weekday + 1) % 7;\n\t\t}\n\t} // end drawCalendarHeader()\n\n\t/**\n\t *\tpopulateDaysCalendar() is a member function to populate the datepicker grid with calendar days\n\t *\trepresenting the current month\n\t *\n\t *\t@return N/A\n\t *\n\t */\n\tDatepicker.prototype.populateDaysCalendar = function() {\n\t\tthis.$calendar.find('.datepicker-bn-prev-label').html(this.options.prevButtonLabel);\n\t\tthis.$calendar.find('.datepicker-bn-next-label').html(this.options.nextButtonLabel);\n\t\tthis.$calendar.find('.datepicker-bn-fast-prev-label').html(this.options.prevMonthButtonLabel);\n\t\tthis.$calendar.find('.datepicker-bn-fast-next-label').html(this.options.nextMonthButtonLabel);\n\t\tif (this.options.min != null &&\n\t\t\t(\tthis.year - 1 < this.options.min.getFullYear() ||\n\t\t\t\t(this.year - 1 == this.options.min.getFullYear() && this.month < this.options.min.getMonth()))) {\n\t\t\tthis.$fastprev.attr('title', '');\n\t\t\tthis.$fastprev.addClass('disabled');\n\t\t\tthis.$fastprev.removeClass('enabled');\n\t\t} else {\n\t\t\tthis.$fastprev.attr('title', this.options.prevMonthButtonLabel);\n\t\t\tthis.$fastprev.addClass('enabled');\n\t\t\tthis.$fastprev.removeClass('disabled');\n\t\t}\n\t\tvar previousMonth = this.previousMonth(this.year, this.month);\n\t\tif (this.options.min != null &&\n\t\t\t(\tpreviousMonth.year < this.options.min.getFullYear() ||\n\t\t\t\t(previousMonth.year == this.options.min.getFullYear() && previousMonth.month < this.options.min.getMonth()))) {\n\t\t\tthis.$prev.attr('title', '');\n\t\t\tthis.$prev.addClass('disabled');\n\t\t\tthis.$prev.removeClass('enabled');\n\t\t} else {\n\t\t\tthis.$prev.attr('title', this.options.prevButtonLabel);\n\t\t\tthis.$prev.addClass('enabled');\n\t\t\tthis.$prev.removeClass('disabled');\n\t\t}\n\t\tthis.$monthObj.attr('title', this.options.changeMonthButtonLabel);\n\t\tvar nextMonth = this.nextMonth(this.year, this.month);\n\t\tif (this.options.max != null &&\n\t\t\t(\tnextMonth.year > this.options.max.getFullYear() ||\n\t\t\t\t(nextMonth.year == this.options.max.getFullYear() && nextMonth.month > this.options.max.getMonth()))) {\n\t\t\tthis.$next.attr('title', '');\n\t\t\tthis.$next.addClass('disabled');\n\t\t\tthis.$next.removeClass('enabled');\n\t\t} else {\n\t\t\tthis.$next.attr('title', this.options.nextButtonLabel);\n\t\t\tthis.$next.addClass('enabled');\n\t\t\tthis.$next.removeClass('disabled');\n\t\t}\n\t\tif (this.options.max != null &&\n\t\t\t(\tthis.year + 1 > this.options.max.getFullYear() ||\n\t\t\t\t(this.year + 1 == this.options.max.getFullYear() && this.month > this.options.max.getMonth()))) {\n\t\t\tthis.$fastnext.attr('title', '');\n\t\t\tthis.$fastnext.addClass('disabled');\n\t\t\tthis.$fastnext.removeClass('enabled');\n\t\t} else {\n\t\t\tthis.$fastnext.attr('title', this.options.nextMonthButtonLabel);\n\t\t\tthis.$fastnext.addClass('enabled');\n\t\t\tthis.$fastnext.removeClass('disabled');\n\t\t}\n\t\tthis.showObject(this.$fastprev);\n\t\tthis.showObject(this.$fastnext);\n\t\tvar numDays = this.getDaysInMonth(this.year, this.month);\n\t\tvar numPrevDays = this.getDaysInMonth(previousMonth.year, previousMonth.month);\n\t\tvar startWeekday = new Date(this.year, this.month, 1).getDay();\n\t\tvar lastDayOfWeek = (this.options.firstDayOfWeek + 6) % 7;\n\t\tvar curDay = 1;\n\t\tvar rowCount = 1;\n\t\tthis.$monthObj.html(this.locales.month_names[this.month] + ' ' + this.year);\n\t\tthis.showObject(this.$grid.find('thead'));\n\t\t// clear the grid\n\t\tvar gridCells = '\\t<tr id=\"row0-'+this.id+'\" role=\"row\">\\n';\n\t\t// Insert the leading empty cells\n\t\tvar numEmpties = 0;\n\t\tvar weekday = this.options.firstDayOfWeek;\n\t\twhile (weekday != startWeekday) {\n\t\t\tnumEmpties++;\n\t\t\tweekday = (weekday + 1) % 7;\n\t\t}\n\t\tfor ( ; numEmpties > 0; numEmpties--) {\n\t\t\tgridCells += '\\t\\t<td class=\"empty\">' + (numPrevDays - numEmpties + 1) + '</td>\\n';\n\t\t}\n\t\t// insert the days of the month.\n\t\tfor (curDay = 1; curDay <= numDays; curDay++) {\n\t\t\tvar date = new Date(this.year, this.month, curDay, 0, 0, 0, 0);\n\t\t\tvar longdate = this.formatDate(date, this.options.titleFormat);\n\t\t\tvar curDayClass = curDay == this.date && this.month == this.curMonth && this.year == this.curYear ? ' curDay' : '';\n\t\t\tif ($.inArray(weekday, this.options.daysOfWeekDisabled) > -1) {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + curDay + '-' + this.id + '\" class=\"day unselectable' + curDayClass + '\"';\n\t\t\t} else if (this.options.min != null && date < this.options.min) {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + curDay + '-' + this.id + '\" class=\"day unselectable' + curDayClass + '\"';\n\t\t\t} else if (this.options.max != null && date > this.options.max) {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + curDay + '-' + this.id + '\" class=\"day unselectable' + curDayClass + '\"';\n\t\t\t} else {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + curDay + '-' + this.id + '\" class=\"day selectable' + curDayClass + '\"';\n\t\t\t}\n\t\t\tgridCells += ' data-value=\"' + curDay + '\"';\n\t\t\tgridCells += ' title=\"' + longdate + '\"';\n\t\t\tgridCells += ' aria-label=\"' + longdate + '\"';\n\t\t\tgridCells += ' headers=\"day' + weekday + '-header-' + this.id + '\" role=\"gridcell\" tabindex=\"-1\" aria-selected=\"false\">' + curDay;\n\t\t\tgridCells +=  '</td>';\n\t\t\tif (weekday == lastDayOfWeek && curDay < numDays) {\n\t\t\t\t// This was the last day of the week, close it out\n\t\t\t\t// and begin a new one\n\t\t\t\tgridCells += '\\t</tr>\\n\\t<tr id=\"row' + rowCount + '-' + this.id + '\" role=\"row\">\\n';\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t\tif (curDay < numDays) {\n\t\t\t\tweekday = (weekday + 1) % 7;\n\t\t\t}\n\t\t}\n\t\t// Insert any trailing empty cells\n\t\twhile (weekday != lastDayOfWeek) {\n\t\t\tgridCells += '\\t\\t<td class=\"empty\">' + (++numEmpties) + '</td>\\n';\n\t\t\tweekday = (weekday + 1) % 7;\n\t\t}\n\t\tgridCells += '\\t</tr>';\n\t\tvar $tbody = this.$grid.find('tbody');\n\t\t$tbody.empty();\n\t\t$tbody.append(gridCells);\n\t\tthis.gridType = 0; // 0 = days grid, 1 = months grid, 2 = years Grid\n\t} // end populateDaysCalendar()\n\n\t/**\n\t *\tpopulateMonthsCalendar() is a member function to populate the datepicker grid with calendar months\n\t *\trepresenting the current year\n\t *\n\t *\t@return N/A\n\t *\n\t */\n\tDatepicker.prototype.populateMonthsCalendar = function() {\n\t\tthis.$calendar.find('.datepicker-bn-prev-label').html(this.options.prevMonthButtonLabel);\n\t\tthis.$calendar.find('.datepicker-bn-next-label').html(this.options.nextMonthButtonLabel);\n\t\tthis.hideObject(this.$fastprev);\n\t\tthis.hideObject(this.$fastnext);\n\t\tif (this.options.min != null && this.year - 1 < this.options.min.getFullYear()) {\n\t\t\tthis.$prev.attr('title', '');\n\t\t\tthis.$prev.addClass('disabled');\n\t\t\tthis.$prev.removeClass('enabled');\n\t\t} else {\n\t\t\tthis.$prev.attr('title', this.options.prevMonthButtonLabel);\n\t\t\tthis.$prev.addClass('enabled');\n\t\t\tthis.$prev.removeClass('disabled');\n\t\t}\n\t\tthis.$monthObj.attr('title', this.options.changeYearButtonLabel);\n\t\tif (this.options.max != null && this.year + 1 > this.options.max.getFullYear()) {\n\t\t\tthis.$next.attr('title', '');\n\t\t\tthis.$next.addClass('disabled');\n\t\t\tthis.$next.removeClass('enabled');\n\t\t} else {\n\t\t\tthis.$next.attr('title', this.options.nextMonthButtonLabel);\n\t\t\tthis.$next.addClass('enabled');\n\t\t\tthis.$next.removeClass('disabled');\n\t\t}\n\t\tvar curMonth = 0;\n\t\tvar rowCount = 1;\n\t\tvar $tbody = this.$grid.find('tbody');\n\t\tthis.$monthObj.html(this.year);\n\t\t// clear the grid\n\t\tthis.hideObject(this.$grid.find('thead'));\n\t\t$tbody.empty();\n\t\t$('#datepicker-err-msg-' + this.id).empty();\n\t\tvar gridCells = '\\t<tr id=\"row0-'+this.id+'\" role=\"row\">\\n';\n\t\t// insert the months of the year.\n\t\tfor (curMonth = 0; curMonth < 12; curMonth++) {\n\t\t\tif (curMonth == this.month && this.year == this.curYear) {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + (curMonth + 1) + '-' + this.id + '\" class=\"month curMonth selectable\"';\n\t\t\t} else if (this.options.min != null && (this.year < this.options.min.getFullYear() || (this.year == this.options.min.getFullYear() && curMonth < this.options.min.getMonth()))) {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + (curMonth + 1) + '-' + this.id + '\" class=\"month unselectable\"';\n\t\t\t} else if (this.options.max != null && (this.year > this.options.max.getFullYear() || (this.year == this.options.max.getFullYear() && curMonth > this.options.max.getMonth()))) {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + (curMonth + 1) + '-' + this.id + '\" class=\"month unselectable\"';\n\t\t\t} else {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + (curMonth + 1) + '-' + this.id + '\" class=\"month selectable\"';\n\t\t\t}\n\t\t\tgridCells += ' data-value=\"' + curMonth + '\"';\n\t\t\tgridCells += ' title=\"' + this.locales.month_names[curMonth] + ' ' + this.year + '\"';\n\t\t\tgridCells += ' aria-label=\"' + this.locales.month_names[curMonth] + ' ' + this.year + '\"';\n\t\t\tgridCells += ' role=\"gridcell\" tabindex=\"-1\" aria-selected=\"false\">' + this.locales.month_names_abbreviated[curMonth];\n\t\t\tgridCells +=  '</td>';\n\t\t\tif (curMonth == 3 || curMonth == 7) {\n\t\t\t\tgridCells += '\\t</tr>\\n\\t<tr id=\"row' + rowCount + '-' + this.id + '\" role=\"row\">\\n';\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\tgridCells += '\\t</tr>';\n\t\t$tbody.append(gridCells);\n\t\tthis.gridType = 1; // 0 = days grid, 1 = months grid, 2 = years Grid\n\t} // end populateMonthsCalendar()\n\n\t/**\n\t *\tpopulateYearsCalendar() is a member function to populate the datepicker grid with 20 calendar years\n\t *\taround the current year\n\t *\n\t *\t@return N/A\n\t *\n\t */\n\tDatepicker.prototype.populateYearsCalendar = function() {\n\t\tthis.$calendar.find('.datepicker-bn-prev-label').html(this.options.prevYearButtonLabel);\n\t\tthis.$calendar.find('.datepicker-bn-next-label').html(this.options.nextYearButtonLabel);\n\t\tthis.hideObject(this.$fastprev);\n\t\tthis.hideObject(this.$fastnext);\n\t\tif (this.options.min != null && this.year - 20 < this.options.min.getFullYear()) {\n\t\t\tthis.$prev.attr('title', '');\n\t\t\tthis.$prev.addClass('disabled');\n\t\t\tthis.$prev.removeClass('enabled');\n\t\t} else {\n\t\t\tthis.$prev.attr('title', this.options.prevYearButtonLabel);\n\t\t\tthis.$prev.addClass('enabled');\n\t\t\tthis.$prev.removeClass('disabled');\n\t\t}\n\t\tthis.$monthObj.attr('title', this.options.changeRangeButtonLabel);\n\t\tif (this.options.max != null && this.year + 20 > this.options.max.getFullYear()) {\n\t\t\tthis.$next.attr('title', '');\n\t\t\tthis.$next.addClass('disabled');\n\t\t\tthis.$next.removeClass('enabled');\n\t\t} else {\n\t\t\tthis.$next.attr('title', this.options.nextYearButtonLabel);\n\t\t\tthis.$next.addClass('enabled');\n\t\t\tthis.$next.removeClass('disabled');\n\t\t}\n\t\tvar startYear = Math.floor(this.year / 10) * 10;\n\t\tvar endYear = startYear + 19;\n\t\tvar rowCount = 1;\n\t\tvar $tbody = this.$grid.find('tbody');\n\t\tthis.$monthObj.html(startYear + '-' + endYear);\n\t\t// clear the grid\n\t\tthis.hideObject(this.$grid.find('thead'));\n\t\t$tbody.empty();\n\t\t$('#datepicker-err-msg-' + this.id).empty();\n\t\tvar gridCells = '\\t<tr id=\"row0-'+this.id+'\" role=\"row\">\\n';\n\t\t// insert the months of the year.\n\t\tfor (var curYear = startYear; curYear <= endYear; curYear++) {\n\t\t\tif (curYear == this.year) {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + (curYear - startYear + 1) + '-' + this.id + '\" class=\"year curYear selectable\"';\n\t\t\t} else if (this.options.min != null && (curYear < this.options.min.getFullYear())) {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + (curYear - startYear + 1) + '-' + this.id + '\" class=\"year unselectable\"';\n\t\t\t} else if (this.options.max != null && (curYear > this.options.max.getFullYear())) {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + (curYear - startYear + 1) + '-' + this.id + '\" class=\"year unselectable\"';\n\t\t\t} else {\n\t\t\t\tgridCells += '\\t\\t<td id=\"cell' + (curYear - startYear + 1) + '-' + this.id + '\" class=\"year selectable\"';\n\t\t\t}\n\t\t\tgridCells += ' data-value=\"' + curYear + '\"';\n\t\t\tgridCells += ' title=\"' + curYear + '\"';\n\t\t\tgridCells += ' role=\"gridcell\" tabindex=\"-1\" aria-selected=\"false\">' + curYear;\n\t\t\tgridCells +=  '</td>';\n\t\t\tvar curPos = curYear - startYear;\n\t\t\tif (curPos == 4 || curPos == 9 || curPos == 14) {\n\t\t\t\tgridCells += '\\t</tr>\\n\\t<tr id=\"row' + rowCount + '-' + this.id + '\" role=\"row\">\\n';\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\tgridCells += '\\t</tr>';\n\t\t$tbody.append(gridCells);\n\t\tthis.gridType = 2; // 0 = days grid, 1 = months grid, 2 = years Grid\n\t} // end populateYearsCalendar()\n\n\t/**\n\t *\tshowDaysOfPrevMonth() is a member function to show the days of the previous month\n\t *\n\t *\t@param\t(offset int) offset may be used to specify an offset for setting\n\t *\t\t\tfocus on a day the specified number of days from the end of the month.\n\t *\t@return true if the previous month is between the minimum and the maximum date otherwise return false\n\t */\n\tDatepicker.prototype.showDaysOfPrevMonth = function(offset) {\n\t\t// show the previous month\n\t\tvar previousMonth = this.previousMonth(this.year, this.month);\n\t\tif (this.options.min != null &&\n\t\t\t(\tpreviousMonth.year < this.options.min.getFullYear() ||\n\t\t\t\t(previousMonth.year == this.options.min.getFullYear() && previousMonth.month < this.options.min.getMonth()))) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.month = previousMonth.month;\n\t\tthis.year = previousMonth.year;\n\t\t// populate the calendar grid\n\t\tthis.populateDaysCalendar();\n\n\t\t// if offset was specified, set focus on the last day - specified offset\n\t\tif (offset != null) {\n\t\t\tvar numDays = this.getDaysInMonth(this.year, this.month);\n\t\t\tvar day = 'cell' + (numDays - offset)  + '-' + this.id;\n\t\t\tthis.$grid.attr('aria-activedescendant', day);\n\t\t\tthis.selectGridCell(day);\n\t\t}\n\t\treturn true;\n\t} // end showDaysOfPrevMonth()\n\n\t/**\n\t *\tshowDaysOfMonth() is a member function to show the days of the specified month\n\t *\n\t *\t@param\t(month int) the month to show.\n\t *\t@return true if the  month is between the minimum and the maximum date otherwise return false\n\t */\n\tDatepicker.prototype.showDaysOfMonth = function(month) {\n\t\tif (this.options.min != null &&\n\t\t\t(\tthis.year < this.options.min.getFullYear() ||\n\t\t\t\t(this.year == this.options.min.getFullYear() && month < this.options.min.getMonth()))) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this.options.max != null &&\n\t\t\t(\tthis.year > this.options.max.getFullYear() ||\n\t\t\t\t(this.year == this.options.max.getFullYear() && month > this.options.max.getMonth()))) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.month = month;\n\t\tthis.date = Math.min(this.date, this.getDaysInMonth(this.year, this.month));\n\t\tthis.populateDaysCalendar();\n\t\t// update the table's activedescendant to point to the active day\n\t\tvar $active = this.$grid.find(\"tbody td[data-value='\" + this.date + \"']\");\n\t\tthis.selectGridCell($active.attr('id'));\n\t\treturn true;\n\t} // end showDaysOfMonth()\n\n\n\t/**\n\t *\tshowMonthsOfPrevYear() is a member function to show the months of the previous year\n\t *\n\t *\t@param\t(offset int) offset may be used to specify an offset for setting\n\t *\t\t\tfocus on a month the specified number of months from the end of the year.\n\t *\t@return true if the previous year is between the minimum and the maximum date otherwise return false\n\t */\n\tDatepicker.prototype.showMonthsOfPrevYear = function(offset) {\n\t\tif (this.options.min != null && this.year - 1 < this.options.min.getFullYear()) {\n\t\t\treturn false;\n\t\t}\n\t\t// show the previous year\n\t\tthis.year--;\n\t\t// populate the calendar grid\n\t\tthis.populateMonthsCalendar();\n\n\t\t// if offset was specified, set focus on the last month - specified offset\n\t\tif (offset != null) {\n\t\t\tvar month = 'cell' + (12 - offset)  + '-' + this.id;\n\t\t\tthis.$grid.attr('aria-activedescendant', month);\n\t\t\tthis.selectGridCell(month);\n\t\t}\n\t\treturn true;\n\t} // end showMonthsOfPrevYear()\n\n\t/**\n\t *\tshowMonthsOfYear() is a member function to show the months of the specified year\n\t *\n\t *\t@param\t(year int) the year to show.\n\t *\t@return true if the year is between the minimum and the maximum date otherwise return false\n\t */\n\tDatepicker.prototype.showMonthsOfYear = function(year) {\n\t\tif (this.options.min != null && year < this.options.min.getFullYear()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this.options.max != null && year > this.options.max.getFullYear()) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.year = year;\n\t\tthis.populateMonthsCalendar();\n\t\t// update the table's activedescendant to point to the active month\n\t\tvar $active = this.$grid.find(\"tbody td[data-value='\" + this.month + \"']\");\n\t\tthis.$grid.attr('aria-activedescendant', $active.attr('id'));\n\t\tthis.selectGridCell($active.attr('id'));\n\t\treturn true;\n\t} // end showMonthsOfYear()\n\n\n\t/**\n\t *\tshowYearsOfPrevRange() is a member function to show the years of the previous range of twenty years\n\t *\n\t *\t@param\t(offset int) offset may be used to specify an offset for setting\n\t *\t\t\tfocus on a year the specified number of years from the end of the range.\n\t *\t@return true if the year - 20 is between the minimum and the maximum date otherwise return false\n\t */\n\tDatepicker.prototype.showYearsOfPrevRange = function(offset) {\n\t\tif (this.options.min != null && this.year - 20 < this.options.min.getFullYear()) {\n\t\t\treturn false;\n\t\t}\n\t\t// show the previous range\n\t\tthis.year -= 20;\n\t\t// populate the calendar grid\n\t\tthis.populateYearsCalendar();\n\n\t\t// if offset was specified, set focus on the last month - specified offset\n\t\tif (offset != null) {\n\t\t\tvar year = 'cell' + (20 - offset)  + '-' + this.id;\n\t\t\tthis.$grid.attr('aria-activedescendant', year);\n\t\t\tthis.selectGridCell(year);\n\t\t}\n\t\treturn true;\n\t} // end showYearsOfPrevRange()\n\n\t/**\n\t * showDaysOfNextMonth() is a member function to show the next month\n\t *\n\t *\t@param\t(offset int) offset may be used to specify an offset for setting\n\t *\t\t\tfocus on a day the specified number of days from\n\t *\t\t\tthe beginning of the month.\n\t *\t@return true if the nextmMonth is between the minimum and the maximum date otherwise return false\n\t */\n\tDatepicker.prototype.showDaysOfNextMonth = function(offset) {\n\t\t// show the next month\n\t\tvar nextMonth = this.nextMonth(this.year, this.month);\n\t\tif (this.options.max != null &&\n\t\t\t(\tnextMonth.year > this.options.max.getFullYear() ||\n\t\t\t\t(nextMonth.year == this.options.max.getFullYear() && nextMonth.month > this.options.max.getMonth()))) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.month = nextMonth.month;\n\t\tthis.year = nextMonth.year;\n\t\t// populate the calendar grid\n\t\tthis.populateDaysCalendar();\n\n\t\t// if offset was specified, set focus on the first day + specified offset\n\t\tif (offset != null) {\n\t\t\tvar day = 'cell' + offset + '-' + this.id;\n\t\t\tthis.$grid.attr('aria-activedescendant', day);\n\t\t\tthis.selectGridCell(day);\n\t\t}\n\t\treturn true;\n\t} // end showDaysOfNextMonth()\n\n\t/**\n\t * showMonthsOfNextYear() is a member function to show the months of next year\n\t *\n\t *\t@param\t(offset int) offset may be used to specify an offset for setting\n\t *\t\t\tfocus on a month the specified number of month from\n\t *\t\t\tthe beginning of the year.\n\t *\t@return true if the next year is between the minimum and the maximum date otherwise return false\n\t */\n\tDatepicker.prototype.showMonthsOfNextYear = function(offset) {\n\t\tif (this.options.max != null && this.year + 1 > this.options.max.getFullYear()) {\n\t\t\treturn false;\n\t\t}\n\t\t// show the next year\n\t\tthis.year++;\n\t\t// populate the calendar grid\n\t\tthis.populateMonthsCalendar();\n\n\t\t// if offset was specified, set focus on the first day + specified offset\n\t\tif (offset != null) {\n\t\t\tvar month = 'cell' + offset + '-' + this.id;\n\t\t\tthis.$grid.attr('aria-activedescendant', month);\n\t\t\tthis.selectGridCell(month);\n\t\t}\n\t\treturn true;\n\t} // end showMonthsOfNextYear()\n\n\t/**\n\t * showYearsOfNextRange() is a member function to show the years of next range of years\n\t *\n\t *\t@param\t(offset int) offset may be used to specify an offset for setting\n\t *\t\t\tfocus on a year the specified number of years from\n\t *\t\t\tthe beginning of the range.\n\t *\t@return true if the year + 20 is between the minimum and the maximum date otherwise return false\n\t */\n\tDatepicker.prototype.showYearsOfNextRange = function(offset) {\n\t\tif (this.options.max != null && this.year + 20 > this.options.max.getFullYear()) {\n\t\t\treturn false;\n\t\t}\n\t\t// show the next year\n\t\tthis.year += 20;\n\t\t// populate the calendar grid\n\t\tthis.populateYearsCalendar();\n\n\t\t// if offset was specified, set focus on the first day + specified offset\n\t\tif (offset != null) {\n\t\t\tvar year = 'cell' + offset + '-' + this.id;\n\t\t\tthis.$grid.attr('aria-activedescendant', year);\n\t\t\tthis.selectGridCell(year);\n\t\t}\n\t\treturn true;\n\t} // end showYearsOfNextRange()\n\n\t/**\n\t *\tshowDaysOfPrevYear() is a member function to show the previous year\n\t *\n\t *\t@return true if the previous year is between the minimum and the maximum date otherwise return false\n\t */\n\tDatepicker.prototype.showDaysOfPrevYear = function() {\n\t\tif (this.options.min != null &&\n\t\t\t(\tthis.year - 1 < this.options.min.getFullYear() ||\n\t\t\t\t(this.year - 1 == this.options.min.getFullYear() && this.month < this.options.min.getMonth()))) {\n\t\t\treturn false;\n\t\t}\n\t\t// decrement the year\n\t\tthis.year--;\n\n\t\t// populate the calendar grid\n\t\tthis.populateDaysCalendar();\n\t\treturn true;\n\t} // end showDaysOfPrevYear()\n\n\t/**\n\t *\tshowDaysOfNextYear() is a member function to show the next year\n\t *\n\t *\t@return true if the next year is between the minimum and the maximum date otherwise return false\n\t */\n\tDatepicker.prototype.showDaysOfNextYear = function() {\n\t\tif (this.options.max != null &&\n\t\t\t(\tthis.year + 1 > this.options.max.getFullYear() ||\n\t\t\t\t(this.year + 1 == this.options.max.getFullYear() && this.month > this.options.max.getMonth()))) {\n\t\t\treturn false;\n\t\t}\n\t\t// increment the year\n\t\tthis.year++;\n\n\t\t// populate the calendar grid\n\t\tthis.populateDaysCalendar();\n\t\treturn true;\n\t} // end showDaysOfNextYear()\n\n\t/**\n\t *\tbindHandlers() is a member function to bind event handlers for the widget\n\t *\n\t *\t@return N/A\n\t */\n\tDatepicker.prototype.bindHandlers = function() {\n\t\tvar self = this;\n\n\t\t// bind button handlers\n\t\tthis.$fastprev.click(function(e) {\n\t\t\treturn self.handleFastPrevClick(e);\n\t\t});\n\t\tthis.$prev.click(function(e) {\n\t\t\treturn self.handlePrevClick(e);\n\t\t});\n\t\tthis.$next.click(function(e) {\n\t\t\treturn self.handleNextClick(e);\n\t\t});\n\t\tthis.$fastnext.click(function(e) {\n\t\t\treturn self.handleFastNextClick(e);\n\t\t});\n\t\tthis.$monthObj.click(function(e) {\n\t\t\treturn self.handleMonthClick(e);\n\t\t});\n\t\tthis.$monthObj.keydown(function(e) {\n\t\t\treturn self.handleMonthKeyDown(e);\n\t\t});\n\t\tthis.$fastprev.keydown(function(e) {\n\t\t\treturn self.handleFastPrevKeyDown(e);\n\t\t});\n\t\tthis.$prev.keydown(function(e) {\n\t\t\treturn self.handlePrevKeyDown(e);\n\t\t});\n\t\tthis.$next.keydown(function(e) {\n\t\t\treturn self.handleNextKeyDown(e);\n\t\t});\n\t\tthis.$fastnext.keydown(function(e) {\n\t\t\treturn self.handleFastNextKeyDown(e);\n\t\t});\n\t\tif (this.options.modal == true) {\n\t\t\tthis.$close.click(function(e) {\n\t\t\t\treturn self.handleCloseClick(e);\n\t\t\t});\n\t\t\tthis.$close.keydown(function(e) {\n\t\t\t\treturn self.handleCloseKeyDown(e);\n\t\t\t});\n\t\t}\n\n\t\t// bind grid handlers\n\t\tthis.$grid.keydown(function(e) {\n\t\t\treturn self.handleGridKeyDown(e);\n\t\t});\n\t\tthis.$grid.keypress(function(e) {\n\t\t\treturn self.handleGridKeyPress(e);\n\t\t});\n\t\tthis.$grid.focus(function(e) {\n\t\t\treturn self.handleGridFocus(e);\n\t\t});\n\t\tthis.$grid.blur(function(e) {\n\t\t\treturn self.handleGridBlur(e);\n\t\t});\n\t\tthis.$grid.delegate('td', 'click', function(e) {\n\t\t\treturn self.handleGridClick(this, e);\n\t\t});\n\t} // end bindHandlers();\n\n\t/**\n\t *\thandleFastPrevClick() is a member function to process click events for the fast prev month button\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleFastPrevClick = function(e) {\n\t\tif (this.showDaysOfPrevYear()) {\n\t\t\tvar active = this.$grid.attr('aria-activedescendant');\n\t\t\tif (this.month != this.curMonth || this.year != this.curYear) {\n\t\t\t\tthis.$grid.attr('aria-activedescendant', 'cell1' + '-' + this.id);\n\t\t\t\tthis.selectGridCell('cell1' + '-' + this.id);\n\t\t\t} else {\n\t\t\t\tthis.$grid.attr('aria-activedescendant', active);\n\t\t\t\tthis.selectGridCell(active);\n\t\t\t}\n\t\t}\n\t\te.stopPropagation();\n\t\treturn false;\n\t} // end handleFastPrevClick()\n\n\t/**\n\t *\thandlePrevClick() is a member function to process click events for the prev month button\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handlePrevClick = function(e) {\n\t\tvar active = this.$grid.attr('aria-activedescendant');\n\t\tswitch (this.gridType) {\n\t\t\tcase 0: // days grid\n\t\t\t\tvar ok;\n\t\t\t\tif (e.ctrlKey) {\n\t\t\t\t\tok = this.showDaysOfPrevYear();\n\t\t\t\t} else {\n\t\t\t\t\tok = this.showDaysOfPrevMonth();\n\t\t\t\t}\n\t\t\t\tif (ok) {\n\t\t\t\t\tif (this.month != this.curMonth || this.year != this.curYear) {\n\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', 'cell1' + '-' + this.id);\n\t\t\t\t\t\tthis.selectGridCell('cell1' + '-' + this.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', active);\n\t\t\t\t\t\tthis.selectGridCell(active);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 1: // months grid\n\t\t\t\tif (this.showMonthsOfPrevYear()) {\n\t\t\t\t\tif (this.year != this.curYear) {\n\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', 'cell1' + '-' + this.id);\n\t\t\t\t\t\tthis.selectGridCell('cell1' + '-' + this.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', active);\n\t\t\t\t\t\tthis.selectGridCell(active);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 2: // years grid\n\t\t\t\tif (this.showYearsOfPrevRange()) {\n\t\t\t\t\tthis.$grid.attr('aria-activedescendant', 'cell1' + '-' + this.id);\n\t\t\t\t\tthis.selectGridCell('cell1' + '-' + this.id);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\te.stopPropagation();\n\t\treturn false;\n\t} // end handlePrevClick()\n\n\t/**\n\t *\thandleMonthClick() is a member function to process click events for the month header\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleMonthClick = function(e) {\n\t\tthis.changeGrid(e);\n\t\te.stopPropagation();\n\t\treturn false;\n\t} // end handleMonthClick()\n\n\t/**\n\t *\thandleNextClick() is a member function to process click events for the next month button\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleNextClick = function(e) {\n\t\tvar active = this.$grid.attr('aria-activedescendant');\n\t\tswitch (this.gridType) {\n\t\t\tcase 0: // days grid\n\t\t\t\tvar ok;\n\t\t\t\tif (e.ctrlKey) {\n\t\t\t\t\tok = this.showDaysOfNextYear();\n\t\t\t\t} else {\n\t\t\t\t\tok = this.showDaysOfNextMonth();\n\t\t\t\t}\n\t\t\t\tif (ok) {\n\t\t\t\t\tif (this.month != this.curMonth || this.year != this.curYear) {\n\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', 'cell1' + '-' + this.id);\n\t\t\t\t\t\tthis.selectGridCell('cell1' + '-' + this.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', active);\n\t\t\t\t\t\tthis.selectGridCell(active);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 1: // months grid\n\t\t\t\tif (this.showMonthsOfNextYear()) {\n\t\t\t\t\tif (this.year != this.curYear) {\n\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', 'cell1' + '-' + this.id);\n\t\t\t\t\t\tthis.selectGridCell('cell1' + '-' + this.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', active);\n\t\t\t\t\t\tthis.selectGridCell(active);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 2: // years grid\n\t\t\t\tif (this.showYearsOfNextRange()) {\n\t\t\t\t\tthis.$grid.attr('aria-activedescendant', 'cell1' + '-' + this.id);\n\t\t\t\t\tthis.selectGridCell('cell1' + '-' + this.id);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\te.stopPropagation();\n\t\treturn false;\n\n\t} // end handleNextClick()\n\n\t/**\n\t *\thandleFastNextClick() is a member function to process click events for the fast next month button\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleFastNextClick = function(e) {\n\t\tif (this.showDaysOfNextYear()) {\n\t\t\tvar active = this.$grid.attr('aria-activedescendant');\n\t\t\tif (this.month != this.curMonth || this.year != this.curYear) {\n\t\t\t\tthis.$grid.attr('aria-activedescendant', 'cell1' + '-' + this.id);\n\t\t\t\tthis.selectGridCell('cell1' + '-' + this.id);\n\t\t\t} else {\n\t\t\t\tthis.$grid.attr('aria-activedescendant', active);\n\t\t\t\tthis.selectGridCell(active);\n\t\t\t}\n\t\t}\n\t\te.stopPropagation();\n\t\treturn false;\n\n\t} // end handleFastNextClick()\n\n\t/**\n\t *\thandleCloseClick() is a member function to process click events for the close button\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleCloseClick = function(e) {\n\t\t// dismiss the dialog box\n\t\tthis.hide();\n\t\te.stopPropagation();\n\t\treturn false;\n\t} // end handleCloseClick()\n\n\t/**\n\t *\thandleFastPrevKeyDown() is a member function to process keydown events for the fast prev month button\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleFastPrevKeyDown = function(e) {\n\t\tif (e.altKey) {\n\t\t\treturn true;\n\t\t}\n\t\tswitch (e.keyCode) {\n\t\t\tcase this.keys.tab:\n\t\t\t\t{\n\t\t\t\t\tif (this.options.modal == false || e.ctrlKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tthis.$close.focus();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$prev.focus();\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.enter:\n\t\t\tcase this.keys.space:\n\t\t\t\t{\n\t\t\t\t\tif (e.shiftKey || e.ctrlKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tthis.showDaysOfPrevYear();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\t\t\tcase this.keys.esc:\n\t\t\t\t{\n\t\t\t\t\t// dismiss the dialog box\n\t\t\t\t\tthis.hide();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t}\n\t\treturn true;\n\t} // end handleFastPrevKeyDown()\n\n\t/**\n\t *\thandlePrevKeyDown() is a member function to process keydown events for the prev month button\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handlePrevKeyDown = function(e) {\n\t\tif (e.altKey) {\n\t\t\treturn true;\n\t\t}\n\t\tswitch (e.keyCode) {\n\t\t\tcase this.keys.tab:\n\t\t\t\t{\n\t\t\t\t\tif (this.options.modal == false || e.ctrlKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tif (this.gridType == 0) {\n\t\t\t\t\t\t\tthis.$fastprev.focus();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.$close.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// @TODO : do not work with FF, Chrome, Safari but work with IE, why ?\n\t\t\t\t\t\tthis.$monthObj.focus();\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.enter:\n\t\t\tcase this.keys.space:\n\t\t\t\t{\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tswitch (this.gridType) {\n\t\t\t\t\t\tcase 0: // days grid\n\t\t\t\t\t\t\tif (e.ctrlKey) {\n\t\t\t\t\t\t\t\tthis.showDaysOfPrevYear();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.showDaysOfPrevMonth();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1: // months grid\n\t\t\t\t\t\t\tthis.showMonthsOfPrevYear();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2: // years grid\n\t\t\t\t\t\t\tthis.showYearsOfPrevRange();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\t\t\tcase this.keys.esc:\n\t\t\t\t{\n\t\t\t\t\t// dismiss the dialog box\n\t\t\t\t\tthis.hide();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t}\n\t\treturn true;\n\t} // end handlePrevKeyDown()\n\n\t/**\n\t *\thandleMonthKeyDown() is a member function to process keydown events for the month title\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleMonthKeyDown = function(e) {\n\t\tif (e.altKey) {\n\t\t\treturn true;\n\t\t}\n\t\tswitch (e.keyCode) {\n\t\t\tcase this.keys.tab:\n\t\t\t\t{\n\t\t\t\t\tif (this.options.modal == false || e.ctrlKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tthis.$prev.focus();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$next.focus();\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.enter:\n\t\t\tcase this.keys.space:\n\t\t\t\t{\n\t\t\t\t\tthis.changeGrid(e);\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\t\t\tcase this.keys.esc:\n\t\t\t\t{\n\t\t\t\t\t// dismiss the dialog box\n\t\t\t\t\tthis.hide();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t}\n\t\treturn true;\n\t} // end handleMonthKeyDown()\n\n\t/**\n\t *\thandleNextKeyDown() is a member function to process keydown events for the next month button\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleNextKeyDown = function(e) {\n\t\tif (e.altKey) {\n\t\t\treturn true;\n\t\t}\n\t\tswitch (e.keyCode) {\n\t\t\tcase this.keys.tab:\n\t\t\t\t{\n\t\t\t\t\tif (this.options.modal == false || e.ctrlKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tthis.$monthObj.focus();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.gridType == 0) {\n\t\t\t\t\t\t\tthis.$fastnext.focus();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.$grid.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.enter:\n\t\t\tcase this.keys.space:\n\t\t\t\t{\n\t\t\t\t\tswitch (this.gridType) {\n\t\t\t\t\t\tcase 0: // days grid\n\t\t\t\t\t\t\tif (e.ctrlKey) {\n\t\t\t\t\t\t\t\tthis.showDaysOfNextYear();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.showDaysOfNextMonth();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1: // months grid\n\t\t\t\t\t\t\tthis.showMonthsOfNextYear();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2: // years grid\n\t\t\t\t\t\t\tthis.showYearsOfNextRange();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.esc:\n\t\t\t\t{\n\t\t\t\t\t// dismiss the dialog box\n\t\t\t\t\tthis.hide();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t}\n\t\treturn true;\n\t} // end handleNextKeyDown()\n\n\t/**\n\t *\thandleFastNextKeyDown() is a member function to process keydown events for the fast next month button\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleFastNextKeyDown = function(e) {\n\t\tif (e.altKey) {\n\t\t\treturn true;\n\t\t}\n\t\tswitch (e.keyCode) {\n\t\t\tcase this.keys.tab:\n\t\t\t\t{\n\t\t\t\t\tif (this.options.modal == false || e.ctrlKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tthis.$next.focus();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$grid.focus();\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.enter:\n\t\t\tcase this.keys.space:\n\t\t\t\t{\n\t\t\t\t\tthis.showDaysOfNextYear();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.esc:\n\t\t\t\t{\n\t\t\t\t\t// dismiss the dialog box\n\t\t\t\t\tthis.hide();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t}\n\t\treturn true;\n\t} // end handleFastNextKeyDown()\n\n\t/**\n\t *\thandleCloseKeyDown() is a member function to process keydown events for the close button\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleCloseKeyDown = function(e) {\n\t\tif (e.altKey) {\n\t\t\treturn true;\n\t\t}\n\t\tswitch (e.keyCode) {\n\t\t\tcase this.keys.tab:\n\t\t\t\t{\n\t\t\t\t\tif (e.ctrlKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tthis.$grid.focus();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.gridType == 0) {\n\t\t\t\t\t\t\tthis.$fastprev.focus();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.$prev.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.enter:\n\t\t\tcase this.keys.esc:\n\t\t\tcase this.keys.space:\n\t\t\t\t{\n\t\t\t\t\tif (e.shiftKey || e.ctrlKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// dismiss the dialog box\n\t\t\t\t\tthis.hide();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\t\t}\n\t\treturn true;\n\t} // end handlePrevKeyDown()\n\n\t/**\n\t *\thandleGridKeyDown() is a member function to process keydown events for the Datepicker grid\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleGridKeyDown = function(e) {\n\t\tvar $curCell = $('#' + this.$grid.attr('aria-activedescendant'));\n\t\tvar $cells = this.$grid.find('td.selectable');\n\t\tvar colCount = this.$grid.find('tbody tr').eq(0).find('td').length;\n\t\tif (e.altKey) {\n\t\t\treturn true;\n\t\t}\n\t\tswitch (e.keyCode) {\n\t\t\tcase this.keys.tab:\n\t\t\t\t{\n\t\t\t\t\tif (this.options.modal == true) {\n\t\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\t\tif (this.gridType == 0) {\n\t\t\t\t\t\t\t\tthis.$fastnext.focus();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.$next.focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.$close.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// dismiss the dialog box\n\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\tthis.handleTabOut(e);\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tcase this.keys.enter:\n\t\t\tcase this.keys.space:\n\t\t\t\t{\n\t\t\t\t\tif (e.ctrlKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tswitch (this.gridType) {\n\t\t\t\t\t\tcase 0: // days grid\n\t\t\t\t\t\t\t// update the target box\n\t\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\t\t// dismiss the dialog box\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1: // months grid\n\t\t\t\t\t\t\tthis.showDaysOfMonth(parseInt($curCell.attr('data-value'), 10));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2: // years grid\n\t\t\t\t\t\t\tthis.showMonthsOfYear(parseInt($curCell.attr('data-value'), 10));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.esc:\n\t\t\t\t{\n\t\t\t\t\t// dismiss the dialog box\n\t\t\t\t\tthis.hide();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.left:\n\t\t\tcase this.keys.right:\n\t\t\t\t{\n\t\t\t\t\tif ((e.keyCode == this.keys.left && this.locales.directionality === 'LTR')  || (e.keyCode == this.keys.right && this.locales.directionality === 'RTL')) {\n\t\t\t\t\t\tif (e.ctrlKey || e.shiftKey) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar cellIndex = $cells.index($curCell) - 1;\n\t\t\t\t\t\tvar $prevCell = null;\n\t\t\t\t\t\tif (cellIndex >= 0) {\n\t\t\t\t\t\t\t$prevCell = $cells.eq(cellIndex);\n\t\t\t\t\t\t\tthis.unSelectGridCell($curCell.attr('id'));\n\t\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', $prevCell.attr('id'));\n\t\t\t\t\t\t\tthis.selectGridCell($prevCell.attr('id'));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tswitch (this.gridType) {\n\t\t\t\t\t\t\t\tcase 0: // days grid\n\t\t\t\t\t\t\t\t\tthis.showDaysOfPrevMonth(0);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 1: // months grid\n\t\t\t\t\t\t\t\t\tthis.showMonthsOfPrevYear(0);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 2: // years grid\n\t\t\t\t\t\t\t\t\tthis.showYearsOfPrevRange(0);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (e.ctrlKey || e.shiftKey) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar cellIndex = $cells.index($curCell) + 1;\n\t\t\t\t\t\tvar $nextCell = null;\n\t\t\t\t\t\tif (cellIndex < $cells.length) {\n\t\t\t\t\t\t\t$nextCell = $cells.eq(cellIndex);\n\t\t\t\t\t\t\tthis.unSelectGridCell($curCell.attr('id'));\n\t\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', $nextCell.attr('id'));\n\t\t\t\t\t\t\tthis.selectGridCell($nextCell.attr('id'));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tswitch (this.gridType) {\n\t\t\t\t\t\t\t\tcase 0: // days grid\n\t\t\t\t\t\t\t\t\t// move to the next month\n\t\t\t\t\t\t\t\t\tthis.showDaysOfNextMonth(1);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 1: // months grid\n\t\t\t\t\t\t\t\t\tthis.showMonthsOfNextYear(1);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 2: // years grid\n\t\t\t\t\t\t\t\t\tthis.showYearsOfNextRange(1);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase this.keys.up:\n\t\t\t\t{\n\t\t\t\t\tif (e.ctrlKey || e.shiftKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tvar cellIndex = $cells.index($curCell) - colCount;\n\t\t\t\t\tvar $prevCell = null;\n\t\t\t\t\tif (cellIndex >= 0) {\n\t\t\t\t\t\t$prevCell = $cells.eq(cellIndex);\n\t\t\t\t\t\tthis.unSelectGridCell($curCell.attr('id'));\n\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', $prevCell.attr('id'));\n\t\t\t\t\t\tthis.selectGridCell($prevCell.attr('id'));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// move to appropriate day in previous month\n\t\t\t\t\t\tcellIndex = colCount - 1 - $cells.index($curCell);\n\t\t\t\t\t\tswitch (this.gridType) {\n\t\t\t\t\t\t\tcase 0: // days grid\n\t\t\t\t\t\t\t\tthis.showDaysOfPrevMonth(cellIndex);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1: // months grid\n\t\t\t\t\t\t\t\tthis.showMonthsOfPrevYear(cellIndex);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2: // years grid\n\t\t\t\t\t\t\t\tthis.showYearsOfPrevRange(cellIndex);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.down:\n\t\t\t\t{\n\t\t\t\t\tif (e.ctrlKey || e.shiftKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tvar cellIndex = $cells.index($curCell) + colCount;\n\t\t\t\t\tvar $nextCell = null;\n\t\t\t\t\tif (cellIndex < $cells.length) {\n\t\t\t\t\t\t$nextCell = $cells.eq(cellIndex);\n\t\t\t\t\t\tthis.unSelectGridCell($curCell.attr('id'));\n\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', $nextCell.attr('id'));\n\t\t\t\t\t\tthis.selectGridCell($nextCell.attr('id'));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// move to appropriate day in next month\n\t\t\t\t\t\tcellIndex = colCount + 1 - ($cells.length - $cells.index($curCell));\n\t\t\t\t\t\tswitch (this.gridType) {\n\t\t\t\t\t\t\tcase 0: // days grid\n\t\t\t\t\t\t\t\tthis.showDaysOfNextMonth(cellIndex);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1: // months grid\n\t\t\t\t\t\t\t\tthis.showMonthsOfNextYear(cellIndex);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2: // years grid\n\t\t\t\t\t\t\t\tthis.showYearsOfNextRange(cellIndex);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.pageup:\n\t\t\t\t{\n\t\t\t\t\tvar active = this.$grid.attr('aria-activedescendant');\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvar ok = false;\n\t\t\t\t\tswitch (this.gridType) {\n\t\t\t\t\t\tcase 0: // days grid\n\t\t\t\t\t\t\tif (e.ctrlKey) {\n\t\t\t\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\t\t\t\tok = this.showDaysOfPrevYear();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tok = this.showDaysOfPrevMonth();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1: // months grid\n\t\t\t\t\t\t\tok = this.showMonthsOfPrevYear();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2: // years grid\n\t\t\t\t\t\t\tok = this.showYearsOfPrevRange();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (ok) {\n\t\t\t\t\t\tif ($('#' + active).attr('id') == undefined) {\n\t\t\t\t\t\t\tvar $lastCell = $cells.eq($cells.length - 1);\n\t\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', $lastCell.attr('id'));\n\t\t\t\t\t\t\tthis.selectGridCell($lastCell.attr('id'));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.selectGridCell(active);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.pagedown:\n\t\t\t\t{\n\t\t\t\t\tvar active = this.$grid.attr('aria-activedescendant');\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvar ok = false;\n\t\t\t\t\tswitch (this.gridType) {\n\t\t\t\t\t\tcase 0: // days grid\n\t\t\t\t\t\t\tif (e.ctrlKey) {\n\t\t\t\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\t\t\t\tok = this.showDaysOfNextYear();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tok = this.showDaysOfNextMonth();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1: // months grid\n\t\t\t\t\t\t\tok = this.showMonthsOfNextYear();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2: // years grid\n\t\t\t\t\t\t\tok = this.showYearsOfNextRange();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (ok) {\n\t\t\t\t\t\tif ($('#' + active).attr('id') == undefined) {\n\t\t\t\t\t\t\tvar $lastCell = $cells.eq($cells.length - 1);\n\t\t\t\t\t\t\tthis.$grid.attr('aria-activedescendant', $lastCell.attr('id'));\n\t\t\t\t\t\t\tthis.selectGridCell($lastCell.attr('id'));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.selectGridCell(active);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.home:\n\t\t\t\t{\n\t\t\t\t\tif (e.ctrlKey || e.shiftKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tvar $firstCell = $cells.eq(0);\n\t\t\t\t\tthis.unSelectGridCell($curCell.attr('id'));\n\t\t\t\t\tthis.$grid.attr('aria-activedescendant', $firstCell.attr('id'));\n\t\t\t\t\tthis.selectGridCell($firstCell.attr('id'));\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tcase this.keys.end:\n\t\t\t\t{\n\t\t\t\t\tif (e.ctrlKey || e.shiftKey) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tvar $lastCell = $cells.eq($cells.length - 1);\n\t\t\t\t\tthis.unSelectGridCell($curCell.attr('id'));\n\t\t\t\t\tthis.$grid.attr('aria-activedescendant', $lastCell.attr('id'));\n\t\t\t\t\tthis.selectGridCell($lastCell.attr('id'));\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t}\n\t\treturn true;\n\t} // end handleGridKeyDown()\n\n\t/**\n\t *\thandleGridKeyPress() is a member function to consume keypress events for browsers that\n\t *\tuse keypress to scroll the screen and manipulate tabs\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t * \t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleGridKeyPress = function(e) {\n\t\tif (e.altKey) {\n\t\t\treturn true;\n\t\t}\n\t\tswitch (e.keyCode) {\n\t\t\tcase this.keys.tab:\n\t\t\tcase this.keys.enter:\n\t\t\tcase this.keys.space:\n\t\t\tcase this.keys.esc:\n\t\t\tcase this.keys.left:\n\t\t\tcase this.keys.right:\n\t\t\tcase this.keys.up:\n\t\t\tcase this.keys.down:\n\t\t\tcase this.keys.pageup:\n\t\t\tcase this.keys.pagedown:\n\t\t\tcase this.keys.home:\n\t\t\tcase this.keys.end:\n\t\t\t\t{\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t}\n\t\treturn true;\n\t} // end handleGridKeyPress()\n\n\t/**\n\t *\thandleGridClick() is a member function to process mouse click events for the Datepicker grid\n\t *\n\t *\t@param (id string) id is the id of the object triggering the event\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\tDatepicker.prototype.handleGridClick = function(id, e) {\n\t\tvar $cell = $(id);\n\t\tif ($cell.is('.empty') || $cell.is('.unselectable')) {\n\t\t\treturn true;\n\t\t}\n\t\tthis.$grid.find('.focus').removeClass('focus').attr('aria-selected', 'false').attr('tabindex', -1);\n\t\tswitch (this.gridType) {\n\t\t\tcase 0: // days grid\n\t\t\t\tthis.$grid.attr('aria-activedescendant', $cell.attr('id'));\n\t\t\t\tthis.selectGridCell($cell.attr('id'));\n\t\t\t\t// update the target box\n\t\t\t\tthis.update();\n\t\t\t\t// dismiss the dialog box\n\t\t\t\tthis.hide();\n\t\t\t\tbreak;\n\t\t\tcase 1: // months grid\n\t\t\t\tthis.showDaysOfMonth(parseInt($cell.attr('data-value'), 10));\n\t\t\t\tbreak;\n\t\t\tcase 2: // years grid\n\t\t\t\tthis.showMonthsOfYear(parseInt($cell.attr('data-value'), 10));\n\t\t\t\tbreak;\n\t\t}\n\t\te.stopPropagation();\n\t\treturn false;\n\t} // end handleGridClick()\n\n\t/**\n\t *\thandleGridFocus() is a member function to process focus events for the Datepicker grid\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) true\n\t */\n\tDatepicker.prototype.handleGridFocus = function(e) {\n\t\tvar active = this.$grid.attr('aria-activedescendant');\n\t\tif ($('#' + active).attr('id') == undefined) {\n\t\t\tvar $cells = this.$grid.find('td.selectable');\n\t\t\tvar $lastCell = $cells.eq($cells.length - 1);\n\t\t\tthis.$grid.attr('aria-activedescendant', $lastCell.attr('id'));\n\t\t\tthis.selectGridCell($lastCell.attr('id'));\n\t\t} else {\n\t\t\tthis.selectGridCell(active);\n\t\t}\n\t\treturn true;\n\t} // end handleGridFocus()\n\n\t/**\n\t *\thandleGridBlur() is a member function to process blur events for the Datepicker grid\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) true\n\t */\n\tDatepicker.prototype.handleGridBlur = function(e) {\n\t\tthis.unSelectGridCell(this.$grid.attr('aria-activedescendant'));\n\t\treturn true;\n\t} // end handleGridBlur()\n\n\t/**\n\t *\thandleTabOut() is a member function to process tab key in Datepicker grid\n\t *\n\t * @param (e obj) e is the event object associated with the event\n\t * @return (boolean) true\n\t */\n\tDatepicker.prototype.handleTabOut = function(e) {\n\t\tvar fields = $('body').find('input:visible,textarea:visible,select:visible');\n        var index = fields.index( this.$target );\n        if ( index > -1 && index < fields.length ) {\n\t\t\tif (e.shiftKey) {\n\t\t\t\tif (index > 0) {\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (index + 1 < fields.length) {\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t}\n            fields.eq( index ).focus();\n        }\n\t\treturn true;\n\t} // end handleTabOut()\n\n\t/**\n\t *\tchangeGrid() is a member function to change the calendar after click or enter into the calendar title\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\t@return true\n\t */\n\tDatepicker.prototype.changeGrid = function(e) {\n\t\tswitch (this.gridType) {\n\t\t\tcase 0: // days grid\n\t\t\t\tthis.populateMonthsCalendar();\n\t\t\t\tif (this.year != this.curYear) {\n\t\t\t\t\tvar $cells = this.$grid.find('td.selectable');\n\t\t\t\t\tthis.$grid.attr('aria-activedescendant', $cells.eq(0).attr('id'));\n\t\t\t\t} else {\n\t\t\t\t\tthis.$grid.attr('aria-activedescendant', this.$grid.find('.curMonth').attr('id'));\n\t\t\t\t}\n\t\t\t\tthis.selectGridCell(this.$grid.attr('aria-activedescendant'));\n\t\t\t\tbreak;\n\t\t\tcase 2: // years grid\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t// goto previous twenty years\n\t\t\t\t\tthis.year -= 20;\n\t\t\t\t} else {\n\t\t\t\t\t// goto next twenty years\n\t\t\t\t\tthis.year += 20;\n\t\t\t\t}\n\t\t\tcase 1: // months grid\n\t\t\t\tthis.populateYearsCalendar();\n\t\t\t\tif (this.year != this.curYear) {\n\t\t\t\t\tvar $cells = this.$grid.find('td.selectable');\n\t\t\t\t\tthis.$grid.attr('aria-activedescendant', $cells.eq(0).attr('id'));\n\t\t\t\t} else {\n\t\t\t\t\tthis.$grid.attr('aria-activedescendant', this.$grid.find('.curYear').attr('id'));\n\t\t\t\t}\n\t\t\t\tthis.selectGridCell(this.$grid.attr('aria-activedescendant'));\n\t\t\t\tbreak;\n\t\t}\n\t\treturn true;\n\t} // end changeGrid()\n\n\t/**\n\t *\tselectGridCell() is a member function to put focus on the current cell of the grid.\n\t *\n\t *\t@return N/A\n\t */\n\tDatepicker.prototype.selectGridCell = function(cellId) {\n\t\t$('#' + cellId).addClass('focus').attr('aria-selected', 'true').attr('tabindex', 0).focus();\n\t} // end focusCurrentDay()\n\n\t/**\n\t *\tselectGridCell() is a member function to put focus on the current cell of the grid.\n\t *\n\t *\t@return N/A\n\t */\n\tDatepicker.prototype.unSelectGridCell = function(cellId) {\n\t\t$('#' + cellId).removeClass('focus').attr('aria-selected', 'false').attr('tabindex', -1);\n\t} // end focusCurrentDay()\n\n\t/**\n\t *\tupdate() is a member function to update the target textbox.\n\t *\n\t *\t@return N/A\n\t */\n\tDatepicker.prototype.update = function() {\n\t\tvar $curDay = $('#' + this.$grid.attr('aria-activedescendant'));\n\t\tvar date = new Date(this.year, this.month, parseInt($curDay.attr('data-value'), 10));\n\t\tvar val = this.formatDate(date, this.options.outputFormat);\n\t\tthis.$target.val(val);\n\t\tthis.$target.removeAttr('aria-invalid');\n\t\tthis.$target.parents('.form-group').removeClass('has-error');\n\t\tthis.$target.trigger('change');\n\t\tif (this.options.onUpdate) {\n\t\t\tthis.options.onUpdate(val);\n\t\t}\n\t} // end update()\n\n\t/**\n\t *\thideObject() is a member function to hide an element of the datepicker.\n\t *\n\t *\t@param ($element jQuery object) the element to hide\n\t *\t@return N/A\n\t */\n\tDatepicker.prototype.hideObject = function($element) {\n\t\t$element.attr('aria-hidden', true);\n\t\t$element.hide();\n\t} // end hideObject()\n\n\t/**\n\t *\tshowObject() is a member function to show an element of the datepicker.\n\t *\n\t *\t@param ($element jQuery object) the element to show\n\t *\t@return N/A\n\t */\n\tDatepicker.prototype.showObject = function($element) {\n\t\t$element.attr('aria-hidden', false);\n\t\t$element.show();\n\t} // end showObject()\n\n\t/**\n\t *\tshow() is a member function to show the Datepicker and give it focus.\n\t *\n\t *\t@return N/A\n\t */\n\tDatepicker.prototype.show = function() {\n\t\tvar self = this;\n\t\t$('.datepicker-calendar').trigger('ab.datepicker.opening', [self.id]);\n\t\tif (this.options.modal == true) {\n\t\t\t// Bind an event listener to the document to capture all mouse events to make dialog modal\n\t\t\t$(document).bind('click mousedown mouseup', function(e) {\n\t\t\t\t//ensure focus remains on the dialog\n\t\t\t\tself.$grid.focus();\n\t\t\t\t// Consume all mouse events and do nothing\n\t\t\t\te.stopPropagation;\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\tthis.greyOut(true);\n\t\t\tvar zIndex = parseInt($('#datepicker-overlay').css('z-index'), 10) || 40;\n\t\t\tthis.$calendar.css('z-index', zIndex + 1);\n\t\t} else {\n\t\t\t// Bind an event listener to the document to capture only the mouse click event\n\t\t\t$(document).bind('click',  $.proxy(this.handleDocumentClick, this));\n\t\t\tthis.$calendar.bind('ab.datepicker.opening', function(e, id) {\n\t\t\t\tif (id != self.id) {\n\t\t\t\t\tself.hide();\n\t\t\t\t} else {\n\t\t\t\t\t//ensure focus remains on the dialog\n\t\t\t\t\tself.$grid.focus();\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\t\tthis.$calendar.bind('ab.datepicker.opened', function(e, id) {\n\t\t\tif (id == self.id) {\n\t\t\t\tself.$grid.focus();\n\t\t\t}\n\t\t});\n\n\t\t// adjust position of the calendar\n\t\tvar groupOffsetTop = Math.max(0, Math.floor(this.$group.offset().top - this.$label.offset().top));\n\t\tvar groupOffsetLeft = Math.max(0, Math.floor(this.$group.offset().left - this.$label.offset().left));\n\t\tvar parentPaddingLeft = parseInt(this.$calendar.parent().css('padding-left'), 10);\n\t\tvar calendarHeight = this.$calendar.outerHeight();\n\t\tvar groupTop = this.$group.offset().top;\n\t\tvar groupLeft = this.$group.offset().left;\n\t\tvar groupHeight = this.$group.outerHeight(true);\n\t\tvar roomBefore = Math.floor(groupTop - $(win).scrollTop());\n\t\tvar roomAfter = Math.floor($(win).height() - (groupTop + groupHeight - $(win).scrollTop()));\n\t\tif (roomAfter < calendarHeight && roomAfter < roomBefore) {\n\t\t\t// show calendar above group\n\t\t\tthis.$calendar.addClass('above');\n\t\t\tthis.$calendar.css({\n\t\t\t\ttop: (groupOffsetTop - calendarHeight) + 'px',\n\t\t\t\tleft: (groupOffsetLeft + parentPaddingLeft) + 'px'\n\t\t\t});\n\t\t} else {\n\t\t\t  // show calendar below group\n\t\t\tthis.$calendar.addClass('below');\n\t\t\tthis.$calendar.css({\n\t\t\t\ttop: (groupHeight + groupOffsetTop) + 'px',\n\t\t\t\tleft: (groupOffsetLeft + parentPaddingLeft) + 'px'\n\t\t\t});\n\t\t}\n\n\t\t// show the dialog\n\t\tthis.$calendar.attr('aria-hidden', 'false');\n\t\tthis.$calendar.fadeIn();\n\t\t$('.datepicker-calendar').trigger('ab.datepicker.opened', [self.id]);\n\t} // end show()\n\n\t/**\n\t *\trefresh() is a member function to refesh the datepicker content when an option change.\n\t *\n\t *\t@return N/A\n\t */\n\tDatepicker.prototype.refresh = function() {\n\t\tthis.drawCalendarHeader();\n\t\tswitch\t(this.gridType) {\n\t\t\tcase 0:\n\t\t\t\tthis.populateDaysCalendar();\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.populateMonthsCalendar();\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.populateYearsCalendar();\n\t\t\t\tbreak;\n\t\t}\n\t} // end refresh()\n\n\t/**\n\t *\thandleDocumentClick() is a member function to handle click on document.\n\t *\n\t *\t@param (e obj) e is the event object associated with the event\n\t *\n\t *\t@return (boolean) false if consuming event, true if propagating\n\t */\n\t Datepicker.prototype.handleDocumentClick = function(e) {\n\t\tif ($(e.target).parents('#datepicker-calendar-' + this.id).length == 0) {\n\t\t\tthis.hide();\n\t\t\treturn true;\n\t\t} else {\n\t\t\t//ensure focus remains on the dialog\n\t\t\tthis.$grid.focus();\n\t\t\t// Consume all mouse events and do nothing\n\t\t\te.stopPropagation;\n\t\t\treturn false;\n\t\t}\n\t} // end handleDocumentClick()\n\n\t/**\n\t *\thide() is a member function to hide the Datepicker and remove focus.\n\t *\n\t *\t@return N/A\n\t */\n\t Datepicker.prototype.hide = function(omitSettingFocus) {\n\t\tif (this.options.inline == false) {\n\t\t\tvar self = this;\n\t\t\t// unbind the modal event sinks\n\t\t\tif (this.options.modal == true) {\n\t\t\t\t$(document).unbind('click mousedown mouseup');\n\t\t\t\tthis.greyOut(false);\n\t\t\t} else {\n\t\t\t\t$(document).unbind('click', self.handleDocumentClick);\n\t\t\t\tthis.$calendar.unbind('ab.datepicker.opening');\n\t\t\t}\n\t\t\t// hide the dialog\n\t\t\tthis.$calendar.removeClass('above below');\n\t\t\tthis.$calendar.attr('aria-hidden', 'true');\n\t\t\tthis.$calendar.fadeOut();\n\t\t\t$('.datepicker-calendar').trigger('ab.datepicker.closed', [self.id]);\n\t\t\t// set focus on the focus target\n\t\t\tif (!omitSettingFocus) {\n\t\t\t\tthis.$target.focus();\n\t\t\t}\n\t\t}\n\t} // end hide()\n\n\t/**\n\t *\tgreyOut() is a member function to grey out the document background.\n\t *\n\t *\t@return N/A\n\t */\n\tDatepicker.prototype.greyOut = function(on) {\n\t\tvar $overlay = $('#datepicker-overlay');\n\t\tif ($overlay.length == 0 && on) {\n\t\t\t$('body').append('<div id=\"datepicker-overlay\" class=\"datepicker-overlay\"></div>');\n\t\t\t$overlay = $('#datepicker-overlay');\n\n \t\t\t// compute z-index for overlay\n\t\t\tvar zmax = 0;\n\t\t\t$('*').each(function() {\n\t\t\t\tvar cur = parseInt($(this).css('z-index'), 10);\n\t\t\t\tif (! isNaN(cur)) zmax = Math.max(zmax, cur);\n\t\t\t});\n\t\t\t$overlay.attr('z-index', zmax + 10);\n\t\t}\n\t\tif (on) {\n\t\t\t$overlay.fadeIn(500);\n\t\t} else {\n\t\t\t$overlay.fadeOut(500);\n\t\t}\n\t} // end greyOut()\n\n\t/**\n\t *\tabsolutePosition() is a member function that compute the absolute position\n\t *\tof some element within document.\n\t *\n\t *\t@param (element obj) the element of the document\n\t *\t@return an object containing the properties top and left.\n\t */\n\tDatepicker.prototype.absolutePosition = function (element) {\n\t\tvar top = 0, left = 0;\n\t    if (element.getBoundingClientRect) {\n\t\t    var box = element.getBoundingClientRect();\n\t\t    var body = document.body;\n\t\t    var docElem = document.documentElement;\n\t\t    var scrollTop = win.pageYOffset || docElem.scrollTop || body.scrollTop;\n\t\t    var scrollLeft = win.pageXOffset || docElem.scrollLeft || body.scrollLeft;\n\t\t    var clientTop = docElem.clientTop || body.clientTop || 0;\n\t\t    var clientLeft = docElem.clientLeft || body.clientLeft || 0;\n\t\t    top  = Math.round(box.top +  scrollTop - clientTop);\n\t\t    left = Math.round(box.left + scrollLeft - clientLeft);\n\t    } else {\n\t\t\twhile(element) {\n\t\t\t\ttop = top + parseInt(element.offsetTop, 10);\n\t\t\t\tleft = left + parseInt(element.offsetLeft, 10);\n\t\t\t\telement = element.offsetParent;\n\t\t\t}\n\t    }\n\t\treturn {top: top, left: left};\n\t} // end absolutePosition()\n\n\t/**\n\t *\tgetDaysInMonth() is a member function to calculate the number of days in a given month\n\t *\n\t *\t@param (year int) the year\n\t *\t@param (month int) the given month\n\t *\n\t *\t@return (integer) number of days\n\t */\n\tDatepicker.prototype.getDaysInMonth = function(year, month) {\n\t\treturn 32 - new Date(year, month, 32).getDate();\n\t} // end getDaysInMonth()\n\n\t/**\n\t *\tpreviousMonth() is a member function that compute the month\n\t *\tpreceding a given month.\n\t *\n\t *\t@param (year int) the given year\n\t *\t@param (month int) the given month\n\t *\t@return an object containing the properties year and month.\n\t */\n\tDatepicker.prototype.previousMonth = function (year, month) {\n\t\tif (month == 0) {\n\t\t\tmonth = 11;\n\t\t\tyear--;\n\t\t} else {\n\t\t\tmonth--;\n\t\t}\n\t\treturn {year: year, month: month};\n\t} // end previousMonth()\n\n\t/**\n\t *\tnextMonth() is a member function that compute the month\n\t *\tfollowing a given month.\n\t *\n\t *\t@param (year int) the given year\n\t *\t@param (month int) the given month\n\t *\t@return an object containing the properties year and month.\n\t */\n\tDatepicker.prototype.nextMonth = function (year, month) {\n\t\tif (month == 11) {\n\t\t\tmonth = 0;\n\t\t\tyear++;\n\t\t} else {\n\t\t\tmonth++;\n\t\t}\n\t\treturn {year: year, month: month};\n\t} // end nextMonth()\n\n\t/**\n\t *\tformatDate (date_object, format)\n\t *\tThe format string uses the same abbreviations as in createDateFromFormat()\n\t *\n\t *\t@param (date date object) the given date\n\t *\t@param (format string) the given output format\n\t *\t@returns a date in the output format specified.\n\t */\n\tDatepicker.prototype.formatDate = function (date, format) {\n\t\tvar zeroPad = function (x) {\n\t\t\treturn(x < 0 || x > 9 ? \"\" : \"0\" ) + x;\n\t\t};\n\t\tvar getWeekOfMonth = function(date) {\n\t\t\treturn Math.ceil((date.getDate() - 1 - date.getDay()) / 7);\n\t\t};\n\t\tvar getWeekOfYear = function(date) {\n\t\t\tvar onejan = new Date(date.getFullYear(),0,1);\n\t\t\treturn Math.ceil((((date - onejan) / 86400000) + onejan.getDay()+1)/7);\n\t\t};\n\t\tvar getDayOfYear = function(date) {\n\t\t\tvar start = new Date(date.getFullYear(), 0, 0);\n\t\t\treturn Math.floor((date - start) / 86400000);\n\t\t};\n\t\tvar getMillisecondsInDay = function(date) {\n\t\t\tvar date1 = new Date(date.getTime());\n\t\t\tdate1.setHours( 0 );\n\t\t\treturn date - date1;\n\t\t};\n\t\tvar y = date.getFullYear() + \"\";\n\t\tvar M = date.getMonth() + 1;\n\t\tvar d = date.getDate();\n\t\tvar D = getDayOfYear(date);\n\t\tvar E = date.getDay();\n\t\tvar H = date.getHours();\n\t\tvar m = date.getMinutes();\n\t\tvar s = date.getSeconds();\n\t\tvar w = getWeekOfYear(date);\n\t\tvar W = getWeekOfMonth(date);\n\t\tvar F = Math.floor( date.getDate() / 7 ) + 1;\n\t\tvar Q = Math.ceil( ( date.getMonth() + 1 ) / 3 );\n\t\tvar era = date.getFullYear() < 1 ? 0 : 1;\n\t\tvar values = {\n\t\t\t\"y\": \"\" + y,\n\t\t\t\"yyyy\": y,\n\t\t\t\"yy\": y.substring(2,4),\n\t\t\t\"L\": M,\n\t\t\t\"LL\": zeroPad(M),\n\t\t\t\"LLL\": this.locales.month_names_abbreviated[M - 1],\n\t\t\t\"LLLL\": this.locales.month_names[M - 1],\n\t\t\t\"LLLLL\": this.locales.month_names_narrow[M - 1],\n\t\t\t\"M\": M,\n\t\t\t\"MM\": zeroPad(M),\n\t\t\t\"MMM\": this.locales.month_names_abbreviated[M - 1],\n\t\t\t\"MMMM\": this.locales.month_names[M - 1],\n\t\t\t\"MMMMM\": this.locales.month_names_narrow[M - 1],\n\t\t\t\"d\": d,\n\t\t\t\"dd\": zeroPad(d),\n\t\t\t\"D\": D,\n\t\t\t\"DD\": D,\n\t\t\t\"DDD\": D,\n\t\t\t\"A\": Math.round( getMillisecondsInDay(date) * Math.pow( 10, -2 ) ),\n\t\t\t\"AA\": Math.round( getMillisecondsInDay(date) * Math.pow( 10, -1 ) ),\n\t\t\t\"AAA\": Math.round( getMillisecondsInDay(date) * Math.pow( 10, 0 ) ),\n\t\t\t\"AAAA\": Math.round( getMillisecondsInDay(date) * Math.pow( 10, 1 ) ),\n\t\t\t\"AAAAA\": Math.round( getMillisecondsInDay(date) * Math.pow( 10, 2 ) ),\n\t\t\t\"AAAAAA\": Math.round( getMillisecondsInDay(date) * Math.pow( 10, 3 ) ),\n\t\t\t\"E\": this.locales.day_names_abbreviated[E],\n\t\t\t\"EE\": this.locales.day_names_abbreviated[E],\n\t\t\t\"EEE\": this.locales.day_names_abbreviated[E],\n\t\t\t\"EEEE\": this.locales.day_names[E],\n\t\t\t\"EEEEE\": this.locales.day_names_narrow[E],\n\t\t\t\"EEEEEE\": this.locales.day_names_short[E],\n\t\t\t\"e\": E,\n\t\t\t\"ee\": E,\n\t\t\t\"eee\": this.locales.day_names_abbreviated[E],\n\t\t\t\"eeee\": this.locales.day_names[E],\n\t\t\t\"eeeee\": this.locales.day_names_narrow[E],\n\t\t\t\"eeeeee\": this.locales.day_names_short[E],\n\t\t\t\"c\": E,\n\t\t\t\"cc\": E,\n\t\t\t\"ccc\": this.locales.day_names_abbreviated[E],\n\t\t\t\"cccc\": this.locales.day_names[E],\n\t\t\t\"ccccc\": this.locales.day_names_narrow[E],\n\t\t\t\"cccccc\": this.locales.day_names_short[E],\n\t\t\t\"F\": F,\n\t\t\t\"G\": this.locales.era_names_abbreviated[era],\n\t\t\t\"GG\": this.locales.era_names_abbreviated[era],\n\t\t\t\"GGG\": this.locales.era_names_abbreviated[era],\n\t\t\t\"GGGG\": this.locales.era_names[era],\n\t\t\t\"GGGGG\": this.locales.era_names_narrow[era],\n\t\t\t\"Q\": Q,\n\t\t\t\"QQ\": zeroPad(Q),\n\t\t\t\"QQQ\": this.locales.quarter_names_abbreviated[Q - 1],\n\t\t\t\"QQQQ\": this.locales.quarter_names[Q - 1],\n\t\t\t\"QQQQQ\": this.locales.quarter_names_narrow[Q - 1],\n\t\t\t\"q\": Q,\n\t\t\t\"qq\": zeroPad(Q),\n\t\t\t\"qqq\": this.locales.quarter_names_abbreviated[Q - 1],\n\t\t\t\"qqqq\": this.locales.quarter_names[Q - 1],\n\t\t\t\"qqqqq\": this.locales.quarter_names_narrow[Q - 1],\n\t\t\t\"H\": H,\n\t\t\t\"HH\": zeroPad(H),\n\t\t\t\"h\": H == 0 ? 12 : H > 12 ? H - 12 : H,\n\t\t\t\"hh\": zeroPad(H == 0 ? 12 : H > 12 ? H - 12 : H),\n\t\t\t\"K\": H > 11 ? H - 12 : H,\n\t\t\t\"k\": H + 1,\n\t\t\t\"KK\": zeroPad(H > 11 ? H - 12 : H),\n\t\t\t\"kk\": zeroPad(H + 1),\n\t\t\t\"a\": H > 11 ? this.locales.day_periods.pm : this.locales.day_periods.am,\n\t\t\t\"m\": m,\n\t\t\t\"mm\": zeroPad(m),\n\t\t\t\"s\": s,\n\t\t\t\"ss\": zeroPad(s),\n\t\t\t\"w\": w,\n\t\t\t\"ww\": zeroPad(w),\n\t\t\t\"W\": W,\n\t\t};\n\t\treturn format.replace(\n\t\t\t/('[^']+'|y{1,4}|L{1,5}|M{1,5}|c{1,6}|d{1,2}|D{1,3}|E{1,6}|e{1,6}|F{1,1}|G{1,5}|Q{1,5}|q{1,5}|H{1,2}|h{1,2}|K{1,2}|k{1,2}|m{1,2}|s{1,2}|w{1,2}|W{1,1}|A{1,6})/g,\n\t\t\tfunction (mask) {\n\t\t\t\treturn mask.charAt(0) === \"'\" ? mask.substr(1, mask.length - 2) : values[mask] || mask;\n\t\t\t}\n\t\t);\n\t} // end formatDate()\n\n\t/**\n\t *\tcreateDateFromFormat( format_string, date_string )\n\t *\n\t *\tThis function takes a date string and a format string. It matches\n\t *\tIf the date string matches the format string, it returns the\n\t *\tthe date object. If it does not match, it returns null.\n\t */\n\tDatepicker.prototype.createDateFromFormat = function(format, value) {\n\t\tvar extractInteger = function(str, pos, minlength, maxlength) {\n\t\t\tfor (var x = maxlength; x >= minlength; x--) {\n\t\t\t\tvar integer = str.substring(pos, pos + x);\n\t\t\t\tif (integer.length < minlength) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (/^\\d+$/.test(integer)) {\n\t\t\t\t\treturn integer;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t\tvar skipName = function(names, pos) {\n\t\t\tfor (var i = 0; i < names.length; i++) {\n\t\t\t\tvar name = names[i];\n\t\t\t\tif (value.substring(pos, pos + name.length).toLowerCase() == name.toLowerCase()) {\n\t\t\t\t\treturn name.length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\t\tvar pos = 0;\n\t\tvar now = new Date();\n\t\tvar year = now.getYear();\n\t\tvar month = now.getMonth() + 1;\n\t\tvar date = 1;\n\t\tvar hh = 0;\n\t\tvar mm = 0;\n\t\tvar ss = 0;\n\t\tvar ampm = \"\";\n\t\tvar self = this;\n\n\t\t$.each(format.match(/(.).*?\\1*/g), function(k, token) {\n\t\t\t// Extract contents of value based on format token\n\t\t\tswitch (token) {\n\t\t\t\tcase 'yyyy':\n\t\t\t\t\tyear = extractInteger(value, pos, 4, 4);\n\t\t\t\t\tif (year != null) {\n\t\t\t\t\t\tpos += year.length;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'yy':\n\t\t\t\t\tyear = extractInteger(value, pos, 2, 2);\n\t\t\t\t\tif (year != null) {\n\t\t\t\t\t\tpos += year.length;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'y':\n\t\t\t\t\tyear = extractInteger(value, pos, 2, 4);\n\t\t\t\t\tif (year != null) {\n\t\t\t\t\t\tpos += year.length;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'MMM':\n\t\t\t\tcase 'LLL':\n\t\t\t\t\tmonth = 0;\n\t\t\t\t\tfor (var i = 0; i < self.locales.month_names_abbreviated.length; i++) {\n\t\t\t\t\t\tvar month_name = self.locales.month_names_abbreviated[i];\n\t\t\t\t\t\tif (value.substring(pos, pos + month_name.length).toLowerCase() == month_name.toLowerCase()) {\n\t\t\t\t\t\t\tmonth = i + 1;\n\t\t\t\t\t\t\tpos += month_name.length;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'MMMM':\n\t\t\t\tcase 'LLLL':\n\t\t\t\t\tmonth = 0;\n\t\t\t\t\tfor (var i = 0; i < self.locales.month_names.length; i++) {\n\t\t\t\t\t\tvar month_name = self.locales.month_names[i];\n\t\t\t\t\t\tif (value.substring(pos, pos + month_name.length).toLowerCase() == month_name.toLowerCase()) {\n\t\t\t\t\t\t\tmonth = i + 1;\n\t\t\t\t\t\t\tpos += month_name.length;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'EEE':\n\t\t\t\tcase 'EE':\n\t\t\t\tcase 'E':\n\t\t\t\tcase 'eee':\n\t\t\t\t\tpos += skipName(self.locales.day_names_abbreviated, pos);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'EEEE':\n\t\t\t\tcase 'eeee':\n\t\t\t\tcase 'cccc':\n\t\t\t\t\tpos += skipName(self.locales.day_names, pos);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'EEEEEE':\n\t\t\t\tcase 'eeeeee':\n\t\t\t\tcase 'cccccc':\n\t\t\t\t\tpos += skipName(self.locales.day_names_short, pos);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'MM':\n\t\t\t\tcase 'M':\n\t\t\t\tcase 'LL':\n\t\t\t\tcase 'L':\n\t\t\t\t\tmonth = extractInteger(value, pos, token.length, 2);\n\t\t\t\t\tif (month == null || (month < 1) || (month > 12)){\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tpos += month.length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'dd':\n\t\t\t\tcase 'd':\n\t\t\t\t\tdate = extractInteger(value, pos, token.length, 2);\n\t\t\t\t\tif (date == null || (date < 1) || (date > 31)){\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tpos += date.length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'hh':\n\t\t\t\tcase 'h':\n\t\t\t\t\thh = extractInteger(value, pos, token.length, 2);\n\t\t\t\t\tif (hh == null || (hh < 1) || (hh > 12)){\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tpos += hh.length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'HH':\n\t\t\t\tcase 'H':\n\t\t\t\t\thh = extractInteger(value, pos, token.length, 2);\n\t\t\t\t\tif (hh == null || (hh < 0) || (hh > 23)){\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tpos += hh.length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'KK':\n\t\t\t\tcase 'K':\n\t\t\t\t\thh = extractInteger(value, pos, token.length, 2);\n\t\t\t\t\tif (hh == null || (hh < 0) || (hh > 11)){\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tpos += hh.length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'kk':\n\t\t\t\tcase 'k':\n\t\t\t\t\thh = extractInteger(value, pos, token.length, 2);\n\t\t\t\t\tif (hh == null || (hh < 1) || (hh > 24)){\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tpos += hh.length;\n\t\t\t\t\thh--;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'mm':\n\t\t\t\tcase 'm':\n\t\t\t\t\tmm = extractInteger(value,pos,token.length,2);\n\t\t\t\t\tif (mm == null || (mm < 0) || (mm > 59)){\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tpos += mm.length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ss':\n\t\t\t\tcase 's':\n\t\t\t\t\tss = extractInteger(value, pos, token.length, 2);\n\t\t\t\t\tif (ss == null || (ss < 0) || (ss > 59)){\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tpos += ss.length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'a':\n\t\t\t\t\tvar amlength = self.locales.day_periods.am.length;\n\t\t\t\t\tvar pmlength = self.locales.day_periods.pm.length;\n\t\t\t\t\tif (value.substring(pos, pos + amlength) == self.locales.day_periods.am) {\n\t\t\t\t\t\tampm = \"AM\";\n\t\t\t\t\t\tpos += amlength;\n\t\t\t\t\t} else if (value.substring(pos, pos + pmlength) == self.locales.day_periods.pm) {\n\t\t\t\t\t\tampm = \"PM\";\n\t\t\t\t\t\tpos += pmlength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tif (value.substring(pos, pos + token.length) != token) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpos += token.length;\n\t\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// If there are any trailing characters left in the value, it doesn't match\n\t\tif (pos != value.length) {\n\t\t\treturn null;\n\t\t}\n\t\tif (year == null) {\n\t\t\treturn null;\n\t\t}\n\t\tif (year.length == 2) {\n\t\t\tif (year > 50) {\n\t\t\t\tyear = 1900 + (year - 0);\n\t\t\t} else {\n\t\t\t\tyear = 2000 + (year - 0);\n\t\t\t}\n\t\t}\n\t\t// Is date valid for month?\n\t\tif ((month < 1) || (month > 12)) {\n\t\t\treturn null;\n\t\t}\n\t\tif (month == 2) {\n\t\t\t// Check for leap year\n\t\t\tif ( ( (year % 4 == 0) && (year % 100 != 0) ) || (year % 400 == 0) ) { // leap year\n\t\t\t\tif (date > 29) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (date > 28) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ((month == 4) || (month == 6) || (month == 9) || (month==11)) {\n\t\t\tif (date > 30) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t// Correct hours value\n\t\tif (hh < 12 && ampm == \"PM\") {\n\t\t\thh = hh - 0 + 12;\n\t\t} else if (hh > 11 && ampm == \"AM\") {\n\t\t\thh -= 12;\n\t\t}\n\t\treturn new Date(year, month - 1, date, hh, mm, ss);\n\t} // end createDateFromFormat()\n\n\t/**\n\t *\tparseDate() is a member function which parse a date string.\n\t *\n\t *\tThis function takes a date string and try to parse it with the input formats.\n\t *\tIf the date string matches one of the format string, it returns the\n\t *\tthe date object. Otherwise, it returns null.\n\t *\n\t *\t@param (value string) the date string\n\t *\t@return a date objet or null\n\t */\n\tDatepicker.prototype.parseDate = function(value) {\n\t\tvar date = null;\n\t\tvar self = this;\n\t\t$.each(this.options.inputFormat, function (i, format) {\n\t\t\tdate = self.createDateFromFormat(format, value);\n\t\t\tif (date != null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif (date == null) { // last try with the output format\n\t\t\tdate = self.createDateFromFormat(this.options.outputFormat, value);\n\t\t}\n\t\treturn date;\n\t} // end parseDate()\n\n\t/**\n\t *\tmin() is a public member function which allow change the smallest selectable date.\n\t *\n\t *\t@param (value string) the new date\n\t *\t@return the smallest selectable date\n\t */\n\tDatepicker.prototype.min = function(value) {\n\t\tif (value != null) {\n\t\t\tthis.options.min = value instanceof Date ? value : this.parseDate(value);\n\t\t\tif (this.options.min != null && this.dateObj < this.options.min) {\n\t\t\t\tthis.$target.attr('aria-invalid', true);\n\t\t\t\tthis.$target.parents('.form-group').addClass('has-error');\n\t\t\t\tthis.dateObj = this.options.min;\n\t\t\t}\n\t\t\tif (this.options.inline != false) {\n\t\t\t\tthis.refresh();\n\t\t\t}\n\t\t}\n\t\treturn this.options.min;\n\t} // end min()\n\n\t/**\n\t *\tmax() is a public member function which allow change the biggest selectable date.\n\t *\n\t *\t@param (value string) the new date\n\t *\t@return the biggest selectable date\n\t */\n\tDatepicker.prototype.max = function(value) {\n\t\tif (value != null) {\n\t\t\tthis.options.max = value instanceof Date ? value : this.parseDate(value);\n\t\t\tif (this.options.max != null && this.dateObj > this.options.max) {\n\t\t\t\tthis.$target.attr('aria-invalid', true);\n\t\t\t\tthis.$target.parents('.form-group').addClass('has-error');\n\t\t\t\tthis.dateObj = this.options.max;\n\t\t\t}\n\t\t\tif (this.options.inline != false) {\n\t\t\t\tthis.refresh();\n\t\t\t}\n\t\t}\n\t\treturn this.options.max;\n\t} // end max()\n\n\t/**\n\t *\ttheme() is a public member function which allow change the datepicker theme.\n\t *\n\t *\t@param (value string) the new theme\n\t *\t@return the datepicker theme\n\t */\n\tDatepicker.prototype.theme = function(value) {\n\t\tif (value != null) {\n\t\t\tthis.$button.removeClass(this.options.theme);\n\t\t\tthis.$calendar.removeClass(this.options.theme);\n\t\t\tthis.options.theme = value;\n\t\t\tthis.$button.addClass(this.options.theme);\n\t\t\tthis.$calendar.addClass(this.options.theme);\n\t\t}\n\t\treturn this.options.theme;\n\t} // end theme()\n\n\t/**\n\t *\tfirstDayOfWeek() is a public member function which allow change the first Day Of Week.\n\t *\n\t *\t@param (value integer) the new first Day Of Week\n\t *\t@return the first Day Of Week\n\t */\n\tDatepicker.prototype.firstDayOfWeek = function(value) {\n\t\tif (value != null) {\n\t\t\tthis.options.firstDayOfWeek = parseInt(value, 10);\n\t\t\tif (this.options.inline == false) {\n\t\t\t\tthis.drawCalendarHeader();\n\t\t\t} else {\n\t\t\t\tthis.refresh();\n\t\t\t}\n\t\t}\n\t\treturn this.options.firstDayOfWeek;\n\t} // end firstDayOfWeek()\n\n\t/**\n\t *\tdaysOfWeekDisabled() is a public member function which allow disabling of some weekdays.\n\t *\n\t *\t@param (value string) the new disabled week days\n\t *\t@return the disabled week days\n\t */\n\tDatepicker.prototype.daysOfWeekDisabled = function(value) {\n\t\tif (value != null) {\n\t\t\tthis.options.daysOfWeekDisabled = [];\n\t\t\tif (! $.isArray(value)) {\n\t\t\t\tvalue = [value];\n\t\t\t}\n\t\t\tvar self = this;\n\t\t\t$.each(value, function(i, val) {\n\t\t\t\tif (typeof val === 'number') {\n\t\t\t\t\tself.options.daysOfWeekDisabled.push(val);\n\t\t\t\t} else if (typeof val === 'string') {\n\t\t\t\t\tself.options.daysOfWeekDisabled.push(parseInt(val, 10));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this.options.daysOfWeekDisabled;\n\t} // end daysOfWeekDisabled()\n\n\t/**\n\t *\tweekDayFormat() is a public member function which allow change the format of weekdays name.\n\t *\n\t *\t@param (value string) the new format. Allowed : 'short' or 'narrow'\n\t *\t@return the format of weekdays name\n\t */\n\tDatepicker.prototype.weekDayFormat = function(value) {\n\t\tif (value != null) {\n\t\t\tthis.options.weekDayFormat = value;\n\t\t\tthis.drawCalendarHeader();\n\t\t}\n\t\treturn this.options.weekDayFormat;\n\t} // end weekDayFormat()\n\n\t/**\n\t *\tinputFormat() is a public member function which allow change the input format.\n\t *\n\t *\t@param (value string) the new format\n\t *\t@return the input format\n\t */\n\tDatepicker.prototype.inputFormat = function(value) {\n\t\tif (value != null) {\n\t\t\tif (! $.isArray(value)) {\n\t\t\t\tvalue = [value];\n\t\t\t}\n\t\t\tif (this.$target.attr('placeholder') == this.options.inputFormat[0]) {\n\t\t\t\tthis.$target.attr('placeholder', value[0]);\n\t\t\t}\n\t\t\tthis.options.inputFormat = value;\n\t\t}\n\t\treturn this.options.inputFormat;\n\t} // end inputFormat()\n\n\t/**\n\t *\toutputFormat() is a public member function which allow change the output format.\n\t *\n\t *\t@param (value string) the new format\n\t *\t@return the output format\n\t */\n\tDatepicker.prototype.outputFormat = function(value) {\n\t\tif (value != null) {\n\t\t\tthis.options.outputFormat = value;\n\t\t}\n\t\treturn this.options.outputFormat;\n\t} // end outputFormat()\n\n\t/**\n\t *\tmodal() is a public member function which allow to set or unset the modal mode.\n\t *\n\t *\t@param (value boolean) the new modal mode\n\t *\t@return the modal mode\n\t */\n\tDatepicker.prototype.modal = function(value) {\n\t\tif (value != null) {\n\t\t\tthis.options.modal = value;\n\t\t\tif (this.options.modal == true) {\n\t\t\t\tif (this.options.inline == false) {\n\t\t\t\t\tthis.showObject(this.$calendar.find('.datepicker-close-wrap'));\n\t\t\t\t\tthis.showObject(this.$calendar.find('.datepicker-bn-close-label'));\n\t\t\t\t}\n\t\t\t\tthis.$close = this.$calendar.find('.datepicker-close');\n\t\t\t\tthis.$close.html(this.options.closeButtonTitle).attr('title', this.options.closeButtonLabel);\n\t\t\t\tthis.$calendar.find('.datepicker-bn-close-label').html(this.options.closeButtonLabel);\n\t\t\t\tvar self = this;\n\t\t\t\tthis.$close.click(function(e) {\n\t\t\t\t\treturn self.handleCloseClick(e);\n\t\t\t\t});\n\t\t\t\tthis.$close.keydown(function(e) {\n\t\t\t\t\treturn self.handleCloseKeyDown(e);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.hideObject(this.$calendar.find('.datepicker-close-wrap'));\n\t\t\t\tthis.hideObject(this.$calendar.find('.datepicker-bn-close-label'));\n\t\t\t}\n\t\t}\n\t\treturn this.options.modal;\n\t} // end modal()\n\n\t/**\n\t *\tinline() is a public member function which allow to set or unset the inline mode.\n\t *\n\t *\t@param (value string or false) the id or jquery object of the datepicker container, false otherwise (not inline)\n\t *\t@return the given value\n\t */\n\tDatepicker.prototype.inline = function(value) {\n\t\tif (value != null) {\n\t\t\tif (value != false) {\n\t\t\t\tthis.hideObject(this.$button);\n\t\t\t\tthis.hideObject(this.$calendar.find('.datepicker-close-wrap'));\n\t\t\t\tthis.hideObject(this.$calendar.find('.datepicker-bn-close-label'));\n\t\t\t\tvar $container = typeof value === 'string' ? $('#' + value) : value;\n\t\t\t\t$container.append(this.$calendar);\n\t\t\t\tthis.$calendar.css({position: 'relative', left: '0px', top: '0px'});\n\t\t\t\tthis.options.inline = value;\n\t\t\t\tthis.initializeDate();\n\t\t\t\tthis.showObject(this.$calendar);\n\t\t\t} else {\n\t\t\t\tthis.$target.parent().after(this.$calendar);\n\t\t\t\tthis.showObject(this.$button);\n\t\t\t\tif (this.options.modal == true) {\n\t\t\t\t\tthis.showObject(this.$calendar.find('.datepicker-close-wrap'));\n\t\t\t\t\tthis.showObject(this.$calendar.find('.datepicker-bn-close-label'));\n\t\t\t\t}\n\t\t\t\tif (this.$calendar.parent().css('position') === 'static') {\n\t\t\t\t\tthis.$calendar.parent().css('position', 'relative');\n\t\t\t\t}\n\t\t\t\tthis.$calendar.css({position: 'absolute'});\n\t\t\t\tthis.options.inline = value;\n\t\t\t\tthis.hide();\n\t\t\t}\n\t\t}\n\t\treturn this.options.inline;\n\t} // end inline()\n\n\n\t/**\n\t *\tformat() is a public member function to format a date according the output format.\n\t *\n\t *\t@param (value date object) the date\n\t *\t@return formatted date string\n\t */\n\tDatepicker.prototype.format = function(date) {\n\t\treturn this.formatDate(date, this.options.outputFormat);\n\t} // end format()\n\n\t/**\n\t *\tsetLocales() is a public member function which allow change the locales.\n\t *\n\t *\t@param (value obj) the new locales\n\t *\t@return N/A\n\t */\n\tDatepicker.prototype.setLocales = function(value) {\n\t\tthis.locales = value;\n\t\tthis.options.inputFormat = [this.locales.short_format];\n\t\tthis.options.outputFormat = this.locales.short_format;\n\t\tthis.options.titleFormat = this.locales.full_format,\n\t\tthis.options.firstDayOfWeek = this.locales.firstday_of_week;\n\t\tthis.options.buttonTitle = this.locales.texts.buttonTitle;\n\t\tthis.$button.find('span').attr('title', this.options.buttonTitle);\n\t\tthis.options.buttonLabel = this.locales.texts.buttonLabel;\n\t\tthis.options.prevButtonLabel = this.locales.texts.prevButtonLabel;\n\t\tthis.options.prevMonthButtonLabel = this.locales.texts.prevMonthButtonLabel;\n\t\tthis.options.prevYearButtonLabel = this.locales.texts.prevYearButtonLabel;\n\t\tthis.options.nextButtonLabel = this.locales.texts.nextButtonLabel;\n\t\tthis.options.nextMonthButtonLabel = this.locales.texts.nextMonthButtonLabel;\n\t\tthis.options.nextYearButtonLabel = this.locales.texts.nextYearButtonLabel;\n\t\tthis.options.changeMonthButtonLabel = this.locales.texts.changeMonthButtonLabel;\n\t\tthis.options.changeYearButtonLabel = this.locales.texts.changeYearButtonLabel;\n\t\tthis.options.changeRangeButtonLabel = this.locales.texts.changeRangeButtonLabel;\n\t\tthis.options.closeButtonTitle = this.locales.texts.closeButtonTitle;\n\t\tthis.options.closeButtonLabel = this.locales.texts.closeButtonLabel;\n\t\tthis.options.calendarHelp = this.locales.texts.calendarHelp;\n\t\tthis.drawCalendarHeader();\n\t\tif (this.locales.directionality === 'RTL') {\n\t\t\tthis.$grid.addClass('rtl');\n\t\t} else {\n\t\t\tthis.$grid.removeClass('rtl');\n\t\t}\n\t} // end outputFormat()\n\n\t// DATEPICKER PLUGIN DEFINITION\n\t// ==========================\n\n\tvar old = $.fn.datepicker\n\n\t$.fn.datepicker = function (option, value) {\n\t\tif (typeof option == 'string' && $(this).length == 1) {\n\t\t\tvar data = $(this).eq(0).data('ab.datepicker');\n\t\t\tif (data) return data[option](value);\n\t\t} else {\n\t\t\treturn this.each(function () {\n\t\t\t\tvar $this   = $(this);\n\t\t\t\tvar data    = $this.data('ab.datepicker');\n\t\t\t\tvar options = $.extend({}, Datepicker.DEFAULTS, $this.data(), typeof option == 'object' && option);\n\t\t\t\tif (!data) $this.data('ab.datepicker', (data = new Datepicker(this, options)));\n\t\t\t\tif (typeof option == 'string') data[option](value);\n\t\t\t});\n\t\t}\n\t}\n\n\t$.fn.datepicker.Constructor = Datepicker\n\n\t// DATEPICKER NO CONFLICT\n\t// ====================\n\n\t$.fn.datepicker.noConflict = function () {\n\t\t$.fn.datepicker = old\n\t\treturn this\n\t}\n})(window, jQuery);\n","// Debounce is meant to be used with event listeners. Use it to delay a call\n// until after a burst of events, such as keyboard input.\n//\n//   usage:\n//\n//     const callback = (ev: Event) => {}\n//     document.addEventListener(\"keyup\", debounce(callback, 250))\n//\n\nconst debounce = (callback: Function, delay: number): EventListener => {\n  let timer: number | undefined;\n\n  return (...args) => {\n    window.clearTimeout(timer);\n    timer = window.setTimeout(() => callback(...args), delay);\n  };\n};\n\nexport default debounce;\n","export function getFeatureIcon(feature) {\n  const icon = document.getElementById(`icon-feature-${feature}`);\n  if (icon) {\n    return icon.innerHTML;\n  }\n  return \"\";\n}\n\nexport function getSvgIcon(feature) {\n  const icon = document.getElementById(`icon-feature-${feature}`);\n  if (icon) {\n    const svg = icon.getElementsByTagName(\"svg\").item(0);\n    if (svg) {\n      return svg.outerHTML;\n    }\n  }\n  return \"\";\n}\n"],"sourceRoot":""}