{"version":3,"sources":["util/util.js","components/shared/LoadingScreen.js","registerServiceWorker.js","util/OfflineFunctinality.js","App.js","index.js","util/TripPlannerUtil.js","util/FavoritesUtil.js","store/ReduxReducer.js"],"names":["getQueryStringParameterByName","name","queryString","decodeURI","window","location","search","substr","replace","o_reg","RegExp","matches","match","length","splitFirstKey","split","shift","indexIsObject","i","isNaN","substring","push","parent","j","kvp","value","splitKey","objToCheck","k","subKey","undefined","results","exec","decodeURIComponent","getUrlParameter","sortNaturalAlphaNumeric","a","b","field","ax","bx","toLowerCase","Math","max","t","as","bs","an","parseInt","bn","toString","getDistanceBetweenLatLngPoints","lat1","lng1","lat2","lng2","deltaLat","degreeToRadian","deltaLng","sin","cos","atan2","sqrt","isAlongSegment","lineLat1","lineLng1","lineLat2","lineLng2","pointLat","pointLng","maxDeviation","startToEndBearing","getBearing","startToVehDist","startToVehBearing","abs","distFromStartToProjection","distFromEndToProjection","y","x","PI","angle","mergePatternPredictions","predictionsByPattern","predictedPatternTemplate","route_dir_dic","forEach","predicPtrn","patternId","dicK","routeCode","directId","predictions","concat","patternGroups","sort","predictTime","localeCompare","applyTemplate","template","obj","routeName","RouteName","patternName","PatternName","RouteCode","patternCode","PatternCode","directName","DirectionName","stopName","StopName","stopCode","StopCode","headSign","HeadSign","PatternID","dateFromISO","s","day","p","L","Date","getDate","NaN","convertToISODateWithoutTime","date","isValidDateObject","toISOString","getToday","Object","prototype","call","isValidTripDate","tripDate","today","addDaysToDate","days","result","setDate","__webpack_require__","d","__webpack_exports__","LoadingScreen","react_default","createElement","width","height","xmlns","viewBox","preserveAspectRatio","style","position","top","left","transform","fill","stroke","strokeWidth","strokeDasharray","attributeName","calcMode","values","keyTimes","dur","begin","repeatCount","isLocalhost","Boolean","hostname","registerValidSW","swUrl","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","console","log","catch","error","alertDiv","App","isMobile","outerWidth","_this2","this","onresize","setState","props","systemSettings","pathName","pathname","serviceDown","ServiceDown","React","lazy","e","bind","PredictionSign","Promise","all","MobilePredictionPortal","DesktopPredictionPortal","Component","connect","updateOnlineStatus","event","onLine","elementExists","document","getElementById","getElementsByTagName","removeChild","isSafari","userAgent","indexOf","id","cssText","innerText","appendChild","message","addEventListener","stop","preventDefault","axios","interceptors","request","use","config","reject","response","data","errorMessage","host","Sentry","ignoreErrors","dsn","title","Array","find","defineProperty","predicate","TypeError","o","len","thisArg","arguments","kValue","configurable","writable","String","includes","start","Number","rootElement","ReactDOM","render","es","store","react","fallback","src_App","URL","process","origin","fetch","status","headers","get","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker","getTripPlanStops","getTripPlan","ISOToDateAndTimeInfo","axios__WEBPACK_IMPORTED_MODULE_0__","axios__WEBPACK_IMPORTED_MODULE_0___default","n","polyline__WEBPACK_IMPORTED_MODULE_1__","_sentry_browser__WEBPACK_IMPORTED_MODULE_2__","includeLocationInfo","addressStr","searchLocation","test","lowerAddr","locationPart","tripPlan","steps","stopPointArr","travelMode","transit","departure_stop","lat","lng","arrival_stop","filter","item","pos","resolve","params","stopPoints","fromAddr","toAddr","tripType","hours","minutes","ampm","routeList","localServerTimeDiff","destination","mode","timestamp","splitDate","tripTime","getTime","baseTime","round","getGoogleTimeStamp","departure_time","arrival_time","transformResponse","defaults","Error","parser","TripPlanDataParser","getSteps","summary","getSummary","ISODateTime","splitISO","dateStr","splitTime","time","hour","minute","tripdata","colorWheel","nextColor","lastIndex","route0","routes","leg0","legs","arrivalText","arrival","departureText","departure","sumBounds","bounds","text","getTimeFromDate","duration","distanceText","distance","durationText","startAddress","start_address","endAddress","end_address","startLoc","start_location","endLoc","end_location","getHours","getMinutes","colorI","that","map","route","transit_details","line","short_name","travel_mode","htmlInstruction","html_instructions","decode","polyline","points","stepColor","getFavoritePatterns","storedFavorites","localStorage","getItem","deserialize","favoriteCookie","getCookie","f","getFavoriteRoutes","getFavoriteStops","getFavoriteStopsOnRoutes","splitCookie","routeNumber","stopNumber","getFavoriteStopsOnPatterns","patternNumber","c_name","ARRcookies","cookie","unescape","serialize","object","JSON","stringify","encodedJSON","json","parse","LoadRoutes","InitialState","selectedRoutes","selectedPatterns","selectedStop","selectedAddress","shownStops","tripPlanFrom","tripPlanTo","tripPlanStops","sidebarShown","globalBroadcasts","routeBroadcasts","stopBroadcasts","broadCast","helpDlgShown","termCondsDlgShown","hasMessage","alertsDlgShown","favoriteRoutes","favoritePatterns","favoriteStops","favoriteStopsOnRoutes","favoriteStopsOnPatterns","walkingPath","alertSavedDlgShown","addressResult","stopResult","filteredRoutes","hasUnreadGlobalBroadcasts","showAllRoutes","infoMessage","searchType","currentPosition","showMyLocation","clearForm","routesLoaded","allPatterns","isAddressSearchCompleted","userPosition","lastPredictedTime","createStore","action","newState","assign","type","slice","foundRoute","patternID","routeID","splice","some","r","stopArr","setItem","addFavoriteStop","stopIndex","removeFavoriteStop","routeArr","addFavoriteRoute","routeIndex","removeFavoriteRoute","patternArr","addFavoritePattern","patternIndex","removeFavoritePattern","sr","stopOnRouteArr","removeFavoriteStopOnRoute","addFavoriteStopOnRoute","stopOnPatternArr","removeFavoriteStopOnPattern","addFavoriteStopOnPattern","stops","alertSubscription","alertDayChoice","settings","preselectedRoutePatternCode","preselectedRoutePattern","showRouteSelection","routeNumsDic","patternIDs","color","label","sidebarPatternTemplate","pattern","directionID","directionName","dispatch","shouldZoom","settingsResponse","currentServerTime","googleAnalyticsTrackingCode","setTimeout","m","q","l","async","src","parentNode","insertBefore","ga","hasTermConditions","err","tripStart","tripEnd","departureTime","arrivalTime","parsedDateTime","isoRegex","alert","setInterval","loadBroadcasts","routeNum","stopNum"],"mappings":"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","file":"static/js/main.8b62e421.chunk.js","sourcesContent":["\r\n/* Retrieves a parameter from the query string\r\n */\r\nexport function getQueryStringParameterByName(name, queryString) {\r\n if (!queryString) queryString = decodeURI(window.location.search);\r\n if (!queryString) return '';\r\n if (queryString.substr(0, 1) !== '?') queryString = '?' + queryString;\r\n name = name.replace(/[[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\r\n var pattern = '[\\\\?&]' + name + '(\\\\[([^\\\\]]+)\\\\])+=[^&#]*';\r\n var o_reg = new RegExp(pattern, 'g');\r\n var matches = queryString.match(o_reg);\r\n\r\n if (matches && matches.length > 0) {\r\n var firstMatchArr = matches[0].split('=');\r\n var splitFirstKey = firstMatchArr[0].split('[');\r\n splitFirstKey.shift();\r\n var indexIsObject = [];\r\n for (var i = 0; i < splitFirstKey.length; i++) {\r\n if (isNaN(splitFirstKey[i].substring(0, splitFirstKey[i].length - 1))) indexIsObject.push(true); //Index is for an object if key is not a number\r\n else indexIsObject.push(false); //Otherwise index is for an array\r\n }\r\n var parent = indexIsObject[0] ? {} : [];\r\n for (var j = 0; j < matches.length; j++) {\r\n var kvp = matches[j].split('=');\r\n var value = kvp[1];\r\n var splitKey = kvp[0].split('[');\r\n splitKey.shift();\r\n var objToCheck = parent;\r\n for (var k = 0; k < splitKey.length; k++) {\r\n var subKey = splitKey[k].substring(0, splitKey[k].length - 1);\r\n if (k === splitKey.length - 1) {\r\n objToCheck[subKey] = value;\r\n }\r\n else {\r\n if (objToCheck[subKey] === undefined) {\r\n if (indexIsObject[k + 1]) objToCheck[subKey] = {};\r\n else objToCheck[subKey] = [];\r\n }\r\n }\r\n objToCheck = objToCheck[subKey];\r\n }\r\n }\r\n return parent;\r\n }\r\n\r\n var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\r\n results = regex.exec(queryString);\r\n return results == null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\r\n}\r\n\r\nexport function getUrlParameter(name) {\r\n name = name.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\r\n var regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)');\r\n var results = regex.exec(window.location.search); \r\n return results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));\r\n}\r\n\r\nexport function sortNaturalAlphaNumeric(a, b, field) {\r\n a = a || ''; b = b || '';\r\n var ax = (field ? a[field] : a);\r\n var bx = (field ? b[field] : b);\r\n ax = ax ? ax.toLowerCase() : '';\r\n bx = bx ? bx.toLowerCase() : '';\r\n //Make case-insensitive\r\n var t = 1;\r\n var f = t * -1;\r\n\r\n for (var i = 0; i < Math.max(ax.length, bx.length); i++) {\r\n if (ax[i] === undefined) return f;\r\n else if (bx[i] === undefined) return t;\r\n else {\r\n var as = ax.substr(i), bs = bx.substr(i);\r\n var an = parseInt(as), bn = parseInt(bs);\r\n if (!isNaN(an) && !isNaN(bn)) {\r\n if (an === bn) {\r\n i = i + an.toString().length - 1;\r\n continue;\r\n }\r\n return an > bn ? t : f;\r\n } else {\r\n if (ax[i] === bx[i])\r\n continue;\r\n return ax[i] > bx[i] ? t : f;\r\n }\r\n }\r\n }\r\n return 0;\r\n}\r\n\r\nexport function getDistanceBetweenLatLngPoints(lat1, lng1, lat2, lng2) {\r\n var radiusOfEarth = 6371100;\r\n var deltaLat = degreeToRadian(lat2 - lat1);\r\n var deltaLng = degreeToRadian(lng2 - lng1);\r\n var a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.cos(degreeToRadian(lat1)) * Math.cos(degreeToRadian(lat2)) * Math.sin(deltaLng / 2) * Math.sin(deltaLng / 2);\r\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n return c * radiusOfEarth;\r\n}\r\n\r\nexport function isAlongSegment(lineLat1, lineLng1, lineLat2, lineLng2, pointLat, pointLng, maxDeviation) {\r\n var startToEndBearing = getBearing(lineLat1, lineLng1, lineLat2, lineLng2);\r\n var startToVehDist = getDistanceBetweenLatLngPoints(lineLat1, lineLng1, pointLat, pointLng);\r\n var startToVehBearing = getBearing(lineLat1, lineLng1, pointLat, pointLng);\r\n\r\n var altitude = Math.abs(startToVehDist * Math.sin(degreeToRadian(Math.abs(startToEndBearing - startToVehBearing))));\r\n if (altitude > maxDeviation) {\r\n return false;\r\n }\r\n else {\r\n var distFromStartToProjection = Math.abs(startToVehDist * Math.sin(degreeToRadian(90 - Math.abs(startToEndBearing - startToVehBearing))));\r\n var distFromEndToProjection = Math.abs(getDistanceBetweenLatLngPoints(lineLat2, lineLng2, pointLat, pointLng) * Math.sin(degreeToRadian(90 - Math.abs(getBearing(lineLat2, lineLng2, lineLat1, lineLng1) - getBearing(lineLat2, lineLng2, pointLat, pointLng)))));\r\n\r\n if ((getDistanceBetweenLatLngPoints(lineLat1, lineLng1, lineLat2, lineLng2) + (maxDeviation / 3)) >= (distFromStartToProjection + distFromEndToProjection)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function getBearing(lat1, lng1, lat2, lng2) {\r\n var y = Math.sin(degreeToRadian(lng2) - degreeToRadian(lng1)) * Math.cos(degreeToRadian(lat2));\r\n var x = Math.cos(degreeToRadian(lat1)) * Math.sin(degreeToRadian(lat2)) - Math.sin(degreeToRadian(lat1))\r\n * Math.cos(degreeToRadian(lat2)) * Math.cos(degreeToRadian(lng2) - degreeToRadian(lng1));\r\n return Math.abs(((Math.atan2(y, x) + (2 * Math.PI)) % (2 * Math.PI)) * 180 / Math.PI) + (1 / 7200);\r\n}\r\n\r\nexport function degreeToRadian(angle) {\r\n return Math.PI * angle / 180.0;\r\n}\r\n\r\nexport function mergePatternPredictions(predictionsByPattern, predictedPatternTemplate) {\r\n let route_dir_dic = {};\r\n predictionsByPattern.forEach(predicPtrn => {\r\n if (!predicPtrn.patternId) return;\r\n\r\n let dicK = predicPtrn.routeCode + \"_\" + predicPtrn.directId;\r\n if (!route_dir_dic[dicK]) {\r\n route_dir_dic[dicK] = predicPtrn;\r\n }\r\n else route_dir_dic[dicK].predictions = route_dir_dic[dicK].predictions.concat(predicPtrn.predictions);\r\n });\r\n\r\n let patternGroups = [];\r\n for (let i in route_dir_dic) {\r\n route_dir_dic[i].predictions.sort((a, b) => a.predictTime.localeCompare(b.predictTime))\r\n patternGroups.push(route_dir_dic[i]);\r\n }\r\n\r\n return patternGroups.sort((a, b) => sortNaturalAlphaNumeric(applyTemplate(predictedPatternTemplate, a), applyTemplate(predictedPatternTemplate, b)));\r\n}\r\n\r\nexport function applyTemplate(template, obj) {\r\n return template\r\n .replace(/#RouteName#/, obj.routeName || obj.RouteName || '')\r\n .replace(/#PatternName#/, obj.patternName || obj.PatternName || '')\r\n .replace(/#RouteCode#/, obj.routeCode || obj.RouteCode || '')\r\n .replace(/#PatternCode#/, obj.patternCode || obj.PatternCode || '')\r\n .replace(/#Direction#/, obj.directName || obj.DirectionName || '')\r\n .replace(/#StopCode#/, obj.stopName || obj.StopName || '')\r\n .replace(/#StopName#/, obj.stopCode || obj.StopCode || '')\r\n .replace(/#HeadSign#/, obj.headSign || obj.HeadSign || '')\r\n .replace(/#PatternID#/, obj.patternId || obj.PatternID || '')\r\n}\r\n\r\n// Convert date from ISO date string\r\nexport function dateFromISO(s) {\r\n let day,\r\n rx = /^(\\d{4}-\\d\\d-\\d\\d([tT ][\\d:.]*)?)([zZ]|([+-])(\\d\\d):(\\d\\d))?$/,\r\n p = rx.exec(s) || [];\r\n if (p[1]) {\r\n day = p[1].split(/\\D/);\r\n for (let i = 0, L = day.length; i < L; i++) {\r\n day[i] = parseInt(day[i], 10) || 0;\r\n }\r\n day[1] -= 1;\r\n day = new Date(day[0], day[1], day[2], day[3], day[4], day[5], 0);\r\n if (!day.getDate()) return NaN;\r\n return day;\r\n }\r\n return NaN;\r\n}\r\n\r\nexport function isNullOrUndefined(val) {\r\n return val === undefined || val === null;\r\n}\r\n/* Returns true if the provided string is null, empty, or only whitespace */\r\nexport function isNullOrWhitespace(str) {\r\n if (str === undefined || str === null) return true;\r\n if (str === 0) return false;\r\n if (typeof str === 'object') return false;\r\n return !str || (typeof str === 'string' && str.match(/^ *$/)) !== null;\r\n}\r\n\r\nexport function convertToISODateWithoutTime(date) {\r\n if (!isValidDateObject(date))\r\n date = new Date(date);\r\n return date.toISOString().split(\"T\")[0];\r\n}\r\n\r\nexport function getToday() {\r\n let today = new Date().toISOString().split(\"T\")[0]; \r\n return today;\r\n}\r\n\r\nexport function isValidDateObject(date) {\r\n return date && Object.prototype.toString.call(date) === \"[object Date]\" && !isNaN(date);\r\n}\r\n\r\nexport function isValidTripDate(tripDate) {\r\n let today = new Date(getToday());\r\n tripDate = new Date(tripDate);\r\n return tripDate >= today;\r\n}\r\n\r\nexport function addDaysToDate(date, days) {\r\n if (!isValidDateObject(date))\r\n date = new Date(date);\r\n let result = date;\r\n result.setDate(result.getDate() + days);\r\n return result;\r\n}\r\n\r\n\r\n\r\n","import React from 'react';\r\n\r\nexport default () => (\r\n \r\n \r\n \r\n \r\n \r\n);","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register() {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/serviceWorker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import axios from 'axios';\r\n\r\nlet alertDiv;\r\nfunction updateOnlineStatus(event) { \r\n if (!navigator.onLine && !alertDiv) { \r\n try {\r\n // Safari 3.0+ \"[object HTMLElementConstructor]\" \r\n var isSafari = navigator.userAgent.indexOf(\"Safari\") !== -1; \r\n alertDiv = document.createElement('div');\r\n alertDiv.id = 'alertDiv';\r\n if (isSafari) {\r\n alertDiv.style.cssText = \"text-align:center; position:fixed; display:inline-block; width:100%;min-height:60px;box-sizing: border-box; font-weight:bold; color:#a94442;border-color:#dca7a7; background-image:linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);padding:15px; border-radius:4px; z-index:9999\";\r\n } else {\r\n alertDiv.style = \"text-align:center; position:fixed; display:inline-block; width:100%;min-height:60px;box-sizing: border-box; font-weight:bold; color:#a94442;border-color:#dca7a7; background-image:linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);padding:15px; border-radius:4px; z-index:9999\";\r\n }\r\n\r\n alertDiv.innerText = \"No internet connection is available.\";\r\n document.getElementsByTagName('body')[0].appendChild(alertDiv);\r\n } catch (e) {\r\n console.log(e.message)\r\n }\r\n \r\n }\r\n else if (alertDiv && navigator.onLine) { \r\n var elementExists = document.getElementById(\"alertDiv\");\r\n if (elementExists) { \r\n document.getElementsByTagName('body')[0].removeChild(elementExists); \r\n alertDiv = null;\r\n }\r\n }\r\n}\r\n\r\nwindow.addEventListener('load', updateOnlineStatus);\r\nwindow.addEventListener('online', updateOnlineStatus);\r\nwindow.addEventListener('offline', updateOnlineStatus);\r\nwindow.addEventListener('beforeunload', (e) => {\r\n if (!navigator.onLine) {\r\n window.stop();\r\n e.preventDefault();\r\n console.log('no connection and if you reload you will loose contents');\r\n }\r\n});\r\n\r\naxios.interceptors.request.use((config) => {\r\n var connection = navigator.onLine;\r\n if (!connection) { return Promise.reject('Request can not be processed because no internet connection is available') };\r\n return config;\r\n}, (error) => {\r\n console.log(error);\r\n return Promise.reject(error);\r\n});\r\n\r\naxios.interceptors.response.use((response) => {\r\n return response;\r\n}, (error) => {\r\n if (error.response && error.response.data && error.response.data.errorMessage)\r\n console.log(error.response.data.errorMessage);\r\n else\r\n console.log(error.message);\r\n\r\n return Promise.reject(error);\r\n});","import React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport LoadingScreen from './components/shared/LoadingScreen';\r\n\r\nclass App extends Component {\r\n\r\n state = {\r\n isMobile: window.outerWidth <= 900\r\n };\r\n\r\n componentDidMount() {\r\n window.onresize = () => {\r\n if (window.outerWidth <= 900 && !this.state.isMobile) this.setState({ isMobile: true });\r\n else if (window.outerWidth > 900 && this.state.isMobile) this.setState({ isMobile: false });\r\n }\r\n }\r\n\r\n render() {\r\n if (!this.props.systemSettings) return ;\r\n\r\n const pathName = window.location.pathname.toLowerCase();\r\n //Use React.Lazy() so that JS/CSS for mobile version is never loaded if the user stays desktop-only, and vice-versa. See: https://reactjs.org/docs/code-splitting.html\r\n if (this.props.systemSettings.serviceDown) {\r\n const ServiceDown = React.lazy(() => import('./components/ServiceDown'));\r\n return ;\r\n }\r\n else if (pathName === '/home/predictionsign' || pathName === '/predictionsign') {\r\n //Load prediction sign if this is a prediction sign URL\r\n const PredictionSign = React.lazy(() => import('./components/PredictionSign'));\r\n return ;\r\n }\r\n else if (this.state.isMobile) {\r\n const MobilePredictionPortal = React.lazy(() => import('./components/MobilePredictionPortal'));\r\n return ;\r\n }\r\n else {\r\n const DesktopPredictionPortal = React.lazy(() => import('./components/DesktopPredictionPortal'));\r\n return ;\r\n }\r\n }\r\n}\r\n\r\nexport default connect((state) => {\r\n return { systemSettings: state.systemSettings };\r\n})(App);","import 'react-app-polyfill/ie11';\r\nimport React, { Suspense } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\nimport store from './store/ReduxReducer';\r\nimport LoadingScreen from './components/shared/LoadingScreen';\r\nimport registerServiceWorker from './registerServiceWorker';\r\nimport App from './App';\r\nimport * as Sentry from '@sentry/browser';\r\nimport './util/OfflineFunctinality';\r\n\r\n//Initialize JavaScript error tracking with Sentry unless we're running on localhost\r\nif (window.location.host.indexOf('localhost') !== 0) {\r\n Sentry.init({\r\n ignoreErrors: ['Network request failed', 'Failed to fetch', 'NetworkError', 'Network Error', 'withrealtime/messaging', 'UnhandledRejection'], // Prevent network errors from consuming our quota\r\n dsn: 'https://7e4569400a1546578b9fb9e7d902caf8@sentry.io/1384406'\r\n });\r\n}\r\nelse document.title = 'Prediction Portal Development Environment'\r\n\r\n// IE11 array find polyfill from https://tc39.github.io/ecma262/#sec-array.prototype.find\r\nif (!Array.prototype.find) {\r\n // eslint-disable-next-line no-extend-native\r\n Object.defineProperty(Array.prototype, 'find', {\r\n value: function (predicate) {\r\n // 1. Let O be ? ToObject(this value).\r\n if (this == null) {\r\n throw new TypeError('\"this\" is null or not defined');\r\n }\r\n\r\n var o = Object(this);\r\n\r\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\r\n var len = o.length >>> 0;\r\n\r\n // 3. If IsCallable(predicate) is false, throw a TypeError exception.\r\n if (typeof predicate !== 'function') {\r\n throw new TypeError('predicate must be a function');\r\n }\r\n\r\n // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\r\n var thisArg = arguments[1];\r\n\r\n // 5. Let k be 0.\r\n var k = 0;\r\n\r\n // 6. Repeat, while k < len\r\n while (k < len) {\r\n // a. Let Pk be ! ToString(k).\r\n // b. Let kValue be ? Get(O, Pk).\r\n // c. Let testResult be ToBoolean(? Call(predicate, T, � kValue, k, O �)).\r\n // d. If testResult is true, return kValue.\r\n var kValue = o[k];\r\n if (predicate.call(thisArg, kValue, k, o)) {\r\n return kValue;\r\n }\r\n // e. Increase k by 1.\r\n k++;\r\n }\r\n\r\n // 7. Return undefined.\r\n return undefined;\r\n },\r\n configurable: true,\r\n writable: true\r\n });\r\n}\r\n\r\n// IE11 string includes polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\r\nif (!String.prototype.includes) {\r\n // eslint-disable-next-line no-extend-native\r\n String.prototype.includes = function (search, start) {\r\n // eslint-disable-next-line strict\r\n 'use strict';\r\n if (typeof start !== 'number') {\r\n start = 0;\r\n }\r\n\r\n if (start + search.length > this.length) {\r\n return false;\r\n } else {\r\n return this.indexOf(search, start) !== -1;\r\n }\r\n };\r\n}\r\n\r\n// IE11 Number isNaN polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN\r\n// eslint-disable-next-line no-extend-native\r\nNumber.isNaN = Number.isNaN || function (value) {\r\n // eslint-disable-next-line no-self-compare\r\n return value !== value;\r\n}\r\n\r\n\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n \r\n }>\r\n \r\n \r\n ,\r\n rootElement);\r\n\r\nregisterServiceWorker();\r\n","import axios from 'axios';\r\nimport { decode } from 'polyline';\r\nimport * as Sentry from '@sentry/browser';\r\n\r\nexport function includeLocationInfo(addressStr, searchLocation) {\r\n if (/^[\\d.-]+,[\\d.-]+$/.test(addressStr)) return addressStr; //If the location is a lat/lng coordinate, don't modify it\r\n\r\n //Include any parts of the search location setting in the address if they aren't already there\r\n var lowerAddr = addressStr.toLowerCase();\r\n var locationArr = searchLocation.split(',');\r\n locationArr.forEach(function (locationPart) {\r\n if (lowerAddr.indexOf(locationPart.toLowerCase()) === -1) addressStr += ',' + locationPart;\r\n });\r\n return addressStr;\r\n}\r\n\r\nexport function getGoogleTimeStamp(date, hours, minutes, ampm, localServerTimeDiff) {\r\n minutes = parseInt(minutes);\r\n hours = parseInt(hours);\r\n var splitDate = date.split('-');\r\n if (hours === 12 && ampm === 'AM') hours = 0;\r\n else if (hours < 12 && ampm === 'PM') hours += 12;\r\n var tripTime = new Date(new Date(parseInt(splitDate[0]), parseInt(splitDate[1]) - 1, parseInt(splitDate[2]), hours, minutes).getTime() + localServerTimeDiff);\r\n var baseTime = new Date('1970-01-01T00:00Z');\r\n return Math.round((-baseTime.getTime() + tripTime.getTime()) / 1000);\r\n}\r\n\r\nexport function getTripPlanStops(tripPlan) {\r\n var steps = tripPlan.steps;\r\n var stopPointArr = [];\r\n for (var i = 0; i < steps.length; i++) {\r\n if (steps[i].travelMode === 'TRANSIT') {\r\n if (steps[i].transit.departure_stop) stopPointArr.push(`${steps[i].transit.departure_stop.location.lat},${steps[i].transit.departure_stop.location.lng}`);\r\n if (steps[i].transit.arrival_stop) stopPointArr.push(`${steps[i].transit.arrival_stop.location.lat},${steps[i].transit.arrival_stop.location.lng}`);\r\n }\r\n };\r\n //Remove duplicates\r\n stopPointArr = stopPointArr.filter(function (item, pos) {\r\n return stopPointArr.indexOf(item) === pos;\r\n });\r\n\r\n if (stopPointArr.length === 0) return Promise.resolve([]);\r\n return axios.get('/api/Stop/GetForPlannedTrip', { params: { stopPoints: stopPointArr } });\r\n}\r\n\r\nexport function getTripPlan(fromAddr, toAddr, tripType, date, hours, minutes, ampm, routeList, searchLocation, localServerTimeDiff) {\r\n var params = {\r\n origin: includeLocationInfo(fromAddr, searchLocation),\r\n destination: includeLocationInfo(toAddr, searchLocation),\r\n mode: 'transit'\r\n };\r\n\r\n var timestamp = getGoogleTimeStamp(date, hours, minutes, ampm, localServerTimeDiff);\r\n if (tripType === 'departure') params.departure_time = timestamp;\r\n else params.arrival_time = timestamp;\r\n\r\n return axios.get('/api/TripPlan', {\r\n params: params,\r\n transformResponse: axios.defaults.transformResponse.concat(function (data, headers) {\r\n if (headers['content-type'].indexOf('json') === -1) {\r\n Sentry.captureException(new Error('Trip planner received a non-JSON response from the server: ' + data));\r\n return {}; //If response is not JSON (most likely meaning it's an error response), don't transform\r\n }\r\n\r\n //If an unexpected status code was received, log to sentry\r\n if (data.status !== 'OK' && data.status !== 'ZERO_RESULTS') Sentry.captureException(new Error('Trip planner response contained error status code: ' + data.status));\r\n\r\n var parser = new TripPlanDataParser(data, new Date(timestamp * 1000), tripType, routeList);\r\n return {\r\n steps: parser.getSteps(), summary: parser.getSummary()\r\n };\r\n })\r\n })\r\n}\r\n\r\nexport function ISOToDateAndTimeInfo(ISODateTime) {\r\n var splitISO = ISODateTime.split('T');\r\n var dateStr = splitISO[0];\r\n var splitTime = splitISO[1].split(':');\r\n var hours = parseInt(splitTime[0]);\r\n var ampm = 'AM';\r\n if (hours >= 12) {\r\n ampm = 'PM';\r\n if (hours > 12) hours -= 12;\r\n }\r\n else if (hours === 0) hours = 12;\r\n var timeStr = hours + ':' + splitTime[1] + ' ' + ampm;\r\n return { date: dateStr, time: timeStr, hour: hours.toString(), minute: splitTime[1], ampm: ampm };\r\n}\r\n\r\nexport function TripPlanDataParser(tripdata, date, tripType, routeList) {\r\n if (!routeList) routeList = [];\r\n this.tripdata = tripdata;\r\n this.date = date;\r\n this.tripType = tripType;\r\n this.colorWheel = ['#000095', '#2eb075', '#a30000', '#7a0078', '#8d9800', '#814d05'];\r\n this.nextColor = function (lastIndex) {\r\n var len = this.colorWheel.length;\r\n while (lastIndex >= len - 1) {\r\n lastIndex = lastIndex - len;\r\n }\r\n return this.colorWheel[lastIndex + 1];\r\n };\r\n this.getSummary = function () {\r\n var data = this.tripdata;\r\n var route0 = data.routes[0];\r\n\r\n if (!route0)\r\n return {};\r\n var leg0 = route0.legs[0];\r\n if (!leg0)\r\n return {};\r\n var sumBounds = route0.bounds;\r\n var arrivalText, arrival, departureText, departure;\r\n //Google doesn't always return the arrival_time and departure_time fields, so we may need to calculate them\r\n if (leg0.arrival_time) {\r\n arrival = new Date(leg0.arrival_time.value);\r\n arrivalText = leg0.arrival_time.text;\r\n }\r\n else {\r\n arrival = this.tripType === 'departure' ? new Date(this.date.getTime() + (leg0.duration.value * 1000)) : this.date;\r\n arrivalText = getTimeFromDate(arrival);\r\n }\r\n if (leg0.departure_time) {\r\n departure = new Date(leg0.departure_time.value);\r\n departureText = leg0.departure_time.text;\r\n }\r\n else {\r\n departure = this.tripType === 'departure' ? this.date : new Date(this.date.getTime() - (leg0.duration.value * 1000));\r\n departureText = getTimeFromDate(departure);\r\n }\r\n\r\n var sum = {\r\n bounds: sumBounds,\r\n arrivalText: arrivalText,\r\n arrival: arrival,\r\n departureText: departureText,\r\n departure: departure,\r\n distanceText: leg0.distance.text,\r\n durationText: leg0.duration.text,\r\n startAddress: leg0.start_address,\r\n endAddress: leg0.end_address,\r\n startLoc: leg0.start_location,\r\n endLoc: leg0.end_location\r\n };\r\n return sum;\r\n function getTimeFromDate(date) {\r\n var ampm = 'AM';\r\n var hours = date.getHours();\r\n if (hours >= 12) {\r\n hours -= 12;\r\n ampm = 'PM';\r\n }\r\n if (hours === 0)\r\n hours = 12;\r\n var minutes = date.getMinutes();\r\n var minutesStr = minutes < 10 ? '0' + minutes : minutes.toString();\r\n return hours + ':' + minutesStr + ' ' + ampm;\r\n }\r\n };\r\n this.getSteps = function () {\r\n var steps = [];\r\n var data = this.tripdata;\r\n var route0 = data.routes[0];\r\n if (!route0)\r\n return steps;\r\n var leg0 = route0.legs[0];\r\n if (!leg0)\r\n return steps;\r\n //leg0.steps[0].polyline\r\n var colorI = -1;\r\n var that = this;\r\n steps = leg0.steps.map(function (p) {\r\n //Find route taken in this trip plan step (if any) so we can use its information\r\n var route = null;\r\n if (p.transit_details && p.transit_details.line && p.transit_details.line.short_name) {\r\n for (var i = 0; i < routeList.length; i++) {\r\n if (routeList[i].routeCode === p.transit_details.line.short_name) {\r\n route = routeList[i];\r\n break;\r\n }\r\n }\r\n }\r\n return {\r\n distanceText: p.distance.text,\r\n travelMode: p.travel_mode,\r\n durationText: p.duration.text,\r\n htmlInstruction: p.html_instructions,\r\n line: decode(p.polyline.points),\r\n stepColor: that.nextColor(colorI++),\r\n transit: p.transit_details,\r\n route: route\r\n };\r\n });\r\n return steps;\r\n };\r\n}","export function addFavoriteRoute(routeNumber) {\r\n var routeArr = getFavoriteRoutes();\r\n routeArr.push(routeNumber);\r\n window.localStorage.setItem('FavoredMergedRoute', serialize(routeArr));\r\n}\r\n\r\nexport function addFavoritePattern(patternNumber) {\r\n var patternArr = getFavoritePatterns();\r\n patternArr.push(patternNumber);\r\n window.localStorage.setItem('FavoredPattern', serialize(patternArr));\r\n}\r\n\r\nexport function addFavoriteStop(stopNumber) {\r\n var stopArr = getFavoriteStops();\r\n stopArr.push(stopNumber);\r\n window.localStorage.setItem('FavoredStops', serialize(stopArr));\r\n}\r\n\r\nexport function addFavoriteStopOnPattern(stopNumber, patternNumber) {\r\n var stopOnPatternArr = getFavoriteStopsOnPatterns();\r\n stopOnPatternArr.push({ patternNumber: patternNumber, stopNumber: stopNumber });\r\n window.localStorage.setItem('FavoredStopsOnRoute', serialize(stopOnPatternArr));\r\n}\r\n\r\nexport function addFavoriteStopOnRoute(stopNumber, routeNumber) {\r\n var stopOnRouteArr = getFavoriteStopsOnRoutes();\r\n stopOnRouteArr.push({ routeNumber: routeNumber, stopNumber: stopNumber });\r\n window.localStorage.setItem('FavoredStopsOnMergedRoute', serialize(stopOnRouteArr));\r\n}\r\n\r\nexport function removeFavoriteRoute(routeNumber) {\r\n var routeArr = getFavoriteRoutes();\r\n var routeIndex = routeArr.indexOf(routeNumber);\r\n if (routeIndex !== -1) {\r\n routeArr.splice(routeIndex, 1);\r\n window.localStorage.setItem('FavoredMergedRoute', serialize(routeArr));\r\n }\r\n}\r\n\r\nexport function removeFavoritePattern(patternNumber) {\r\n var patternArr = getFavoritePatterns();\r\n var patternIndex = patternArr.indexOf(patternNumber);\r\n if (patternIndex !== -1) {\r\n patternArr.splice(patternIndex, 1);\r\n window.localStorage.setItem('FavoredPattern', serialize(patternArr));\r\n }\r\n}\r\n\r\nexport function removeFavoriteStop(stopNumber) {\r\n var stopArr = getFavoriteStops();\r\n var stopIndex = stopArr.indexOf(stopNumber);\r\n if (stopIndex !== -1) {\r\n stopArr.splice(stopIndex, 1);\r\n window.localStorage.setItem('FavoredStops', serialize(stopArr));\r\n }\r\n}\r\n\r\nexport function removeFavoriteStopOnRoute(stopNumber, routeNumber) {\r\n var stopOnRouteArr = getFavoriteStopsOnRoutes();\r\n for (var i = 0; i < stopOnRouteArr.length; i++) {\r\n if (stopOnRouteArr[i].stopNumber === stopNumber && stopOnRouteArr[i].routeNumber === routeNumber) {\r\n stopOnRouteArr.splice(i, 1);\r\n break;\r\n }\r\n }\r\n window.localStorage.setItem('FavoredStopsOnMergedRoute', serialize(stopOnRouteArr));\r\n}\r\n\r\nexport function removeFavoriteStopOnPattern(stopNumber, patternNumber) {\r\n var stopOnPatternArr = getFavoriteStopsOnPatterns();\r\n for (var i = 0; i < stopOnPatternArr.length; i++) {\r\n if (stopOnPatternArr[i].stopNumber === stopNumber && stopOnPatternArr[i].patternNumber === patternNumber) {\r\n stopOnPatternArr.splice(i, 1);\r\n break;\r\n }\r\n }\r\n window.localStorage.setItem('FavoredStopsOnRoute', serialize(stopOnPatternArr));\r\n}\r\n\r\nexport function getFavoritePatterns() {\r\n var storedFavorites = window.localStorage.getItem('FavoredPattern');\r\n if (storedFavorites) return deserialize(storedFavorites);\r\n\r\n //For backwards-compatibility with favorites saved before 5.1.3\r\n var favoriteCookie = getCookie('FavoredPattern');\r\n if (favoriteCookie) return deserialize(favoriteCookie);\r\n favoriteCookie = getCookie('favoritePatterns');\r\n if (!favoriteCookie) return [];\r\n return favoriteCookie.split(',').map(function (f) { return parseInt(f) });\r\n}\r\n\r\nexport function getFavoriteRoutes() {\r\n var storedFavorites = window.localStorage.getItem('FavoredMergedRoute');\r\n if (storedFavorites) return deserialize(storedFavorites);\r\n\r\n //For backwards-compatibility with favorites saved before 5.1.3\r\n var favoriteCookie = getCookie('FavoredMergedRoute');\r\n if (favoriteCookie) return deserialize(favoriteCookie);\r\n favoriteCookie = getCookie('favoriteRoutes');\r\n if (!favoriteCookie) return [];\r\n return favoriteCookie.split(',').map(function (f) { return parseInt(f) });\r\n}\r\n\r\nexport function getFavoriteStops() {\r\n var storedFavorites = window.localStorage.getItem('FavoredStops');\r\n if (storedFavorites) return deserialize(storedFavorites);\r\n\r\n //For backwards-compatibility with favorites saved before 5.1.3\r\n var favoriteCookie = getCookie('FavoredStops');\r\n if (favoriteCookie) return deserialize(favoriteCookie);\r\n favoriteCookie = getCookie('favoriteStops');\r\n if (!favoriteCookie) return [];\r\n return favoriteCookie.split(',').map(function (f) { return parseInt(f) });\r\n}\r\n\r\nexport function getFavoriteStopsOnRoutes() {\r\n var storedFavorites = window.localStorage.getItem('FavoredStopsOnMergedRoute');\r\n if (storedFavorites) return deserialize(storedFavorites);\r\n\r\n //For backwards-compatibility with favorites saved before 5.1.3\r\n var favoriteCookie = getCookie('FavoredStopsOnMergedRoute');\r\n if (!favoriteCookie) return [];\r\n return deserialize(favoriteCookie).map(function (f) {\r\n var splitCookie = f.split('-');\r\n return {\r\n routeNumber: parseInt(splitCookie[0]),\r\n stopNumber: parseInt(splitCookie[1])\r\n }\r\n });\r\n}\r\n\r\nexport function getFavoriteStopsOnPatterns() {\r\n var storedFavorites = window.localStorage.getItem('FavoredStopsOnRoute');\r\n if (storedFavorites) return deserialize(storedFavorites);\r\n\r\n //For backwards-compatibility with favorites saved before 5.1.3\r\n var favoriteCookie = getCookie('FavoredStopsOnRoute');\r\n if (!favoriteCookie) return [];\r\n return deserialize(favoriteCookie).map(function (f) {\r\n var splitCookie = f.split('-');\r\n return {\r\n patternNumber: parseInt(splitCookie[0]),\r\n stopNumber: parseInt(splitCookie[1])\r\n }\r\n });\r\n}\r\n\r\nfunction getCookie(c_name) {\r\n var i, x, y, ARRcookies = document.cookie.split(\";\");\r\n for (i = 0; i < ARRcookies.length; i++) {\r\n x = ARRcookies[i].substr(0, ARRcookies[i].indexOf(\"=\"));\r\n y = ARRcookies[i].substr(ARRcookies[i].indexOf(\"=\") + 1);\r\n x = x.replace(/^\\s+|\\s+$/g, \"\");\r\n if (x === c_name) {\r\n return unescape(y);\r\n }\r\n }\r\n}\r\n\r\n/** internally use encodeURI and JSON serializer */\r\nfunction serialize(object) {\r\n if (!object) return \"\";\r\n return JSON.stringify(object);\r\n}\r\n\r\nfunction deserialize(encodedJSON) {\r\n var json = decodeURI(encodedJSON);\r\n return JSON.parse(json);\r\n}\r\n","import { createStore } from 'redux';\r\nimport axios from 'axios';\r\nimport { ISOToDateAndTimeInfo, getTripPlan, getTripPlanStops } from '../util/TripPlannerUtil';\r\nimport { getQueryStringParameterByName, sortNaturalAlphaNumeric, dateFromISO, applyTemplate } from '../util/util';\r\nimport { addFavoriteStop, removeFavoriteStop, getFavoriteStops, addFavoriteRoute, removeFavoriteRoute, getFavoriteRoutes, addFavoritePattern, removeFavoritePattern, getFavoritePatterns, addFavoriteStopOnRoute, removeFavoriteStopOnRoute, getFavoriteStopsOnRoutes, addFavoriteStopOnPattern, removeFavoriteStopOnPattern, getFavoriteStopsOnPatterns } from '../util/FavoritesUtil';\r\n\r\nfunction ReduxReducer(state, action) {\r\n // This function receives actions and updates the redux state. Some notes:\r\n // 1. The returned state MUST be a new object. Not just the original state with modifications. Otherwise redux will believe the state didn't change.\r\n // 2. Any properties of the state which are arrays or objects must be cloned if they're going to be modified, or the components subscribed to those properties won't re-render.\r\n // 3. We could easily get around the above two restrictions by deep-cloning the state every time (e.g. return JSON.parse(JSON.stringify(state))) but we don't because it will cause unnecessary re-renders of every subscribed component.\r\n // See: https://redux.js.org/troubleshooting\r\n var newState = Object.assign({}, state);\r\n switch (action.type) {\r\n case 'TOGGLE_ROUTE':\r\n var selectedRoutes = newState.selectedRoutes.slice(0);\r\n var foundRoute = false;\r\n for (var i = 0; i < selectedRoutes.length; i++) {\r\n if ((selectedRoutes[i].patternID && selectedRoutes[i].patternID === action.route.patternID) || (selectedRoutes[i].routeID && selectedRoutes[i].routeID === action.route.routeID)) {\r\n foundRoute = true;\r\n selectedRoutes.splice(i, 1);\r\n break;\r\n }\r\n }\r\n if (!foundRoute) selectedRoutes.push(action.route);\r\n newState.selectedRoutes = selectedRoutes; \r\n break;\r\n case 'TOGGLE_SINGLE_ROUTE':\r\n //Toggles selection of the specified route and deselects all other routes (if any)\r\n if (state.selectedRoutes.some(function (r) { return r.routeID === action.route.routeID }))\r\n newState.selectedRoutes = [];\r\n else\r\n newState.selectedRoutes = [action.route]; \r\n break;\r\n case 'SELECT_SINGLE_ROUTE':\r\n newState.selectedRoutes = [action.route];\r\n break;\r\n case 'SET_ROUTE_LIST':\r\n newState.routesLoaded = true;\r\n newState.routeList = action.routeList;\r\n break;\r\n case 'SET_PATTERN_LIST':\r\n newState.allPatterns = action.allPatterns;\r\n break;\r\n case 'TOGGLE_SIDEBAR':\r\n newState.sidebarShown = !state.sidebarShown;\r\n break;\r\n case 'HIDE_SIDEBAR':\r\n newState.sidebarShown = false;\r\n break;\r\n case 'SELECT_STOP':\r\n newState.selectedStop = action.stop;\r\n break; \r\n case 'UPDATE_BROADCASTS':\r\n //To avoid unnecessary re-rendering, only update broadcasts in the state if the broadcast contents have changed\r\n if (JSON.stringify(action.globalBroadcasts) !== JSON.stringify(state.globalBroadcasts)) newState.globalBroadcasts = action.globalBroadcasts;\r\n if (JSON.stringify(action.routeBroadcasts) !== JSON.stringify(state.routeBroadcasts)) newState.routeBroadcasts = action.routeBroadcasts;\r\n if (JSON.stringify(action.stopBroadcasts) !== JSON.stringify(state.stopBroadcasts)) newState.stopBroadcasts = action.stopBroadcasts;\r\n break;\r\n case 'TOGGLE_FAVORITE_STOP':\r\n if (state.favoriteStops.indexOf(action.stopNumber) === -1) addFavoriteStop(action.stopNumber);\r\n else removeFavoriteStop(action.stopNumber);\r\n newState.favoriteStops = getFavoriteStops();\r\n break;\r\n case 'TOGGLE_FAVORITE_ROUTE':\r\n if (state.favoriteRoutes.indexOf(action.routeNumber) === -1) addFavoriteRoute(action.routeNumber);\r\n else removeFavoriteRoute(action.routeNumber);\r\n newState.favoriteRoutes = getFavoriteRoutes();\r\n break;\r\n case 'TOGGLE_FAVORITE_PATTERN':\r\n if (state.favoritePatterns.indexOf(action.patternNumber) === -1) addFavoritePattern(action.patternNumber);\r\n else removeFavoritePattern(action.patternNumber);\r\n newState.favoritePatterns = getFavoritePatterns();\r\n break;\r\n case 'TOGGLE_FAVORITE_STOP_ON_ROUTE':\r\n if (!state.favoriteStopsOnRoutes.some(function (sr) { return sr.stopNumber === action.stopNumber && sr.routeNumber === action.routeNumber })) addFavoriteStopOnRoute(action.stopNumber, action.routeNumber);\r\n else removeFavoriteStopOnRoute(action.stopNumber, action.routeNumber);\r\n newState.favoriteStopsOnRoutes = getFavoriteStopsOnRoutes();\r\n break;\r\n case 'TOGGLE_FAVORITE_STOP_ON_PATTERN':\r\n if (!state.favoriteStopsOnPatterns.some(function (sr) { return sr.stopNumber === action.stopNumber && sr.patternNumber === action.patternNumber })) addFavoriteStopOnPattern(action.stopNumber, action.patternNumber);\r\n else removeFavoriteStopOnPattern(action.stopNumber, action.patternNumber);\r\n newState.favoriteStopsOnPatterns = getFavoriteStopsOnPatterns();\r\n break;\r\n case 'TOGGLE_HELP_DLG':\r\n newState.helpDlgShown = !state.helpDlgShown;\r\n break;\r\n case 'SHOW_HELP_DLG':\r\n newState.helpDlgShown = true;\r\n break;\r\n case 'HIDE_HELP_DLG':\r\n newState.helpDlgShown = false;\r\n break;\r\n case 'SHOW_TERM_CONDS_DLG':\r\n if (newState.helpDlgShown) newState.helpDlgShown = false;\r\n newState.termCondsDlgShown = true;\r\n break;\r\n case 'TOGGLE_TERM_CONDS_DLG':\r\n newState.termCondsDlgShown = !state.termCondsDlgShown;\r\n break;\r\n case 'HIDE_TERM_CONDS_DLG':\r\n newState.termCondsDlgShown = false;\r\n if (localStorage.getItem(\"showHelp\") === null) {\r\n localStorage.setItem('showHelp', true);\r\n newState.helpDlgShown = true;\r\n }\r\n break;\r\n case 'SHOW_ALERTS_DLG':\r\n newState.alertsDlgShown = true;\r\n break;\r\n case 'HIDE_ALERTS_DLG':\r\n newState.alertsDlgShown = false;\r\n break;\r\n case 'SET_TRIP_PLAN':\r\n newState.tripPlan = action.tripPlan;\r\n newState.tripPlanTo = null;\r\n newState.tripPlanFrom = null;\r\n if (!newState.tripPlan) newState.tripPlanStops = null;\r\n break;\r\n case 'SET_TRIP_PLAN_TO':\r\n newState.tripPlanTo = action.tripPlanTo;\r\n break;\r\n case 'SET_TRIP_PLAN_FROM':\r\n newState.tripPlanFrom = action.tripPlanFrom;\r\n break;\r\n case 'SET_TRIP_PLAN_STOPS':\r\n newState.tripPlanStops = action.tripPlanStops && action.tripPlanStops.length > 0 ? action.tripPlanStops : null;\r\n break;\r\n case 'CLEAR_MAP':\r\n newState.selectedStop = null;\r\n newState.selectedRoutes = [];\r\n newState.walkingPath = null;\r\n newState.shownStops = null;\r\n newState.currentPosition = null;\r\n newState.showMyLocation = false;\r\n newState.tripPlan = null;\r\n newState.tripPlanTo = null;\r\n newState.tripPlanFrom = null;\r\n newState.tripPlanStops = null;\r\n break;\r\n case 'CLEAR_MAP_EXCEPT_TRIP_PLAN':\r\n newState.selectedStop = null;\r\n newState.selectedRoutes = [];\r\n newState.walkingPath = null;\r\n newState.shownStops = null;\r\n newState.currentPosition = null;\r\n newState.showMyLocation = false;\r\n break;\r\n case 'SET_WALKING_PATH':\r\n newState.walkingPath = action.walkingPath; \r\n break;\r\n case 'SHOW_STOPS':\r\n newState.shownStops = action.stops;\r\n break;\r\n case 'SET_ALERT_SUBSCRIPTION':\r\n newState.alertSubscription = action.alertSubscription;\r\n break;\r\n case 'TOGGLE_ALERT_DAY_CHOICE':\r\n newState.alertDayChoice = !state.alertDayChoice;\r\n break;\r\n case 'SHOW_ALERT_SAVED_DLG':\r\n newState.alertSavedDlgShown = true;\r\n break;\r\n case 'HIDE_ALERT_SAVED_DLG':\r\n newState.alertSavedDlgShown = false;\r\n break;\r\n case 'HAS_UNREAD_GLOBAL_BROADCASTS':\r\n newState.hasUnreadGlobalBroadcasts = true;\r\n break;\r\n case 'NO_UNREAD_GLOBAL_BROADCASTS':\r\n newState.hasUnreadGlobalBroadcasts = false;\r\n break;\r\n case \"ADDRESS_RESULT\": \r\n newState.addressResult = action.addressResult;\r\n break;\r\n case \"STOP_RESULT\":\r\n newState.stopResult = action.stopResult;\r\n break; \r\n case \"SET_FILTERED_ROUTES\":\r\n newState.filteredRoutes = action.filteredRoutes;\r\n break;\r\n case \"SHOW_ALL_ROUTES\":\r\n newState.showAllRoutes = action.showAllRoutes;\r\n break;\r\n case \"SET_INFO_MESSAGE\":\r\n newState.infoMessage = action.infoMessage;\r\n break; \r\n case \"SEARCH_TYPE\":\r\n newState.searchType = action.searchType; \r\n break;\r\n case \"SET_CURRENT_POSITION\":\r\n newState.currentPosition = action.currentPosition; \r\n break;\r\n case \"SHOW_MY_LOCATION\":\r\n newState.showMyLocation = true;\r\n break;\r\n case \"SET_ROUTE_BROADCAST\":\r\n newState.broadCast = action.broadCast;\r\n break;\r\n case \"CLEAR_FORM\": \r\n newState.clearForm = action.clearForm;\r\n break;\r\n case \"ADDRESS_SEARCH_COMPLETED\":\r\n newState.isAddressSearchCompleted = action.isAddressSearchCompleted;\r\n break;\r\n case \"SET_SYSTEM_SETTINGS\":\r\n newState.systemSettings = action.settings;\r\n break;\r\n case \"SET_USER_POSITION\":\r\n newState.userPosition = action.userPosition;\r\n break;\r\n case \"SET_LAST_PREDICTED_TIME\":\r\n newState.lastPredictedTime = action.lastPredictedTime;\r\n break;\r\n default:\r\n break;\r\n }\r\n return newState;\r\n}\r\n\r\nvar InitialState = {\r\n selectedRoutes: [],\r\n selectedPatterns: [],\r\n selectedStop: null,\r\n selectedAddress: null,\r\n shownStops: [],\r\n tripPlan: null,\r\n tripPlanFrom: null,\r\n tripPlanTo: null,\r\n tripPlanStops: null,\r\n routeList: [],\r\n sidebarShown: true,\r\n globalBroadcasts: [],\r\n routeBroadcasts: [],\r\n stopBroadcasts: [],\r\n broadCast: null,\r\n helpDlgShown: false,\r\n termCondsDlgShown: false,\r\n hasMessage: false, // var message = getQueryStringParameterByName('message');\r\n alertsDlgShown: false,\r\n favoriteRoutes: getFavoriteRoutes(), //Array of route numbers\r\n favoritePatterns: getFavoritePatterns(), //Array of pattern numbers\r\n favoriteStops: getFavoriteStops(), //Array of stop numbers\r\n favoriteStopsOnRoutes: getFavoriteStopsOnRoutes(), //Array of objects with the properties stopNumber and routeNumber\r\n favoriteStopsOnPatterns: getFavoriteStopsOnPatterns(), //Array of objects with the properties stopNumber and patternNumber \r\n walkingPath: null,\r\n alertSavedDlgShown: false,\r\n addressResult: null,\r\n stopResult: null,\r\n filteredRoutes: null,\r\n hasUnreadGlobalBroadcasts: false,\r\n showAllRoutes: false,\r\n infoMessage: null,\r\n searchType: '',\r\n currentPosition: null,\r\n showMyLocation: false,\r\n clearForm: false,\r\n routesLoaded: false,\r\n allPatterns: [],\r\n isAddressSearchCompleted: false,\r\n systemSettings: null,\r\n userPosition: null,\r\n lastPredictedTime: null,\r\n title: window.location.host.indexOf('localhost') !== 0 ? document.title : 'Prediction Portal Development Environment'\r\n};\r\n\r\nvar store = createStore(ReduxReducer, InitialState);\r\n\r\naxios.get('/api/SystemSettings').then(function (settingsResponse) {\r\n var systemSettings = settingsResponse.data;\r\n systemSettings.currentServerTime = dateFromISO(systemSettings.currentServerTime);\r\n systemSettings.localServerTimeDiff = new Date().getTime() - systemSettings.currentServerTime.getTime();\r\n\r\n //If the client has a Google Analytics tracking code configured, asynchronously add Google Analytics to the page\r\n if (systemSettings.googleAnalyticsTrackingCode) {\r\n setTimeout(() => {\r\n (function (i, s, o, g, r, a, m) {\r\n i['GoogleAnalyticsObject'] = r;\r\n i[r] = i[r] || function () {\r\n (i[r].q = i[r].q || []).push(arguments)\r\n };\r\n i[r].l = 1 * new Date();\r\n a = s.createElement(o);\r\n m = s.getElementsByTagName(o)[0];\r\n a.async = 1;\r\n a.src = g;\r\n m.parentNode.insertBefore(a, m);\r\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\r\n\r\n window.ga('create', systemSettings.googleAnalyticsTrackingCode, 'auto');\r\n window.ga('send', 'pageview');\r\n }, 5);\r\n }\r\n\r\n store.dispatch({ type: 'SET_SYSTEM_SETTINGS', settings: systemSettings });\r\n\r\n if (systemSettings.hasTermConditions && localStorage.getItem(\"showTerm\") === null) {\r\n localStorage.setItem('showTerm', true);\r\n store.dispatch({ type: 'SHOW_TERM_CONDS_DLG' });\r\n } else if (localStorage.getItem(\"showHelp\") === null) {\r\n localStorage.setItem('showHelp', true);\r\n store.dispatch({ type: 'SHOW_HELP_DLG' });\r\n }\r\n \r\n //Load list of routes when page loads\r\n LoadRoutes(systemSettings);\r\n}).catch(err=> console.log('Error loading system settings'));\r\n\r\nexport function LoadRoutes(systemSettings) {\r\n axios.get('/api/Route').then(function (response) {\r\n var data = response.data;\r\n var routeList = [];\r\n //If a route/pattern code to show on load was passed in the query string, we need to automatically select that route\r\n var preselectedRoutePatternCode = getQueryStringParameterByName('code');\r\n var preselectedRoutePattern = null;\r\n if (systemSettings.showRouteSelection) {\r\n //Create a list of routes\r\n var routeNumsDic = {};\r\n for (let i = data.length - 1; i >= 0; i--) {\r\n if (!routeNumsDic[data[i].routeNumber]) {\r\n var route = {\r\n routeID: data[i].routeID,\r\n routeNumber: data[i].routeNumber,\r\n routeName: data[i].routeName,\r\n routeCode: data[i].routeCode,\r\n color: data[i].color,\r\n patternIDs: [data[i].patternID],\r\n label: applyTemplate(systemSettings.sidebarPatternTemplate, data[i])\r\n };\r\n routeNumsDic[data[i].routeNumber] = route;\r\n if (preselectedRoutePatternCode && route.routeCode === preselectedRoutePatternCode) preselectedRoutePattern = route;\r\n routeList.push(route);\r\n }\r\n else routeNumsDic[data[i].routeNumber].patternIDs.push(data[i].patternID);\r\n }\r\n\r\n routeList.forEach(r => r.patternIDs.sort()); //Pattern IDs should be sorted since sorted pattern IDs are used as the cache key by the CalculateRoutePathService\r\n }\r\n else {\r\n //Create a list of patterns\r\n for (let i = data.length - 1; i >= 0; i--) {\r\n var pattern = {\r\n patternID: data[i].patternID,\r\n patternName: data[i].patternName,\r\n patternNumber: data[i].patternNumber,\r\n patternCode: data[i].patternCode,\r\n routeNumber: data[i].routeNumber,\r\n routeName: data[i].routeName,\r\n routeCode: data[i].routeCode,\r\n directionID: data[i].directionID,\r\n directionName: data[i].directionName,\r\n color: data[i].color,\r\n label: applyTemplate(systemSettings.sidebarPatternTemplate, data[i])\r\n };\r\n if (preselectedRoutePatternCode && pattern.patternCode === preselectedRoutePatternCode) preselectedRoutePattern = pattern;\r\n routeList.push(pattern);\r\n }\r\n }\r\n\r\n routeList.sort(function (a, b) {\r\n return sortNaturalAlphaNumeric(a, b, 'label');\r\n });\r\n store.dispatch({ type: 'SET_ROUTE_LIST', routeList: routeList });\r\n store.dispatch({ type: 'SET_PATTERN_LIST', allPatterns: data });\r\n if (preselectedRoutePattern) {\r\n preselectedRoutePattern.shouldZoom = true;\r\n store.dispatch({ type: 'SELECT_SINGLE_ROUTE', route: preselectedRoutePattern });\r\n store.dispatch({ type: 'HIDE_SIDEBAR' });\r\n }\r\n });\r\n}\r\n\r\n//If a trip plan request was passed in the query string, we need to automatically load and display that trip plan\r\nvar tripStart = getQueryStringParameterByName('start');\r\nvar tripEnd = getQueryStringParameterByName('destination');\r\nvar departureTime = getQueryStringParameterByName('departureTime');\r\nvar arrivalTime = getQueryStringParameterByName('arrivalTime');\r\nif (tripStart && tripEnd) {\r\n var isoRegex = /\\d{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-5][0-9](:[0-5][0-9])?/;\r\n if ((departureTime && isoRegex.test(departureTime)) || (arrivalTime && isoRegex.test(arrivalTime))) {\r\n var parsedDateTime, tripType;\r\n if (departureTime) {\r\n parsedDateTime = ISOToDateAndTimeInfo(departureTime);\r\n tripType = 'departure';\r\n }\r\n else {\r\n parsedDateTime = ISOToDateAndTimeInfo(arrivalTime);\r\n tripType = 'arrival';\r\n }\r\n getTripPlan(tripStart, tripEnd, tripType, parsedDateTime.date, parsedDateTime.hour, parsedDateTime.minute, parsedDateTime.ampm).then(function (response) {\r\n var tripPlan = response.data;\r\n store.dispatch({ type: 'SET_TRIP_PLAN', tripPlan: tripPlan });\r\n store.dispatch({ type: 'HIDE_SIDEBAR' });\r\n getTripPlanStops(tripPlan).then(function (response) {\r\n store.dispatch({ type: 'SHOW_STOPS', stops: response.data });\r\n });\r\n })\r\n .catch(function (error) {\r\n console.log(error);\r\n alert('Unable to load trip plan');\r\n })\r\n }\r\n}\r\n\r\n//Every 30 seconds, load broadcasts\r\nsetInterval((function loadBroadcasts() {\r\n axios.get('/api/Broadcast').then(function (response) {\r\n var data = response.data;\r\n var globalBroadcasts = [];\r\n var routeBroadcasts = [];\r\n var stopBroadcasts = [];\r\n for (var i = 0; i < data.length; i++) {\r\n if (data[i].routeNum || data[i].patternId) routeBroadcasts.push(data[i]);\r\n else if (data[i].stopNum) stopBroadcasts.push(data[i]);\r\n else globalBroadcasts.push(data[i]);\r\n }\r\n store.dispatch({ type: 'UPDATE_BROADCASTS', globalBroadcasts: globalBroadcasts, routeBroadcasts: routeBroadcasts, stopBroadcasts: stopBroadcasts });\r\n });\r\n return loadBroadcasts;\r\n})(), 30000);\r\n\r\nexport default store;"],"sourceRoot":""}