PageSourceSearch

https://assets.locations.dtlr.com/js/babel/module/locator.js?v=b241a3e5b5d47231bf70112209c58bdf)

js dtlr.com collected 2026-09-25 10:24:13 UTC 49,658 bytes, 1,581 lines download raw bytes

1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4    value: true
5});
6
7var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
8
9function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
10
11/* Variables defined in config.php, copied here for text editor assistance and scoping */
12var pageLevel$1 = $config.pageLevel;
13var domainName$1 = $config.domainName;
14var fullDomainName = $config.fullDomainName;
15$config.assetsUrl;
16$config.mapsUrl;
17$config.defaultRadius;
18$config.isMobile;
19$config.protocol;
20$config.urlCountryCode;
21$config.language;
22$config.dictionary;
23var pageHasMap = $config.pageHasMap;
24var specialties = $config.specialties;
25var tileMode = $config.tileMode;
26var searchPageUrl = $config.searchPageUrl;
27$config.defaultListHtml;
28var defaultListData = $config.defaultListData;
29var redirectOnSearch = $config.redirectOnSearch;
30var regionData = JSON.parse($config.regionData);
31var enableLeafletPopups = $config.enableLeafletPopups;
32var autoSearch = $config.autoSearch;
33var userLocationPin = $config.userLocationPin;
34var browseMode = $config.browseMode;
35
36var HERE_APP_ID = '9rBITyPARX9UO8lBrmdI'; // change this
37var HERE_APP_CODE = 'wfb3CAIGhfgCRyVhap7dUg'; // change this
38
39/* Other variables */
40var useHardwareLocation = true;
41var enableHighAccuracy = true;
42var maximumAge = 0;
43var timeout = 6000;
44var loadMap = window.innerWidth > 767 && pageLevel$1 != 'region' && !browseMode && pageLevel$1 != 'region';
45var searchUrl = '//maps.' + domainName$1 + '/api/getAsyncLocations';
46var locale = "en-us";
47var zoomControlPosition = 'bottomright';
48var mapStyles = [{
49    "featureType": "administrative.country",
50    "elementType": "geometry",
51    "stylers": [{
52        "visibility": "simplified"
53    }, {
54        "hue": "#ff0000"
55    }]
56}, {
57    "featureType": "poi",
58    "elementType": "labels.text",
59    "stylers": [{
60        "visibility": "off"
61    }]
62}, {
63    "featureType": "poi",
64    "elementType": "labels.icon",
65    "stylers": [{
66        "visibility": "off"
67    }]
68}, {
69    "featureType": "transit.station",
70    "elementType": "labels.icon",
71    "stylers": [{
72        "visibility": "off"
73    }]
74}, {
75    "featureType": "water",
76    "elementType": "geometry.fill",
77    "stylers": [{
78        "visibility": "on"
79    }, {
80        "color": "#d8eeff"
81    }]
82}];
83var TileMode = {
84    GOOGLE: "GOOGLE",
85    BING: 'BING',
86    MAPBOX: 'MAPBOX',
87    BAIDU: 'BAIDU',
88    HERE: 'HERE',
89    DEFAULT: 'DEFAULT'
90};
91var MarkerShape = {
92    "ROUND": "ROUND",
93    "DROP": "DROP"
94};
95var MarkerShapeData = {
96    ROUND: {
97        size: [32, 39],
98        anchor: [16, 39],
99        popupAnchor: [1, -18]
100    },
101    DROP: {
102        size: [32, 39],
103        anchor: [16, 39],
104        popupAnchor: [1, -18]
105    }
106};
107
108var markerShape = pageLevel$1 == 'domain' || pageLevel$1 == 'city' || pageLevel$1 == 'indy' ? MarkerShape.DROP : MarkerShape.ROUND;
109
110if (autoSearch) {
111    switch (pageLevel$1) {
112        case 'indy':
113            autoSearch = false;
114            break;
115        case 'city':
116            autoSearch = false;
117            break;
118        case 'region':
119            autoSearch = false;
120            break;
121    }
122}
123
124var Status = {
125    LOADING: 'geolocation-loading',
126    NO_RESULTS: 'no-results',
127    MAP_MODE: 'map-mode',
128    SEARCH_INVALID: 'search-invalid',
129    FILTER_ITEM_HIDDEN: 'filter-item-hidden',
130    PAN_SEARCH_ACTIVE: 'pan-search-active',
131    MAP_CROSSHAIR_POINTER_ACTIVE: 'map-crosshair-pointer-active',
132    MAP_ZOOMED_OUT_SEARCH_ACTIVE: 'map-zoomed-out-search-active'
133};
134var Events = {
135    'SEARCH_SUBMIT': 'SEARCH_SUBMIT',
136    'SEARCH_PAN_ZOOM_SUBMIT': 'SEARCH_PAN_ZOOM_SUBMIT',
137    'SEARCH_INVALID': 'SEARCH_INVALID',
138    'SEARCH_SUCCESS': 'SEARCH_SUCCESS',
139    'SEARCH_NEARBY': 'SEARCH_NEARBY',
140    'SEARCH_FAIL': 'SEARCH_FAIL',
141    'SEARCH_NO_RESULTS': 'SEARCH_NO_RESULTS',
142    'ASYNC_RESULTS': 'ASYNC_RESULTS',
143    'MAP_PINS_READY': 'MAP_PINS_READY',
144    'CREATE_MAP': 'CREATE_MAP',
145    'OPEN_POPUP': 'OPEN_POPUP',
146    'MAP_CENTERED': 'MAP_CENTERED',
147    'MAP_CREATED': 'MAP_CREATED',
148    'MAP_LIST_READY': 'MAP_LIST_READY',
149    'MAP_FILTERS_READY': 'MAP_FILTERS_READY',
150    'MAP_LIST_HOURS_READY': 'MAP_LIST_HOURS_READY',
151    'LIVE_DATA_READY': 'LIVE_DATA_READY',
152    'MAP_TASKS_COMPLETE': 'MAP_TASKS_COMPLETE',
153    'RESET_DEFAULT_DATA': 'RESET_DEFAULT_DATA',
154    'PAN_SEARCH_SUBMIT': 'PAN_SEARCH_SUBMIT',
155    'MOBILE_MAP_INITIALIZE': 'MOBILE_MAP_INITIALIZE',
156    'APPLY_FILTERS': 'APPLY_FILTERS',
157    'NUMBER_MAP_PINS': 'NUMBER_MAP_PINS',
158    'REMOVE_MAP': 'REMOVE_MAP'
159};
160
161var historyStates = [];
162
163var State = function State(term, nearby) {
164    _classCallCheck(this, State);
165
166    this.term = term;
167    this.data = {};
168    this.nearby = nearby;
169    this.id = generateUUID();
170};
171
172function push(term) {
173    var nearby = true;
174    if (typeof term['searchTerm'] != 'undefined') {
175        nearby = false;
176    }
177
178    var state = new State(term, nearby);
179
180    $(document).one(Events.SEARCH_SUCCESS, function (event, data) {
181        state.data = data;
182        historyStates.push(state);
183        var term = state.nearby ? '?lat=' + state.term['lat'] + '&lng=' + state.term['lng'] : '?q=' + state.term['searchTerm'];
184        window.history.pushState({ id: state.id }, state.term, '' + term);
185    });
186}
187
188function init() {
189    window.onpopstate = function (event) {
190        console.log(event);
191        if (event.state && event.state.id) {
192            var state = getStateById(event.state.id);
193            $(document).trigger(Events.ASYNC_RESULTS, state.data);
194        }
195    };
196}
197
198function getStateById(id) {
199    var targetState = void 0;
200    historyStates.forEach(function (state) {
201        if (state.id == id) {
202            targetState = state;
203        }
204    });
205    return targetState;
206}
207
208function generateUUID() {
209    // Public Domain/MIT
210    var d = new Date().getTime();
211    if (typeof performance !== 'undefined' && typeof performance.now === 'function') {
212        d += performance.now(); //use high-precision timer if available
213    }
214    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
215        var r = (d + Math.random() * 16) % 16 | 0;
216        d = Math.floor(d / 16);
217        return (c === 'x' ? r : r & 0x3 | 0x8).toString(16);
218    });
219}
220
221var _regex = /{{[\w\s:\|\.]+}}/g;
222var _bracketsRegex = /({{)|(}})/g;
223
224/** @description Renders template html with data and returns the result  
225 * @param {string} html The html template.
226 * @param {JSON} data The data in JSON format.
227 * @return {string} The processed html.
228 */
229var render = function render(html, data) {
230    var name;
231    var matches = html.match(_regex);
232    var length = matches.length;
233    var i;
234    var match = void 0;
235
236    for (i = 0; i < length; i++) {
237        match = matches[i];
238        name = match.replace(_bracketsRegex, '');
239        if (data[name]) {
240            html = html.replace(match, data[name]);
241        } else {
242            html = html.replace(match, '');
243        }
244    }
245    return html;
246};
247
248var GEO_COOKIE_NAME = 'rls_geo_data';
249
250function setCookie(cname, cvalue, exdays) {
251    var d = new Date();
252    var days = exdays || 365;
253    d.setTime(d.getTime() + days * 24 * 60 * 60 * 1000);
254    var expires = "expires=" + d.toUTCString();
255    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
256}
257
258function getCookie(cname) {
259    var name = cname + "=";
260    var decodedCookie = decodeURIComponent(document.cookie);
261    var ca = decodedCookie.split(';');
262    for (var i = 0; i < ca.length; i++) {
263        var c = ca[i];
264        while (c.charAt(0) == ' ') {
265            c = c.substring(1);
266        }
267        if (c.indexOf(name) == 0) {
268            return c.substring(name.length, c.length);
269        }
270    }
271    return "";
272}
273
274var regionZoomSearch = false;
275
276function getZoomRegionSearch() {
277    return regionZoomSearch;
278}
279function setZoomRegionSearch(value) {
280    regionZoomSearch = value;
281}
282
283function initPanZoom(MapData) {
284    var zooming = false;
285    var moving = false;
286    var interacting = false;
287    var panInterval = null;
288    var initialPan = true;
289
290    var Threshold = {
291        big: .75, // 3/4 of 1
292        small: .2575, // 3/4 of .25
293        zoom: 7
294    };
295    var ClassNames = {
296        PAN_SEARCH_ACTIVE: 'pan-search-active'
297    };
298    var Activity = {
299        panSearchActive: false
300    };
301    var Position = {
302        start: {
303            lat: MapData.map.getCenter().lat,
304            lng: MapData.map.getCenter().lng
305        },
306        stop: {
307            lat: MapData.map.getCenter().lat,
308            lng: MapData.map.getCenter().lng
309        }
310    };
311    var Zoom = {
312        previous: MapData.map.getZoom(),
313        current: MapData.map.getZoom(),
314        difference: function difference() {
315            return Zoom.current - Zoom.previous;
316        }
317    };
318
319    // interaction
320    MapData.map.on('mousedown', function (event) {
321        interacting = true;
322    });
323    MapData.map.on('mouseup', function (event) {
324        if (!moving && !zooming) {
325            interacting = false;
326        }
327    });
328    var elements = document.querySelectorAll('a.leaflet-control-zoom-in, a.leaflet-control-zoom-out');
329    for (var i = 0; i < elements.length; i++) {
330        L.DomEvent.addListener(elements[i], 'click', function (event) {
331            interacting = true;
332        });
333    }
334    var setPanSearchActive = function setPanSearchActive(active) {
335        Activity.panSearchActive = active;
336        if (active) {
337            $('body').addClass(ClassNames.PAN_SEARCH_ACTIVE);
338        } else {
339            $('body').removeClass(ClassNames.PAN_SEARCH_ACTIVE);
340        }
341    };
342    var panCallback = function panCallback() {
343        var lat = MapData.map.getCenter().lat;
344        var lng = MapData.map.getCenter().lng;
345        var differenceLat = lat - Position.start.lat;
346        var differenceLng = lng - Position.start.lng;
347
348        var distance = Math.sqrt(Math.pow(differenceLat, 2) + Math.pow(differenceLng, 2));
349
350        setPanSearchActive(distance > Threshold.small);
351    };
352    // event handlers
353    MapData.map.on('movestart', function (event) {
354        Zoom.current = MapData.map.getZoom();
355
356        if (!zooming && interacting && Zoom.current >= Threshold.zoom) {
357            if (initialPan) {
358                Position.start.lat = MapData.map.getCenter().lat;
359                Position.start.lng = MapData.map.getCenter().lng;
360                initialPan = false;
361            }
362            moving = true;
363            panCallback();
364            panInterval = setInterval(panCallback, 200);
365        }
366    });
367    MapData.map.on('moveend', function (event) {
368        if (!zooming && moving) {
369            moving = false;
370            interacting = false;
371            Position.stop.lat = MapData.map.getCenter().lat;
372            Position.stop.lng = MapData.map.getCenter().lng;
373            clearInterval(panInterval);
374            Activity.panSearchActive && triggerSearch();
375        }
376    });
377    MapData.map.on('zoomstart', function (event) {
378        if (!moving && interacting) {
379            zooming = true;
380            Zoom.previous = MapData.map.getZoom();
381        }
382    });
383    MapData.map.on('zoomend', function (event) {
384        if (!moving && zooming) {
385            zooming = false;
386            interacting = false;
387            Zoom.current = MapData.map.getZoom();
388            if (zoomTest()) {
389
390                if (Threshold.zoom > Zoom.current) {
391                    regionZoomSearch = true;
392                }
393                triggerSearch();
394            }
395        }
396    });
397    $(document).on(Events.MAP_CENTERED, function () {
398        Position.start.lat = MapData.map.getCenter().lat;
399        Position.start.lng = MapData.map.getCenter().lng;
400        Position.stop.lat = MapData.map.getCenter().lat;
401        Position.stop.lng = MapData.map.getCenter().lng;
402        Zoom.previous = MapData.map.getZoom();
403    });
404
405    var zoomTest = function zoomTest() {
406        return Zoom.difference() < 0 && Zoom.current == Threshold.zoom - 1 || Zoom.difference() > 0 && Zoom.current == Threshold.zoom;
407    };
408
409    // send the search!
410    var triggerSearch = function triggerSearch() {
411        $(document).trigger(Events.SEARCH_PAN_ZOOM_SUBMIT, {
412            lat: MapData.map.getCenter().lat,
413            lng: MapData.map.getCenter().lng,
414            zoom: MapData.map.getZoom()
415        });
416
417        Position.start.lat = MapData.map.getCenter().lat;
418        Position.start.lng = MapData.map.getCenter().lng;
419
420        setPanSearchActive(false);
421    };
422}
423
424var mapCreated = false;
425var useMarkerClusters = false;
426var nearbySearch = false;
427var centeringEnabled = true;
428
429var MapCenters = {
430    'en-us': {
431        lat: 39.5,
432        lng: -98.35,
433        zoom: 4
434    }
435};
436
437var MarkerData = {
438    markers: [],
439    psid: 1,
440    markerObjects: {}
441};
442
443var MapData = {
444    map: {},
445    tileLayer: {},
446    clusters: {}
447};
448function setClusters(useClusters) {
449    useMarkerClusters = useClusters;
450}
451function setNearbySearch(isNearbySearch) {
452    nearbySearch = isNearbySearch;
453}
454function isNearbySearch() {
455    return nearbySearch;
456}
457function data$4(__data) {
458    var data = __data || null;
459    if (data === null) {
460        return MarkerData;
461    } else {
462        MarkerData.markers = data;
463        if (data.options && data.options.psid) {
464            marker_psid = data.options.psid;
465        }
466        if (mapCreated) {
467            createPins();
468            createUserLocationMarker();
469            centerMap();
470        } else {
471            $(document).on(Events.MAP_CREATED, function () {
472                createPins();
473                createUserLocationMarker();
474                centerMap();
475            });
476        }
477    }
478}
479
480function create() {
481    createMap(tileMode);
482}
483
484function removeMap() {
485
486    //Remove user location marker from Marker Data
487    if (typeof MarkerData.markers[MarkerData.markers.length - 1]['className'] != 'undefined' && MarkerData.markers[MarkerData.markers.length - 1]['className'].indexOf('current-location') > -1) {
488        MarkerData.markers.pop();
489    }
490
491    removePins();
492    MapData.map.remove();
493    mapCreated = false;
494}
495
496/**
497 * @description Create a new Leaflet map using a tileMode
498 * @param {*} tileMode TileMode
499 */
500function createMap(tileMode) {
501    if (mapCreated) {
502        return;
503    }
504    switch (tileMode) {
505        case TileMode.GOOGLE:
506            createGoogleMap();
507            break;
508        case TileMode.BING:
509            createBingMap();
510            break;
511        case TileMode.MAPBOX:
512            createMapboxMap();
513            break;
514        case TileMode.BAIDU:
515            createBaiduMap();
516            break;
517        case TileMode.HERE:
518            createHereMap();
519            break;
520        case TileMode.DEFAULT:
521            createGoogleMap();
522            break;
523    }
524    mapCreated = true;
525    $(document).trigger(Events.MAP_CREATED);
526    {
527        initPanZoom(MapData);
528    }
529}
530
531function createHereMap() {
532    MapData.map = L.map('gmap', {
533        zoomControl: true,
534        attributionControl: false,
535        scrollWheelZoom: false,
536        doubleClickZoom: 'center'
537    }).setView([MapCenters[locale].lat, MapCenters[locale].lng], MapCenters[locale].zoom);
538
539    L.tileLayer.here({
540        appId: HERE_APP_ID,
541        appCode: HERE_APP_CODE,
542        style: 'dreamworks'
543    }).addTo(MapData.map);
544}
545
546function createGoogleMap() {
547    MapData.map = L.map('gmap', {
548        zoomControl: false,
549        attributionControl: false,
550        scrollWheelZoom: false,
551        doubleClickZoom: 'center'
552    }).setView([MapCenters[locale].lat, MapCenters[locale].lng], MapCenters[locale].zoom);
553
554    L.control.zoom({
555        position: zoomControlPosition
556    }).addTo(MapData.map);
557
558    L.gridLayer.googleMutant({
559        type: 'roadmap', // valid values are 'roadmap', 'satellite', 'terrain' and 'hybrid'
560        styles: mapStyles
561    }).addTo(MapData.map);
562}
563
564function createMapboxMap() {
565    MapData.map = L.map('gmap', {
566        zoomControl: true,
567        attributionControl: false,
568        scrollWheelZoom: true,
569        doubleClickZoom: 'center'
570    }).setView([MapCenters[locale].lat, MapCenters[locale].lng], MapCenters[locale].zoom);
571
572    var accessUrl = 'https://api.mapbox.com/styles/v1/mapbox/streets-v11/tiles/{z}/{x}/{y}?access_token=';
573    L.tileLayer(accessUrl + MAPBOX_KEY, {
574        style: 'mapbox://styles/mapbox/bright-v11',
575        tileSize: 512,
576        zoomOffset: -1
577    }).addTo(MapData.map);
578
579    var credits = L.control.attribution().addTo(MapData.map);
580    credits.addAttribution('© <a href="https://www.mapbox.com/about/maps/">Mapbox</a> © <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>');
581}
582
583function createBingMap() {
584    MapData.map = L.map('gmap', {
585        zoomControl: false,
586        attributionControl: false,
587        scrollWheelZoom: false,
588        doubleClickZoom: 'center'
589    }).setView([MapCenters[locale].lat, MapCenters[locale].lng], MapCenters[locale].zoom);
590    //    L.control.attribution({
591    //        prefix: false 
592    //    }).addTo(map);
593
594    L.tileLayer.bing({
595        bingMapsKey: BING_KEY,
596        imagerySet: 'Road'
597    }).addTo(MapData.map);
598}
599
600function createBaiduMap() {
601    var options = {
602        crs: L.CRS.EPSGB3857,
603        center: [MapCenters[locale].lat, MapCenters[locale].lng],
604        zoom: MapCenters[locale].zoom,
605        zoomControl: false,
606        attributionControl: false,
607        scrollWheelZoom: false,
608        doubleClickZoom: 'center'
609    };
610
611    var baseMaps = {
612        Normal: new L.TileLayer.BaiduLayer("Normal.Map")
613    };
614
615    options.layers = [baseMaps.Normal];
616    MapData.map = L.map("gmap", options);
617
618    L.control.zoom({
619        position: Settings.zoomControlPosition
620    }).addTo(MapData.map);
621
622    L.control.layers(baseMaps).addTo(MapData.map);
623}
624
625function removePins() {
626    if (!mapCreated) {
627        return;
628    }
629
630    $('.map-marker').remove();
631
632    if (MapData.map.hasLayer(MapData.clusters)) {
633
634        MapData.map.removeLayer(MapData.clusters);
635    }
636    MarkerData.markerObjects = {};
637}
638
639function createUserLocationMarker() {
640    var cookieData = getCookie(GEO_COOKIE_NAME);
641    if (typeof cookieData != 'undefined' && cookieData != '' && userLocationPin) {
642        cookieData = JSON.parse(cookieData);
643        var customMarkerData = {
644            className: 'map-marker cmOverlay current-location',
645            iconSize: [20, 20],
646            iconAnchor: [10, 10],
647            lat: cookieData.latitude,
648            lng: cookieData.longitude,
649            particleGroupNames: [], // used for data-particles on map pins, example: ['Location Type', 'Brands Carried']
650            visible: true
651        };
652        var icon = L.DivIcon.dataMarkup(customMarkerData);
653        var newMarker = L.marker([cookieData.latitude, cookieData.longitude], {
654            icon: icon
655        });
656        newMarker.addTo(MapData.map);
657
658        if (nearbySearch) {
659            MarkerData.markers.push(customMarkerData);
660        }
661    }
662}
663
664function preProcessMarkerInfo(data) {
665    return data;
666}
667
668function createPins() {
669    if (!mapCreated) {
670        $(document).one(Events.MAP_CREATED, function () {
671            mapCreated = true;
672            createPins();
673        });
674    }
675    removePins();
676
677    var markers = MarkerData.markers;
678
679    if (MarkerData.psid == 2 || MarkerData.psid == 4) {
680        useMarkerClusters = false;
681    }
682
683    if (useMarkerClusters) {
684        MapData.clusters = L.markerClusterGroup({
685            spiderfyOnMaxZoom: false,
686            disableClusteringAtZoom: 8
687        });
688        MapData.clusters.on('animationend', function () {
689            $(document).trigger(Events.MAP_PINS_READY);
690            $(document).trigger(Events.NUMBER_MAP_PINS);
691            $(document).trigger(Events.APPLY_FILTERS);
692        });
693    }
694
695    for (var i = 0; i < markers.length; i++) {
696        var marker = markers[i];
697
698        marker.visible = true;
699
700        var classNames = 'map-marker cmOverlay filter-item';
701        if (markerShape == MarkerShape.ROUND) {
702            classNames = classNames + ' rounded';
703        }
704
705        var icon = L.DivIcon.dataMarkup({
706            className: classNames,
707            iconSize: MarkerShapeData[markerShape].size,
708            iconAnchor: MarkerShapeData[markerShape].anchor,
709            popupAnchor: MarkerShapeData[markerShape].popupAnchor,
710            lid: marker.locationId,
711            lat: marker.lat,
712            lng: marker.lng,
713            visible: true,
714            specialties: marker.specialties
715        });
716
717        // prepare marker.info for use in template processor
718        var popUpHtml = '';
719
720        if (typeof marker.info != 'undefined' && marker.info != '') {
721            var markerInfo = marker.info.substring(26, marker.info.length - 6);
722
723            var markerInfoJson = JSON.parse(markerInfo);
724
725            if (Object.keys(markerInfoJson).length > 0) {
726                // get marker popup template
727                var template = Styles.popup_locations;
728                if (pageLevel == 'domain' && typeof markerInfoJson.lid == 'undefined') {
729                    template = Styles.popup_regions;
730                }
731                if (pageLevel == 'region') {
732                    template = Styles.popup_cities;
733                }
734                markerInfoJson = preProcessMarkerInfo(markerInfoJson);
735                popUpHtml = render(template, markerInfoJson);
736            }
737        }
738        var newMarker = L.marker([marker.lat, marker.lng], {
739            icon: icon
740        });
741
742        if (popUpHtml != '' && (enableLeafletPopups || getZoomRegionSearch())) {
743            newMarker.bindPopup(popUpHtml, {
744                autoPanPadding: L.point(80, 80),
745                minWidth: 230
746            }).on('popupopen', function () {
747                $('body').addClass('popup-open');
748            }).on('popupclose', function () {
749                $('body').removeClass('popup-open');
750                $('.map-list-item-wrap').removeClass('selected');
751                $('.cmOverlay').removeClass('selected');
752            });
753        }
754        if (!useMarkerClusters) {
755            newMarker.addTo(MapData.map);
756        } else {
757            MapData.clusters.addLayer(newMarker);
758            MapData.map.addLayer(MapData.clusters);
759            MarkerData.markerObjects['marker' + marker.locationId] = newMarker;
760        }
761    }
762
763    setZoomRegionSearch(false);
764
765    if (!useMarkerClusters) {
766        $(document).trigger(Events.MAP_PINS_READY);
767    }
768}
769
770function centerMap() {
771    if (!mapCreated || !centeringEnabled) {
772        return;
773    }
774
775    var lats = [];
776    var lngs = [];
777    var markers = MarkerData.markers;
778
779    for (var i = 0; i < markers.length; i++) {
780        if (markers[i].visible) {
781            lats.push(markers[i].lat);
782            lngs.push(markers[i].lng);
783        }
784    }
785
786    lats.sort(function (a, b) {
787        return a - b;
788    });
789    lngs.sort(function (a, b) {
790        return a - b;
791    });
792
793    var minLat = lats[0];
794    var minLng = lngs[0];
795    var maxLat = lats[lats.length - 1];
796    var maxLng = lngs[lngs.length - 1];
797
798    var southWest = new L.LatLng(minLat, maxLng);
799    var northEast = new L.LatLng(maxLat, minLng);
800    var bounds = new L.LatLngBounds(southWest, northEast);
801
802    // TODO: FIX THIS
803    // if (MapSettings.CENTER_MAP_ENABLED) {
804    MapData.map.fitBounds(bounds, {
805        padding: [60, 60],
806        maxZoom: 14,
807        noMoveStart: true
808    });
809    // }
810
811    $(document).trigger(Events.MAP_CENTERED);
812}
813
814function processMapDefaultData(_data) {
815    var data = _data || RLS.defaultData;
816    var markerData = data.markerData;
817    var locationSpecialties = {};
818    if (data.locationSpecialties) {
819        locationSpecialties = data.locationSpecialties;
820    }
821    var spids = [];
822    for (var name in locationSpecialties) {
823        spids.push(name.replace('spid', ''));
824    }
825
826    var specialtyData = {};
827    var locations = [];
828
829    if (specialties && specialties.length) {
830        for (var i = 0; i < specialties.length; i++) {
831            var specialty = specialties[i];
832            if (spids.indexOf(specialty.spid) != -1) {
833                var lids = [];
834                for (var key in locationSpecialties['spid' + specialty.spid]) {
835                    if (key.indexOf('lid') != -1) {
836                        var lid = key.replace('lid', '');
837                        lids.push(lid);
838                        if (locations.indexOf(lid) == -1) {
839                            locations.push(lid);
840                        }
841                    }
842                }
843                specialtyData[specialty.spid] = {
844                    spid: specialty.spid,
845                    name: specialty.name,
846                    group: specialty.group,
847                    lids: lids
848                };
849            }
850        }
851    }
852
853    var markerSpecialties = {};
854    for (var i = 0; i < locations.length; i++) {
855        var lid = locations[i];
856        var locationSpecialties = [];
857
858        for (var key in specialtyData) {
859            if (specialtyData[key].lids.indexOf(lid) != -1) {
860                locationSpecialties.push(specialtyData);
861                if (markerSpecialties[lid]) ;else {
862                    markerSpecialties[lid] = [];
863                }
864                markerSpecialties[lid].push({
865                    name: specialtyData[key].name,
866                    spid: specialtyData[key].spid,
867                    group: specialtyData[key].group
868                });
869            }
870        }
871    }
872
873    for (var i = 0; i < markerData.length; i++) {
874        var lid = markerData[i].lid;
875        markerData[i]['locationId'] = lid;
876        markerData[i]['specialties'] = markerSpecialties[lid];
877    }
878    MarkerData.markers = markerData;
879    return MarkerData.markers;
880}
881function setCenteringEnabled(enabled) {
882    centeringEnabled = enabled;
883}
884
885var initialSearch = true;
886var $el$1 = $('#map-search-form');
887var form_data = formDataFromArray($el$1.serializeArray());
888$el$1.find('input[type=text]').attr('placeholder', 'Enter City, State, or Zip Code');
889
890$el$1.on('submit', function (event) {
891    event.preventDefault();
892    form_data = formDataFromArray($el$1.serializeArray());
893
894    $(document).trigger(Events.SEARCH_SUBMIT, form_data);
895});
896
897$el$1.change(function (event) {
898    form_data = formDataFromArray($el$1.serializeArray());
899    $el$1.find('input[type=text]').attr('placeholder', 'Enter City, State, or Zip Code');
900});
901
902function isInitialSearch() {
903    return initialSearch;
904}
905
906function setInitialSearch(isInitialSearch) {
907    initialSearch = isInitialSearch;
908}
909
910var $nearby = $('#search-near-me');
911$nearby.on('click', function (ev) {
912    ev.preventDefault();
913    $(document).trigger(Events.SEARCH_NEARBY);
914});
915
916function nearby(data) {
917    return new Promise(function (resolve, reject) {
918        var url = searchUrl + '?template=search&level=search';
919
920        if (typeof data != 'undefined' && typeof oppositeBrandURL[brand] != 'undefined') {
921            url = oppositeBrandURL[brand] + '?template=search&level=search';
922        }
923
924        var searchTerm = getSearchTermFromURL();
925        var coordinates = getLatLngFromURL();
926        var IP = getIPFromURL();
927        var cookieData = getCookie(GEO_COOKIE_NAME);
928
929        if (searchTerm !== '' && initialSearch) {
930            if (isRegion$1(searchTerm)) {
931                url = '//' + fullDomainName + '/' + regionData[searchTerm]['region_lc'] + '/';
932                window.location.href = url;
933                return;
934            } else {
935                if (typeof searchTerm != 'undefined' && searchTerm.length == 5 && !isNaN(searchTerm)) {
936                    searchTerm = searchTerm + ', US';
937                }
938
939                url = url + '&search=' + searchTerm;
940            }
941            setNearbySearch(false);
942        } else if (coordinates !== '' && initialSearch) {
943            url += '&lat=' + coordinates['lat'] + '&lng=' + coordinates['lng'];
944            var _data2 = {
945                latitude: coordinates['lat'],
946                longitude: coordinates['lng']
947            };
948            setNearbySearch(true);
949            setCookie(GEO_COOKIE_NAME, JSON.stringify(_data2));
950        } else if (IP !== '' && initialSearch) {
951            url = url + '&' + IP;
952            setNearbySearch(false);
953        } else if (cookieData !== '' && (searchTerm == '' || isNearbySearch())) {
954            var _data3 = JSON.parse(cookieData);
955
956            if (_data3 != null) {
957                url += '&lat=' + _data3.latitude + '&lng=' + _data3.longitude;
958            }
959            setNearbySearch(true);
960        }
961        $.ajax(url).done(function (data) {
962            resolve(data);
963        });
964    });
965}
966
967function data$3(__data) {
968    var _data = __data || null;
969    if (_data === null) {
970        return form_data;
971    } else {
972        if (_data.options && _data.options.search) {
973
974            // Replace , US that was added for zip code search when populating the input box value
975            if (_data.options.search.indexOf(', US') == _data.options.search.length - 4 && !isNaN(_data.options.search.replace(', US', ''))) {
976                _data.options.search = _data.options.search.replace(', US', '');
977            }
978
979            $el$1.find('input[type=text]').val(_data.options.search);
980        }
981        if (_data.searchTerm) {
982
983            // Replace , US that was added for zip code search when populating the input box value
984            if (_data.searchTerm.indexOf(', US') == _data.searchTerm.length - 4 && !isNaN(_data.searchTerm.replace(', US', ''))) {
985                _data.searchTerm = _data.searchTerm.replace(', US', '');
986            }
987
988            $el$1.find('input[type=text]').val(_data.searchTerm);
989        }
990        if (_data.searchType) {
991            $el$1.find('input[value=' + _data.searchType + ']').click();
992        }
993        form_data = formDataFromArray($el$1.serializeArray());
994    }
995}
996
997function locate(search, data) {
998    return new Promise(function (resolve, reject) {
999        var searchTerm = search['locator-search-value'];
1000        var url = void 0;
1001
1002        var searchValue = [searchTerm];
1003        if (isRegion$1(searchValue)) {
1004            url = '//' + fullDomainName + '/' + regionData[searchValue[0]]['region_lc'] + '/';
1005            $('body').removeClass('geolocation-loading');
1006            window.location.href = url;
1007            return;
1008        } else {
1009            if (typeof searchTerm != 'undefined' && searchTerm.length == 5 && !isNaN(searchTerm)) {
1010                searchTerm = searchTerm + ', US';
1011            }
1012
1013            url = searchUrl + '?template=search&level=search&search=' + searchTerm;
1014
1015            if (typeof data != 'undefined' && data != null && typeof oppositeBrandURL[brand] != 'undefined') {
1016                url = oppositeBrandURL[brand] + '?template=search&level=search&search=' + searchTerm;
1017            }
1018        }
1019
1020        $.ajax(url).done(function (data) {
1021            resolve(data);
1022        });
1023    });
1024}
1025
1026function panZoom(panZoomData) {
1027    return new Promise(function (resolve, reject) {
1028        var url = void 0;
1029
1030        if (panZoomData.zoom >= 7) {
1031            url = searchUrl + '?template=search&level=search&lat=' + panZoomData.lat + '&lng=' + panZoomData.lng;
1032        } else {
1033            url = '//' + fullDomainName + '/api/';
1034        }
1035
1036        $.ajax(url).done(function (data) {
1037            resolve(data);
1038        });
1039    });
1040}
1041
1042function formDataFromArray(array) {
1043    var formData = {};
1044    array.forEach(function (value) {
1045        formData[value.name] = value.value;
1046    });
1047    return formData;
1048}
1049
1050function getIPFromURL() {
1051    var query = '';
1052    var pattern = /(^|&|\?)(ip=)([0-9]+\.)([0-9]+\.)([0-9]+\.)([0-9]+)/;
1053    var match = pattern.exec(window.location.href);
1054    if (match != null) {
1055        var query = match[0];
1056        // test if private ip
1057        var privateIpPattern = /(^127\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)/;
1058        var ip = query.split('=')[1];
1059        if (!privateIpPattern.test(ip)) {
1060            // test if we matched a '&' or '?'
1061            if (query.charAt(0) == '&' || query.charAt(0) == '?') {
1062                query = query.substr(1);
1063            }
1064        }
1065    }
1066    return query;
1067}
1068function getSearchTermFromURL() {
1069    var query = '';
1070    var pattern = /(\?|&)q=(.*)(&|$)/;
1071    var match = pattern.exec(window.location.href);
1072    if (match != null) {
1073        query = match[2];
1074    }
1075    return query;
1076}
1077
1078function getLatLngFromURL() {
1079    var vars = {};
1080    var query = '';
1081    var locationUrl = window.location.href.split('#')[0];
1082    locationUrl.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (m, key, value) {
1083        vars[key] = value;
1084    });
1085
1086    if (typeof vars['lat'] != 'undefined' && typeof vars['lng'] != 'undefined') {
1087        query = vars;
1088    }
1089
1090    return query;
1091}
1092
1093function isRegion$1(array) {
1094    var searchTerm = array[0];
1095    var regex = /(,*\s*(%20)*[Uu][Ss][Aa]*)$/;
1096    searchTerm = searchTerm.replace(regex, '');
1097    if (regionData[searchTerm.toLowerCase()]) {
1098        array[0] = searchTerm.toLowerCase();
1099        return true;
1100    }
1101    return false;
1102}
1103
1104/* uses globally-scoped Styles object defined in templates.html */
1105
1106var $el = $('.map-list');
1107var doc_html = '';
1108var map_list_data = {};
1109var map_list_style = Styles.list_locations;
1110
1111var data$2 = function data$2(__data) {
1112    var _data = __data || null;
1113    if (_data === null) {
1114        return map_list_data;
1115    } else {
1116        map_list_data = _data;
1117        doc_html = renderMapList(map_list_style, map_list_data);
1118        $el.html(doc_html);
1119        map_list_data.forEach(function (value) {
1120            var lid = value.lid;
1121            var $el = $('.map-list-item-wrap[data-lid=' + lid + ']');
1122            value.$el = $el;
1123        });
1124        $(document).trigger(Events.MAP_LIST_READY);
1125    }
1126};
1127
1128var setTemplate = function setTemplate(__template) {
1129    map_list_style = __template;
1130};
1131
1132var setElement = function setElement(__element) {
1133    $el = $(__element);
1134};
1135
1136function renderMapList(template, data) {
1137    var renderedHTML = '';
1138    for (var i = 0; i < data.length; i++) {
1139        data[i] = preProcessMapListData(data[i]);
1140        renderedHTML += render(template, data[i]);
1141    }
1142    return renderedHTML;
1143}
1144
1145// Use to pre-process any data or to append any data that is needed in the map list
1146function preProcessMapListData(data) {
1147    data['address_1_urlencoded'] = typeof data['address_1'] != 'undefined' ? encodeURIComponent(data['address_1']) : '';
1148    data['address_2_urlencoded'] = typeof data['address_2'] != 'undefined' ? encodeURIComponent(data['address_2']) : '';
1149
1150    data['directions_link'] = '';
1151
1152    if (typeof data['address_1'] != 'undefined') {
1153        data['directions_link'] = "https://www.google.com/maps/search/?api=1&query=" + encodeURIComponent(data['location_name']) + "+" + encodeURIComponent(data['address_1']) + "+" + encodeURIComponent(data['address_2']) + "+" + encodeURIComponent(data['city']) + "+" + encodeURIComponent(data['post_code']);
1154    }
1155
1156    var store_service_list = '';
1157    if (typeof data['Store Services_CS'] != 'undefined') {
1158        var services = data['Store Services_CS'].split(',');
1159        if (services.length > 0 && services != '') {
1160            for (var i = 0; i < services.length; i++) {
1161
1162                store_service_list += '<li class="icon-check">' + services[i] + '</li>';
1163            }
1164        }
1165    }
1166
1167    data['brand_logo'] = '';
1168    data['hide_details'] = "";
1169
1170    if (typeof data["Page Settings_CS"] != 'undefined' && data["Page Settings_CS"].includes('Suppress Location Page')) {
1171        data['hide_details'] = "hide";
1172    }
1173
1174    if (typeof data["Finish Line at Macy's_CS"] != 'undefined' && data["Finish Line at Macy's_CS"].includes('Yes')) {
1175        data['brand_logo'] = "https://assets." + domainName + "/images/finish-line-macys-logo.png";
1176    } else if (typeof data['brand_name'] != 'undefined' && data['brand_name'] == 'City Gear') {
1177        data['brand_logo'] = "https://assets." + domainName + "/images/DTLR-CG-Black.svg";
1178    } else {
1179        data['brand_logo'] = "https://assets." + domainName + "/images/" + siteConfiguration[brandName]['logo'];
1180    }
1181
1182    data['store_service_list'] = store_service_list;
1183
1184    var openDate = data.opening_date;
1185    var today = new Date().toISOString().slice(0, 10);
1186    if (today < openDate) {
1187        data.is_coming_soon = "is-coming-soon";
1188        data.is_coming_soon_message = "Coming Soon";
1189    } else {
1190        data.is_coming_soon = "";
1191        data.is_coming_soon_message = "";
1192    }
1193    return data;
1194}
1195
1196var hoursData = {};
1197// uses global hours variable
1198
1199function data$1(_hoursData) {
1200    var _data = _hoursData || null;
1201    if (_data == null) {
1202        return hoursData;
1203    }
1204    _data.forEach(function (datum) {
1205        if (datum["hours_sets:primary"]) {
1206            hours[datum.lid] = {};
1207            hours[datum.lid].primary = JSON.parse(datum["hours_sets:primary"]);
1208            hours[datum.lid].timezone = datum.hours_timezone;
1209            hours[datum.lid].dst = datum.hours_dst;
1210        }
1211    });
1212}
1213
1214if (autoSearch) {
1215    {
1216        hardwareGeoLocate();
1217    }
1218} else {
1219    setTemplate(getStyleByPageLevel(pageLevel$1));
1220    if (pageLevel$1 == 'indy') {
1221        setElement($('.indy-nearby-map-list .map-list'));
1222    }
1223    if (pageLevel$1 == 'indy' || pageLevel$1 == 'city') {
1224        setClusters(true);
1225    }
1226    if (pageLevel$1 != 'region') {
1227        data$2(JSON.parse(defaultListData));
1228    }
1229    if (browseMode == false && pageHasMap) {
1230        data$4(processMapDefaultData());
1231    }
1232}
1233
1234if (loadMap && pageHasMap) {
1235    create();
1236} else {
1237    $(document).one(Events.CREATE_MAP, function () {
1238        create();
1239    });
1240}
1241
1242$(document).on(Events.REMOVE_MAP, function () {
1243    removeMap();
1244});
1245
1246init();
1247
1248$(document).on(Events.SEARCH_NEARBY, function () {
1249    setNearbySearch(true);
1250    setCenteringEnabled(true);
1251    jQuery('#q').val('');
1252    $('body').addClass(Status.LOADING);
1253    $('body').removeClass('no-results-found');
1254    if (window.navigator && window.navigator.geolocation && location.protocol == 'https:' && useHardwareLocation) {
1255        window.navigator.geolocation.getCurrentPosition(function (position) {
1256            var data = {
1257                latitude: position.coords.latitude,
1258                longitude: position.coords.longitude
1259            };
1260            setCookie(GEO_COOKIE_NAME, JSON.stringify(data));
1261            searchNearby();
1262        }, function (fail) {
1263            showMapAlert();
1264            searchNearby();
1265        }, {
1266            enableHighAccuracy: enableHighAccuracy,
1267            maximumAge: maximumAge,
1268            timeout: timeout
1269        });
1270    } else {
1271        showMapAlert();
1272        searchNearby();
1273    }
1274});
1275
1276$(document).on(Events.MAP_PINS_READY, function () {
1277    $('.locator .map-list-item-wrap').each(function () {
1278        var lid = $(this).data("lid");
1279        $('.cmOverlay[data-lid="' + lid + '"]').attr("data-particles", $(this).attr("data-particles"));
1280    });
1281    $(document).trigger(Events.APPLY_FILTERS);
1282});
1283
1284$(document).on(Events.SEARCH_PAN_ZOOM_SUBMIT, function (event, data) {
1285    $('body').addClass(Status.LOADING);
1286    $('body').removeClass('no-results-found');
1287    $('body').removeClass('search-input-error');
1288    setCenteringEnabled(false);
1289    panZoom(data).then(function (results) {
1290        $(document).trigger(Events.ASYNC_RESULTS, results);
1291    }, function (results) {
1292        $(document).trigger(Events.SEARCH_FAIL);
1293    });
1294});
1295
1296$(document).on(Events.SEARCH_SUBMIT, function (event, search) {
1297    if (jQuery('#q').val() == '') {
1298        $('body').addClass('search-input-error');
1299        return;
1300    }
1301
1302    setNearbySearch(false);
1303    setCenteringEnabled(true);
1304
1305    if (!redirectOnSearch) {
1306        push({ 'searchTerm': search['locator-search-value'] });
1307        $('body').addClass(Status.LOADING);
1308        $('body').removeClass('no-results-found');
1309        $('body').removeClass('search-input-error');
1310        locate(search, null).then(function (data) {
1311            if (brand == 'jdsports' || brand == 'finishline') {
1312                var originSearchData = data;
1313                locate(search, data).then(function (data) {
1314                    //Both searches returned results
1315                    data = mergeData(originSearchData, data);
1316                    $(document).trigger(Events.ASYNC_RESULTS, data);
1317                }, function (data) {
1318                    //Only first search returned results
1319                    $(document).trigger(Events.ASYNC_RESULTS, originSearchData);
1320                });
1321            } else {
1322                $(document).trigger(Events.ASYNC_RESULTS, data);
1323            }
1324        }, function (data) {
1325
1326            if (brand == 'jdsports' || brand == 'finishline') {
1327                locate(search, data).then(function (data) {
1328                    //First search didn't return data but second search did
1329                    $(document).trigger(Events.ASYNC_RESULTS, data);
1330                }, function (data) {
1331                    //Neither first search nor second search returned data
1332                    $(document).trigger(Events.SEARCH_FAIL);
1333                });
1334            } else {
1335                $(document).trigger(Events.SEARCH_FAIL);
1336            }
1337        });
1338    } else {
1339        var searchTerm = search["locator-search-value"];
1340        if (isRegion([searchTerm])) {
1341            var regex = /(,*\s*(%20)*[Uu][Ss][Aa]*)$/;
1342            searchTerm = searchTerm.replace(regex, '');
1343            var url = '//' + fullDomainName + '/' + regionData[searchTerm.toLowerCase()]['region_lc'] + '/';
1344            window.location.href = url;
1345            return;
1346        } else {
1347            window.location.href = location.protocol + "//" + fullDomainName;
1348        }
1349        window.location.href = searchPageUrl + '?q=' + search["locator-search-value"];
1350    }
1351});
1352
1353/*
1354This is where we clean up and prepare the data for the separate modules to use
1355*/
1356$(document).on(Events.ASYNC_RESULTS, function (event, data) {
1357    try {
1358        if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) != 'object') {
1359            data = JSON.parse(data);
1360        }
1361        if (data.markerData) {
1362            data.markers = processMapDefaultData(data);
1363        }
1364    } catch (e) {}
1365    try {
1366        data.maplist = JSON.parse('[' + data.maplist.substring(25, data.maplist.length - 7) + ']');
1367    } catch (e) {}
1368
1369    setClusters(false);
1370    setTemplate(Styles.list_locations);
1371    if (data.api_level) {
1372        if (data.api_level == 'region') {
1373            setClusters(false);
1374            setTemplate(Styles.list_cities);
1375        } else if (data.api_level == 'domain') {
1376            setClusters(false);
1377            setTemplate(Styles.list_regions);
1378        }
1379    }
1380
1381    if (data && data.markers && data.markers.length && data.markers.length !== 0) {
1382        $(document).trigger(Events.SEARCH_SUCCESS, data);
1383    } else {
1384        $(document).trigger(Events.SEARCH_NO_RESULTS, data);
1385    }
1386});
1387
1388$(document).on(Events.SEARCH_SUCCESS, function (event, data) {
1389    setInitialSearch(false);
1390    data$1(data.maplist);
1391    data$2(data.maplist);
1392    data$4(data.markers);
1393    data$3(data);
1394
1395    $('body').removeClass(Status.LOADING);
1396    updateMappin();
1397
1398    $(document).trigger(Events.APPLY_FILTERS);
1399});
1400
1401$(document).on(Events.SEARCH_NO_RESULTS, function (event, data) {
1402    enableLeafletPopups = true;
1403    $('body').addClass('no-results-found');
1404    $('body').removeClass(Status.LOADING);
1405
1406    if (data.options) {
1407        var searchTerm = 'you';
1408        if (data.options.search) {
1409            searchTerm = data.options.search;
1410        }
1411        $('.map-list-header-search-term').html('0 stores near ' + searchTerm);
1412    }
1413
1414    if (isInitialSearch()) {
1415        data$4(processMapDefaultData());
1416        setInitialSearch(false);
1417    }
1418});
1419
1420$(document).on(Events.SEARCH_FAIL, function (event, data) {
1421    $('body').removeClass(Status.LOADING);
1422    $('body').addClass('no-results-found');
1423});
1424
1425function data() {
1426    var _data = {};
1427    _data.maplist = data$2();
1428    _data.map = data$4();
1429    _data.search = data$3();
1430    return _data;
1431}
1432
1433function getStyleByPageLevel(pageLevel) {
1434    if (pageLevel == 'region') {
1435        return Styles.list_cities;
1436    } else if (pageLevel == 'domain') {
1437        return Styles.list_regions;
1438    } else {
1439        return Styles.list_locations;
1440    }
1441}
1442
1443function searchNearby() {
1444    if (redirectOnSearch) {
1445        window.location.href = location.protocol + "//" + fullDomainName;
1446    } else {
1447        nearby().then(function (data) {
1448            if (brand == 'jdsports' || brand == 'finishline') {
1449                var originSearchData = data;
1450                nearby(data).then(function (data) {
1451                    //Both searches returned results
1452                    data = mergeData(originSearchData, data);
1453                    $(document).trigger(Events.ASYNC_RESULTS, data);
1454                }, function (data) {
1455                    //Only first search returned results
1456                    $(document).trigger(Events.ASYNC_RESULTS, originSearchData);
1457                });
1458            } else {
1459                $(document).trigger(Events.ASYNC_RESULTS, data);
1460            }
1461        }, function (data) {
1462
1463            if (brand == 'jdsports' || brand == 'finishline') {
1464                nearby(data).then(function (data) {
1465                    //First search didn't return data but second search did
1466                    $(document).trigger(Events.ASYNC_RESULTS, data);
1467                }, function (data) {
1468                    //Neither first search nor second search returned data
1469                    $(document).trigger(Events.SEARCH_FAIL);
1470                    $(document).trigger(Events.SEARCH_NO_RESULTS);
1471                });
1472            } else {
1473                $(document).trigger(Events.SEARCH_FAIL);
1474                $(document).trigger(Events.SEARCH_NO_RESULTS);
1475            }
1476        });
1477    }
1478}
1479
1480function hardwareGeoLocate() {
1481    if (getCookie(GEO_COOKIE_NAME) === '' && useHardwareLocation && window.navigator && window.navigator.geolocation && location.protocol == 'https:') {
1482        window.navigator.geolocation.getCurrentPosition(function (position) {
1483            var data = {
1484                latitude: position.coords.latitude,
1485                longitude: position.coords.longitude
1486            };
1487            setCookie(GEO_COOKIE_NAME, JSON.stringify(data));
1488            searchNearby();
1489        }, function (fail) {
1490            searchNearby();
1491            showMapAlert();
1492        }, {
1493            enableHighAccuracy: enableHighAccuracy,
1494            maximumAge: maximumAge,
1495            timeout: timeout
1496        });
1497    } else {
1498        if (window.navigator && window.navigator.permissions) {
1499            window.navigator.permissions.query({ name: 'geolocation' }).then(function (data) {
1500                if (data.state == 'denied') {
1501                    showMapAlert();
1502                }
1503            });
1504        }
1505
1506        searchNearby();
1507    }
1508}
1509
1510function showMapAlert() {
1511    {
1512        $('.map-alert').fadeIn();
1513    }
1514}
1515
1516function isRegion(array) {
1517    var searchTerm = array[0];
1518    var regex = /(,*\s*(%20)*[Uu][Ss][Aa]*)$/;
1519    searchTerm = searchTerm.replace(regex, '');
1520    if (regionData[searchTerm.toLowerCase()]) {
1521        array[0] = searchTerm.toLowerCase();
1522        return true;
1523    }
1524    return false;
1525}
1526
1527$(document).on(Events.OPEN_POPUP, function (event, data) {
1528    if (typeof data$4().markerObjects['marker' + data.lid] != 'undefined') {
1529        data$4().markerObjects['marker' + data.lid].openPopup();
1530    }
1531});
1532
1533function mergeData(originSearchData, secondSearchData) {
1534    if (typeof originSearchData.markers != 'undefined' && originSearchData.markers == null && originSearchData.markers != '' && typeof secondSearchData.markers != 'undefined' && secondSearchData.markers == null && secondSearchData.markers != '') {
1535        return originSearchData;
1536    } else if (originSearchData.markers != null && secondSearchData.markers == null) {
1537        return originSearchData;
1538    } else if (originSearchData.markers == null && secondSearchData.markers != null) {
1539        return secondSearchData;
1540    } else if (typeof secondSearchData.markers != 'undefined' && secondSearchData.markers != null) {
1541        for (var i = 0; i < secondSearchData.markers.length; i++) {
1542            originSearchData.markers.push(secondSearchData.markers[i]);
1543        }
1544
1545        var originData = JSON.parse('[' + originSearchData.maplist.substring(25, originSearchData.maplist.length - 7) + ']');
1546        var secondaryData = JSON.parse('[' + secondSearchData.maplist.substring(25, secondSearchData.maplist.length - 7) + ']');
1547        var tempData = [];
1548
1549        for (var i = 0; i < originData.length; i++) {
1550            tempData.push(originData[i]);
1551        }
1552        for (var y = 0; y < secondaryData.length; y++) {
1553            tempData.push(secondaryData[y]);
1554        }
1555
1556        tempData.sort(function (a, b) {
1557            return parseFloat(a.distance) - parseFloat(b.distance);
1558        });
1559
1560        tempData = '<div class="tlsmap_list">' + JSON.stringify(tempData).slice(1, -1) + ", <div>";
1561
1562        originSearchData.maplist = tempData;
1563
1564        return originSearchData;
1565    } else {
1566        if (typeof secondSearchData != 'undefined' && secondSearchData.indexOf('markersAvailable') > -1) {
1567            return secondSearchData;
1568        } else {
1569            return originSearchData;
1570        }
1571    }
1572}
1573
1574function updateMappin() {
1575    $('.map-list-item-wrap').each(function () {
1576        var lid = $(this).data("lid");
1577        $('.cmOverlay[data-lid=' + lid + ']').attr("data-brand", $(this).attr("data-brand"));
1578    });
1579}
1580
1581exports.data = data;

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.