{"version":3,"file":"MapSearch.min.js","sources":["MapSearch.js"],"sourcesContent":["/*\r\n * \r\n * API calls and map setup\r\n * \r\n */\r\n\r\nfunction ms_getSettings() {\r\n var $ = jQuery;\r\n $.ajax({\r\n type: \"POST\",\r\n cache: false,\r\n url: \"/services/marketing/MapSearchService.asmx/GetSettings\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n data: \"{ currentItemId: '\" +\r\n $('#hfCurrentItemId').val() +\r\n \"', settingsId: '\" +\r\n $('#hfSettingsId').val() +\r\n \"', language: '\" +\r\n $('#hfCurrentLanguage').val() +\r\n \"', mapType: '\" +\r\n $('#hfMapType').val() +\r\n \"' }\",\r\n success: function (result) {\r\n ms_init(result.d);\r\n },\r\n error: function (request, status, error) {\r\n }\r\n });\r\n}\r\n\r\nfunction ms_sendDealersEmail() {\r\n var $ = jQuery;\r\n\r\n var formFields = [];\r\n $(\".ms_contactForm_element input, .ms_contactForm_element textarea \").each(function () {\r\n formFields.push({\r\n id: $(this).attr(\"data-id\"),\r\n FieldValue: $(this).val() || $(this).is(':checked')\r\n })\r\n });\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n cache: false,\r\n url: \"/services/marketing/MapSearchService.asmx/SubmitForm\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n data: \"{ currentItemId: '\" + $('#hfCurrentItemId').val() +\r\n \"', language: '\" + $('#hfCurrentLanguage').val() +\r\n \"', form: \" + JSON.stringify(formFields) +\r\n \" }\",\r\n success: function (result) {\r\n ms_showFormSucessMessage(result);\r\n },\r\n error: function (request, status, error) {\r\n }\r\n });\r\n}\r\n\r\nfunction ms_getContacts() {\r\n var $ = jQuery;\r\n $.ajax({\r\n type: \"POST\",\r\n cache: false,\r\n url: \"/services/marketing/MapSearchService.asmx/GetContacts\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n data: \"{ currentItemId: '\" +\r\n $('#hfCurrentItemId').val() +\r\n \"', language: '\" +\r\n $('#hfCurrentLanguage').val() +\r\n\r\n \"' }\",\r\n success: function (result) {\r\n ms_markers = result.d;\r\n ms_pins(ms_markers);\r\n\r\n if (!ms_has_valid_url_prams) {\r\n $('#mapSearchLoad').addClass(\"fadeout\");\r\n } else {\r\n ms_show_filtered_list();\r\n }\r\n\r\n },\r\n error: function (request, status, error) {\r\n }\r\n });\r\n}\r\nfunction ms_getContactsById(pspId, fn) {\r\n var $ = jQuery;\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n cache: false,\r\n async: false,\r\n url: \"/services/marketing/MapSearchService.asmx/GetContactsById\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n data: \"{ currentItemId: '\" +\r\n $('#hfCurrentItemId').val() +\r\n \"', language: '\" +\r\n $('#hfCurrentLanguage').val() +\r\n \"',pspId: '\" + pspId +\r\n \"' }\",\r\n success: function (result) {\r\n fn(result.d);\r\n },\r\n error: function (request, status, error) {\r\n }\r\n });\r\n}\r\n\r\n/*\r\n * Start inserting the map. Create a Global var ms_Map to access it from other functions/scripts, and the settings var too\r\n */\r\nvar ms_Settings;\r\nvar ms_Map;\r\n//I also create a Global info window var\r\nvar ms_infoWindow = false;\r\n//the markers object\r\nvar ms_markers;\r\n//the markers in the map object\r\nvar ms_markers_map;\r\n//and the pin colors object\r\nvar ms_colors = {};\r\n//distances from location\r\nvar ms_distances;\r\n//original template for \"more info\"\r\nvar ms_more_info_template = false;\r\n//closest markers to selected position (near me or search)\r\nvar ms_closest = [];\r\n//filters\r\nvar ms_filters;\r\n//available filters\r\nvar ms_av_filters = [];\r\n//url parameters\r\nvar ms_url_params;\r\n//switch statuss\r\nvar ms_switchStatus = false;\r\n//search location\r\nvar ms_place;\r\n//filtered products\r\nvar ms_filtered;\r\n//mobile view option list/map\r\nvar ms_mobile_view_option = 'list';\r\nvar ms_has_valid_url_prams = true;\r\nvar ms_location_geometry;\r\nvar ms_max_distance_allowed = 10;\r\n\r\nvar last_place_searched = null;\r\n\r\n\r\nfunction updateLastPlace(place_id) {\r\n var new_id = place_id;\r\n if (new_id !== last_place_searched) {\r\n last_place_searched = new_id;\r\n // reset filters\r\n ms_clearAllFilters();\r\n\r\n }\r\n}\r\nfunction ms_init(ms) {\r\n\r\n //define settigns\r\n ms_Settings = ms;\r\n // Need to set default value of list results to 30\r\n ms_Settings.TotalSearchResults = !ms_Settings.TotalSearchResults ? 30 : ms_Settings.TotalSearchResults;\r\n\r\n if (ms_Settings.DefaultDistance) {\r\n ms_max_distance_allowed = ms_Settings.DefaultDistance;\r\n }\r\n\r\n //check if url has parameters\r\n ms_url_params = getJsonFromUrl();\r\n if (\r\n ms_url_params.hasOwnProperty('loc') ||\r\n ms_url_params.hasOwnProperty('maptype') ||\r\n ms_url_params.hasOwnProperty('subtypes') ||\r\n ms_url_params.hasOwnProperty('status') ||\r\n ms_url_params.hasOwnProperty('services') ||\r\n ms_url_params.hasOwnProperty('products') ||\r\n ms_url_params.hasOwnProperty('certificates') ||\r\n ms_url_params.hasOwnProperty('productCount')\r\n ) {\r\n ms_has_valid_url_prams = true;\r\n } else {\r\n ms_has_valid_url_prams = false;\r\n }\r\n //start map\r\n ms_Map = new google.maps.Map(document.getElementById('mapSearch'), {\r\n scrollwheel: false,\r\n mapTypeControl: false,\r\n streetViewControl: false,\r\n rotateControl: false,\r\n fullscreenControl: false,\r\n gestureHandling: 'cooperative'\r\n });\r\n\r\n //define a short access var to map.\r\n var map = ms_Map;\r\n\r\n //center map on country/city in settigns\r\n var geocoder = new google.maps.Geocoder();\r\n var location = ms_Settings.MapCenter;\r\n\r\n if (!jQuery.isEmptyObject(ms_url_params) && ms_url_params.hasOwnProperty('loc')) {\r\n geocoder.geocode({ 'address': ms_url_params.loc }, function (results, status) {\r\n if (status == \"OK\" && typeof results[0].geometry.bounds !== 'undefined' && typeof results[0].geometry.location !== 'undefined') {\r\n ms_centerMap(results[0].geometry);\r\n document.getElementById('mapSearchInput').value = results[0].formatted_address;\r\n } else {\r\n //If url location is not found - use settings location\r\n geocoder.geocode({ 'address': location }, function (results, status) {\r\n if (status == \"OK\") {\r\n map.fitBounds(results[0].geometry.bounds);\r\n map.setCenter(results[0].geometry.location);\r\n } else {\r\n alert(\"Could not find location: \" + location);\r\n }\r\n });\r\n }\r\n });\r\n } else {\r\n geocoder.geocode({ 'address': location }, function (results, status) {\r\n if (status == \"OK\") {\r\n ms_centerMap(results[0].geometry);\r\n } else {\r\n alert(\"Could not find location: \" + location);\r\n }\r\n });\r\n }\r\n\r\n //switch statuss\r\n checkSwitchStatus();\r\n\r\n //load pins (clustered)\r\n ms_getContacts();\r\n\r\n //autocomplete Search Bar\r\n var input = document.getElementById('mapSearchInput');\r\n var autocomplete = new google.maps.places.Autocomplete(input, { types: ['geocode'] });\r\n autocomplete.bindTo('bounds', map);\r\n\r\n var marker = new google.maps.Marker({\r\n map: map\r\n });\r\n\r\n setMapView();\r\n\r\n // submit on press enter if no item from the autocomplete list is selected\r\n google.maps.event.addDomListener(input, 'keydown', function (e) {\r\n var suggestionSelected = document.querySelectorAll('.pac-item-selected');\r\n\r\n if (e.key === \"Enter\" && !e.triggered && (!suggestionSelected || suggestionSelected.length == 0)) {\r\n var ex1 = new Event('keydown');\r\n ex1.code = \"ArrowDown\";\r\n ex1.key = \"ArrowDown\";\r\n ex1.keyCode = 40;\r\n google.maps.event.trigger(this, 'keydown', ex1);\r\n\r\n var ex2 = new Event('keydown');\r\n ex2.code = \"Enter\";\r\n ex2.key = \"Enter\";\r\n ex2.keyCode = 13;\r\n ex2.triggered = true;\r\n google.maps.event.trigger(this, 'keydown', ex2);\r\n\r\n }\r\n });\r\n\r\n google.maps.event.addListener(autocomplete, 'place_changed', function () {\r\n\r\n marker.setVisible(false);\r\n ms_place = autocomplete.getPlace();\r\n\r\n if (ms_place.place_id) {\r\n\r\n updateLastPlace(ms_place.place_id);\r\n console.log('id now:', last_place_searched);\r\n }\r\n if (!ms_place.geometry) {\r\n return;\r\n }\r\n\r\n // If the place has a geometry, then present it on a map.\r\n if (ms_place.geometry.viewport) {\r\n map.fitBounds(ms_place.geometry.viewport);\r\n } else {\r\n map.setCenter(ms_place.geometry.location);\r\n map.setZoom(14);\r\n }\r\n\r\n marker.setPosition(ms_place.geometry.location);\r\n marker.setVisible(true);\r\n\r\n setListView();\r\n\r\n //create list of contacts nearby\r\n ms_list(ms_place.geometry.location);\r\n\r\n if (ms_has_valid_url_prams) {\r\n //show tags when using mapsearch with reduced/filered bucket size\r\n ms_set_filters(true);\r\n }\r\n //track search\r\n //check if we are starting\r\n if (ms_start) {\r\n ms_registerDataLayer(\"Start\", \"Search box\");\r\n ms_start = false;\r\n ms_track_label = \"Search box\";\r\n }\r\n\r\n\r\n openDealerContactForm();\r\n\r\n });\r\n\r\n //find my location button\r\n document.getElementById('mapSearchLocation').onclick = function (e) {\r\n ms_findLocation(map);\r\n e.preventDefault();\r\n };\r\n\r\n //fix find my location button position after event\r\n const findMyLocationButton = document.getElementById(\"mapSearchLocation\");\r\n findMyLocationButton.addEventListener(\"click\", function () {\r\n findMyLocationButton.classList.add(\"ms_find_mobile\");\r\n });\r\n\r\n //legends box (and pin colors)\r\n var legs = [];\r\n for (var i = 0, len = ms.MapType.length; i < len; i++) {\r\n //create the legends\r\n var l = ms.MapType[i];\r\n if (l.IsActive) {\r\n var legend = [\r\n '
',\r\n '',\r\n '
',\r\n '' + l.DisplayName + '',\r\n '
',\r\n '
'\r\n ].join('');\r\n legs.push(legend);\r\n //create the colors vars for the pins\r\n ms_colors[l.Id] = l.Pin.toLowerCase();\r\n }\r\n }\r\n document.getElementById('mapSearchLegends').innerHTML = legs.join('');\r\n\r\n // Translate everything with texts from settings\r\n ms_translate();\r\n\r\n //create filters (for the list of points)\r\n ms_get_filters();\r\n\r\n //Grab information from input and filter\r\n document.querySelector('.ms_copy_link').addEventListener('click', ms_copy_link);\r\n\r\n document.getElementById('ms_copy_link_bar').querySelector('.ms_copy_link_bar_copy').addEventListener('click', ms_copy_to_clipboard);\r\n\r\n //max distance allowed\r\n if (ms_Settings.DisabledFilters.All || ms_Settings.DisabledFilters.Distance) {\r\n document.querySelector(\"#mapSearchList\").classList.add('ms_list_distance_select_hidden');\r\n } else {\r\n createMaxDistanceSelectBox();\r\n }\r\n\r\n if (ms_Settings.Form) {\r\n //create dealers contact form\r\n createDealersContectForm();\r\n }\r\n\r\n}\r\n\r\nfunction fixSidebarHeight() {\r\n setTimeout(function () {\r\n var maxHeight = jQuery('#mapSearch').outerHeight();\r\n var headHeight = jQuery('.ms_list_head').outerHeight();\r\n var tags = jQuery('.ms_filter_tags').outerHeight();\r\n var offset = 2;\r\n var height = maxHeight - headHeight - tags - offset;\r\n jQuery('.ms_list_container').outerHeight(height);\r\n jQuery('.ms_filter_container').outerHeight(maxHeight - headHeight);\r\n }, 0)\r\n}\r\n\r\nfunction createDealersContectForm() {\r\n var form = ms_Settings ? ms_Settings.Form : console.log('FORM SETTINGS NOT DEFINED');\r\n var container = document.querySelector('.ms_contactForm_wrapper');\r\n var leftColumn = container.querySelector('.ms_contactForm_left');\r\n var rightColumn = container.querySelector('.ms_contactForm_right');\r\n var button = container.querySelector('div .button');\r\n\r\n if (form) {\r\n document.querySelector('.ms_contactForm_headline').innerText = form.Headline;\r\n for (var i = 0; i < form.Fields.length; i++) {\r\n var isHidden = form.Fields[i][\"IsHiddenField\"] == true ? \"hidden\" : \"\";\r\n\r\n var isTextArea = form.Fields[i][\"FieldType\"] == 'textarea' ? 'textarea' : 'input';\r\n var endOfTextArea = isTextArea ? \"> \" : \"/>\";\r\n var formElement = '
' + form.Fields[i][\"FieldLabel\"] + '<' + isTextArea + ' type=\"' + form.Fields[i][\"FieldType\"] + '\" name=\"' + form.Fields[i][\"HubspotFieldName\"] + '\" data-id=\"' + form.Fields[i][\"Id\"] + '\" data-required=\"' + form.Fields[i][\"IsRequiredField\"] + '\" placeholder=\"' + form.Fields[i][\"Placeholder\"] + '\" value=\"\" ' + endOfTextArea + '
' + form.Fields[i][\"RequiredMessageError\"] + '
';\r\n\r\n if (form.Fields[i][\"HubspotFieldName\"] == \"firstname\" ||\r\n form.Fields[i][\"HubspotFieldName\"] == \"lastname\" ||\r\n form.Fields[i][\"HubspotFieldName\"] == \"email\" ||\r\n form.Fields[i][\"HubspotFieldName\"] == \"email_subject\"\r\n ) {\r\n leftColumn.insertAdjacentHTML('beforeend', formElement);\r\n } else if (form.Fields[i][\"HubspotFieldName\"] == \"message\") {\r\n rightColumn.insertAdjacentHTML('beforeend', formElement);\r\n } else {\r\n container.insertAdjacentHTML('beforeend', formElement);\r\n }\r\n }\r\n button.innerText = form.ButtonText;\r\n\r\n button.addEventListener('click', function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (ms_dealersForm_valid()) {\r\n ms_sendDealersEmail();\r\n }\r\n })\r\n }\r\n}\r\n\r\nfunction ms_dealersForm_valid() {\r\n var $ = jQuery;\r\n var hasError = [];\r\n var form = document.querySelector('.ms_contactForm');\r\n\r\n if (form.classList.contains('is-active')) {\r\n $(\".ms_contactForm_element input, .ms_contactForm_element textarea\").each(function (index, element) {\r\n var el = $(this);\r\n var errorMessage = el.closest('.ms_contactForm_element');\r\n var required = element.dataset.required;\r\n var isRequired = required === 'true' ? true : (required === 'false' ? false : required);\r\n\r\n if (isRequired) {\r\n if (el.val() == '' || (el.is(':checkbox') && el.is(':checked') == false)) {\r\n errorMessage.addClass('has-error');\r\n hasError.push(index);\r\n } else {\r\n errorMessage.removeClass('has-error');\r\n }\r\n }\r\n });\r\n\r\n return !hasError.length > 0;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nfunction ms_showFormSucessMessage(result) {\r\n var success = document.querySelector('.ms_contactForm_success');\r\n var form = document.querySelector('.ms_contactForm');\r\n\r\n if (result.d && result.d[0].Key == \"Success\" && result.d[0].Value) {\r\n success.innerHTML = ms_Settings.Form.SuccessMessage;\r\n success.classList.add('is-active');\r\n\r\n setTimeout(function () {\r\n success.classList.remove('is-active');\r\n form.classList.remove('is-active');\r\n }, 6000)\r\n }\r\n}\r\n\r\nfunction ms_centerMap(geometry) {\r\n if (!ms_location_geometry) {\r\n //in init fn this variable will be set, so we can reuse it later for url params\r\n ms_location_geometry = geometry;\r\n }\r\n\r\n if (ms_location_geometry) {\r\n ms_Map.fitBounds(ms_location_geometry.bounds);\r\n ms_Map.setCenter(ms_location_geometry.location);\r\n }\r\n}\r\n\r\nfunction ms_clearAllFilters() {\r\n var filters = document.querySelector('.ms_filters');\r\n var input = filters.querySelectorAll('input');\r\n\r\n for (var i = 0; i < input.length; i++) {\r\n input[i].checked = false;\r\n }\r\n\r\n //attribute \"true\" for not hiding the filter section\r\n ms_set_filters(true);\r\n\r\n enableOrDisableCTA(false);\r\n\r\n fixSidebarHeight();\r\n}\r\n\r\nfunction isFilterOptionSelected(input) {\r\n var checked = false;\r\n\r\n if (!input) { return; }\r\n\r\n for (var i = 0; i < input.length; i++) {\r\n if (input[i].checked) {\r\n checked = true;\r\n }\r\n }\r\n\r\n return checked;\r\n}\r\n\r\nfunction enableOrDisableCTA(enable) {\r\n if (enable) {\r\n document.querySelector('.ms_infobuttons .ms_filter_apply_bot').classList.add('is-active');\r\n document.querySelector('.ms_infobuttons .ms_filter_clear_bot').classList.add('is-active');\r\n } else {\r\n document.querySelector('.ms_infobuttons .ms_filter_apply_bot').classList.remove('is-active');\r\n document.querySelector('.ms_infobuttons .ms_filter_clear_bot').classList.remove('is-active');\r\n }\r\n}\r\n\r\n\r\nfunction watchFilterInputs() {\r\n var filters = document.querySelector('.ms_filters');\r\n var input = filters.querySelectorAll('input');\r\n\r\n for (var i = 0; i < input.length; i++) {\r\n input[i].addEventListener('click', function (event) {\r\n\r\n //make possible to unselect radio input\r\n setRadioInputScope(this);\r\n\r\n //make cta buttons available\r\n if (isFilterOptionSelected(input)) {\r\n enableOrDisableCTA(true);\r\n } else {\r\n enableOrDisableCTA(false);\r\n }\r\n });\r\n }\r\n}\r\n\r\n//make possible to unselect radio input\r\nfunction setRadioInputScope(radioInputField) {\r\n if (radioInputField.getAttribute('type') !== 'radio') {\r\n return;\r\n }\r\n var filters = document.querySelector('.ms_filters');\r\n var input = filters.querySelectorAll('input');\r\n\r\n\r\n if (radioInputField.dataset.checked === 'true') {\r\n radioInputField.checked = false;\r\n }\r\n\r\n var otherRadioInputs = Array.from(input).filter(function (element) {\r\n return element.getAttribute('name') === radioInputField.getAttribute('name') && element.value !== radioInputField.value;\r\n });\r\n\r\n Array.from(otherRadioInputs).forEach(function (element) {\r\n element.setAttribute('data-checked', false);\r\n element.checked = false;\r\n });\r\n\r\n radioInputField.setAttribute('data-checked', radioInputField.checked);\r\n}\r\n\r\nfunction checkSwitchStatus() {\r\n var switchButton = document.getElementsByClassName('ms_list_switch_position');\r\n //if additional sorting is enabled - Don't allow sorting when sorting by ranking\r\n if (!ms_Settings.DisableSorting && ms_Settings.StandardSorting !== 'ranking') {\r\n if (switchButton.length) {\r\n //check switch status if it's checked or not\r\n ms_switchStatus = switchButton[0].checked;\r\n }\r\n } else {\r\n //if additional sorting is disabled then hide it.\r\n //ms_list_switch_wrapper hidden by server\r\n var mapSearch = document.getElementById('mapSearchList');\r\n\r\n if (!!mapSearch) {\r\n mapSearch.classList.add('ms_list_swtich_hidden');\r\n }\r\n\r\n }\r\n\r\n //Check what the list is sorting on\r\n (ms_Settings.StandardSorting === 'ranking') ? ms_toggleDistanceAndFilter(false) : ms_toggleDistanceAndFilter(true);\r\n\r\n if (switchButton && switchButton.length > 0) {\r\n //add event listener on change to sort and print the list based on the choice\r\n switchButton[0].addEventListener('change', function () {\r\n var orderList = ms_filtered || ms_closest;\r\n if (orderList.length > ms_Settings.TotalSearchResults) {\r\n //if filtered by urlParams we have all the dealers in ms_filtered, we sort only the ones that are in the list and dont touch the global list\r\n orderList = ms_list_paginate(ms_filtered, ms_Settings.TotalSearchResults, 1)\r\n }\r\n\r\n if (this.checked) {\r\n ms_switchStatus = true;\r\n orderList ? orderList.sort(function (a, b) { return b.count - a.count }) : ms_closest.sort(function (a, b) { return b.count - a.count });\r\n } else {\r\n ms_switchStatus = false;\r\n orderList ? orderList.sort(function (a, b) { return a.d - b.d }) : ms_closest.sort(function (a, b) { return a.d - b.d });\r\n }\r\n\r\n orderList ? ms_print_list(orderList, true) : ms_print_list(ms_closest, true);\r\n\r\n });\r\n }\r\n\r\n}\r\n\r\n/* TRANSLATIONS */\r\nfunction decodeHtml(text) {\r\n var txt = document.createElement(\"textarea\");\r\n txt.innerHTML = text;\r\n return txt.value;\r\n}\r\nfunction ms_translate() {\r\n //translations\r\n var _t = ms_Settings.Translations;\r\n var pho = document.querySelectorAll(\"a.ms_info_phone\");\r\n var nav = document.querySelectorAll(\"a.ms_i_navigation span\");\r\n var info = document.querySelector(\"a.ms_i_info span\"),\r\n services = document.querySelector(\".ms_info_ad_services b\"),\r\n otherServices = document.querySelector(\".ms_info_ad_other_services b\"),\r\n status = document.querySelector(\".ms_info_ad_status b\"),\r\n products = document.querySelector(\".ms_info_ad_products b\"),\r\n certificate = document.querySelector(\".ms_info_certificate b\"),\r\n list_filter = document.querySelector(\".ms_list_filter_bot span\"),\r\n apply = document.querySelector(\".ms_filter_apply_bot span\"),\r\n clear_filter = document.querySelector(\".ms_filter_clear_bot span\");\r\n ms_list_max_distance_label = document.querySelector(\".ms_list_max_distance_label\");\r\n\r\n //autocomplete Search Bar\r\n document.getElementById('mapSearchInput').setAttribute(\"placeholder\", decodeHtml(_t.search_bar_placeholder));\r\n //find my location\r\n document.querySelector(\"#mapSearchLocation span\").innerHTML = _t.find_near_me;\r\n\r\n //pin infobox\r\n for (var i = 0, len = nav.length; i < len; i++) {\r\n pho[i].innerHTML = _t.show_phone_number_text;\r\n nav[i].innerHTML = _t.navigate_button_label;\r\n }\r\n\r\n info !== null ? info.innerHTML = _t.more_info_button_label : '';\r\n services !== null ? services.innerHTML = _t.map_services_label + \":\" : '';\r\n otherServices !== null ? otherServices.innerHTML = _t.other_services_label ? _t.other_services_label + \":\" : 'Other Services' : '';\r\n status !== null ? status.innerHTML = _t.map_status_label + \":\" : '';\r\n products !== null ? products.innerHTML = _t.map_products_label + \":\" : '';\r\n certificate !== null ? certificate.innerHTML = _t.map_certificates_label + \":\" : '';\r\n //markers list\r\n list_filter !== null ? list_filter.innerHTML = _t.filter_text : '';\r\n apply !== null ? apply.innerHTML = _t.apply_button_text : '';\r\n clear_filter !== null ? clear_filter.innerHTML = _t.clear_filter_button_text : '';\r\n ms_list_max_distance_label !== null ? ms_list_max_distance_label.innerHTML = _t.ms_list_max_distance_label_text ? _t.ms_list_max_distance_label_text : 'Distance:' : '';\r\n}\r\n\r\n/* Find location */\r\n\r\nfunction ms_findLocation(map) {\r\n // Try HTML5 geolocation.\r\n if (navigator.geolocation) {\r\n navigator.geolocation.getCurrentPosition(function (position) {\r\n var pos = {\r\n lat: position.coords.latitude,\r\n lng: position.coords.longitude\r\n };\r\n\r\n var marker = new google.maps.Marker({\r\n position: pos,\r\n map: map\r\n });\r\n\r\n infoWindowMapSearch(map, marker);\r\n\r\n //show address in search bar\r\n var geocoder = new google.maps.Geocoder;\r\n geocoder.geocode({ 'location': pos }, function (results, status) {\r\n if (status === 'OK') {\r\n document.getElementById('mapSearchInput').value = results[0].formatted_address;\r\n } else {\r\n console.log('No results found');\r\n }\r\n });\r\n\r\n\r\n //create list of contacts nearby\r\n ms_list(new google.maps.LatLng(pos));\r\n\r\n //tracks the click\r\n if (ms_start) {\r\n ms_registerDataLayer(\"Start\", \"Find nearest\");\r\n ms_start = false;\r\n ms_track_label = \"Find nearest\";\r\n }\r\n }, function () {\r\n handleLocationError(true, map.getCenter());\r\n });\r\n } else {\r\n // Browser doesn't support Geolocation\r\n handleLocationError(false, map.getCenter());\r\n }\r\n}\r\n\r\nfunction handleLocationError(browserHasGeolocation, pos) {\r\n var txt = browserHasGeolocation ? 'Error: The Geolocation service failed.' : 'Error: Your browser doesn\\'t support geolocation.';\r\n alert(txt);\r\n}\r\n\r\n/* Markers */\r\nfunction update_markers_on_map(loc) {\r\n if (!loc.length) {\r\n removeCluster();\r\n } else {\r\n ms_pins(loc, true);\r\n }\r\n}\r\n\r\nfunction removeCluster() {\r\n var markers = window.markerCluster.getMarkers();\r\n for (var i = 0; i < markers.length; i++) {\r\n markers[i].setMap(null);\r\n }\r\n window.markerCluster.removeMarkers(markers);\r\n window.markerCluster.clearMarkers();\r\n ms_markers_map = [];\r\n markers = [];\r\n}\r\n\r\nfunction ms_pins(loc, updateMap) {\r\n var bounds = new google.maps.LatLngBounds();\r\n var cluster_styles = [\r\n {\r\n width: 40,\r\n height: 40,\r\n url: getClusterInlineSvg('#28231f'),\r\n textColor: 'white',\r\n textSize: 12\r\n },\r\n {\r\n width: 50,\r\n height: 50,\r\n url: getClusterInlineSvg('#28231f'),\r\n textColor: 'white',\r\n textSize: 14\r\n },\r\n {\r\n width: 60,\r\n height: 60,\r\n url: getClusterInlineSvg('#28231f'),\r\n textColor: 'white',\r\n textSize: 16\r\n }\r\n ];\r\n\r\n if (updateMap) {\r\n //first remove all the markers\r\n removeCluster();\r\n\r\n //filter the map based on the filter settings\r\n ms_markers_map = loc.map(function (location, i) {\r\n bounds.extend(new google.maps.LatLng(parseFloat(location.info.loc.lat), parseFloat(location.info.loc.lng)));\r\n return new google.maps.Marker({\r\n position: new google.maps.LatLng(parseFloat(location.info.loc.lat), parseFloat(location.info.loc.lng)),\r\n icon: pinSymbolMapSearch(ms_colors[location.info.Type]),\r\n ms_id: location.info.PspId\r\n });\r\n });\r\n //ms_centerMap();\r\n //ms_Map.setZoom(11);\r\n\r\n } else {\r\n ms_markers_map = loc.Data.map(function (location, i) {\r\n bounds.extend(new google.maps.LatLng(parseFloat(location.loc.lat), parseFloat(location.loc.lng)));\r\n return new google.maps.Marker({\r\n position: new google.maps.LatLng(parseFloat(location.loc.lat), parseFloat(location.loc.lng)),\r\n icon: pinSymbolMapSearch(ms_colors[location.Type]),\r\n ms_id: location.PspId\r\n });\r\n });\r\n\r\n }\r\n\r\n // Add a marker clusterer to manage the markers.\r\n window.markerCluster = new MarkerClusterer(ms_Map, ms_markers_map, { styles: cluster_styles, maxZoom: 10 });\r\n\r\n //add click event to markers/pins\r\n for (var i = 0, len = ms_markers_map.length; i < len; i++) {\r\n ms_markers_map[i].addListener('click', function () {\r\n pinInfoMapSearch(this.ms_id, ms_Map, this);\r\n });\r\n }\r\n}\r\n\r\nfunction getClusterInlineSvg(color) {\r\n var encoded = window.btoa('Created with Sketch.');\r\n return ('data:image/svg+xml;base64,' + encoded);\r\n};\r\n\r\n\r\n//function to create custom SVG marker\r\nfunction pinSymbolMapSearch(color) {\r\n return {\r\n path: 'M40,114.007954 C13.3333333,79.3969115 0,54.7275933 0,40 C0,17.90861 17.90861,0 40,0 C62.09139,0 80,17.90861 80,40 C80,54.7275933 66.6666667,79.3969115 40,114.007954 Z M40,56 C48.2842712,56 55,49.2842712 55,41 C55,32.7157288 48.2842712,26 40,26 C31.7157288,26 25,32.7157288 25,41 C25,49.2842712 31.7157288,56 40,56 Z',\r\n fillColor: getHexColor(color),\r\n fillOpacity: 1,\r\n scale: 0.25\r\n };\r\n}\r\n\r\n// get hex color code\r\nfunction getHexColor(color) {\r\n switch (color) {\r\n case 'red':\r\n return \"#ee0000\";\r\n break;\r\n case 'darkred':\r\n return \"#A11515\";\r\n break;\r\n case 'blue':\r\n return \"#A9CAE5\";\r\n break;\r\n case 'darkblue':\r\n return \"#476996\";\r\n break;\r\n case 'gray':\r\n return \"#7b7a79\";\r\n break;\r\n\r\n }\r\n}\r\n\r\n\r\n//get info of given ID\r\nfunction ms_get_info(id) {\r\n var info = ms_markers.Data.filter(function (obj) {\r\n return obj.PspId === id;\r\n })[0];\r\n return info;\r\n}\r\n\r\n//get marker by ID\r\nfunction ms_get_marker(id) {\r\n var mk = ms_markers_map.filter(function (obj) {\r\n return obj.ms_id === id;\r\n })[0];\r\n return mk;\r\n}\r\n\r\n/* Tooltip */\r\n\r\n//get info of pin/list item and creates a tooltip in place\r\nfunction pinInfoMapSearch(id, map, pos) {\r\n var info = ms_get_info(id);\r\n\r\n //show tooltip\r\n infoWindowMapSearch(map, pos, id);\r\n\r\n //track that click!\r\n //check if we are starting\r\n if (ms_start) {\r\n ms_registerDataLayer(\"Start\", \"Click on map\");\r\n ms_start = false;\r\n }\r\n ms_registerDataLayer(info.FullName, info.FullAddress + \" | \" + info.Telephone1);\r\n}\r\n\r\n\r\nfunction choose_view_option(view) {\r\n //remove active items from all icons\r\n if (view === 'map') {\r\n setMapView();\r\n } else {\r\n setListView();\r\n //clear data if switched to list view\r\n document.querySelector('.ms_list_item_map_view').innerHTML = '';\r\n }\r\n}\r\n\r\n//create or modify info window\r\nfunction infoWindowMapSearch(map, position, id) {\r\n remove_active_class_from_ms_list_items();\r\n\r\n if (!ms_closest.length) {\r\n ms_print_list(false, true, ms_get_info(id));\r\n } else if (ms_mobile_view_option === 'map' && window.innerWidth <= 768) {\r\n ms_print_list(ms_closest, true, ms_get_info(id));\r\n }\r\n\r\n var item = document.querySelector('.ms_list_item[data-id=\"' + id + '\"]');\r\n\r\n //open card when clicking on the marker \r\n item.classList.add('ms_list_item_clicked');\r\n\r\n //scroll to that item to make it visible\r\n scroll_to_ms_list_item();\r\n\r\n //get more info for item\r\n ms_more_info(id);\r\n\r\n //position map\r\n if (window.innerWidth >= 768) {\r\n map.setZoom(15);\r\n }\r\n\r\n setTimeout(function () {\r\n map.setCenter(position.getPosition());\r\n }, 0);\r\n}\r\n\r\n//info window button functions\r\nfunction ms_showPhone(e) {\r\n e.preventDefault();\r\n\r\n var t = e.target;\r\n t.style.display = \"none\";\r\n t.nextElementSibling.style.display = \"block\";\r\n}\r\n\r\n//list of locations close to user\r\nfunction ms_list(pos) {\r\n ms_distances = [];\r\n\r\n var locs = ms_markers.Data;\r\n for (var i = 0, len = locs.length; i < len; i++) {\r\n var distance = google.maps.geometry.spherical.computeDistanceBetween(pos, new google.maps.LatLng({ lat: parseFloat(locs[i].loc.lat), lng: parseFloat(locs[i].loc.lng) }));\r\n if (isNaN(distance)) distance = 99999999999;\r\n\r\n //we are changing to miles/km when we show the list, pushing default distance here,but checking allowance in miles or km based on settings.\r\n var currentDistance;\r\n if (ms_Settings.DistancesInMiles) {\r\n currentDistance = distance * 0.00062137;\r\n } else {\r\n currentDistance = distance / 1000\r\n }\r\n if (ms_Settings.DisabledFilters.All || ms_Settings.DisabledFilters.Distance) {\r\n ms_distances.push({ d: distance, count: locs[i].ProductCount, id: locs[i].PspId });\r\n } else {\r\n if (currentDistance <= ms_max_distance_allowed) {\r\n ms_distances.push({ d: distance, count: locs[i].ProductCount, id: locs[i].PspId });\r\n }\r\n }\r\n\r\n }\r\n\r\n //get the array of all distances and sort it from lower to higher\r\n ms_distances.sort(function (a, b) { return a.d - b.d });\r\n\r\n //extract the first X results\r\n\r\n // #############\r\n // ###### Amount is hardcoded right here. ######\r\n // ######\r\n var closest = ms_list_paginate(ms_distances, ms_Settings.TotalSearchResults, 1);\r\n //get the full data for these pins and add it to them\r\n if (ms_switchStatus) {\r\n closest.sort(function (a, b) { return b.count - a.count });\r\n }\r\n\r\n var closeids = [];\r\n for (var i = 0, len = closest.length; i < len; i++) {\r\n closeids.push(closest[i].id);\r\n }\r\n ms_getContactsById(closeids.join(','), function (d) {\r\n for (var i = 0, len = closest.length; i < len; i++) {\r\n closest[i].info = d.Data.filter(function (obj) {\r\n return obj.PspId == closest[i].id;\r\n })[0];\r\n }\r\n\r\n //if sorting by ranking points, re-sort the list\r\n if (ms_Settings.StandardSorting === 'ranking') {\r\n closest = sortByRanking(closest);\r\n }\r\n\r\n //make the closest list global\r\n ms_closest = closest;\r\n //print list\r\n ms_print_list(closest, true);\r\n\r\n //also, reset filter selects\r\n var sel = document.querySelectorAll('.ms_filters select');\r\n for (var i = 0, len = sel.length; i < len; i++) {\r\n sel[i].selectedIndex = 0;\r\n }\r\n // reset multiList \r\n var multiSel = document.querySelectorAll('.ms_filter_container > .ms_filters > .ms_filter .ms_selectMultiList label > input[type=\"checkbox\"]');\r\n if (multiSel.length) {\r\n for (var ii = 0, lenn = multiSel.length; ii < lenn; ii++) {\r\n multiSel[ii].checked = false;\r\n }\r\n //remove active class from the multilist after all checkboxes are unchecked\r\n var labels = document.querySelectorAll('.ms_filter_container > .ms_filters > .ms_filter .ms_selectMultiList_label');\r\n for (var iii = 0, lennn = labels.length; iii < lennn; iii++) {\r\n labels[iii].classList.remove('is-active')\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction getLocationOrCountry() {\r\n //if location will not be set it will take country base point from settings\r\n return !jQuery.isEmptyObject(ms_url_params) && ms_url_params.hasOwnProperty('loc') ? ms_url_params.loc : ms_Settings.MapCenter;\r\n}\r\n\r\nfunction setDealersIdsInArray(closest) {\r\n var closeids = [];\r\n for (var i = 0, len = closest.length; i < len; i++) {\r\n closeids.push(closest[i].id);\r\n }\r\n\r\n return closeids;\r\n}\r\n\r\nfunction setFilterList(closest, dontPrintList) {\r\n\r\n //if sorting by ranking points, re-sort the list\r\n if (ms_Settings.StandardSorting === 'ranking') {\r\n closest = sortByRanking(closest);\r\n }\r\n\r\n //print list\r\n if (!dontPrintList) {\r\n //make the closest list global\r\n ms_closest = closest;\r\n ms_print_list(closest, true);\r\n }\r\n\r\n //filter by params\r\n if (ms_has_valid_url_prams) {\r\n //set filter values\r\n if (ms_url_params.hasOwnProperty('maptype')) {\r\n jQuery(\"#mapSearchList .ms_filters [data-category='MapType'][value=\" + ms_url_params.maptype + \"]:enabled\").click();\r\n }\r\n if (ms_url_params.hasOwnProperty('subtypes')) {\r\n jQuery(\"#mapSearchList .ms_filters [data-category='SubTypes'][value=\" + ms_url_params.subtypes + \"]:enabled\").click();\r\n }\r\n if (ms_url_params.hasOwnProperty('status')) {\r\n jQuery(\"#mapSearchList .ms_filters [data-category='Status'][value=\" + ms_url_params.status + \"]:enabled\").click();\r\n }\r\n if (ms_url_params.hasOwnProperty('services')) {\r\n jQuery(\"#mapSearchList .ms_filters [data-category='Services'][value=\" + ms_url_params.services + \"]:enabled\").click();\r\n }\r\n if (ms_url_params.hasOwnProperty('products')) {\r\n //as products are multi selectable, need to split string and choose all items in the list seperated by comma\r\n var productsArray = ms_url_params.products.split(',');\r\n\r\n for (var productIndex = 0; productIndex < productsArray.length; productIndex++) {\r\n jQuery(\"#mapSearchList .ms_filters [data-category='Products'][value=\" + productsArray[productIndex] + \"]:enabled\").click();\r\n }\r\n\r\n }\r\n if (ms_url_params.hasOwnProperty('certificates')) {\r\n //as Certificates are multi selectable, need to split string and choose all items in the list seperated by comma\r\n var CertificatesArray = ms_url_params['certificates'].split(',');\r\n\r\n for (var CertificateIndex = 0; CertificateIndex < CertificatesArray.length; CertificateIndex++) {\r\n jQuery(\"#mapSearchList .ms_filters [data-category='Certificates'][value=\" + CertificatesArray[CertificateIndex] + \"]:enabled\").click();\r\n }\r\n\r\n }\r\n if (ms_url_params.hasOwnProperty('ProductCount')) {\r\n jQuery(\"#mapSearchList .ms_filters [data-category='ProductCount'][value=\" + ms_url_params.ProductCount + \"]:enabled\").click();\r\n }\r\n\r\n //if we dont have a location set in urls, and we have reduced backet installers, we just select the filter options but dont show it.\r\n if (!dontPrintList) {\r\n //show filter tab, its toggled again in ms_set_filters()\r\n ms_filter_display();\r\n }\r\n\r\n\r\n ms_set_filters();\r\n jQuery('#mapSearchLoad').addClass(\"fadeout\");\r\n }\r\n}\r\n\r\n//show location and apply filters from url params\r\n//used on page load when parameters are specified\r\nfunction ms_show_filtered_list() {\r\n var geocoder = new google.maps.Geocoder();\r\n var location = getLocationOrCountry();\r\n\r\n //overwrite default location\r\n if (location) {\r\n geocoder.geocode({ 'address': location }, function (results, status) {\r\n //overwrite only if location was found\r\n if (status == \"OK\" && typeof results[0].geometry.bounds !== 'undefined' && typeof results[0].geometry.location !== 'undefined') {\r\n var resultBounds = new google.maps.LatLngBounds(\r\n results[0].geometry.viewport.getSouthWest(),\r\n results[0].geometry.viewport.getNorthEast()\r\n );\r\n\r\n ms_Map.fitBounds(results[0].geometry.bounds);\r\n ms_Map.setCenter(results[0].geometry.location);\r\n document.getElementById('mapSearchInput').value = results[0].formatted_address;\r\n var pos = ms_Map.center;\r\n ms_distances = [];\r\n var locs = ms_markers.Data;\r\n for (var i = 0, len = locs.length; i < len; i++) {\r\n var distance = google.maps.geometry.spherical.computeDistanceBetween(pos, new google.maps.LatLng({ lat: parseFloat(locs[i].loc.lat), lng: parseFloat(locs[i].loc.lng) }));\r\n if (isNaN(distance)) distance = 99999999999;\r\n ms_distances.push({ d: distance, count: locs[i].ProductCount, id: locs[i].PspId });\r\n }\r\n //get the array of all distances and sort it from lower to higher\r\n ms_distances.sort(function (a, b) { return a.d - b.d });\r\n\r\n var closest = ms_distances;\r\n var closeids = [];\r\n\r\n //if location is not set, need to get data for all dealers as we are filtering country scope not city scope\r\n if (ms_Settings.MapCenter === location && ms_has_valid_url_prams) {\r\n closeids = setDealersIdsInArray(ms_distances)\r\n\r\n var chunkLimit = 100;\r\n var temparray;\r\n var contactData = [];\r\n\r\n for (var ii = 0; ii <= closeids.length; ii += chunkLimit) {\r\n var spliceLimit = ii + chunkLimit;\r\n temparray = closeids.slice(ii, spliceLimit);\r\n\r\n\r\n ms_getContactsById(temparray.join(','), function (d) {\r\n\r\n for (var j = 0; j < d.Data.length; j++) {\r\n contactData.push(d.Data[j]);\r\n }\r\n\r\n if (spliceLimit > closeids.length) {\r\n //its last iterations\r\n\r\n for (var k = 0; k < closest.length; k++) {\r\n closest[k].info = contactData.filter(function (obj) {\r\n return obj.PspId == closest[k].id;\r\n })[0];\r\n }\r\n\r\n\r\n var dontPrintList = true;\r\n setFilterList(closest, dontPrintList);\r\n reduce_dealers(closest);\r\n update_markers_on_map(ms_filtered, true);\r\n }\r\n });\r\n }\r\n } else {\r\n //extract the first X results\r\n closest = ms_list_paginate(ms_distances, ms_Settings.TotalSearchResults, 1);\r\n closeids = setDealersIdsInArray(closest);\r\n\r\n //get the full data for these pins and add it to them\r\n ms_getContactsById(closeids.join(','), function (d) {\r\n for (var i = 0, len = closest.length; i < len; i++) {\r\n closest[i].info = d.Data.filter(function (obj) {\r\n return obj.PspId == closest[i].id;\r\n })[0];\r\n }\r\n\r\n\r\n setFilterList(closest);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\nfunction show_mobile_map_view_list_item(marker_info) {\r\n if (!marker_info) { return; }\r\n var container = document.querySelector('#mapSearchList .ms_list_container');\r\n var mobile_container = document.querySelector('.ms_list_item_map_view');\r\n mobile_container.innerHTML = '';\r\n //set active class in list view\r\n var list_active_item = container.querySelector('.ms_list_item[data-id=\"' + marker_info.PspId + '\"]');\r\n list_active_item.classList.add('ms_list_item_clicked');\r\n var activeListItem = container.querySelector('.ms_list_item.ms_list_item_clicked').cloneNode(true);\r\n\r\n mobile_container.appendChild(activeListItem);\r\n}\r\n\r\nfunction hide_view_options() {\r\n document.querySelector('.ms_view_options').classList.add('is-hidden');\r\n}\r\n\r\nfunction show_view_options() {\r\n document.querySelector('.ms_view_options').classList.remove('is-hidden');\r\n}\r\n\r\nfunction setMapView() {\r\n document.getElementById('mapSearchContainer').classList.remove('ms_view_list');\r\n document.getElementById('mapSearchContainer').classList.add('ms_view_map');\r\n ms_mobile_view_option = 'map';\r\n}\r\n\r\nfunction setListView() {\r\n document.querySelector('.ms_view_options').classList.remove('is-hidden');\r\n document.getElementById('mapSearchContainer').classList.add('ms_view_list');\r\n document.getElementById('mapSearchContainer').classList.remove('ms_view_map');\r\n\r\n ms_mobile_view_option = 'list';\r\n}\r\n\r\nfunction switchAdditionalFeatures(status) {\r\n var listResults = document.querySelector('#mapSearchList .ms_list_results'),\r\n listSwitch = document.querySelector('#mapSearchList .ms_list_switch_wrapper'),\r\n infoButtons = document.querySelector('#mapSearchList .ms_infobuttons');\r\n\r\n if (status === 'hide') {\r\n listResults !== null ? listResults.classList.add('is-hidden') : '';\r\n listSwitch !== null ? listSwitch.classList.add('is-hidden') : '';\r\n infoButtons !== null ? infoButtons.classList.add('is-hidden') : '';\r\n } else if (status === 'show') {\r\n listResults !== null ? listResults.classList.remove('is-hidden') : '';\r\n listSwitch !== null ? listSwitch.classList.remove('is-hidden') : '';\r\n infoButtons !== null ? infoButtons.classList.remove('is-hidden') : '';\r\n }\r\n}\r\n\r\n//build list of closest places and print it\r\nfunction ms_print_list(closest, shrink, marker_info) {\r\n var items = [];\r\n var container = document.querySelector('#mapSearchList .ms_list_container');\r\n var list_item_dom;\r\n var mapSearch = document.getElementById('mapSearch');\r\n\r\n if (closest) {\r\n update_markers_on_map(closest, true);\r\n }\r\n\r\n //marker_info - display only one list item if search in not used\r\n if (marker_info && !closest) {\r\n container.innerHTML = '';\r\n //if there are no closest items dont list/map options\r\n hide_view_options();\r\n list_item_dom = document.querySelector('.ms_list_itemLayout .ms_list_item').cloneNode(true);\r\n //translations\r\n list_item_dom.querySelector('.ms_info_email').innerHTML = (ms_Settings.Translations.product_send_email_label || 'Send email');\r\n list_item_dom.querySelector('.ms_info_web span').innerHTML = (ms_Settings.Translations.product_web_address || 'Webaddress');\r\n list_item_dom.querySelector('.ms_info_times_label').innerHTML = (ms_Settings.Translations.product_info_times_label || 'Opening hours');\r\n list_item_dom.classList.add('ms_list_item_clicked');\r\n list_item_dom.setAttribute('data-id', marker_info.PspId);\r\n list_item_dom.querySelector('.ms_list_info_title').innerHTML = marker_info.FullName;\r\n list_item_dom.querySelector('.ms_list_info_address').innerHTML = marker_info.FullAddress;\r\n list_item_dom.querySelector('.ms_list_info_productCount').innerHTML = marker_info.ProductCount ? '' + (ms_Settings.Translations.product_count_label || \"Products on display\") + \": \" + marker_info.ProductCount + '' : '';\r\n list_item_dom.removeChild(list_item_dom.querySelector('.ms_list_expand'));\r\n list_item_dom.removeChild(list_item_dom.querySelector('.ms_list_collapse'));\r\n\r\n container.appendChild(list_item_dom);\r\n\r\n if (!mapSearch.classList.contains('ms_listed')) {\r\n mapSearch.classList.add('ms_listed');\r\n }\r\n\r\n //if only one result don't show additional features\r\n switchAdditionalFeatures('hide');\r\n //hide max distance selection if one result \r\n document.querySelector(\".ms_list_max_distance_wrapper\").classList.add('is-hidden')\r\n\r\n //show at the bottom of the map marker info seperated from the list view as map view \r\n if (ms_mobile_view_option === 'map' && window.innerWidth < 768) {\r\n show_mobile_map_view_list_item(marker_info);\r\n }\r\n\r\n } else if (marker_info && ms_mobile_view_option === 'map' && closest) {\r\n show_mobile_map_view_list_item(marker_info);\r\n show_view_options();\r\n } else {\r\n container.innerHTML = '';\r\n show_view_options();\r\n for (var i = 0, len = closest.length; i < len; i++) {\r\n var distance = '' + (closest[i].d / 1000).toFixed(1).replace(\".0\", '') + ' km';\r\n\r\n if (ms_Settings.DistancesInMiles) {\r\n distance = '' + (closest[i].d * 0.00062137).toFixed(1).replace(\".0\", '') + ' mi';\r\n }\r\n\r\n //clone\r\n list_item_dom = document.querySelector('.ms_list_itemLayout .ms_list_item').cloneNode(true);\r\n //translations\r\n list_item_dom.querySelector('.ms_list_expand').innerHTML = (ms_Settings.Translations.product_expand_label || 'Expand');\r\n list_item_dom.querySelector('.ms_list_collapse').innerHTML = (ms_Settings.Translations.product_collapse_label || 'Collapse');\r\n list_item_dom.querySelector('.ms_info_email').innerHTML = (ms_Settings.Translations.product_send_email_label || 'Send email');\r\n list_item_dom.querySelector('.ms_info_web span').innerHTML = (ms_Settings.Translations.product_web_address || 'Webaddress');\r\n list_item_dom.querySelector('.ms_info_times_label').innerHTML = (ms_Settings.Translations.product_info_times_label || 'Opening hours');\r\n list_item_dom.setAttribute('data-id', closest[i].id);\r\n list_item_dom.querySelector('.ms_list_info_title').innerHTML = closest[i].info.FullName;\r\n list_item_dom.querySelector('.ms_list_info_address').innerHTML = closest[i].info.FullAddress;\r\n list_item_dom.querySelector('.ms_list_info_productCount').innerHTML = closest[i].info.ProductCount ? '' + (ms_Settings.Translations.product_count_label || \"Products on display\") + \": \" + closest[i].info.ProductCount + '' : '';\r\n list_item_dom.querySelector('.ms_list_distance').innerHTML = distance;\r\n\r\n container.appendChild(list_item_dom);\r\n\r\n\r\n }\r\n\r\n //if multiple results show show additional features\r\n switchAdditionalFeatures('show');\r\n //if multiple results show max distance\r\n document.querySelector(\".ms_list_max_distance_wrapper\").classList.remove('is-hidden')\r\n\r\n\r\n //assign click event to items\r\n var its = container.querySelectorAll('.ms_list_item');\r\n\r\n for (var j = 0, lenn = its.length; j < lenn; j++) {\r\n its[j].addEventListener('click', function (event) {\r\n // event.preventDefault();\r\n event.stopPropagation();\r\n\r\n //if its already opened dont execute the code\r\n if (this.classList.contains('ms_list_item_clicked')) {\r\n if (event.target.classList.contains('ms_list_collapse')) {\r\n this.classList.remove(\"ms_list_item_clicked\");\r\n }\r\n\r\n return;\r\n }\r\n\r\n var id = this.getAttribute(\"data-id\"),\r\n marker = ms_get_marker(id);\r\n\r\n\r\n //add and remove clicked classes\r\n Array.prototype.forEach.call(its, function (item) {\r\n item.classList.remove(\"ms_list_item_clicked\");\r\n });\r\n\r\n pinInfoMapSearch(id, ms_Map, marker);\r\n scroll_to_ms_list_item();\r\n });\r\n }\r\n\r\n //number of results\r\n document.querySelector(\".ms_list_results\").innerHTML = its.length + \" \" + ms_Settings.Translations.results_found;\r\n\r\n\r\n //switch sort by distance or by number of products\r\n var applySwitchButtonTranslations = function () {\r\n var switchWrapper = document.querySelector(\".ms_list_switch_wrapper_header\"),\r\n distanceLabel = document.querySelector(\".ms_list_switch_wrapper_label.is-distance\"),\r\n productsLabel = document.querySelector(\".ms_list_switch_wrapper_label.is-products\");\r\n\r\n if (switchWrapper !== null) {\r\n switchWrapper.innerHTML = ms_Settings.Translations.product_sort_by ? ms_Settings.Translations.product_sort_by : 'Sort by:';\r\n }\r\n\r\n if (distanceLabel !== null) {\r\n distanceLabel.innerHTML = ms_Settings.Translations.product_sort_distance ? ms_Settings.Translations.product_sort_distance : 'Distance';\r\n\r\n }\r\n\r\n if (productsLabel !== null) {\r\n productsLabel.innerHTML = ms_Settings.Translations.product_sort_on_display ? ms_Settings.Translations.product_sort_on_display : 'Products on Display';\r\n }\r\n\r\n };\r\n\r\n applySwitchButtonTranslations();\r\n\r\n }\r\n /* If the result ID is set in URL query - execute only once on page load if url contains specific installer ID */\r\n openInstallerIfPsId(mapSearch);\r\n\r\n //if I'm coming from the initial show list function\r\n if (shrink) {\r\n var mapSearchList = document.getElementById('mapSearchList'),\r\n searchIcon = document.getElementById('mapSearchBar').querySelector('i');\r\n\r\n //show list, shrink map\r\n mapSearchList.classList.add('ms_listed');\r\n searchIcon.classList.remove(\"icon-search-black\");\r\n searchIcon.classList.add('icon-cross-light');\r\n\r\n searchIcon.addEventListener(\"click\", ms_list_remove_and_show_all_markers, true);\r\n\r\n //when I resize map, re-center it\r\n var center = ms_Map.getCenter();\r\n google.maps.event.trigger(ms_Map, 'resize');\r\n ms_Map.setCenter(center);\r\n\r\n\r\n }\r\n\r\n //go through filters and disable/enable available ones for this specific list of contacts\r\n ms_clear_filters();\r\n\r\n fixSidebarHeight();\r\n}\r\n\r\nfunction createMaxDistanceSelectBox() {\r\n var settings = ms_Settings;\r\n var select = document.querySelector(\".ms_list_max_distance\");\r\n if (settings && select) {\r\n var options = settings.Distances;\r\n var prefix = 'km';\r\n\r\n if (ms_Settings.DistancesInMiles) {\r\n prefix = 'mi';\r\n }\r\n if (options) {\r\n for (var i = 0; i < options.length; i++) {\r\n select.options[select.options.length] = new Option(options[i] + ' ' + prefix, options[i], ms_Settings.DefaultDistance == options[i], ms_Settings.DefaultDistance == options[i]);\r\n }\r\n }\r\n\r\n //add Event Listener\r\n\r\n select.addEventListener('change', function (event) {\r\n var value = event.target.value;\r\n ms_max_distance_allowed = value;\r\n ms_list(ms_place.geometry.location);\r\n });\r\n }\r\n}\r\n\r\nfunction openInstallerIfPsId(mapSearch) {\r\n if (ms_url_params.hasOwnProperty('pspid') && !mapSearch.classList.contains('ms_listed')) {\r\n var listItem = document.querySelectorAll('#mapSearchList .ms_list_item[data-id=\"' + ms_url_params.pspid + '\"]');\r\n if (listItem.length > 0) {\r\n listItem[0].click();\r\n scroll_to_ms_list_item();\r\n }\r\n }\r\n}\r\n\r\nfunction remove_active_class_from_ms_list_items() {\r\n var its = document.querySelectorAll('#mapSearchList .ms_list_container .ms_list_item');\r\n\r\n if (!its) { return; }\r\n\r\n for (var i = 0; i < its.length; i++) {\r\n its[i].classList.remove(\"ms_list_item_clicked\");\r\n }\r\n}\r\n\r\nfunction scroll_to_ms_list_item() {\r\n setTimeout(function () {\r\n var ms_list_container = document.querySelector(\"#mapSearchList .ms_list_container\"),\r\n ms_list_item_clicked = document.querySelector('#mapSearchList .ms_list_item.ms_list_item_clicked');\r\n\r\n if (!ms_list_item_clicked) {\r\n return;\r\n }\r\n\r\n if (window.innerWidth < 768) {\r\n //VMS menu is fixed position need to subtract\r\n var vmsMenu = document.querySelectorAll(\".fixedHeaderWrapper .mobile-menu\");\r\n\r\n if (vmsMenu.length > 0) {\r\n var yOffset = vmsMenu[0].offsetHeight;\r\n var y = ms_list_item_clicked.getBoundingClientRect().top + window.pageYOffset - yOffset;\r\n\r\n window.scrollTo({ top: y, behavior: 'smooth' });\r\n } else {\r\n ms_list_item_clicked.scrollIntoView({ block: 'start', behavior: 'smooth' });\r\n }\r\n\r\n } else {\r\n var scrollTop = ms_list_item_clicked.getBoundingClientRect().top - ms_list_container.getBoundingClientRect().top;\r\n var targetTop = document.querySelector(\"#mapSearchList .ms_list_container > *\").getBoundingClientRect().top - ms_list_container.getBoundingClientRect().top;\r\n var scrollOffset = scrollTop - targetTop;\r\n\r\n ms_list_container.scrollTop = scrollOffset;\r\n }\r\n }, 300);\r\n}\r\n\r\nfunction ms_list_remove_and_show_all_markers() {\r\n ms_list_remove();\r\n ms_show_all_markers();\r\n ms_tags_remove();\r\n setMapView();\r\n}\r\n\r\nfunction ms_tags_remove() {\r\n document.querySelector('.ms_filter_tags').innerHTML = '';\r\n\r\n var filters = document.querySelectorAll('.ms_filters input');\r\n\r\n for (var i = 0; i < filters.length; i++) {\r\n filters[i].checked = false;\r\n filters[i].setAttribute('data-checked', false);\r\n }\r\n}\r\n\r\n//Hide the list of found items \r\nfunction ms_list_remove() {\r\n document.getElementById('mapSearch').classList.remove('ms_listed');\r\n document.getElementById('mapSearchList').classList.remove('ms_listed');\r\n var closeIcon = document.getElementById('mapSearchBar').querySelector('i');\r\n closeIcon.classList.remove('icon-cross-light');\r\n closeIcon.classList.add(\"icon-search-black\");\r\n //closeIcon.removeEventListener(\"click\", function () { });\r\n closeIcon.removeEventListener(\"click\", ms_list_remove_and_show_all_markers, true);\r\n\r\n document.getElementById('mapSearchInput').value = \"\";\r\n var center = ms_Map.getCenter();\r\n google.maps.event.trigger(ms_Map, 'resize');\r\n ms_Map.setCenter(center);\r\n ms_closest = [];\r\n}\r\n\r\n//Show all markers after filter is used\r\nfunction ms_show_all_markers() {\r\n removeCluster();\r\n ms_pins(ms_markers, false);\r\n}\r\n\r\n\r\n//paginate list of locations\r\nfunction ms_list_paginate(array, page_size, page_number) {\r\n --page_number; // because pages logically start with 1, but technically with 0\r\n return array.slice(page_number * page_size, (page_number + 1) * page_size);\r\n}\r\n\r\n/* filter list */\r\n\r\n//hide/show filter\r\nfunction ms_filter_display() {\r\n var container = document.getElementById('mapSearchList');\r\n container.classList.toggle('ms-show-filter');\r\n}\r\n\r\n//get filters from settings and creates the filter list\r\nfunction ms_get_filters() {\r\n var ms = ms_Settings;\r\n var _t = ms.Translations;\r\n var IS_MULTI_SELECTABLE = 'multiSelectable';\r\n\r\n ms_filters = [\r\n { label: _t.map_type_label, filter: ms.MapType, key: 'MapType', },\r\n { label: _t.map_sub_type_label, filter: ms.SubTypes, key: 'SubTypes', },\r\n { label: _t.map_status_label, filter: ms.Status, key: 'Status', },\r\n { label: _t.map_services_label, filter: ms.Services, key: 'Services', },\r\n { label: _t.map_products_label, filter: ms.Products, key: 'Products', type: IS_MULTI_SELECTABLE },\r\n { label: _t.map_certificates_label, filter: ms.Certificates, key: 'Certificates', type: IS_MULTI_SELECTABLE },\r\n { label: _t.product_count_label, filter: [{ \"Name\": (ms_Settings.Translations.product_count_label_yes || \"Yes\"), \"Id\": 1 }, { \"Name\": (ms_Settings.Translations.product_count_label_no || \"No\"), \"Id\": 0 }], key: 'ProductCount' }\r\n ];\r\n\r\n\r\n //print those filters\r\n var filters = [];\r\n for (var i = 0, len = ms_filters.length; i < len; i++) {\r\n\r\n // if filter is disabled, don't print it and skip it\r\n if (ms.DisabledFilters && ms_isFilterDisabled(ms_filters[i], ms.DisabledFilters)) {\r\n continue;\r\n }\r\n\r\n //check if filter option exists if not skip the step\r\n if (ms_filters[i].filter) {\r\n ms_filters[i].filter = ms_filters[i].filter.filter(function (el) {\r\n return el.hasOwnProperty('IsActive') ? el.IsActive : true;\r\n });\r\n } else {\r\n continue;\r\n }\r\n\r\n\r\n //check if filters aren't empty and then print them (if not)\r\n var lenn = ms_filters[i].filter.length;\r\n var options = [];\r\n if (lenn > 0) {\r\n\r\n for (var ii = 0, lenn; ii < lenn; ii++) {\r\n var f = ms_filters[i].filter[ii];\r\n var n;\r\n var v;\r\n //not all filter objects have same naming :( - MUST FIX\r\n //nor the object of each pin the same way of identifying what it is (ex. array with obj + id)- MUST FIX\r\n if (f.hasOwnProperty('DisplayName')) {\r\n n = f.DisplayName;\r\n v = f.Id;\r\n } else if (f.hasOwnProperty('SubTypeName')) {\r\n n = f.SubTypeName;\r\n v = f.Id;\r\n } else if (f.hasOwnProperty('StatusName')) {\r\n n = f.StatusName;\r\n v = f.Id;\r\n } else if (f.hasOwnProperty('CertificateName')) {\r\n n = f.CertificateName;\r\n v = f.Id;\r\n } else {\r\n n = f.Name;\r\n v = f.Id;\r\n }\r\n\r\n if (ms_filters[i].type && ms_filters[i].type == IS_MULTI_SELECTABLE) {\r\n options.push(\r\n ''\r\n\r\n );\r\n } else {\r\n options.push(\r\n ' '\r\n );\r\n }\r\n }\r\n\r\n filter = [\r\n '
' + ms_filters[i].label + '
',\r\n options.join(''),\r\n '
'\r\n ].join('');\r\n\r\n filters.push(filter);\r\n\r\n //what filters are available?\r\n ms_av_filters.push(ms_filters[i].key === \"MapType\" ? \"Type\" : ms_filters[i].key);\r\n }\r\n }\r\n\r\n if (filters.length !== 0) {\r\n document.querySelector(\".ms_filter_container > .ms_filters\").innerHTML = filters.join('');\r\n watchFilterInputs();\r\n } else {\r\n document.getElementsByClassName(\"ms_list_filter_bot\")[0].style.display = \"none\";\r\n }\r\n\r\n //add event listener for products select to open options\r\n if (document.getElementsByClassName('ms_selectMultiList').length > 0) {\r\n var labels = document.querySelectorAll('.ms_selectMultiList_label');\r\n\r\n for (var j = 0; j < labels.length; j++) {\r\n labels[j].addEventListener(\"click\", ms_show_products_filter_options);\r\n }\r\n }\r\n}\r\n\r\nfunction ms_show_products_filter_options(event) {\r\n event.stopPropagation();\r\n var labelClass = 'ms_selectMultiList_label';\r\n if (!this.classList.contains(labelClass)) { return; }\r\n\r\n if (this.classList.contains('is-active')) {\r\n this.classList.remove('is-active')\r\n } else {\r\n this.classList.add('is-active')\r\n }\r\n}\r\n\r\nfunction ms_isFilterDisabled(currentFilter, disabledFilters) {\r\n return disabledFilters[currentFilter.key];\r\n}\r\n\r\n//run through the list of closest points and, if these don't have matches with a filter, it will hide them\r\nfunction ms_clear_filters() {\r\n if (ms_closest.length > 0 && ms_av_filters.length > 0) {\r\n //go through array of filters to check\r\n var has = {};\r\n if (ms_av_filters.length) {\r\n for (var ii = 0, l = ms_av_filters.length; ii < l; ii++) {\r\n var ex = 0;\r\n for (var i = 0, len = ms_closest.length; i < len; i++) {\r\n if (ms_closest[i].info.hasOwnProperty(ms_av_filters[ii]) && (ms_closest[i].info[ms_av_filters[ii]].length || ms_closest[i].info[ms_av_filters[ii]] > 0)) ex++;\r\n }\r\n has[ms_av_filters[ii]] = ex;\r\n\r\n //if there's no contact with this filter, disable it\r\n var f = document.querySelector(\".ms_filters .ms_filter_option > input[data-category='\" + (ms_av_filters[ii] === \"Type\" ? \"MapType\" : ms_av_filters[ii]) + \"']\");\r\n\r\n ex === 0 ? f.parentNode.parentNode.classList.add('is-disabled') : '';\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction reduce_dealers(closest) {\r\n //we want to reduce dealers by using filter options, we dont want to select them, just reduce it and use Mapsearch as usual.\r\n if (ms_has_valid_url_prams && ms_url_params) {\r\n var filters = {};\r\n Object.keys(ms_url_params).forEach(function (k) {\r\n var element = ms_url_params[k];\r\n var key = k.charAt(0).toUpperCase() + k.slice(1);\r\n\r\n element.indexOf(',') > -1 ? filters[key] = element.split(',') : filters[key] = element;\r\n });\r\n\r\n ms_filtered = use_filters(closest, filters);\r\n\r\n ms_markers.Data = ms_markers.Data.filter(function (marker) {\r\n var result = ms_filtered.filter(function (filter) {\r\n return marker.PspId == filter.info.PspId;\r\n })\r\n\r\n return result.length > 0;\r\n })\r\n }\r\n\r\n jQuery('#mapSearchLoad').addClass(\"fadeout\");\r\n}\r\n\r\n\r\nfunction use_filters(ms_filtered, filters) {\r\n //type (if it's not defined or empty, don't filter)\r\n if (typeof (filters.MapType) !== \"undefined\" && filters.MapType) {\r\n ms_filtered = ms_filtered.filter(function (el) {\r\n return el.info.Type == filters.MapType;\r\n });\r\n }\r\n if (typeof (filters.SubTypes) !== \"undefined\" && filters.SubTypes) {\r\n ms_filtered = ms_filtered.filter(function (el) {\r\n var pe = el.info.SubType.filter(function (p) {\r\n return p.Id == filters.SubTypes;\r\n });\r\n return pe.length > 0;\r\n });\r\n }\r\n if (typeof (filters.Status) !== \"undefined\" && filters.Status) {\r\n ms_filtered = ms_filtered.filter(function (el) {\r\n var pe = el.info.Status.filter(function (p) {\r\n return p.Id == filters.Status;\r\n });\r\n return pe.length > 0;\r\n });\r\n }\r\n if (typeof (filters.Services) !== \"undefined\" && filters.Services) {\r\n ms_filtered = ms_filtered.filter(function (el) {\r\n var pe = el.info.Services.filter(function (p) {\r\n return p.Id == filters.Services;\r\n });\r\n return pe.length > 0;\r\n });\r\n }\r\n if (typeof (filters.Certificates) !== \"undefined\") {\r\n ms_filtered = ms_filtered.filter(function (el) {\r\n if (Array.isArray(filters.Certificates)) {\r\n var CertificatesFound = 0;\r\n for (var i = 0; i < el.info.Certificates.length; i++) {\r\n if (filters.Certificates.indexOf(el.info.Certificates[i].Id) > -1) {\r\n CertificatesFound++;\r\n }\r\n }\r\n if (CertificatesFound === filters.Certificates.length) {\r\n return true;\r\n }\r\n } else {\r\n var pe = el.info.Certificates.filter(function (p) {\r\n return p.Id == filters.Certificates;\r\n });\r\n return pe.length > 0;\r\n }\r\n });\r\n }\r\n if (typeof (filters.Products) !== \"undefined\") {\r\n ms_filtered = ms_filtered.filter(function (el) {\r\n if (Array.isArray(filters.Products)) {\r\n var productsFound = 0;\r\n for (var z = 0; z < el.info.Products.length; z++) {\r\n if (filters.Products.indexOf(el.info.Products[z].Id) > -1) {\r\n productsFound++;\r\n }\r\n }\r\n if (productsFound === filters.Products.length) {\r\n return true;\r\n }\r\n } else {\r\n var pe = el.info.Products.filter(function (p) {\r\n return p.Id == filters.Products;\r\n });\r\n return pe.length > 0;\r\n }\r\n\r\n });\r\n }\r\n if (typeof (filters.ProductCount) !== \"undefined\" && filters.ProductCount !== \"\") {\r\n ms_filtered = ms_filtered.filter(function (el) {\r\n if (filters.ProductCount === \"0\") {\r\n return el.info.ProductCount < 1;\r\n } else {\r\n return el.info.ProductCount >= filters.ProductCount;\r\n }\r\n });\r\n }\r\n\r\n return ms_filtered;\r\n}\r\n\r\n//set filters and filters out the list\r\nfunction ms_set_filters(hideFilterSection) {\r\n //only run this if there are elements in the \"closest\" list\r\n if (ms_closest.length > 0) {\r\n //my selected filters\r\n var filters = {};\r\n //tracking - i make another object for tracking these filters\r\n var filters_tr = {};\r\n //set value and label name for tags\r\n var tags = [];\r\n //look at the selected options and create a filters object\r\n var sel = document.querySelectorAll('.ms_filter_container > .ms_filters > .ms_filter .ms_filter_option input[type=\"radio\"]:checked');\r\n for (var i = 0, len = sel.length; i < len; i++) {\r\n var k = sel[i].getAttribute(\"data-category\");\r\n var v = sel[i].value;\r\n filters[k] = v;\r\n //tracking - the filter tracking needs the name, so I make a new var with the selected value label \r\n var filter_label = sel[i].parentNode.innerText;\r\n filters_tr[k] = filter_label;\r\n //tags\r\n tags.push({\r\n id: v,\r\n name: filter_label,\r\n category: k\r\n });\r\n }\r\n //add to filters list multiselect values\r\n var multiSel = document.querySelectorAll('.ms_filter_container > .ms_filters > .ms_filter .ms_filter_option > input[type=\"checkbox\"]');\r\n if (multiSel.length > 0) {\r\n var filters_tr_multiSelect = [];\r\n for (var ii = 0, lenn = multiSel.length; ii < lenn; ii++) {\r\n var kk = multiSel[ii].getAttribute(\"data-category\");\r\n // make filters products list as array\r\n if (!filters[kk]) {\r\n filters[kk] = [];\r\n } else if (filters[kk].constructor !== Array) {\r\n //if filter products has value from url params\r\n filters[kk] = filters[kk].split(',');\r\n }\r\n\r\n if (multiSel[ii].checked) {\r\n var vv = multiSel[ii].value;\r\n var selectedText = multiSel[ii].parentNode.innerText;\r\n var n = selectedText.length > 0 ? selectedText : \"Empty\";\r\n //tracking \r\n filters_tr_multiSelect.push(n);\r\n //filters\r\n filters[kk].push(vv);\r\n //tags\r\n tags.push({\r\n id: vv,\r\n name: n,\r\n category: kk\r\n });\r\n }\r\n }\r\n //add multiple selected elements as a string list to tracking array\r\n filters_tr[kk] = filters_tr_multiSelect.join();\r\n }\r\n\r\n //only keep list items that have these properties\r\n ms_filtered = use_filters(ms_closest, filters);\r\n\r\n ms_print_list(ms_filtered, false);\r\n\r\n if (!hideFilterSection) {\r\n ms_filter_display();\r\n }\r\n\r\n //\"filters_tr\" contains names of the selections rather then \"filters\" variable contains values (id's)\r\n ms_show_filter_tags(Object.values(tags));\r\n\r\n //if i'm on mobile, jump to the list\r\n ms_jump(document.getElementById(\"mapSearchList\"));\r\n\r\n //track the filter list\r\n ms_registerDataLayer(\"Filter\", JSON.stringify(filters_tr));\r\n }\r\n fixSidebarHeight();\r\n}\r\n\r\nfunction ms_show_filter_tags(tags) {\r\n var tags_container = document.querySelector('#mapSearchList .ms_filter_tags');\r\n\r\n if (!tags || tags.length === 0) {\r\n tags_container.classList.add('is-hidden');\r\n } else {\r\n tags_container.classList.remove('is-hidden');\r\n }\r\n\r\n var filtered_tags = [];\r\n for (var i = 0; i < tags.length; i++) {\r\n var tag = [\r\n '
' + tags[i].name + '
'\r\n ].join('');\r\n\r\n filtered_tags.push(tag);\r\n }\r\n\r\n tags_container.innerHTML = filtered_tags.join('');\r\n}\r\n\r\n\r\nfunction update_filtered_listed_based_on_tags(tag) {\r\n //unselect radio and checkboxes\r\n var filter_id = tag.getAttribute('data-id');\r\n var filter_category = tag.getAttribute('data-category');\r\n //todo: check if possible to checked= true data-checked true not click\r\n document.querySelector('.ms_filters input[data-category=\"' + filter_category + '\"][value=\"' + filter_id + '\"]').click();\r\n ms_set_filters(true);\r\n}\r\n\r\n/* more info (overlay with information of dealer/installer). */\r\nfunction ms_more_info(id) {\r\n ms_getContactsById(id, ms_more_info_show);\r\n}\r\n\r\nfunction ms_more_info_show(inf) {\r\n //geting data from getContactsById API\r\n var info = inf.Data[0],\r\n mobile_list_location = document.querySelector('#mapSearchContainer > .ms_list_item_map_view .ms_list_item.ms_list_item_clicked .ms_list_expanded'),\r\n desktop_list_location = document.querySelector('#mapSearchList .ms_list_container .ms_list_item.ms_list_item_clicked .ms_list_expanded'),\r\n ms_infoContent = (ms_mobile_view_option === 'map' && window.innerWidth < 768) ? mobile_list_location : desktop_list_location;\r\n\r\n if (ms_infoContent === null) {\r\n return;\r\n }\r\n\r\n var ms_infoWeb = ms_infoContent.querySelector(\".ms_info_web\");\r\n\r\n if (info.Telephone1 !== null) {\r\n ms_infoContent.querySelector(\".ms_info_phone_container .ms_info_phone_number > a\").innerHTML = info.Telephone1;\r\n ms_infoContent.querySelector(\".ms_info_phone_container .ms_info_phone_number > a\").href = 'tel: +' + info.Telephone1;\r\n ms_infoContent.querySelector(\".ms_info_phone_container > a\").setAttribute(\"data-label\", info.FullName + \" | \" + info.Telephone1);\r\n } else {\r\n ms_infoContent.querySelector(\".ms_info_phone_container\").style.display = \"none\";\r\n }\r\n\r\n if (info.Email !== null) {\r\n ms_infoContent.querySelector(\".ms_info_email\").href = \"mailto:\" + info.Email;\r\n } else {\r\n ms_infoContent.querySelector(\".ms_info_email_container\").style.display = \"none\";\r\n }\r\n\r\n if (info.WebAddress !== null) {\r\n ms_infoWeb.href = info.WebAddress;\r\n } else {\r\n ms_infoWeb.style.display = \"none\";\r\n }\r\n\r\n ms_infoContent.querySelector(\".ms_i_navigation\").href = \"https://www.google.com/maps/dir/?api=1&destination=\" + encodeURIComponent(info.FullAddress) + \"&origin=\" + encodeURIComponent(document.getElementById('mapSearchInput').value);\r\n\r\n //search for the opening hours (using google api)\r\n var service = new google.maps.places.PlacesService(document.getElementById('ms_info_autocomplete'));\r\n var search = service.textSearch({ query: info.FullName + \", \" + info.FullAddress }, function (response, status, pagination) {\r\n if (status === google.maps.GeocoderStatus.OK && response.length > 0) {\r\n service.getDetails({ placeId: response[0].place_id }, function (place, status) {\r\n\r\n if (place.opening_hours) {\r\n var opening = \"\";\r\n for (var i = 0, len = place.opening_hours.weekday_text.length; i < len; i++) {\r\n opening += \"
\" + place.opening_hours.weekday_text[i] + \"
\";\r\n }\r\n ms_infoContent.querySelector(\".ms_info_times\").innerHTML = opening;\r\n } else {\r\n //hide label and data if no data present\r\n ms_infoContent.querySelector(\".ms_info_times\").setAttribute('style', 'display: none;');\r\n ms_infoContent.querySelector(\".ms_info_times_label\").setAttribute('style', 'display: none;');\r\n }\r\n });\r\n }\r\n });\r\n\r\n //Get the Services\r\n if (info.Services.length > 0) {\r\n var services = [];\r\n for (var i = 0, len = info.Services.length; i < len; i++) {\r\n services.push(info.Services[i].Name);\r\n }\r\n ms_infoContent.querySelector(\".ms_info_ad_services div\").innerHTML = services.join(', ');\r\n } else {\r\n ms_infoContent.querySelector(\".ms_info_ad_services\").style.display = \"none\";\r\n }\r\n\r\n //Get the Other Services\r\n if (info.AdditionalService) {\r\n if (Array.isArray(info.AdditionalService)) {\r\n var services = [];\r\n for (var i = 0, len = info.AdditionalService.length; i < len; i++) {\r\n services.push(info.AdditionalService[i].Name);\r\n }\r\n ms_infoContent.querySelector(\".ms_info_ad_other_services div\").innerHTML = services.join(', ');\r\n }\r\n else {\r\n ms_infoContent.querySelector(\".ms_info_ad_other_services div\").innerHTML = info.AdditionalService;\r\n }\r\n } else {\r\n ms_infoContent.querySelector(\".ms_info_ad_other_services\").style.display = \"none\";\r\n }\r\n\r\n //get the Status\r\n if (info.Status.length > 0) {\r\n var st = [];\r\n for (var i = 0, len = info.Status.length; i < len; i++) {\r\n st.push(info.Status[i].StatusName);\r\n }\r\n ms_infoContent.querySelector(\".ms_info_ad_status div\").innerHTML = st.join(', ');\r\n } else {\r\n ms_infoContent.querySelector(\".ms_info_ad_status\").style.display = \"none\";\r\n }\r\n\r\n //Get the Products\r\n if (info.Products.length > 0) {\r\n var products = [];\r\n for (var i = 0, len = info.Products.length; i < len; i++) {\r\n\r\n var product = [\r\n '
',\r\n info.Products[i].ProductImageSrc ? '' : '',\r\n '' + info.Products[i].Name + '',\r\n '
'\r\n ].join('');\r\n\r\n products.push(product);\r\n }\r\n\r\n ms_infoContent.querySelector(\".ms_info_ad_products_element\").innerHTML = products.join('');\r\n } else {\r\n ms_infoContent.querySelector(\".ms_info_ad_products\").style.display = \"none\";\r\n }\r\n\r\n // Get the certificates\r\n if (info.Certificates.length > 0) {\r\n var certificates = [];\r\n var ul = ms_infoContent.querySelector(\".certificate_list\");\r\n\r\n for (var c = 0; c < info.Certificates.length; c++) {\r\n var certificate = [\r\n '
  • ' + info.Certificates[c].CertificateName + '
  • '\r\n ].join('');\r\n\r\n certificates.push(certificate);\r\n }\r\n ul.innerHTML = certificates.join('');\r\n } else {\r\n ms_infoContent.querySelector(\".ms_info_certificate\").style.display = \"none\";\r\n }\r\n\r\n //tracking\r\n ms_registerDataLayer(\"More Info\", info.FullName);\r\n}\r\n\r\nfunction openDealerContactForm() {\r\n var emailElements = document.querySelectorAll('.ms_info_email_container')\r\n var form = document.querySelector('.ms_contactForm');\r\n\r\n emailElements.forEach(function (element) {\r\n element.addEventListener('click', function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (ms_Settings && ms_Settings.Form) {\r\n form.classList.add('is-active');\r\n var emailAddress = element.querySelector('.ms_info_email').href.replace('mailto:', '');\r\n var pspId = element.closest('.ms_list_item').dataset.id;\r\n var dealerName = jQuery(element).closest('.ms_list_item').find('.ms_list_info_title').text();\r\n\r\n form.querySelector('input[name=\"installer_dealer_email\"]').value = emailAddress;\r\n form.querySelector('input[name=\"pspid\"]').value = pspId;\r\n form.querySelector('input[name=\"name_of_installer_dealer\"]').value = dealerName;\r\n form.querySelector('input[name=\"unsubscribe_language\"]').value = jQuery('#hfCurrentLanguage').val();\r\n\r\n form.querySelector('.ms_contactForm_close').addEventListener('click', function () {\r\n form.classList.remove('is-active');\r\n })\r\n\r\n form.scrollIntoView({ behavior: \"smooth\", block: \"start\", inline: \"nearest\" });\r\n } else {\r\n window.open(element.querySelector('.ms_info_email').href);\r\n }\r\n });\r\n });\r\n}\r\n\r\n/* jump to certain point of the map/list on mobile */\r\nfunction ms_jump(to) {\r\n if (window.innerWidth < 768) {\r\n jQuery(\"html, body\").animate({\r\n scrollTop: jQuery(to).offset().top\r\n }, 600);\r\n }\r\n}\r\n\r\n\r\n\r\n// creates dictionary where each type is active or not active\r\nfunction GetTypesActiveDictionary() {\r\n var activeTypes = {};\r\n jQuery.each(ms_Settings.MapType, function (i, value) {\r\n activeTypes[value.Id] = value.IsActive;\r\n });\r\n\r\n return activeTypes;\r\n}\r\n\r\n//get parameters from url\r\nfunction getJsonFromUrl() {\r\n var query = location.search.substr(1);\r\n var result = {};\r\n query.split(\"&\").forEach(function (part) {\r\n var item = part.split(\"=\");\r\n result[item[0].toLocaleLowerCase()] = decodeURIComponent(item[1]); // Setting lowercase to disregard case sensitive URL\r\n });\r\n return result;\r\n}\r\n\r\nfunction SelectHasValueIfExists(select, value) {\r\n obj = document.getElementById(select);\r\n\r\n if (obj !== null) {\r\n return (obj.innerHTML.indexOf('value=\"' + value + '\"').setAttribute(\"selected\") > -1);\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\n\r\n/*\r\nMAP SEARCH TRACKING\r\n*/\r\n\r\n//will only be true in the beginning\r\nvar ms_start = true;\r\nvar ms_track_label = false;\r\n\r\nfunction ms_registerDataLayer(action, label) {\r\n if (typeof (dataLayer) !== \"undefined\") {\r\n var data = {\r\n 'event': 'interactioneventga',\r\n 'eventcategory': \"Map search\",\r\n 'eventaction': action,\r\n 'eventlabel': label,\r\n 'eventnoninteraction': false\r\n };\r\n dataLayer.push(data);\r\n }\r\n}\r\n\r\n//when the user has interacted, but have't chosen an installer\r\nwindow.addEventListener(\"unload\", function (e) {\r\n if (!ms_start && ms_track_label) {\r\n ms_registerDataLayer(\"Abandon\", ms_track_label);\r\n }\r\n});\r\n\r\n/* Copy MapSearch settings to URL functions */\r\nfunction ms_copy_link(pspid, event) {\r\n if (event) {\r\n event.stopPropagation();\r\n if (window.innerWidth < 768) {\r\n window.scrollTo({\r\n left: 0,\r\n top: 0,\r\n })\r\n }\r\n\r\n }\r\n\r\n var query = window.location.origin + window.location.pathname + '?',\r\n productInputs = document.querySelectorAll(\"#mapSearchList .ms_filters input[data-category='Products']:checked:enabled\");\r\n\r\n query = query + 'loc=' + document.getElementById('mapSearchInput').value;\r\n\r\n if (pspid && typeof pspid === 'string') {\r\n query = query + '&pspid=' + pspid;\r\n }\r\n\r\n jQuery(ms_filters).each(function (index, value) {\r\n var inputValue = jQuery(\"#mapSearchList .ms_filters input[data-category='\" + value.key + \"']:checked:enabled\").val();\r\n\r\n //Products are multi selectable items\r\n if (productInputs && value.key === 'Products') {\r\n query = query + '&' + value.key + '=';\r\n //then add product Id's seperated by comma\r\n for (var i = 0; i < productInputs.length; i++) {\r\n i === 0 ? query = query + productInputs[i].value : query = query + ',' + productInputs[i].value;\r\n }\r\n\r\n } else if (inputValue && value.key !== 'Products') {\r\n query = query + '&' + value.key + '=' + inputValue;\r\n }\r\n\r\n\r\n });\r\n\r\n ms_fill_copy_field(query);\r\n\r\n return query;\r\n}\r\nfunction ms_copy_result_to_clipboard() {\r\n var activeResult = document.querySelector('.ms_list_item_clicked'),\r\n activeId = activeResult.dataset.id,\r\n query = ms_copy_link();\r\n\r\n query = query + '&pspid=' + activeId;\r\n\r\n ms_fill_copy_field(query);\r\n}\r\nfunction ms_fill_copy_field(e) {\r\n var copyField = document.getElementById('ms_copy_link_bar');\r\n copyField.classList.add('active');\r\n copyField.querySelector('input').value = e;\r\n}\r\nfunction ms_copy_to_clipboard() {\r\n var copyField = document.getElementById('ms_copy_link_field');\r\n copyField.select();\r\n copyField.setSelectionRange(0, 99999); /*For mobile devices*/\r\n document.execCommand(\"copy\");\r\n}\r\nfunction ms_toggleDistanceAndFilter(show) {\r\n if (!show) {\r\n document.getElementById('mapSearchList').classList.add('hide-filter');\r\n } else {\r\n document.getElementById('mapSearchList').classList.remove('hide-filter');\r\n document.getElementById('mapSearchList').classList.remove('hide-filter');\r\n }\r\n}\r\nfunction sortByRanking(closest) {\r\n //if sorting by ranking points, re-sort the list\r\n if (ms_Settings.StandardSorting === 'ranking') {\r\n /* Filter out the values with value 0 (RankingPoint not set) */\r\n var part1 = [], part2 = [];\r\n\r\n for (var i = 0, len = closest.length; i < len; i++) {\r\n if (closest[i].info.RankingPoint === \"0\") {\r\n part2.push(closest[i]);\r\n } else {\r\n part1.push(closest[i]);\r\n }\r\n }\r\n\r\n part1.sort(function (a, b) {\r\n return b.info.RankingPoint - a.info.RankingPoint;\r\n });\r\n\r\n return part1.concat(part2);\r\n }\r\n}"],"names":["ms_getSettings","$","jQuery","ajax","type","cache","url","contentType","dataType","data","val","success","result","ms_init","d","error","request","status","ms_sendDealersEmail","formFields","each","push","id","this","attr","FieldValue","is","JSON","stringify","ms_showFormSucessMessage","ms_getContacts","ms_pins","ms_markers","ms_has_valid_url_prams","ms_show_filtered_list","addClass","ms_getContactsById","pspId","fn","async","ms_Settings","ms_Map","ms_markers_map","ms_distances","ms_filters","ms_url_params","ms_place","ms_filtered","ms_location_geometry","ms_infoWindow","ms_colors","ms_more_info_template","ms_closest","ms_av_filters","ms_switchStatus","ms_mobile_view_option","ms_max_distance_allowed","last_place_searched","updateLastPlace","place_id","ms_clearAllFilters","ms","TotalSearchResults","DefaultDistance","getJsonFromUrl","hasOwnProperty","map","google","maps","Map","document","getElementById","scrollwheel","mapTypeControl","streetViewControl","rotateControl","fullscreenControl","gestureHandling","geocoder","Geocoder","location","MapCenter","isEmptyObject","geocode","address","loc","results","geometry","bounds","ms_centerMap","value","formatted_address","fitBounds","setCenter","alert","checkSwitchStatus","input","autocomplete","places","Autocomplete","types","bindTo","marker","Marker","setMapView","event","addDomListener","e","suggestionSelected","querySelectorAll","key","triggered","length","ex1","Event","code","keyCode","trigger","ex2","addListener","setVisible","getPlace","console","log","viewport","setZoom","setPosition","setListView","ms_list","ms_set_filters","ms_start","ms_registerDataLayer","ms_track_label","openDealerContactForm","onclick","ms_findLocation","preventDefault","findMyLocationButton","addEventListener","classList","add","legs","i","len","MapType","legend","l","IsActive","Pin","toLowerCase","DisplayName","join","Id","innerHTML","ms_translate","ms_get_filters","querySelector","ms_copy_link","ms_copy_to_clipboard","DisabledFilters","All","Distance","createMaxDistanceSelectBox","Form","createDealersContectForm","fixSidebarHeight","setTimeout","maxHeight","outerHeight","headHeight","height","form","container","leftColumn","rightColumn","button","innerText","Headline","Fields","isHidden","isTextArea","endOfTextArea","formElement","insertAdjacentHTML","ButtonText","stopPropagation","ms_dealersForm_valid","hasError","contains","index","element","el","errorMessage","closest","required","dataset","removeClass","Key","Value","SuccessMessage","remove","checked","enableOrDisableCTA","isFilterOptionSelected","enable","watchFilterInputs","setRadioInputScope","radioInputField","otherRadioInputs","getAttribute","Array","from","filter","forEach","setAttribute","mapSearch","switchButton","getElementsByClassName","DisableSorting","StandardSorting","ms_toggleDistanceAndFilter","orderList","ms_list_paginate","sort","a","b","count","ms_print_list","decodeHtml","text","txt","createElement","_t","Translations","pho","nav","info","services","otherServices","products","certificate","list_filter","apply","clear_filter","ms_list_max_distance_label","search_bar_placeholder","find_near_me","show_phone_number_text","navigate_button_label","more_info_button_label","map_services_label","other_services_label","map_status_label","map_products_label","map_certificates_label","filter_text","apply_button_text","clear_filter_button_text","ms_list_max_distance_label_text","navigator","geolocation","getCurrentPosition","position","pos","lat","coords","latitude","lng","longitude","infoWindowMapSearch","LatLng","handleLocationError","getCenter","browserHasGeolocation","update_markers_on_map","removeCluster","markers","window","markerCluster","getMarkers","setMap","removeMarkers","clearMarkers","updateMap","LatLngBounds","cluster_styles","width","getClusterInlineSvg","textColor","textSize","extend","parseFloat","icon","pinSymbolMapSearch","Type","ms_id","PspId","Data","MarkerClusterer","styles","maxZoom","pinInfoMapSearch","color","btoa","path","fillColor","getHexColor","fillOpacity","scale","ms_get_info","obj","ms_get_marker","FullName","FullAddress","Telephone1","choose_view_option","view","remove_active_class_from_ms_list_items","innerWidth","scroll_to_ms_list_item","ms_more_info","getPosition","ms_showPhone","t","target","style","display","nextElementSibling","locs","currentDistance","distance","spherical","computeDistanceBetween","isNaN","DistancesInMiles","ProductCount","closeids","sortByRanking","sel","selectedIndex","multiSel","ii","lenn","labels","iii","lennn","getLocationOrCountry","setDealersIdsInArray","setFilterList","dontPrintList","maptype","click","subtypes","productsArray","split","productIndex","CertificatesArray","CertificateIndex","ms_filter_display","getSouthWest","getNorthEast","center","contactData","spliceLimit","slice","j","k","reduce_dealers","show_mobile_map_view_list_item","marker_info","mobile_container","activeListItem","cloneNode","appendChild","hide_view_options","show_view_options","switchAdditionalFeatures","listResults","listSwitch","infoButtons","shrink","list_item_dom","switchWrapper","distanceLabel","productsLabel","product_send_email_label","product_web_address","product_info_times_label","product_count_label","removeChild","toFixed","replace","product_expand_label","product_collapse_label","its","prototype","call","item","results_found","product_sort_by","product_sort_distance","product_sort_on_display","openInstallerIfPsId","mapSearchList","searchIcon","ms_list_remove_and_show_all_markers","ms_clear_filters","settings","select","options","Distances","prefix","Option","listItem","pspid","y","ms_list_container","ms_list_item_clicked","vmsMenu","yOffset","offsetHeight","getBoundingClientRect","top","pageYOffset","scrollTo","behavior","scrollIntoView","block","scrollOffset","scrollTop","ms_list_remove","ms_show_all_markers","ms_tags_remove","filters","closeIcon","removeEventListener","array","page_size","page_number","toggle","IS_MULTI_SELECTABLE","label","map_type_label","map_sub_type_label","SubTypes","Status","Services","Products","Certificates","Name","product_count_label_yes","product_count_label_no","ms_isFilterDisabled","n","f","v","SubTypeName","StatusName","CertificateName","ms_show_products_filter_options","currentFilter","disabledFilters","has","ex","parentNode","Object","keys","charAt","toUpperCase","indexOf","use_filters","SubType","p","isArray","CertificatesFound","productsFound","z","hideFilterSection","filters_tr","tags","filter_label","name","category","filters_tr_multiSelect","vv","kk","constructor","selectedText","ms_show_filter_tags","values","ms_jump","tags_container","filtered_tags","tag","update_filtered_listed_based_on_tags","filter_id","filter_category","ms_more_info_show","inf","mobile_list_location","desktop_list_location","ms_infoContent","ms_infoWeb","href","Email","WebAddress","encodeURIComponent","service","PlacesService","textSearch","query","response","pagination","GeocoderStatus","OK","getDetails","placeId","place","opening_hours","opening","weekday_text","AdditionalService","st","product","ProductImageSrc","certificates","ul","c","emailElements","emailAddress","dealerName","find","inline","open","to","animate","offset","GetTypesActiveDictionary","activeTypes","search","substr","part","toLocaleLowerCase","decodeURIComponent","SelectHasValueIfExists","action","dataLayer","eventcategory","eventaction","eventlabel","eventnoninteraction","left","origin","pathname","productInputs","inputValue","ms_fill_copy_field","ms_copy_result_to_clipboard","activeId","copyField","setSelectionRange","execCommand","show","part1","part2","RankingPoint","concat"],"mappings":"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"}