{"version":3,"sources":["jquery.loadTemplate.js","markerclusterer.js","shvenergy.search.dealer.js","shvenergy.search.filters.js","shvenergy.search.gui.js","shvenergy.maps.js"],"names":["$","templates","queue","formatters","loadTemplate","template","data","options","$template","isFile","settings","selection","$that","this","extend","async","overwriteCache","complete","success","error","each","html","errorMessage","paged","pageNo","elemPerPage","append","prepend","beforeInsert","afterInsert","bindingOptions","ignoreUndefined","ignoreNull","ignoreEmptyString","type","newOptions","todo","length","doPrepend","done","errored","errorObjects","startNo","slice","call","e","push","reverse","str","indexOf","$templateContainer","clone","prepareTemplate","prepareTemplateFromCache","hasOwnProperty","templateUrl","url","uniqueId","urlAvoidCache","ajax","templateContent","value","shift","handleTemplateLoadingSuccess","key","handleTemplateLoadingError","loadAndPrepareTemplate","is","parseHTML","trim","loadTemplateFromDocument","addTemplateFormatter","formatter","Date","getTime","processElements","$elem","applyFormatters","applyDataRemoveHandler","text","attr","removeHandlers","removethis","shvenergy","maps","usePreferredPartenerLabel","addClass","$linkElem","wrap","appendTo","listItemTemplate","find","listItem","remove","$this","param","parseJSON","removeAttr","_typeof","getValue","attribute","valueIsAllowedByBindingOptions","applyDataBindFormatters","optionsData","content","undefined","selected","processAllElements","val","removeOnNoData","$templateHtml","children","eq","removeparent","parent","removethischeckparent","el","func","dataBindFunction","noDataFunction","bindingOptionsContainer","jQuery","getBindingOptions","formatOptions","part","paramParts","split","formatterTarget","internalSettings","parentElement","fn","MarkerClusterer","map","opt_markers","opt_options","google","OverlayView","map_","markers_","clusters_","sizes","styles_","style_","ready_","gridSize_","minClusterSize_","maxZoom_","imagePath_","MARKER_CLUSTER_IMAGE_PATH_","imageExtension_","MARKER_CLUSTER_IMAGE_EXTENSION_","zoomOnClick_","averageCenter_","setupStyles_","setMap","prevZoom_","getZoom","that","event","addListener","zoom","resetViewport","redraw","addMarkers","Cluster","markerClusterer","markerClusterer_","getMap","getGridSize","getMinClusterSize","isAverageCenter","center_","bounds_","clusterIcon_","ClusterIcon","getStyles","cluster","styles","opt_padding","getMarkerClusterer","padding_","cluster_","div_","sums_","visible_","prototype","obj1","obj2","object","property","apply","onAdd","setReady_","draw","size","i","Object","assign","height","width","fitMapToMarkers","marker","markers","getMarkers","bounds","LatLngBounds","getPosition","fitBounds","setStyles","isZoomOnClick","getTotalMarkers","setMaxZoom","maxZoom","getMaxZoom","calculator_","numStyles","index","count","dv","parseInt","Math","min","setCalculator","calculator","getCalculator","opt_nodraw","pushMarkerTo_","isAdded","repaint","addMarker","removeMarker_","m","splice","removeMarker","removed","removeMarkers","r","ready","createClusters_","getTotalClusters","setGridSize","setMinClusterSize","getExtendedBounds","projection","getProjection","tr","LatLng","getNorthEast","lat","lng","bl","getSouthWest","trPix","fromLatLngToDivPixel","x","y","blPix","ne","fromDivPixelToLatLng","sw","isMarkerInBounds_","contains","clearMarkers","opt_hide","oldClusters","window","setTimeout","distanceBetweenPoints_","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","addToClosestCluster_","distance","clusterToAddTo","center","getCenter","d","isMarkerInClusterBounds","mapBounds","getBounds","isMarkerAlreadyAdded","l","calculateBounds_","len","updateIcon","getSize","mz","hide","sums","setCenter","setSums","show","triggerClusterClick","trigger","pos","useClusterSizeAsText","document","documentElement","lang","toLowerCase","createElement","getPosFromLatLng_","style","cssText","createCss","innerHTML","getPanes","overlayMouseTarget","appendChild","isDragging","addDomListener","latlng","iconAnchor_","width_","height_","top","left","display","onRemove","parentNode","removeChild","text_","index_","useStyle","max","url_","textColor_","anchor_","textSize_","backgroundPosition_","backgroundPosition","txtColor","txtSize","join","search","dealer","currentDealer","dealerType","detailsWrapper","getFilter","filterName","self","prop","on","console","log","toggleClass","next","slideToggle","autocomplete","searchTerm","results","cb","lastTerm","startsWith","dealers","grep","element","description","contentType","dataType","JSON","stringify","DealerName","DealerType","isMobile","matchMedia","matches","tracking","trackRawEventData","searchType","query","jqXHR","textStatus","warn","searchByLocation","zoomLevel","start_time","currentLocation","getDefaultMarkerLocation","bounce","runNamed","filters","tags","storeTypesArray","beforeSend","northEast","southWest","location","hasSpecialOrderAvailable","isOpenNow","dealerStoreTypes","id","dealerBrandNames","dealerBrandNamesArray","paneBrandFilter","ids","forEach","filter","getDealerBrandNames","isDeliveryAvailable","isBio","isTruckLpg","isPreferredPartner","sortBy","locationMarker","visible","request_time","createDealerMarkers","getType","setType","setUseDistance","useDistance","getDetails","checkMarkersInterval","setInterval","defaultmarkerLocation","dealerLocation","searchUrl","oldDealerId","areMarkersCreatedAndNotClusters","clearInterval","trackEvent","getMarkerById","URL","searchParams","get","set","pathname","position","history","pushState","empty","load","loc","fadeIn","navigator","permissions","name","then","result","state","css","replacedHref","replace","getFilterCount","detectFilterButtonAvailability","currentDealerType","filterButton","querySelector","updateFilterCount","removeUrlParameter","parameter","parameterValue","arguments","urlParts","urlBase","queryString","params","URLSearchParams","prefix","toString","parts","includes","updateFiltersByType","removeClass","resetFilters","reset","newUrl","href","hash","title","updateQueryStringFilters","dataset","queryparametername","checked","searchString","protocol","host","getOriginalSelectedUrlFilters","TAG_FILTER_NAME","filterQuerystring","querySelectorAll","gui","searchResults","mapSideBarToggleButton","mapSidebar","mapSidebarContent","listSidebar","mapCustomSearchButton","useCurrentLocationButton","searchFilters","bactostart","mobileViewSelectors","mapStateStore","mapView","mapViewListener","mapVisible","registerListener","listener","placeDetails","placeDetailsListener","placeDetailsContent","registerPlaceDetailsListener","mapClearSearchButtonStore","isVisible","clearSearchButtonListener","clearSearchButtonVisible","reorderPanels","searchControls","toggleMobileListInfoText","selector","toggleMobileButtons","infoContainer","mobileToggleContainer","isMapView","searchResultsCount","opacity","max-width","z-index","-webkit-transform","transform","toggleMobileListViewText","toggleMobileMapViewText","viewType","historyPushState","mapClearSearchButton","searchResultsObserver","MutationObserver","mutations","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","err","return","term","builtQuery","historyReplaceState","currentSearcUrl","replaceState","clearSuggestions","useFallBackText","fallBackText","class","toggleOpeningHoursList","slideUp","slideDown","buildOpeningHoursHtml","weekday_text","arr","setOpeningHours","placeId","loadGoogleMapsService","fields","place","status","places","PlacesServiceStatus","OK","opening_hours","removeData","stopPropagation","parents","setIsZoomedAndCenteredOnMarker","target","filterTitle","innerText","action","useGeoLocation","utils","intro","setBactoStartState","setZoom","initialZoom","initialPosition","hideMarker","dealerId","setMarker","storeZoomAndBounds","zoomAndCenterOnMarker","callback","dealerName","parseFloat","getPlaceId","disabled","setKeepSearchingIfNoResults","category","label","addEventListener","ev","observe","childList","setCurrentSearch","setGooglePhoneNumber","span","linkToReplaceNumberIn","hideDetails","getStoredBounds","getStoredZoom","mapsContainer","cdnvalue","initialLat","isArray","countryRestrictionsArray","getdirectionstext","numberofsearchresultbeforeshowingsearchresults","defaultPosition","initialLong","averageCenter","imagePath","processArray","resultList","dealerTarget","dealerTemplate","distanceUnit","currentBounds","infoBox","addToQueue","disableAutoPan","maxWidth","boxStyle","closeBoxMargin","closeBoxURL","enableEventPropagation","currentLocationMarker","mapStyles","containsSlashes","maputils","keepSearchingIfNoResults","toUpperCase","geoCoder","Geocoder","legend","icon","getMobileAddressSettings","Boolean","showAddressInListView","UpperCaseFormatter","DealerAddressFormatter","DealerDistanceFormatter","DealerIdFormatter","DealerPromotedPreferredPartnerFormatter","selectFirstOnEnter","input","eventListener","attachEvent","origListener","suggestionSelected","simulatedDownarrow","keyCode","which","addEventListenerWrapper","setDefaultFilterFromUrlParam","dealerTypeParams","getUrlParameter","goToDealerFromURLId","maxTries","cookies","getCookie","activeMarker","loadDealer","initializeAutocomplete","getElementById","countryRestrictionsOptions","$option","strictBounds","setTypes","setFields","country","setVisible","geometry","viewport","searchZoomLevel","getLocationFromAddress","mobileHeaderSticky","logo","prependTo","fixMobileMenu","body","nodeName","closest","hasAttribute","removeMobileInfoBoxes","Map","minZoom","zoomControl","allowTaint","useCORS","streetViewControl","rotateControl","fullscreenControlOptions","ControlPosition","RIGHT_BOTTOM","zoomControlOptions","Marker","anchorPoint","Point","mapservice","searchText","mcOptions","formatterSettings","request","address","countryIsOk","address_components","short_name","zoomClose","errorCallbackLowAccuracy","successCallback","geolocation","code","msg","message","latLng","coords","latitude","longitude","geocode","GeocoderStatus","formattedAddress","formatted_address","components","validCountry","countryRestrictions","setPosition","getCurrentPosition","TIMEOUT","maximumAge","timeout","enableHighAccuracy","getAll","urlSearchParameters","item","myMarkers","buildDealerIcons","pins","markDone","stepDone","pinsToHandle","pin","pinId","checkDealerIcon","urlArr","urls","pinurl","mergeImages","b64","buildIcon","elements","getElementsByClassName","isZoomedAndCenteredOnMarker","getVisible","useDark","n","lastIndexOf","substring","setAnimation","Animation","BOUNCE","getKeepSearchingIfNoResults","init","pan","xOffset","yOffset","panBy","setLocation","skiplocation","Promise","resolve","reject","iconPins","Count","Dealers","showDirections","ShowGetDirections","minimumnumbersofdealersshownonmapafterinitialsearch","errorString","noResultsErrorMessages","NoResultNoDealersInArea","myZoom","numberofsearchresultsbeforeserversideclustering","dealerCounter","iconPinId","dealerPhones","addresslines","shortAddress","isPref","dist","shortAddressDiv","_this","retailerName","mobileInfoBox","right","backgroundColor","zIndex","directions","markerLocation","dealerPhonesAndDirections","showAddressInDealerPreviewBox","header","close","boxText","extractIconAndLabelFromFilter","truncatelongdealernames","infoBoxOptions","pixelOffset","Size","infoBoxClearance","mergedOptions","infoBoxDefaultOptions","InfoBox","open","localMarkers","t","filterObj","obj","localDealers","createDealerList","resultListWarning","clusterSize","clusterSizeLength","clusterLabel","color","marker2","radius","findPlaceFromQuery","place_id","formatted_phone_number","currentZoom","ok"],"mappings":"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","file":"shvenergy.maps.js","sourcesContent":["(function ($) {\r\n\t\"use strict\";\r\n\tvar templates = {},\r\n\t\tqueue = {},\r\n\t\tformatters = {},\r\n\t\tisArray;\r\n\r\n\tfunction loadTemplate(template, data, options) {\r\n\t\tvar $that = this,\r\n\t\t\t$template,\r\n\t\t\tisFile,\r\n\t\t\tsettings;\r\n\r\n\t\tdata = data || {};\r\n\r\n\t\tsettings = $.extend(true, {\r\n\t\t\t// These are the defaults.\r\n\t\t\tasync: true,\r\n\t\t\toverwriteCache: false,\r\n\t\t\tcomplete: null,\r\n\t\t\tsuccess: null,\r\n\t\t\terror: function () {\r\n\t\t\t\t$(this).each(function () {\r\n\t\t\t\t\t$(this).html(settings.errorMessage);\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\terrorMessage: \"There was an error loading the template.\",\r\n\t\t\tpaged: false,\r\n\t\t\tpageNo: 1,\r\n\t\t\telemPerPage: 10,\r\n\t\t\tappend: false,\r\n\t\t\tprepend: false,\r\n\t\t\tbeforeInsert: null,\r\n\t\t\tafterInsert: null,\r\n\t\t\tbindingOptions: {\r\n\t\t\t\tignoreUndefined: false,\r\n\t\t\t\tignoreNull: false,\r\n\t\t\t\tignoreEmptyString: false\r\n\t\t\t}\r\n\t\t}, options);\r\n\r\n\t\tif ($.type(data) === \"array\") {\r\n\t\t\tisArray = true;\r\n\t\t\treturn processArray.call(this, template, data, settings);\r\n\t\t}\r\n\r\n\t\tif (!containsSlashes(template)) {\r\n\t\t\t$template = $(template);\r\n\t\t\tif (typeof template === 'string' && template.indexOf('#') === 0) {\r\n\t\t\t\tsettings.isFile = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tisFile = settings.isFile || (typeof settings.isFile === \"undefined\" && (typeof $template === \"undefined\" || $template.length === 0));\r\n\r\n\t\tif (isFile && !settings.overwriteCache && templates[template]) {\r\n\t\t\tprepareTemplateFromCache(template, $that, data, settings);\r\n\t\t} else if (isFile && !settings.overwriteCache && templates.hasOwnProperty(template)) {\r\n\t\t\taddToQueue(template, $that, data, settings);\r\n\t\t} else if (isFile) {\r\n\t\t\tloadAndPrepareTemplate(template, $that, data, settings);\r\n\t\t} else {\r\n\t\t\tloadTemplateFromDocument($template, $that, data, settings);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\tfunction addTemplateFormatter(key, formatter) {\r\n\t\tif (formatter) {\r\n\t\t\tformatters[key] = formatter;\r\n\t\t} else {\r\n\t\t\tformatters = $.extend(formatters, key);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction containsSlashes(str) {\r\n\t\treturn typeof str === \"string\" && str.indexOf(\"/\") > -1;\r\n\t}\r\n\r\n\tfunction processArray(template, data, settings) {\r\n\t\tsettings = settings || {};\r\n\t\tvar $that = this,\r\n\t\t\ttodo = data.length,\r\n\t\t\tdoPrepend = settings.prepend && !settings.append,\r\n\t\t\tdone = 0,\r\n\t\t\tsuccess = 0,\r\n\t\t\terrored = false,\r\n\t\t\terrorObjects = [],\r\n\t\t\tnewOptions;\r\n\r\n\t\tif (settings.paged) {\r\n\t\t\tvar startNo = (settings.pageNo - 1) * settings.elemPerPage;\r\n\t\t\tdata = data.slice(startNo, startNo + settings.elemPerPage);\r\n\t\t\ttodo = data.length;\r\n\t\t}\r\n\r\n\t\tif (!settings.append && !settings.prepend) {\r\n\t\t\t$that.html(\"\");\r\n\t\t}\r\n\r\n\t\tnewOptions = $.extend(\r\n\t\t\t{},\r\n\t\t\tsettings,\r\n\t\t\t{\r\n\t\t\t\tappend: !settings.prepend && true,\r\n\t\t\t\tcomplete: function (data) {\r\n\t\t\t\t\tdone++;\r\n\t\t\t\t\tif (done === todo || errored) {\r\n\t\t\t\t\t\tif (errored && settings && typeof settings.error === \"function\") {\r\n\t\t\t\t\t\t\tsettings.error.call($that, errorObjects);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (settings && typeof settings.complete === \"function\") {\r\n\t\t\t\t\t\t\tsettings.complete();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tsuccess: function () {\r\n\t\t\t\t\tsuccess++;\r\n\t\t\t\t\tif (success === todo) {\r\n\t\t\t\t\t\tif (settings && typeof settings.success === \"function\") {\r\n\t\t\t\t\t\t\tsettings.success();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\terror: function (e) {\r\n\t\t\t\t\terrored = true;\r\n\t\t\t\t\terrorObjects.push(e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t);\r\n\r\n\r\n\r\n\t\tif (doPrepend) data.reverse();\r\n\t\t$(data).each(function () {\r\n\r\n\t\t\tloadTemplate.call($that, template, this, newOptions);\r\n\t\t\tif (errored) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tfunction addToQueue(template, selection, data, settings) {\r\n\t\tif (queue[template]) {\r\n\t\t\tqueue[template].push({ data: data, selection: selection, settings: settings });\r\n\t\t} else {\r\n\t\t\tqueue[template] = [{ data: data, selection: selection, settings: settings }];\r\n\t\t}\r\n\t}\r\n\r\n\tfunction prepareTemplateFromCache(template, selection, data, settings) {\r\n\t\tvar $templateContainer = templates[template].clone();\r\n\r\n\t\tprepareTemplate.call(selection, $templateContainer, data, settings);\r\n\t\tif (typeof settings.success === \"function\") {\r\n\t\t\tsettings.success();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction uniqueId() {\r\n\t\treturn new Date().getTime();\r\n\t}\r\n\r\n\tfunction urlAvoidCache(url) {\r\n\t\tif (url.indexOf('?') !== -1) {\r\n\t\t\treturn url + \"&_=\" + uniqueId();\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn url + \"?_=\" + uniqueId();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction loadAndPrepareTemplate(template, selection, data, settings) {\r\n\r\n\t\ttemplates[template] = null;\r\n\t\tvar templateUrl = template;\r\n\t\tif (settings.overwriteCache) {\r\n\t\t\ttemplateUrl = urlAvoidCache(templateUrl);\r\n\t\t}\r\n\t\t$.ajax({\r\n\t\t\turl: templateUrl,\r\n\t\t\tasync: settings.async,\r\n\t\t\tsuccess: function (templateContent) {\r\n\t\t\t\thandleTemplateLoadingSuccess($(templateContent), template, selection, data, settings);\r\n\t\t\t},\r\n\t\t\terror: function (e) {\r\n\t\t\t\thandleTemplateLoadingError(template, selection, data, settings, e);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction loadTemplateFromDocument($template, selection, data, settings) {\r\n\t\tif ($template.is(\"script\") || $template.is(\"template\")) {\r\n\t\t\t$template = $.parseHTML($.trim($template.html()));\r\n\t\t}\r\n\r\n\t\tprepareTemplate.call(selection, $template, data, settings);\r\n\r\n\t\tif (typeof settings.success === \"function\") {\r\n\t\t\tsettings.success();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction prepareTemplate(template, data, settings) {\r\n\t\tvar template = $(\"
\").append(template);\r\n\t\tbindData(template, data, settings);\r\n\r\n\t\t$(this).each(function () {\r\n\t\t\tvar $templateHtml = template.children().clone(true);\r\n\t\t\t$(\"select\", $templateHtml).each(function (key, value) {\r\n\t\t\t\t$(this).val($(\"select\", template).eq(key).val())\r\n\t\t\t});\r\n\t\t\tif (settings.beforeInsert) {\r\n\t\t\t\tsettings.beforeInsert($templateHtml, data);\r\n\t\t\t}\r\n\t\t\tif (settings.append) {\r\n\r\n\t\t\t\t$(this).append($templateHtml);\r\n\t\t\t} else if (settings.prepend) {\r\n\t\t\t\t$(this).prepend($templateHtml);\r\n\t\t\t} else {\r\n\t\t\t\t$(this).html(\"\").append($templateHtml);\r\n\t\t\t}\r\n\t\t\tif (settings.afterInsert) {\r\n\t\t\t\tsettings.afterInsert($templateHtml, data);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (typeof settings.complete === \"function\") {\r\n\t\t\tsettings.complete.call($(this), data);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction handleTemplateLoadingError(template, selection, data, settings, error) {\r\n\t\tvar value;\r\n\r\n\t\tif (typeof settings.error === \"function\") {\r\n\t\t\tsettings.error.call(selection, error);\r\n\t\t}\r\n\r\n\t\t$(queue[template]).each(function (key, value) {\r\n\t\t\tif (typeof value.settings.error === \"function\") {\r\n\t\t\t\tvalue.settings.error.call(value.selection, error);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (typeof settings.complete === \"function\") {\r\n\t\t\tsettings.complete.call(selection);\r\n\t\t}\r\n\r\n\t\twhile (queue[template] && (value = queue[template].shift())) {\r\n\t\t\tif (typeof value.settings.complete === \"function\") {\r\n\t\t\t\tvalue.settings.complete.call(value.selection);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (typeof queue[template] !== 'undefined' && queue[template].length > 0) {\r\n\t\t\tqueue[template] = [];\r\n\t\t}\r\n\t}\r\n\r\n\tfunction handleTemplateLoadingSuccess($templateContainer, template, selection, data, settings) {\r\n\t\tvar value;\r\n\r\n\t\ttemplates[template] = $templateContainer.clone();\r\n\t\tprepareTemplate.call(selection, $templateContainer, data, settings);\r\n\r\n\t\tif (typeof settings.success === \"function\") {\r\n\t\t\tsettings.success.call(selection);\r\n\t\t}\r\n\r\n\t\twhile (queue[template] && (value = queue[template].shift())) {\r\n\t\t\tprepareTemplate.call(value.selection, templates[template].clone(), value.data, value.settings);\r\n\t\t\tif (typeof value.settings.success === \"function\") {\r\n\t\t\t\tvalue.settings.success.call(value.selection);\r\n\t\t\t}\r\n\t\t}\r\n }\r\n\r\n\tvar removeHandlers = {\r\n\t\tremovethis: function($elem) {\r\n\t\t\t$elem.remove();\r\n\t\t},\r\n\t\tremoveparent: function($elem) {\r\n\t\t\tvar parent = $elem.parent();\r\n\t\t\tparent.remove();\r\n\t\t},\r\n\t\tremovethischeckparent: function($elem) {\r\n\t\t\tvar parent = $elem.parent();\r\n\t\t\tthis.removethis($elem);\r\n\t\t\tif (isEmpty(parent)) {\r\n\t\t\t\tparent.remove();\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n function applyDataRemoveHandler($elem) {\r\n var func = $elem.attr(\"data-onempty\");\r\n if (func && removeHandlers[func] && typeof removeHandlers[func] === \"function\") {\r\n removeHandlers[func]($elem);\r\n }\r\n }\r\n\r\n function removeOnNoData($elem) {\r\n $elem.remove();\r\n }\r\n\r\n function isEmpty(el) {\r\n return !$.trim(el.html());\r\n }\r\n\r\n\tfunction bindData(template, data, settings) {\r\n\t\tdata = data || {};\r\n\r\n\t\tprocessElements(\"data-content\", template, data, settings, function ($elem, value) {\r\n\t\t\t$elem.html(applyFormatters($elem, value, \"content\", settings));\r\n }, applyDataRemoveHandler);\r\n\r\n\t\tprocessElements(\"data-content-append\", template, data, settings, function ($elem, value) {\r\n\t\t\t$elem.append(applyFormatters($elem, value, \"content\", settings));\r\n });\r\n\r\n\t\tprocessElements(\"data-content-prepend\", template, data, settings, function ($elem, value) {\r\n\t\t\t$elem.prepend(applyFormatters($elem, value, \"content\", settings));\r\n });\r\n\r\n\t\tprocessElements(\"data-content-text\", template, data, settings, function ($elem, value) {\r\n\t\t\t$elem.text(applyFormatters($elem, value, \"content\", settings));\r\n });\r\n\r\n\t\tprocessElements(\"data-innerHTML\", template, data, settings, function ($elem, value) {\r\n\t\t\t$elem.html(applyFormatters($elem, value, \"content\", settings));\r\n });\r\n\r\n\t\tprocessElements(\"data-src\", template, data, settings, function ($elem, value) {\r\n\t\t\t$elem.attr(\"src\", applyFormatters($elem, value, \"src\", settings));\r\n }, removeHandlers.removethis);\r\n\r\n\t\tprocessElements(\"data-href\", template, data, settings, function ($elem, value) {\r\n\t\t\t$elem.attr(\"href\", applyFormatters($elem, value, \"href\", settings));\r\n }, removeHandlers.removethis);\r\n\r\n\t\tprocessElements(\"data-alt\", template, data, settings, function ($elem, value) {\r\n\t\t\t$elem.attr(\"alt\", applyFormatters($elem, value, \"alt\", settings));\r\n });\r\n\r\n\t\tprocessElements(\"data-id\", template, data, settings, function ($elem, value) {\r\n\t\t\t$elem.attr(\"id\", applyFormatters($elem, value, \"id\", settings));\r\n });\r\n\r\n\t\tprocessElements(\"data-dealerid\", template, data, settings, function ($elem, value) {\r\n\t\t\t$elem.attr(\"dealerid\", value);\r\n });\r\n\r\n processElements(\"data-customclass\", template, data, settings, function ($elem, value) {\r\n if (shvenergy.maps.usePreferredPartenerLabel() && value) {\r\n $elem.addClass(\"preferred\");\r\n }\r\n else {\r\n $elem.addClass(\"notpreferred\");\r\n }\r\n });\r\n\r\n\t\tprocessElements(\"data-class\", template, data, settings, function ($elem, value) {\r\n\t\t\t$elem.addClass(applyFormatters($elem, value, \"class\", settings));\r\n });\r\n\r\n\t\tprocessElements(\"data-link\", template, data, settings, function ($elem, value) {\r\n\t\t\tvar $linkElem = $(\"\");\r\n\t\t\t$linkElem.attr(\"href\", applyFormatters($elem, value, \"link\", settings));\r\n\t\t\t$linkElem.html($elem.html());\r\n\t\t\t$elem.html($linkElem);\r\n\t\t});\r\n\r\n\t\tprocessElements(\"data-link-wrap\", template, data, settings, function ($elem, value) {\r\n\t\t\tvar $linkElem = $(\"\");\r\n\t\t\t$linkElem.attr(\"href\", applyFormatters($elem, value, \"link-wrap\", settings));\r\n\t\t\t$elem.wrap($linkElem);\r\n });\r\n\r\n\t\tprocessElements(\"data-options\", template, data, settings, function ($elem, value) {\r\n\t\t\t$(value).each(function () {\r\n\t\t\t\tvar $option = $(\"v2 MarkerClusterer.\r\n */\r\n\r\n/**\r\n * @license\r\n * Copyright 2010 Google Inc. All Rights Reserved.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n\r\n/**\r\n * A Marker Clusterer that clusters markers.\r\n *\r\n * @param {google.maps.Map} map The Google map to attach to.\r\n * @param {Array.=} opt_markers Optional markers to add to\r\n * the cluster.\r\n * @param {Object=} opt_options support the following options:\r\n * 'gridSize': (number) The grid size of a cluster in pixels.\r\n * 'maxZoom': (number) The maximum zoom level that a marker can be part of a\r\n * cluster.\r\n * 'zoomOnClick': (boolean) Whether the default behaviour of clicking on a\r\n * cluster is to zoom into it.\r\n * 'averageCenter': (boolean) Whether the center of each cluster should be\r\n * the average of all markers in the cluster.\r\n * 'minimumClusterSize': (number) The minimum number of markers to be in a\r\n * cluster before the markers are hidden and a count\r\n * is shown.\r\n * 'styles': (object) An object that has style properties:\r\n * 'url': (string) The image url.\r\n * 'height': (number) The image height.\r\n * 'width': (number) The image width.\r\n * 'anchor': (Array) The anchor position of the label text.\r\n * 'textColor': (string) The text color.\r\n * 'textSize': (number) The text size.\r\n * 'backgroundPosition': (string) The position of the backgound x, y.\r\n * 'iconAnchor': (Array) The anchor position of the icon x, y.\r\n * @constructor\r\n * @extends google.maps.OverlayView\r\n */\r\nfunction MarkerClusterer(map, opt_markers, opt_options) {\r\n\t// MarkerClusterer implements google.maps.OverlayView interface. We use the\r\n\t// extend function to extend MarkerClusterer with google.maps.OverlayView\r\n\t// because it might not always be available when the code is defined so we\r\n\t// look for it at the last possible moment. If it doesn't exist now then\r\n\t// there is no point going ahead :)\r\n\tthis.extend(MarkerClusterer, google.maps.OverlayView);\r\n\tthis.map_ = map;\r\n\r\n\t/**\r\n\t * @type {Array.}\r\n\t * @private\r\n\t */\r\n\tthis.markers_ = [];\r\n\r\n\t/**\r\n\t * @type {Array.}\r\n\t */\r\n\tthis.clusters_ = [];\r\n\r\n\tthis.sizes = [44, 56, 66, 78, 90];\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n this.styles_ = [];\r\n this.style_ = {};\r\n\r\n\t/**\r\n\t * @type {boolean}\r\n\t * @private\r\n\t */\r\n\tthis.ready_ = false;\r\n\r\n\tvar options = opt_options || {};\r\n\r\n\t/**\r\n\t * @type {number}\r\n\t * @private\r\n\t */\r\n\tthis.gridSize_ = options['gridSize'] || 60;\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tthis.minClusterSize_ = options['minimumClusterSize'] || 2;\r\n\r\n\r\n\t/**\r\n\t * @type {?number}\r\n\t * @private\r\n\t */\r\n\tthis.maxZoom_ = options['maxZoom'] || null;\r\n\r\n\tthis.styles_ = [];\r\n\tthis.style_ = options['styles'] || {};\r\n\r\n\t/**\r\n\t * @type {string}\r\n\t * @private\r\n\t */\r\n\tthis.imagePath_ = options['imagePath'] ||\r\n\t\tthis.MARKER_CLUSTER_IMAGE_PATH_;\r\n\r\n\t/**\r\n\t * @type {string}\r\n\t * @private\r\n\t */\r\n\tthis.imageExtension_ = options['imageExtension'] ||\r\n\t\tthis.MARKER_CLUSTER_IMAGE_EXTENSION_;\r\n\r\n\t/**\r\n\t * @type {boolean}\r\n\t * @private\r\n\t */\r\n\tthis.zoomOnClick_ = true;\r\n\r\n\tif (options['zoomOnClick'] != undefined) {\r\n\t\tthis.zoomOnClick_ = options['zoomOnClick'];\r\n\t}\r\n\r\n\t/**\r\n\t * @type {boolean}\r\n\t * @private\r\n\t */\r\n\tthis.averageCenter_ = false;\r\n\r\n\tif (options['averageCenter'] != undefined) {\r\n\t\tthis.averageCenter_ = options['averageCenter'];\r\n\t}\r\n\r\n\tthis.setupStyles_();\r\n\r\n\tthis.setMap(map);\r\n\r\n\t/**\r\n\t * @type {number}\r\n\t * @private\r\n\t */\r\n\tthis.prevZoom_ = this.map_.getZoom();\r\n\r\n\t// Add the map event listeners\r\n\tvar that = this;\r\n\tgoogle.maps.event.addListener(this.map_, 'zoom_changed', function () {\r\n\t\tvar zoom = that.map_.getZoom();\r\n\r\n\t\tif (that.prevZoom_ != zoom) {\r\n\t\t\tthat.prevZoom_ = zoom;\r\n\t\t\tthat.resetViewport();\r\n\t\t}\r\n\t});\r\n\r\n\tgoogle.maps.event.addListener(this.map_, 'idle', function () {\r\n\t\tthat.redraw();\r\n\t});\r\n\r\n\t// Finally, add the markers\r\n\tif (opt_markers && opt_markers.length) {\r\n\t\tthis.addMarkers(opt_markers, false);\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * The marker cluster image path.\r\n *\r\n * @type {string}\r\n * @private\r\n */\r\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PATH_ = '../images/m';\r\n\r\n\r\n/**\r\n * The marker cluster image path.\r\n *\r\n * @type {string}\r\n * @private\r\n */\r\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_EXTENSION_ = 'png';\r\n\r\n\r\n/**\r\n * Extends a objects prototype by anothers.\r\n *\r\n * @param {Object} obj1 The object to be extended.\r\n * @param {Object} obj2 The object to extend with.\r\n * @return {Object} The new extended object.\r\n * @ignore\r\n */\r\nMarkerClusterer.prototype.extend = function (obj1, obj2) {\r\n\treturn (function (object) {\r\n\t\tfor (var property in object.prototype) {\r\n\t\t\tthis.prototype[property] = object.prototype[property];\r\n\t\t}\r\n\t\treturn this;\r\n\t}).apply(obj1, [obj2]);\r\n};\r\n\r\n\r\n/**\r\n * Implementaion of the interface method.\r\n * @ignore\r\n */\r\nMarkerClusterer.prototype.onAdd = function () {\r\n\tthis.setReady_(true);\r\n};\r\n\r\n/**\r\n * Implementaion of the interface method.\r\n * @ignore\r\n */\r\nMarkerClusterer.prototype.draw = function () { };\r\n\r\n/**\r\n * Sets up the styles object.\r\n *\r\n * @private\r\n */\r\nMarkerClusterer.prototype.setupStyles_ = function () {\r\n\tif (this.styles_.length) {\r\n\t\treturn;\r\n\t}\r\n\r\n for (var i = 0, size; size = this.sizes[i]; i++) {\r\n\t\tthis.styles_.push(Object.assign({\r\n\t\t\turl: this.imagePath_ + (i + 1) + '.' + this.imageExtension_,\r\n\t\t\theight: size,\r\n\t\t\twidth: size\r\n },this.style_));\r\n\t}\r\n};\r\n\r\n/**\r\n * Fit the map to the bounds of the markers in the clusterer.\r\n */\r\nMarkerClusterer.prototype.fitMapToMarkers = function () {\r\n\tvar markers = this.getMarkers();\r\n\tvar bounds = new google.maps.LatLngBounds();\r\n\tfor (var i = 0, marker; marker = markers[i]; i++) {\r\n\t\tbounds.extend(marker.getPosition());\r\n\t}\r\n\r\n\tthis.map_.fitBounds(bounds);\r\n};\r\n\r\n\r\n/**\r\n * Sets the styles.\r\n *\r\n * @param {Object} styles The style to set.\r\n */\r\nMarkerClusterer.prototype.setStyles = function (styles) {\r\n\tthis.styles_ = styles;\r\n};\r\n\r\n\r\n/**\r\n * Gets the styles.\r\n *\r\n * @return {Object} The styles object.\r\n */\r\nMarkerClusterer.prototype.getStyles = function () {\r\n\treturn this.styles_;\r\n};\r\n\r\n\r\n/**\r\n * Whether zoom on click is set.\r\n *\r\n * @return {boolean} True if zoomOnClick_ is set.\r\n */\r\nMarkerClusterer.prototype.isZoomOnClick = function () {\r\n\treturn this.zoomOnClick_;\r\n};\r\n\r\n/**\r\n * Whether average center is set.\r\n *\r\n * @return {boolean} True if averageCenter_ is set.\r\n */\r\nMarkerClusterer.prototype.isAverageCenter = function () {\r\n\treturn this.averageCenter_;\r\n};\r\n\r\n\r\n/**\r\n * Returns the array of markers in the clusterer.\r\n *\r\n * @return {Array.} The markers.\r\n */\r\nMarkerClusterer.prototype.getMarkers = function () {\r\n\treturn this.markers_;\r\n};\r\n\r\n\r\n/**\r\n * Returns the number of markers in the clusterer\r\n *\r\n * @return {Number} The number of markers.\r\n */\r\nMarkerClusterer.prototype.getTotalMarkers = function () {\r\n\treturn this.markers_.length;\r\n};\r\n\r\n\r\n/**\r\n * Sets the max zoom for the clusterer.\r\n *\r\n * @param {number} maxZoom The max zoom level.\r\n */\r\nMarkerClusterer.prototype.setMaxZoom = function (maxZoom) {\r\n\tthis.maxZoom_ = maxZoom;\r\n};\r\n\r\n\r\n/**\r\n * Gets the max zoom for the clusterer.\r\n *\r\n * @return {number} The max zoom level.\r\n */\r\nMarkerClusterer.prototype.getMaxZoom = function () {\r\n\treturn this.maxZoom_;\r\n};\r\n\r\n\r\n/**\r\n * The function for calculating the cluster icon image.\r\n *\r\n * @param {Array.} markers The markers in the clusterer.\r\n * @param {number} numStyles The number of styles available.\r\n * @return {Object} A object properties: 'text' (string) and 'index' (number).\r\n * @private\r\n */\r\nMarkerClusterer.prototype.calculator_ = function (markers, numStyles) {\r\n\tvar index = 0;\r\n\tvar count = markers.length;\r\n\tvar dv = count;\r\n\twhile (dv !== 0) {\r\n\t\tdv = parseInt(dv / 10, 10);\r\n\t\tindex++;\r\n\t}\r\n\r\n\tindex = Math.min(index, numStyles);\r\n\treturn {\r\n\t\ttext: count,\r\n\t\tindex: index\r\n\t};\r\n};\r\n\r\n\r\n/**\r\n * Set the calculator function.\r\n *\r\n * @param {function(Array, number)} calculator The function to set as the\r\n * calculator. The function should return a object properties:\r\n * 'text' (string) and 'index' (number).\r\n *\r\n */\r\nMarkerClusterer.prototype.setCalculator = function (calculator) {\r\n\tthis.calculator_ = calculator;\r\n};\r\n\r\n\r\n/**\r\n * Get the calculator function.\r\n *\r\n * @return {function(Array, number)} the calculator function.\r\n */\r\nMarkerClusterer.prototype.getCalculator = function () {\r\n\treturn this.calculator_;\r\n};\r\n\r\n\r\n/**\r\n * Add an array of markers to the clusterer.\r\n *\r\n * @param {Array.} markers The markers to add.\r\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\r\n */\r\nMarkerClusterer.prototype.addMarkers = function (markers, opt_nodraw) {\r\n\tfor (var i = 0, marker; marker = markers[i]; i++) {\r\n\t\tthis.pushMarkerTo_(marker);\r\n\t}\r\n\tif (!opt_nodraw) {\r\n\t\tthis.redraw();\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Pushes a marker to the clusterer.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.pushMarkerTo_ = function (marker) {\r\n\tmarker.isAdded = false;\r\n\tif (marker['draggable']) {\r\n\t\t// If the marker is draggable add a listener so we update the clusters on\r\n\t\t// the drag end.\r\n\t\tvar that = this;\r\n\t\tgoogle.maps.event.addListener(marker, 'dragend', function () {\r\n\t\t\tmarker.isAdded = false;\r\n\t\t\tthat.repaint();\r\n\t\t});\r\n\t}\r\n\tthis.markers_.push(marker);\r\n};\r\n\r\n\r\n/**\r\n * Adds a marker to the clusterer and redraws if needed.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\r\n */\r\nMarkerClusterer.prototype.addMarker = function (marker, opt_nodraw) {\r\n\tthis.pushMarkerTo_(marker);\r\n\tif (!opt_nodraw) {\r\n\t\tthis.redraw();\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Removes a marker and returns true if removed, false if not\r\n *\r\n * @param {google.maps.Marker} marker The marker to remove\r\n * @return {boolean} Whether the marker was removed or not\r\n * @private\r\n */\r\nMarkerClusterer.prototype.removeMarker_ = function (marker) {\r\n\tvar index = -1;\r\n\tif (this.markers_.indexOf) {\r\n\t\tindex = this.markers_.indexOf(marker);\r\n\t} else {\r\n\t\tfor (var i = 0, m; m = this.markers_[i]; i++) {\r\n\t\t\tif (m == marker) {\r\n\t\t\t\tindex = i;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (index == -1) {\r\n\t\t// Marker is not in our list of markers.\r\n\t\treturn false;\r\n\t}\r\n\r\n\tmarker.setMap(null);\r\n\r\n\tthis.markers_.splice(index, 1);\r\n\r\n\treturn true;\r\n};\r\n\r\n\r\n/**\r\n * Remove a marker from the cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to remove.\r\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\r\n * @return {boolean} True if the marker was removed.\r\n */\r\nMarkerClusterer.prototype.removeMarker = function (marker, opt_nodraw) {\r\n\tvar removed = this.removeMarker_(marker);\r\n\r\n\tif (!opt_nodraw && removed) {\r\n\t\tthis.resetViewport();\r\n\t\tthis.redraw();\r\n\t\treturn true;\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Removes an array of markers from the cluster.\r\n *\r\n * @param {Array.} markers The markers to remove.\r\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\r\n */\r\nMarkerClusterer.prototype.removeMarkers = function (markers, opt_nodraw) {\r\n\tvar removed = false;\r\n\r\n\tfor (var i = 0, marker; marker = markers[i]; i++) {\r\n\t\tvar r = this.removeMarker_(marker);\r\n\t\tremoved = removed || r;\r\n\t}\r\n\r\n\tif (!opt_nodraw && removed) {\r\n\t\tthis.resetViewport();\r\n\t\tthis.redraw();\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Sets the clusterer's ready state.\r\n *\r\n * @param {boolean} ready The state.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.setReady_ = function (ready) {\r\n\tif (!this.ready_) {\r\n\t\tthis.ready_ = ready;\r\n\t\tthis.createClusters_();\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Returns the number of clusters in the clusterer.\r\n *\r\n * @return {number} The number of clusters.\r\n */\r\nMarkerClusterer.prototype.getTotalClusters = function () {\r\n\treturn this.clusters_.length;\r\n};\r\n\r\n\r\n/**\r\n * Returns the google map that the clusterer is associated with.\r\n *\r\n * @return {google.maps.Map} The map.\r\n */\r\nMarkerClusterer.prototype.getMap = function () {\r\n\treturn this.map_;\r\n};\r\n\r\n\r\n/**\r\n * Sets the google map that the clusterer is associated with.\r\n *\r\n * @param {google.maps.Map} map The map.\r\n */\r\nMarkerClusterer.prototype.setMap = function (map) {\r\n\tthis.map_ = map;\r\n};\r\n\r\n\r\n/**\r\n * Returns the size of the grid.\r\n *\r\n * @return {number} The grid size.\r\n */\r\nMarkerClusterer.prototype.getGridSize = function () {\r\n\treturn this.gridSize_;\r\n};\r\n\r\n\r\n/**\r\n * Sets the size of the grid.\r\n *\r\n * @param {number} size The grid size.\r\n */\r\nMarkerClusterer.prototype.setGridSize = function (size) {\r\n\tthis.gridSize_ = size;\r\n};\r\n\r\n\r\n/**\r\n * Returns the min cluster size.\r\n *\r\n * @return {number} The grid size.\r\n */\r\nMarkerClusterer.prototype.getMinClusterSize = function () {\r\n\treturn this.minClusterSize_;\r\n};\r\n\r\n/**\r\n * Sets the min cluster size.\r\n *\r\n * @param {number} size The grid size.\r\n */\r\nMarkerClusterer.prototype.setMinClusterSize = function (size) {\r\n\tthis.minClusterSize_ = size;\r\n};\r\n\r\n\r\n/**\r\n * Extends a bounds object by the grid size.\r\n *\r\n * @param {google.maps.LatLngBounds} bounds The bounds to extend.\r\n * @return {google.maps.LatLngBounds} The extended bounds.\r\n */\r\nMarkerClusterer.prototype.getExtendedBounds = function (bounds) {\r\n\tvar projection = this.getProjection();\r\n\r\n\t// Turn the bounds into latlng.\r\n\tvar tr = new google.maps.LatLng(bounds.getNorthEast().lat(),\r\n\t\tbounds.getNorthEast().lng());\r\n\tvar bl = new google.maps.LatLng(bounds.getSouthWest().lat(),\r\n\t\tbounds.getSouthWest().lng());\r\n\r\n\t// Convert the points to pixels and the extend out by the grid size.\r\n\tvar trPix = projection.fromLatLngToDivPixel(tr);\r\n\ttrPix.x += this.gridSize_;\r\n\ttrPix.y -= this.gridSize_;\r\n\r\n\tvar blPix = projection.fromLatLngToDivPixel(bl);\r\n\tblPix.x -= this.gridSize_;\r\n\tblPix.y += this.gridSize_;\r\n\r\n\t// Convert the pixel points back to LatLng\r\n\tvar ne = projection.fromDivPixelToLatLng(trPix);\r\n\tvar sw = projection.fromDivPixelToLatLng(blPix);\r\n\r\n\t// Extend the bounds to contain the new bounds.\r\n\tbounds.extend(ne);\r\n\tbounds.extend(sw);\r\n\r\n\treturn bounds;\r\n};\r\n\r\n\r\n/**\r\n * Determins if a marker is contained in a bounds.\r\n *\r\n * @param {google.maps.Marker} marker The marker to check.\r\n * @param {google.maps.LatLngBounds} bounds The bounds to check against.\r\n * @return {boolean} True if the marker is in the bounds.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.isMarkerInBounds_ = function (marker, bounds) {\r\n\treturn bounds.contains(marker.getPosition());\r\n};\r\n\r\n\r\n/**\r\n * Clears all clusters and markers from the clusterer.\r\n */\r\nMarkerClusterer.prototype.clearMarkers = function () {\r\n\tthis.resetViewport(true);\r\n\r\n\t// Set the markers a empty array.\r\n\tthis.markers_ = [];\r\n};\r\n\r\n\r\n/**\r\n * Clears all existing clusters and recreates them.\r\n * @param {boolean} opt_hide To also hide the marker.\r\n */\r\nMarkerClusterer.prototype.resetViewport = function (opt_hide) {\r\n\t// Remove all the clusters\r\n\tfor (var i = 0, cluster; cluster = this.clusters_[i]; i++) {\r\n\t\tcluster.remove();\r\n\t}\r\n\r\n\t// Reset the markers to not be added and to be invisible.\r\n\tfor (var i = 0, marker; marker = this.markers_[i]; i++) {\r\n\t\tmarker.isAdded = false;\r\n\t\tif (opt_hide) {\r\n\t\t\tmarker.setMap(null);\r\n\t\t}\r\n\t}\r\n\r\n\tthis.clusters_ = [];\r\n};\r\n\r\n/**\r\n *\r\n */\r\nMarkerClusterer.prototype.repaint = function () {\r\n\tvar oldClusters = this.clusters_.slice();\r\n\tthis.clusters_.length = 0;\r\n\tthis.resetViewport();\r\n\tthis.redraw();\r\n\r\n\t// Remove the old clusters.\r\n\t// Do it in a timeout so the other clusters have been drawn first.\r\n\twindow.setTimeout(function () {\r\n\t\tfor (var i = 0, cluster; cluster = oldClusters[i]; i++) {\r\n\t\t\tcluster.remove();\r\n\t\t}\r\n\t}, 0);\r\n};\r\n\r\n\r\n/**\r\n * Redraws the clusters.\r\n */\r\nMarkerClusterer.prototype.redraw = function () {\r\n\tthis.createClusters_();\r\n};\r\n\r\n\r\n/**\r\n * Calculates the distance between two latlng locations in km.\r\n * @see http://www.movable-type.co.uk/scripts/latlong.html\r\n *\r\n * @param {google.maps.LatLng} p1 The first lat lng point.\r\n * @param {google.maps.LatLng} p2 The second lat lng point.\r\n * @return {number} The distance between the two points in km.\r\n * @private\r\n*/\r\nMarkerClusterer.prototype.distanceBetweenPoints_ = function (p1, p2) {\r\n\tif (!p1 || !p2) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tvar R = 6371; // Radius of the Earth in km\r\n\tvar dLat = (p2.lat() - p1.lat()) * Math.PI / 180;\r\n\tvar dLon = (p2.lng() - p1.lng()) * Math.PI / 180;\r\n\tvar a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\r\n\t\tMath.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *\r\n\t\tMath.sin(dLon / 2) * Math.sin(dLon / 2);\r\n\tvar c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n\tvar d = R * c;\r\n\treturn d;\r\n};\r\n\r\n\r\n/**\r\n * Add a marker to a cluster, or creates a new cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.addToClosestCluster_ = function (marker) {\r\n\tvar distance = 40000; // Some large number\r\n\tvar clusterToAddTo = null;\r\n\tvar pos = marker.getPosition();\r\n\tfor (var i = 0, cluster; cluster = this.clusters_[i]; i++) {\r\n\t\tvar center = cluster.getCenter();\r\n\t\tif (center) {\r\n\t\t\tvar d = this.distanceBetweenPoints_(center, marker.getPosition());\r\n\t\t\tif (d < distance) {\r\n\t\t\t\tdistance = d;\r\n\t\t\t\tclusterToAddTo = cluster;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\r\n\t\tclusterToAddTo.addMarker(marker);\r\n\t} else {\r\n\t\tvar cluster = new Cluster(this);\r\n\t\tcluster.addMarker(marker);\r\n\t\tthis.clusters_.push(cluster);\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Creates the clusters.\r\n *\r\n * @private\r\n */\r\nMarkerClusterer.prototype.createClusters_ = function () {\r\n\tif (!this.ready_) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Get our current map view bounds.\r\n\t// Create a new bounds object so we don't affect the map.\r\n\tvar mapBounds = new google.maps.LatLngBounds(this.map_.getBounds().getSouthWest(),\r\n\t\tthis.map_.getBounds().getNorthEast());\r\n\tvar bounds = this.getExtendedBounds(mapBounds);\r\n\r\n\tfor (var i = 0, marker; marker = this.markers_[i]; i++) {\r\n\t\tif (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\r\n\t\t\tthis.addToClosestCluster_(marker);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * A cluster that contains markers.\r\n *\r\n * @param {MarkerClusterer} markerClusterer The markerclusterer that this\r\n * cluster is associated with.\r\n * @constructor\r\n * @ignore\r\n */\r\nfunction Cluster(markerClusterer) {\r\n\tthis.markerClusterer_ = markerClusterer;\r\n\tthis.map_ = markerClusterer.getMap();\r\n\tthis.gridSize_ = markerClusterer.getGridSize();\r\n\tthis.minClusterSize_ = markerClusterer.getMinClusterSize();\r\n\tthis.averageCenter_ = markerClusterer.isAverageCenter();\r\n\tthis.center_ = null;\r\n\tthis.markers_ = [];\r\n\tthis.bounds_ = null;\r\n\tthis.clusterIcon_ = new ClusterIcon(this, markerClusterer.getStyles(),\r\n\t\tmarkerClusterer.getGridSize());\r\n}\r\n\r\n/**\r\n * Determins if a marker is already added to the cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to check.\r\n * @return {boolean} True if the marker is already added.\r\n */\r\nCluster.prototype.isMarkerAlreadyAdded = function (marker) {\r\n\tif (this.markers_.indexOf) {\r\n\t\treturn this.markers_.indexOf(marker) != -1;\r\n\t} else {\r\n\t\tfor (var i = 0, m; m = this.markers_[i]; i++) {\r\n\t\t\tif (m == marker) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n};\r\n\r\n\r\n/**\r\n * Add a marker the cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @return {boolean} True if the marker was added.\r\n */\r\nCluster.prototype.addMarker = function (marker) {\r\n\tif (this.isMarkerAlreadyAdded(marker)) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (!this.center_) {\r\n\t\tthis.center_ = marker.getPosition();\r\n\t\tthis.calculateBounds_();\r\n\t} else {\r\n\t\tif (this.averageCenter_) {\r\n\t\t\tvar l = this.markers_.length + 1;\r\n\t\t\tvar lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l;\r\n\t\t\tvar lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l;\r\n\t\t\tthis.center_ = new google.maps.LatLng(lat, lng);\r\n\t\t\tthis.calculateBounds_();\r\n\t\t}\r\n\t}\r\n\r\n\tmarker.isAdded = true;\r\n\tthis.markers_.push(marker);\r\n\r\n\tvar len = this.markers_.length;\r\n\tif (len < this.minClusterSize_ && marker.getMap() != this.map_) {\r\n\t\t// Min cluster size not reached so show the marker.\r\n\t\tmarker.setMap(this.map_);\r\n\t}\r\n\r\n\tif (len == this.minClusterSize_) {\r\n\t\t// Hide the markers that were showing.\r\n\t\tfor (var i = 0; i < len; i++) {\r\n\t\t\tthis.markers_[i].setMap(null);\r\n\t\t}\r\n\t}\r\n\r\n\tif (len >= this.minClusterSize_) {\r\n\t\tmarker.setMap(null);\r\n\t}\r\n\r\n\tthis.updateIcon();\r\n\treturn true;\r\n};\r\n\r\n\r\n/**\r\n * Returns the marker clusterer that the cluster is associated with.\r\n *\r\n * @return {MarkerClusterer} The associated marker clusterer.\r\n */\r\nCluster.prototype.getMarkerClusterer = function () {\r\n\treturn this.markerClusterer_;\r\n};\r\n\r\n\r\n/**\r\n * Returns the bounds of the cluster.\r\n *\r\n * @return {google.maps.LatLngBounds} the cluster bounds.\r\n */\r\nCluster.prototype.getBounds = function () {\r\n\tvar bounds = new google.maps.LatLngBounds(this.center_, this.center_);\r\n\tvar markers = this.getMarkers();\r\n\tfor (var i = 0, marker; marker = markers[i]; i++) {\r\n\t\tbounds.extend(marker.getPosition());\r\n\t}\r\n\treturn bounds;\r\n};\r\n\r\n\r\n/**\r\n * Removes the cluster\r\n */\r\nCluster.prototype.remove = function () {\r\n\tthis.clusterIcon_.remove();\r\n\tthis.markers_.length = 0;\r\n\tdelete this.markers_;\r\n};\r\n\r\n\r\n/**\r\n * Returns the center of the cluster.\r\n *\r\n * @return {number} The cluster center.\r\n */\r\nCluster.prototype.getSize = function () {\r\n\treturn this.markers_.length;\r\n};\r\n\r\n\r\n/**\r\n * Returns the center of the cluster.\r\n *\r\n * @return {Array.} The cluster center.\r\n */\r\nCluster.prototype.getMarkers = function () {\r\n\treturn this.markers_;\r\n};\r\n\r\n\r\n/**\r\n * Returns the center of the cluster.\r\n *\r\n * @return {google.maps.LatLng} The cluster center.\r\n */\r\nCluster.prototype.getCenter = function () {\r\n\treturn this.center_;\r\n};\r\n\r\n\r\n/**\r\n * Calculated the extended bounds of the cluster with the grid.\r\n *\r\n * @private\r\n */\r\nCluster.prototype.calculateBounds_ = function () {\r\n\tvar bounds = new google.maps.LatLngBounds(this.center_, this.center_);\r\n\tthis.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);\r\n};\r\n\r\n\r\n/**\r\n * Determines if a marker lies in the clusters bounds.\r\n *\r\n * @param {google.maps.Marker} marker The marker to check.\r\n * @return {boolean} True if the marker lies in the bounds.\r\n */\r\nCluster.prototype.isMarkerInClusterBounds = function (marker) {\r\n\treturn this.bounds_.contains(marker.getPosition());\r\n};\r\n\r\n\r\n/**\r\n * Returns the map that the cluster is associated with.\r\n *\r\n * @return {google.maps.Map} The map.\r\n */\r\nCluster.prototype.getMap = function () {\r\n\treturn this.map_;\r\n};\r\n\r\n\r\n/**\r\n * Updates the cluster icon\r\n */\r\nCluster.prototype.updateIcon = function () {\r\n\tvar zoom = this.map_.getZoom();\r\n\tvar mz = this.markerClusterer_.getMaxZoom();\r\n\r\n\tif (mz && zoom > mz) {\r\n\t\t// The zoom is greater than our max zoom so show all the markers in cluster.\r\n\t\tfor (var i = 0, marker; marker = this.markers_[i]; i++) {\r\n\t\t\tmarker.setMap(this.map_);\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (this.markers_.length < this.minClusterSize_) {\r\n\t\t// Min cluster size not yet reached.\r\n\t\tthis.clusterIcon_.hide();\r\n\t\treturn;\r\n\t}\r\n\r\n\tvar numStyles = this.markerClusterer_.getStyles().length;\r\n\tvar sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);\r\n\tthis.clusterIcon_.setCenter(this.center_);\r\n\tthis.clusterIcon_.setSums(sums);\r\n\tthis.clusterIcon_.show();\r\n};\r\n\r\n\r\n/**\r\n * A cluster icon\r\n *\r\n * @param {Cluster} cluster The cluster to be associated with.\r\n * @param {Object} styles An object that has style properties:\r\n * 'url': (string) The image url.\r\n * 'height': (number) The image height.\r\n * 'width': (number) The image width.\r\n * 'anchor': (Array) The anchor position of the label text.\r\n * 'textColor': (string) The text color.\r\n * 'textSize': (number) The text size.\r\n * 'backgroundPosition: (string) The background postition x, y.\r\n * @param {number=} opt_padding Optional padding to apply to the cluster icon.\r\n * @constructor\r\n * @extends google.maps.OverlayView\r\n * @ignore\r\n */\r\nfunction ClusterIcon(cluster, styles, opt_padding) {\r\n\tcluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);\r\n\r\n this.styles_ = styles;\r\n\tthis.padding_ = opt_padding || 0;\r\n\tthis.cluster_ = cluster;\r\n\tthis.center_ = null;\r\n\tthis.map_ = cluster.getMap();\r\n\tthis.div_ = null;\r\n\tthis.sums_ = null;\r\n\tthis.visible_ = false;\r\n\r\n\tthis.setMap(this.map_);\r\n}\r\n\r\n\r\n/**\r\n * Triggers the clusterclick event and zoom's if the option is set.\r\n *\r\n * @param {google.maps.MouseEvent} event The event to propagate\r\n */\r\nClusterIcon.prototype.triggerClusterClick = function (event) {\r\n\tvar markerClusterer = this.cluster_.getMarkerClusterer();\r\n\r\n\t// Trigger the clusterclick event.\r\n\tgoogle.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster_, event);\r\n\r\n\tif (markerClusterer.isZoomOnClick()) {\r\n\t\t// Zoom into the cluster.\r\n\t\tthis.map_.fitBounds(this.cluster_.getBounds());\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Adding the cluster icon to the dom.\r\n * @ignore\r\n */\r\nClusterIcon.prototype.onAdd = function () {\r\n\r\n var useClusterSizeAsText = document.documentElement.lang.toLowerCase() !== \"pt\" ? true : false;\r\n\r\n\tthis.div_ = document.createElement('DIV');\r\n\tif (this.visible_) {\r\n\t\tvar pos = this.getPosFromLatLng_(this.center_);\r\n\t\tthis.div_.style.cssText = this.createCss(pos);\r\n\t\tthis.div_.innerHTML = useClusterSizeAsText ? this.sums_.text: \"\";\r\n\t}\r\n\r\n\tvar panes = this.getPanes();\r\n\tpanes.overlayMouseTarget.appendChild(this.div_);\r\n\r\n\tvar that = this;\r\n\tvar isDragging = false;\r\n\tgoogle.maps.event.addDomListener(this.div_, 'click', function (event) {\r\n\t\t// Only perform click when not preceded by a drag\r\n\t\tif (!isDragging) {\r\n\t\t\tthat.triggerClusterClick(event);\r\n\t\t}\r\n\t});\r\n\tgoogle.maps.event.addDomListener(this.div_, 'mousedown', function () {\r\n\t\tisDragging = false;\r\n\t});\r\n\tgoogle.maps.event.addDomListener(this.div_, 'mousemove', function () {\r\n\t\tisDragging = true;\r\n\t});\r\n};\r\n\r\n\r\n/**\r\n * Returns the position to place the div dending on the latlng.\r\n *\r\n * @param {google.maps.LatLng} latlng The position in latlng.\r\n * @return {google.maps.Point} The position in pixels.\r\n * @private\r\n */\r\nClusterIcon.prototype.getPosFromLatLng_ = function (latlng) {\r\n\tvar pos = this.getProjection().fromLatLngToDivPixel(latlng);\r\n\r\n\tif (typeof this.iconAnchor_ === 'object' && this.iconAnchor_.length === 2) {\r\n\t\tpos.x -= this.iconAnchor_[0];\r\n\t\tpos.y -= this.iconAnchor_[1];\r\n\t} else {\r\n\t\tpos.x -= parseInt(this.width_ / 2, 10);\r\n\t\tpos.y -= parseInt(this.height_ / 2, 10);\r\n\t}\r\n\treturn pos;\r\n};\r\n\r\n\r\n/**\r\n * Draw the icon.\r\n * @ignore\r\n */\r\nClusterIcon.prototype.draw = function () {\r\n\tif (this.visible_) {\r\n\t\tvar pos = this.getPosFromLatLng_(this.center_);\r\n\t\tthis.div_.style.top = pos.y + 'px';\r\n\t\tthis.div_.style.left = pos.x + 'px';\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Hide the icon.\r\n */\r\nClusterIcon.prototype.hide = function () {\r\n\tif (this.div_) {\r\n\t\tthis.div_.style.display = 'none';\r\n\t}\r\n\tthis.visible_ = false;\r\n};\r\n\r\n\r\n/**\r\n * Position and show the icon.\r\n */\r\nClusterIcon.prototype.show = function () {\r\n\tif (this.div_) {\r\n\t\tvar pos = this.getPosFromLatLng_(this.center_);\r\n\t\tthis.div_.style.cssText = this.createCss(pos);\r\n\t\tthis.div_.style.display = '';\r\n\t}\r\n\tthis.visible_ = true;\r\n};\r\n\r\n\r\n/**\r\n * Remove the icon from the map\r\n */\r\nClusterIcon.prototype.remove = function () {\r\n\tthis.setMap(null);\r\n};\r\n\r\n\r\n/**\r\n * Implementation of the onRemove interface.\r\n * @ignore\r\n */\r\nClusterIcon.prototype.onRemove = function () {\r\n\tif (this.div_ && this.div_.parentNode) {\r\n\t\tthis.hide();\r\n\t\tthis.div_.parentNode.removeChild(this.div_);\r\n\t\tthis.div_ = null;\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Set the sums of the icon.\r\n *\r\n * @param {Object} sums The sums containing:\r\n * 'text': (string) The text to display in the icon.\r\n * 'index': (number) The style index of the icon.\r\n */\r\nClusterIcon.prototype.setSums = function (sums) {\r\n\tthis.sums_ = sums;\r\n\tthis.text_ = sums.text;\r\n\tthis.index_ = sums.index;\r\n\tif (this.div_) {\r\n\t\tthis.div_.innerHTML = sums.text;\r\n\t}\r\n\r\n\tthis.useStyle();\r\n};\r\n\r\n\r\n/**\r\n * Sets the icon to the the styles.\r\n */\r\nClusterIcon.prototype.useStyle = function () {\r\n\tvar index = Math.max(0, this.sums_.index - 1);\r\n\tindex = Math.min(this.styles_.length - 1, index);\r\n\tvar style = this.styles_[index];\r\n\tthis.url_ = style['url'];\r\n\tthis.height_ = style['height'];\r\n\tthis.width_ = style['width'];\r\n\tthis.textColor_ = style['textColor'];\r\n\tthis.anchor_ = style['anchor'];\r\n\tthis.textSize_ = style['textSize'];\r\n\tthis.backgroundPosition_ = style['backgroundPosition'];\r\n\tthis.iconAnchor_ = style['iconAnchor'];\r\n};\r\n\r\n\r\n/**\r\n * Sets the center of the icon.\r\n *\r\n * @param {google.maps.LatLng} center The latlng to set as the center.\r\n */\r\nClusterIcon.prototype.setCenter = function (center) {\r\n\tthis.center_ = center;\r\n};\r\n\r\n\r\n/**\r\n * Create the css text based on the position of the icon.\r\n *\r\n * @param {google.maps.Point} pos The position.\r\n * @return {string} The css style text.\r\n */\r\nClusterIcon.prototype.createCss = function (pos) {\r\n\tvar style = [];\r\n\tstyle.push('background-image:url(' + this.url_ + ');');\r\n\tvar backgroundPosition = this.backgroundPosition_ ? this.backgroundPosition_ : '0 0';\r\n\tstyle.push('background-position:' + backgroundPosition + ';');\r\n\r\n\tif (typeof this.anchor_ === 'object') {\r\n\t\tif (typeof this.anchor_[0] === 'number' && this.anchor_[0] > 0 &&\r\n\t\t\tthis.anchor_[0] < this.height_) {\r\n\t\t\tstyle.push('height:' + (this.height_ - this.anchor_[0]) +\r\n\t\t\t\t'px; padding-top:' + this.anchor_[0] + 'px;');\r\n\t\t} else if (typeof this.anchor_[0] === 'number' && this.anchor_[0] < 0 &&\r\n\t\t\t-this.anchor_[0] < this.height_) {\r\n\t\t\tstyle.push('height:' + this.height_ + 'px; line-height:' + (this.height_ + this.anchor_[0]) +\r\n\t\t\t\t'px;');\r\n\t\t} else {\r\n\t\t\tstyle.push('height:' + this.height_ + 'px; line-height:' + this.height_ +\r\n\t\t\t\t'px;');\r\n\t\t}\r\n\t\tif (typeof this.anchor_[1] === 'number' && this.anchor_[1] > 0 &&\r\n\t\t\tthis.anchor_[1] < this.width_) {\r\n\t\t\tstyle.push('width:' + (this.width_ - this.anchor_[1]) +\r\n\t\t\t\t'px; padding-left:' + this.anchor_[1] + 'px;');\r\n\t\t} else {\r\n\t\t\tstyle.push('width:' + this.width_ + 'px; text-align:center;');\r\n\t\t}\r\n\t} else {\r\n\t\tstyle.push('height:' + this.height_ + 'px; line-height:' +\r\n\t\t\tthis.height_ + 'px; width:' + this.width_ + 'px; text-align:center;');\r\n\t}\r\n\r\n\tvar txtColor = this.textColor_ ? this.textColor_ : 'black';\r\n\tvar txtSize = this.textSize_ ? this.textSize_ : 11;\r\n\r\n\tstyle.push('cursor:pointer; top:' + pos.y + 'px; left:' +\r\n\t\tpos.x + 'px; color:' + txtColor + '; position:absolute; font-size:' +\r\n\t\ttxtSize + 'px; font-family:Arial,sans-serif; font-weight:bold');\r\n\treturn style.join('');\r\n};\r\n\r\n\r\n// Export Symbols for Closure\r\n// If you are not going to compile with closure then you can remove the\r\n// code below.\r\nwindow['MarkerClusterer'] = MarkerClusterer;\r\nMarkerClusterer.prototype['addMarker'] = MarkerClusterer.prototype.addMarker;\r\nMarkerClusterer.prototype['addMarkers'] = MarkerClusterer.prototype.addMarkers;\r\nMarkerClusterer.prototype['clearMarkers'] =\r\n\tMarkerClusterer.prototype.clearMarkers;\r\nMarkerClusterer.prototype['fitMapToMarkers'] =\r\n\tMarkerClusterer.prototype.fitMapToMarkers;\r\nMarkerClusterer.prototype['getCalculator'] =\r\n\tMarkerClusterer.prototype.getCalculator;\r\nMarkerClusterer.prototype['getGridSize'] =\r\n\tMarkerClusterer.prototype.getGridSize;\r\nMarkerClusterer.prototype['getExtendedBounds'] =\r\n\tMarkerClusterer.prototype.getExtendedBounds;\r\nMarkerClusterer.prototype['getMap'] = MarkerClusterer.prototype.getMap;\r\nMarkerClusterer.prototype['getMarkers'] = MarkerClusterer.prototype.getMarkers;\r\nMarkerClusterer.prototype['getMaxZoom'] = MarkerClusterer.prototype.getMaxZoom;\r\nMarkerClusterer.prototype['getStyles'] = MarkerClusterer.prototype.getStyles;\r\nMarkerClusterer.prototype['getTotalClusters'] =\r\n\tMarkerClusterer.prototype.getTotalClusters;\r\nMarkerClusterer.prototype['getTotalMarkers'] =\r\n\tMarkerClusterer.prototype.getTotalMarkers;\r\nMarkerClusterer.prototype['redraw'] = MarkerClusterer.prototype.redraw;\r\nMarkerClusterer.prototype['removeMarker'] =\r\n\tMarkerClusterer.prototype.removeMarker;\r\nMarkerClusterer.prototype['removeMarkers'] =\r\n\tMarkerClusterer.prototype.removeMarkers;\r\nMarkerClusterer.prototype['resetViewport'] =\r\n\tMarkerClusterer.prototype.resetViewport;\r\nMarkerClusterer.prototype['repaint'] =\r\n\tMarkerClusterer.prototype.repaint;\r\nMarkerClusterer.prototype['setCalculator'] =\r\n\tMarkerClusterer.prototype.setCalculator;\r\nMarkerClusterer.prototype['setGridSize'] =\r\n\tMarkerClusterer.prototype.setGridSize;\r\nMarkerClusterer.prototype['setMaxZoom'] =\r\n\tMarkerClusterer.prototype.setMaxZoom;\r\nMarkerClusterer.prototype['onAdd'] = MarkerClusterer.prototype.onAdd;\r\nMarkerClusterer.prototype['draw'] = MarkerClusterer.prototype.draw;\r\n\r\nCluster.prototype['getCenter'] = Cluster.prototype.getCenter;\r\nCluster.prototype['getSize'] = Cluster.prototype.getSize;\r\nCluster.prototype['getMarkers'] = Cluster.prototype.getMarkers;\r\n\r\nClusterIcon.prototype['onAdd'] = ClusterIcon.prototype.onAdd;\r\nClusterIcon.prototype['draw'] = ClusterIcon.prototype.draw;\r\nClusterIcon.prototype['onRemove'] = ClusterIcon.prototype.onRemove;","var shvenergy = shvenergy || {};\r\nshvenergy.search = (function ($) {\r\n return {\r\n };\r\n})(jQuery);\r\n\r\nshvenergy.search.dealer = (function ($) {\r\n \"use strict\";\r\n var dealerType = $('input[name=toggle]:checked').val();\r\n var constBounceKey = \"dealerSearch\";\r\n var detailsWrapper = $(\".map-dealerdetails\");\r\n var currentDealer;\r\n\r\n function autocomplete(searchTerm, results, cb, appendTo) {\r\n if (getFromLastSearch(searchTerm, results, cb, appendTo)) {\r\n return;\r\n }\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: \"/api/dealer/searchbyname\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n data: JSON.stringify({\r\n DealerName: searchTerm,\r\n DealerType: dealerType,\r\n isMobile: window.matchMedia('(max-width: 640px)').matches,\r\n }),\r\n success: function (data) {\r\n results.dealers = data.dealers;\r\n\r\n cb(results.dealers, \"address\", searchTerm, appendTo, \"Dealer_16x16\");\r\n\r\n shvenergy.tracking.trackRawEventData({\r\n 'event': 'clickDFSearch',\r\n 'searchType': dealerType,\r\n 'query': searchTerm\r\n });\r\n },\r\n error: function (jqXHR, textStatus) {\r\n console.warn(textStatus);\r\n }\r\n });\r\n }\r\n\r\n function getFromLastSearch(searchTerm, results, cb, appendTo) {\r\n if (!results.lastTerm || !results.lastTerm.startsWith(searchTerm) || !results.dealers || results.dealers.results > 5)\r\n return;\r\n\r\n results.dealers = $.grep(results.dealers, function (element) {\r\n return element.description.indexOf(searchTerm) !== -1;\r\n });\r\n cb(results.dealers, \"address\", searchTerm, appendTo);\r\n return;\r\n }\r\n\r\n function searchByLocation(bounds, zoomLevel) {\r\n\r\n var currentLocation = shvenergy.maps.getDefaultMarkerLocation();\r\n\r\n //console.log(\"bounds: \", bounds);\r\n //console.log(\"zoomLevel: \", zoomLevel);\r\n //console.log(\"currentLocation: \", currentLocation);\r\n var start_time;\r\n shvenergy.bounce.runNamed(constBounceKey,\r\n function () {\r\n // TODO: Extend this with filters\r\n $.ajax({\r\n type: \"POST\",\r\n url: \"/api/dealer/searchbyarea\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n beforeSend: function () {\r\n start_time = new Date().getTime();\r\n },\r\n data: JSON.stringify({\r\n northEast: bounds.getNorthEast(),\r\n southWest: bounds.getSouthWest(),\r\n zoomLevel: zoomLevel,\r\n location: currentLocation,\r\n dealerType: dealerType,\r\n hasSpecialOrderAvailable: false,\r\n isOpenNow: false,\r\n dealerStoreTypes: getDealerStoreTypes(),\r\n dealerBrandNames: getDealerBrandNames(),\r\n tags: getDealerTags(),\r\n filters: getDealerFilterGroups(),\r\n isDeliveryAvailable: getFilter(\"dealerDeliveryAvailableFilter\"),\r\n isBio: getFilter(\"dealerBioFilter\"),\r\n isTruckLpg: getFilter(\"dealerTruckLpgFilter\"),\r\n isPreferredPartner: getFilter(\"dealerPreferredPartnerFilter\") || getFilter(\"dealerPromotedPreferredPartnerFilter\"),\r\n sortBy: shvenergy.maps.locationMarker.visible ? \"Distance\" : \"Name\",\r\n isMobile: window.matchMedia('(max-width: 640px)').matches,\r\n\r\n }),\r\n success: function (data) {\r\n var request_time = new Date().getTime() - start_time;\r\n console.log(\"searchbyarea request process time: \" + request_time);\r\n shvenergy.maps.createDealerMarkers(data);\r\n },\r\n error: function (jqXHR, textStatus) {\r\n console.warn(textStatus);\r\n }\r\n });\r\n }, 40);\r\n }\r\n\r\n function getFilter(filterName) {\r\n var self = $(\"#\" + dealerType + \"-\" + filterName);\r\n\r\n if (self && self.length) {\r\n return self.prop(\"checked\");\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n function getDealerFilterGroups() {\r\n var filters = [];\r\n $(\"input[data-type=\" + dealerType + \"-Filter]:checked\").each(function () {\r\n var self = $(this);\r\n var id = self.val();\r\n filters.push(id);\r\n });\r\n\r\n $(\"input[data-filter=\" + dealerType + \"-dealerBrandFilter]:checked\").each(function () {\r\n var self = $(this);\r\n var id = self.val();\r\n filters.push(id);\r\n });\r\n\r\n return filters;\r\n }\r\n\r\n function getDealerTags() {\r\n var tags = [];\r\n $(\"input[data-type=\" + dealerType + \"-Tag]:checked\").each(function () {\r\n var self = $(this);\r\n var id = self.val();\r\n tags.push(id);\r\n });\r\n return tags;\r\n }\r\n\r\n function getDealerStoreTypes() {\r\n var storeTypesArray = [];\r\n\r\n var pane = $(\"[data-paneid=\" + dealerType + \"-dealerStoreTypeFilter]\");\r\n\r\n pane.find(\"input[type=checkbox]\").each(function () {\r\n var self = $(this);\r\n var id = self.val();\r\n\r\n if (self.prop(\"checked\")) {\r\n storeTypesArray.push(id);\r\n }\r\n });\r\n\r\n //console.log(storeTypesArray);\r\n\r\n return storeTypesArray;\r\n }\r\n\r\n function getDealerBrandNames() {\r\n var dealerBrandNamesArray = [];\r\n\r\n var pane = $(\"[data-paneid=\" + dealerType + \"-dealerBrandNameFilter]\");\r\n\r\n pane.find(\"input[type=checkbox]\").each(function () {\r\n var self = $(this);\r\n var id = self.val();\r\n\r\n if (self.prop(\"checked\")) {\r\n dealerBrandNamesArray.push(id);\r\n }\r\n });\r\n\r\n var paneBrandFilter = $(\"[data-type=\" + dealerType + \"-DealerBrandFilter]\");\r\n\r\n $(paneBrandFilter).each(function () {\r\n var self = $(this);\r\n var ids = self.val().split(\"|\");\r\n\r\n\r\n if (self.prop(\"checked\")) {\r\n\r\n ids.forEach(function (id) {\r\n dealerBrandNamesArray.push(id);\r\n });\r\n\r\n\r\n }\r\n });\r\n\r\n const unique = (value, index, self) => {\r\n return self.indexOf(value) === index;\r\n };\r\n\r\n const uniqueDealerBrandNamesArray = dealerBrandNamesArray.filter(unique);\r\n\r\n return uniqueDealerBrandNamesArray;\r\n }\r\n\r\n function getDetails(id) {\r\n console.log(\"getDetails...\")\r\n\r\n //at this point we need to be sure that markers are not clusters\r\n var checkMarkersInterval = setInterval(function () {\r\n var checMarkerStatus = shvenergy.maps.areMarkersCreatedAndNotClusters()\r\n\r\n if (checMarkerStatus) {\r\n clearInterval(checkMarkersInterval);\r\n shvenergy.tracking.trackEvent(\"Dealerfinder\", \"Dealer clicked\", id);\r\n\r\n //$(\"#map-sidebar\").removeClass(\"is-invisible\");\r\n currentDealer = id;\r\n var url = \"\";\r\n\r\n var defaultmarkerLocation = shvenergy.maps.getDefaultMarkerLocation();\r\n var dealerLocation = shvenergy.maps.getMarkerById(currentDealer);\r\n var lat, lng;\r\n\r\n // Create shareable URL for a specific dealer and add to browser history\r\n var searchUrl = new URL(window.location);\r\n var oldDealerId = searchUrl.searchParams.get(\"dealerId\");\r\n\r\n if (oldDealerId !== currentDealer) {\r\n searchUrl.searchParams.set(\"dealerId\", currentDealer);\r\n searchUrl.searchParams.set(\"view\", \"details\");\r\n }\r\n\r\n //If location\r\n if (defaultmarkerLocation != null) {\r\n //console.log(defaultmarkerLocation);\r\n url = window.location.pathname +\r\n \"/\" +\r\n id +\r\n \"/details?Latitude=\" +\r\n defaultmarkerLocation.lat() +\r\n \"&Longitude=\" +\r\n defaultmarkerLocation.lng();\r\n } else if (dealerLocation) {\r\n //console.log(dealerLocation);\r\n lat = dealerLocation.position.lat();\r\n lng = dealerLocation.position.lng();\r\n\r\n url = window.location.pathname +\r\n \"/\" +\r\n id +\r\n \"/details?Latitude=\" +\r\n lat +\r\n \"&Longitude=\" +\r\n lng;\r\n } else {\r\n getDetails(id)\r\n }\r\n\r\n // \"Sharable URL\"-continued to also allow lat/lng\r\n if (oldDealerId !== currentDealer) {\r\n if (!lat || !lng) {\r\n lat = dealerLocation.position.lat();\r\n lng = dealerLocation.position.lng();\r\n }\r\n\r\n searchUrl.searchParams.set(\"lat\", lat);\r\n searchUrl.searchParams.set(\"lng\", lng);\r\n\r\n window.history.pushState({}, '', searchUrl);\r\n }\r\n\r\n detailsWrapper.empty();\r\n //var startTime = new Date().getTime();\r\n\r\n detailsWrapper.load(url + \" #searchDetails\", function () {\r\n\r\n $(\"#searchDetails\").hide().fadeIn(600);\r\n detailsWrapper.addClass('isActive');\r\n //getOpeningHours();\r\n hideLocationAlert();\r\n if (defaultmarkerLocation)\r\n setGetDirectionsButtons(defaultmarkerLocation);\r\n //console.log(\"detailsWrapper.load() time taken : \" + new Date(new Date().getTime()));\r\n //var request_time = new Date().getTime() - startTime;\r\n //console.log(\"Time Taken for detailsWrapper.load : \" + request_time);\r\n });\r\n\r\n clearInterval(checkMarkersInterval);\r\n\r\n }\r\n }, 200);\r\n }\r\n\r\n function setGetDirectionsButtons(location) {\r\n var loc = location.lat() + \",\" + location.lng();\r\n var getDirectionButtons = $(\".get-directions\");\r\n getDirectionButtons.each(function () {\r\n\r\n var currentHref = $(this).attr(\"href\");\r\n var replacedHref = currentHref.replace(\"dir//\", 'dir/' + loc + '/');\r\n\r\n $(this).attr(\"href\", replacedHref);\r\n\r\n });\r\n console.log(\"setGetDirectionsButtons() time taken:\" + new Date(new Date().getTime()));\r\n }\r\n\r\n function getType() {\r\n return dealerType;\r\n }\r\n\r\n function setType(val) {\r\n dealerType = val;\r\n }\r\n\r\n function setUseDistance(val) {\r\n useDistance = val;\r\n }\r\n\r\n function openCampaignBanner() {\r\n\r\n $(document).on(\"click\", \"#campaign-arrow\", function () {\r\n console.log('du rammer knappen');\r\n $(this).toggleClass(\"search__details__campaign__arrow--closed\")\r\n $(this).next(\".search__details__campaign__list\").slideToggle();\r\n });\r\n }\r\n\r\n function hideLocationAlert() {\r\n navigator.permissions.query({ name: \"geolocation\" }).then((result) => {\r\n if (result.state === \"granted\") {\r\n $(\".location-reminder\").css({ \"display\": \"none\" });\r\n } else {\r\n $(document).on(\"click\", \".location-reminder__close\", function () {\r\n $(\".location-reminder\").css({ \"display\": \"none\" });\r\n });\r\n }\r\n });\r\n }\r\n\r\n openCampaignBanner();\r\n\r\n return {\r\n autocomplete: autocomplete,\r\n searchByLocation: searchByLocation,\r\n getType: getType,\r\n setType: setType,\r\n setUseDistance: setUseDistance,\r\n getDetails: getDetails\r\n };\r\n\r\n\r\n\r\n})(jQuery);","var shvenergy = shvenergy || {};\r\n\r\nshvenergy.search.filters = (function ($) {\r\n \"use strict\";\r\n\r\n function updateFiltersByType() {\r\n $(\".search__dealerfilter.isActive\").removeClass(\"isActive\");\r\n $(\"[data-dealertype]\").hide();\r\n $(\"[data-dealertype='\" + shvenergy.search.dealer.getType() + \"']\").show();\r\n }\r\n\r\n\r\n function getOriginalSelectedUrlFilters() {\r\n var type = shvenergy.search.dealer.getType();\r\n const TAG_FILTER_NAME = `${type}-Tag`;\r\n let filterQuerystring = \"\";\r\n const currentFilters = document.querySelectorAll(`[data-filterwasdefaultchecked='true'][data-type='${TAG_FILTER_NAME}']`);\r\n currentFilters.forEach(function (filter) {\r\n filterQuerystring += \"&filter=\" + filter.dataset.queryparametername;\r\n });\r\n\r\n return filterQuerystring;\r\n }\r\n\r\n function resetFilters() {\r\n var form = $(\".search__filter.search__pane\");\r\n form[0].reset();\r\n\r\n\r\n setTimeout(function () {\r\n $(\"input[data-dealertypename]:checked\").prop(\"checked\", false);\r\n \r\n updateFilterCount();\r\n }, 100);\r\n\r\n if (window.history.pushState) {\r\n\r\n var urlWithoutFilters = removeUrlParameter(window.location.href, \"&filter\", \"*\");\r\n //console.log(\"urlWithoutFilters\", urlWithoutFilters);\r\n\r\n var newUrl = urlWithoutFilters + window.location.hash;\r\n //console.log(newUrl);\r\n history.pushState(null, document.title, newUrl);\r\n }\r\n\r\n var bounds = shvenergy.maps.getBounds();\r\n var zoomLevel = shvenergy.maps.getZoom();\r\n shvenergy.search.dealer.searchByLocation(bounds, zoomLevel);\r\n }\r\n\r\n function getFilterCount() {\r\n var type = shvenergy.search.dealer.getType();\r\n return $(\"input[data-dealertypename='\" + type + \"']:checked\").length;\r\n }\r\n\r\n const detectFilterButtonAvailability = () => {\r\n let currentDealerType = shvenergy.search.dealer.getType();\r\n const filterButton = document.querySelector(\".search__filters.search__back--filter.search__controls__button-container\");\r\n\r\n if(!$(\".toggle[value='Cylinder']\").data('hideavailablefiltersbutton') && currentDealerType === 'Cylinder' ){\r\n filterButton.style.display = \"inline-flex\";\r\n }\r\n if(!$(\".toggle[value='Autogas']\").data('hideavailablefiltersbutton') && currentDealerType === 'Autogas'){\r\n filterButton.style.display = \"inline-flex\";\r\n }\r\n\r\n if($(\".toggle[value='Cylinder']\").data('hideavailablefiltersbutton') && currentDealerType === 'Cylinder' ){\r\n filterButton.style.display = \"none\";\r\n }\r\n if($(\".toggle[value='Autogas']\").data('hideavailablefiltersbutton') && currentDealerType === 'Autogas'){\r\n filterButton.style.display = \"none\";\r\n }\r\n }\r\n\r\n function updateFilterCount() {\r\n const count = getFilterCount();\r\n \r\n if (count > 0) {\r\n $(\".search__filter__number\").show().text(getFilterCount());\r\n } else {\r\n $(\".search__filter__number\").hide();\r\n }\r\n\r\n detectFilterButtonAvailability();\r\n }\r\n\r\n //Helper function. Not exported at the bottom\r\n function removeUrlParameter(url, parameter, parameterValue = '') {\r\n var urlParts = url.split('?');\r\n\r\n if (urlParts.length >= 2) {\r\n // Get first part, and remove from array\r\n var urlBase = urlParts.shift();\r\n\r\n // Join it back up\r\n var queryString = urlParts.join('?');\r\n\r\n const params = new URLSearchParams(\"\");\r\n params.append(parameter, parameterValue);\r\n\r\n var prefix = params.toString();\r\n var parts = queryString.split(/[&;]/g);\r\n\r\n // Reverse iteration as may be destructive\r\n for (var i = parts.length; i-- > 0;) {\r\n // Idiom for string.startsWith\r\n //console.log(\"parts[i]:\", parts[i]);\r\n //console.log(\"prefix: \", prefix);\r\n if (parts[i] === prefix || (parts[i].includes(\"filter\") && prefix.includes(\"*\"))) {\r\n parts.splice(i, 1);\r\n }\r\n }\r\n\r\n url = urlBase + '?' + parts.join('&');\r\n }\r\n\r\n return url;\r\n }\r\n\r\n function updateQueryStringFilters(filter) {\r\n const searchParams = new URLSearchParams(window.location.search);\r\n\r\n\r\n if (filter.dataset.queryparametername === undefined)\r\n return;\r\n\r\n var newUrl = \"\";\r\n if (filter.checked) {\r\n searchParams.append(\"filter\", filter.dataset.queryparametername);\r\n const searchString = searchParams.toString().length > 0 ? '?' + searchParams.toString() : '';\r\n newUrl = window.location.protocol + \"//\" + window.location.host + window.location.pathname + searchString + window.location.hash;\r\n \r\n } else {\r\n newUrl = removeUrlParameter(window.location.href, \"filter\", filter.dataset.queryparametername);\r\n }\r\n\r\n if (window.history.pushState) {\r\n history.pushState(null, document.title, newUrl);\r\n }\r\n }\r\n\r\n return {\r\n updateFiltersByType: updateFiltersByType,\r\n resetFilters: resetFilters,\r\n getFilterCount: getFilterCount,\r\n updateFilterCount: updateFilterCount,\r\n updateQueryStringFilters: updateQueryStringFilters,\r\n getOriginalSelectedUrlFilters: getOriginalSelectedUrlFilters\r\n };\r\n\r\n})(jQuery);","var shvenergy = shvenergy || {};\r\n\r\nshvenergy.search.gui = (function ($) {\r\n \"use strict\";\r\n var searchResults = $(\".search-result\");\r\n\r\n const mapSideBarToggleButton = $(\"button[data-toggle-sidebar]\");\r\n var mapSidebar = $(\"#map-sidebar\");\r\n var mapSidebarContent = $(\".search__filter.search__pane\");\r\n\r\n var listSidebar = $(\".search__list\");\r\n\r\n var detailsWrapper = $(\".map-dealerdetails\");\r\n\r\n var mapCustomSearchButton = $(\"#map-custom-search-button\");\r\n\r\n var intro = $(\".map-sidebar__intro\");\r\n const useCurrentLocationButton = $(\"#useCurrentLocationButton\");\r\n var searchFilters = $(\".search__filter.search__pane\");\r\n var bactostart = $(\".search__back-tostart\");\r\n\r\n const mobileViewSelectors = window.matchMedia('(max-width: 640px)');\r\n\r\n var mapStateStore = {\r\n mapView: (() => {\r\n const view = new URL(window.location).searchParams.get('view');\r\n if (view === 'list') {\r\n return false;\r\n }\r\n return true;\r\n })(),\r\n mapViewListener: function (val) { },\r\n set mapVisible(val) {\r\n if (this.mapView !== val) {\r\n this.mapView = val;\r\n this.mapViewListener(val);\r\n }\r\n },\r\n get mapVisible() {\r\n return this.mapView;\r\n },\r\n registerListener: function (listener) {\r\n this.mapViewListener = listener;\r\n this.mapViewListener(this.mapView);\r\n },\r\n\r\n placeDetails: null,\r\n placeDetailsListener: function (val) { },\r\n set placeDetailsContent(val) {\r\n this.placeDetails = val;\r\n this.placeDetailsListener(val);\r\n },\r\n get placeDetailsContent() {\r\n return this.placeDetails;\r\n },\r\n registerPlaceDetailsListener: function (listener) {\r\n this.placeDetailsListener = listener;\r\n }\r\n };\r\n\r\n var mapClearSearchButtonStore = {\r\n isVisible: false,\r\n clearSearchButtonListener: function (val) { },\r\n set clearSearchButtonVisible(val) {\r\n this.isVisible = val;\r\n this.clearSearchButtonListener(val);\r\n },\r\n get clearSearchButtonVisible() {\r\n return this.isVisible;\r\n },\r\n registerListener: function (listener) {\r\n this.clearSearchButtonListener = listener;\r\n }\r\n };\r\n\r\n setTimeout(() => {\r\n mapSidebarContent.css({\r\n \"opacity\": \"\"\r\n });\r\n }, 100);\r\n\r\n setTimeout(() => {\r\n detailsWrapper.css({\r\n \"max-width\": \"\",\r\n \"opacity\": \"\",\r\n \"z-index\": \"\",\r\n \"-webkit-transform\": \"\",\r\n \"transform\": \"\"\r\n });\r\n\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n mapSidebar.css(\"opacity\", \"1\");\r\n }, 200);\r\n\r\n\r\n function reorderPanels(mapVisible = mapStateStore.mapVisible) {\r\n const searchControls = $('.search__controls');\r\n const isMobile = mobileViewSelectors.matches;\r\n if (!isMobile) {\r\n $('.map-sidebar__content').prepend(searchControls);\r\n return;\r\n };\r\n\r\n\r\n if (mapVisible) {\r\n $('.search__controls--mobile-container').append(searchControls);\r\n } else {\r\n $('.map-sidebar__content').prepend(searchControls);\r\n }\r\n }\r\n\r\n mapStateStore.registerListener(function (mapVisible) {\r\n var searchUrl = new URL(window.location);\r\n const display = mapVisible ? 'map' : 'list';\r\n const toggleMobileListViewText = $('[data-mobile-toggle-sidebar] > span[data-mobile-toggle-list-view]');\r\n const toggleMobileMapViewText = $('[data-mobile-toggle-sidebar] > span[data-mobile-toggle-map-view]');\r\n\r\n if (mapVisible) {\r\n mapSidebar.addClass(\"is-invisible\");\r\n listSidebar.addClass(\"is-invisible\");\r\n\r\n toggleMobileListViewText.show();\r\n toggleMobileMapViewText.hide();\r\n } else {\r\n mapSidebar.removeClass(\"is-invisible\");\r\n listSidebar.removeClass(\"is-invisible\");\r\n\r\n toggleMobileListViewText.hide();\r\n toggleMobileMapViewText.show();\r\n }\r\n\r\n\r\n shvenergy.tracking.trackEvent('Dealerfinder', 'Viewtype', `${display} view`);\r\n\r\n shvenergy.tracking.trackRawEventData({\r\n 'event': 'clickDFView',\r\n 'viewType': display\r\n });\r\n historyPushState();\r\n toggleMobileButtons();\r\n\r\n reorderPanels(mapVisible);\r\n });\r\n\r\n mapClearSearchButtonStore.registerListener(function (val) {\r\n var mapClearSearchButton = $(\"#map-clearsearchbutton\");\r\n if (mapClearSearchButtonStore.clearSearchButtonVisible) {\r\n mapClearSearchButton.show();\r\n } else {\r\n mapClearSearchButton.hide();\r\n $(\"#map-searchinput\").val(\"\");\r\n searchResults.empty();\r\n }\r\n });\r\n\r\n function toggleMobileListInfoText() {\r\n const toggles = $('[name=toggle]');\r\n const selector = toggles.length === 1\r\n ? '[name=toggle]'\r\n : '[name=toggle]:checked';\r\n\r\n const title = $(selector).data('mobilelistviewinfotext');\r\n $('span#retailer-info-headline').text(title);\r\n }\r\n\r\n function toggleMobileButtons() {\r\n const isMapView = mapStateStore.mapView;\r\n const searchResultsCount = $('#dealerTarget').children().length;\r\n\r\n $('input#map-searchinput').show();\r\n $('#useCurrentLocationButton').removeClass('hide-for-small-only');\r\n\r\n if (!mobileViewSelectors.matches) return;\r\n\r\n $('.search__toggle-mobile').show();\r\n\r\n if (isMapView) {\r\n $('#useCurrentLocationButton').removeClass('hide-for-small-only');\r\n } else {\r\n $('#useCurrentLocationButton').addClass('hide-for-small-only');\r\n }\r\n\r\n const infoContainer = $('[data-mobile-info-container]');\r\n const mobileToggleContainer = $('[data-mobile-toggle-sidebar-container]');\r\n\r\n if (isMapView) {\r\n if (searchResultsCount > 0) {\r\n infoContainer.hide();\r\n mobileToggleContainer.show();\r\n } else {\r\n infoContainer.show();\r\n mobileToggleContainer.hide();\r\n }\r\n } else {\r\n infoContainer.hide();\r\n mobileToggleContainer.show();\r\n\r\n if (searchResultsCount > 0) {\r\n $('input#map-searchinput').show();\r\n } else {\r\n $('input#map-searchinput').hide();\r\n }\r\n }\r\n }\r\n\r\n const searchResultsObserver = new MutationObserver((mutations) => {\r\n for (const mutation of mutations) {\r\n if (mutation.type === 'childList') {\r\n toggleMobileButtons();\r\n }\r\n }\r\n })\r\n\r\n // TODO: refactor these, should be in the same handler\r\n mapSideBarToggleButton.on(\"click\", function (e) {\r\n e.stopPropagation();\r\n mapStateStore.mapVisible = !mapStateStore.mapVisible;\r\n });\r\n\r\n $('*[data-mobile-toggle-sidebar]').on('click', function (e) {\r\n e.stopPropagation();\r\n listSidebar.removeClass('hide-for-small-only');\r\n\r\n mapStateStore.mapVisible = !mapStateStore.mapVisible;\r\n toggleMobileButtons();\r\n });\r\n\r\n $('*[data-mobile-show-results]').on('click', function (e) {\r\n e.stopPropagation();\r\n listSidebar.removeClass('hide-for-small-only');\r\n\r\n mapStateStore.mapVisible = true;\r\n\r\n // TODO rework duplicate code: see line 347\r\n $(this).parents('.search__pane').toggleClass('search__pane--active');\r\n $(this).parents('.search__pane').toggleClass('is-invisible');\r\n\r\n // shvenergy.maps.fitBounds(shvenergy.maps.getStoredBounds());\r\n // shvenergy.maps.setZoom(shvenergy.maps.getStoredZoom());\r\n shvenergy.maps.setIsZoomedAndCenteredOnMarker(false);\r\n })\r\n\r\n $('*[data-toggle-mobile-info]').on('click', function (e) {\r\n $('.map-sidebar__mobile-info').toggleClass('is-invisible');\r\n });\r\n\r\n mapCustomSearchButton.on(\"click\", function () {\r\n mapSidebar.removeClass(\"is-invisible\");\r\n listSidebar.addClass(\"is-invisible\");\r\n $('body').addClass(\"map-search\");\r\n });\r\n\r\n function historyPushState(term = $('#map-searchinput').val()) {\r\n var searchUrl = new URL(window.location);\r\n var type = shvenergy.search.dealer.getType();\r\n const display = mapStateStore.mapVisible\r\n ? searchUrl.searchParams.get('view') === 'details' ? 'details' : 'map'\r\n : 'list';\r\n\r\n if (!!term) {\r\n searchUrl.searchParams.set('search', term);\r\n }\r\n searchUrl.searchParams.set('view', display);\r\n searchUrl.searchParams.set('dealerType', type);\r\n\r\n const TAG_FILTER_NAME = `${type}-Tag`;\r\n let filterQuerystring = \"\";\r\n const currentFilters = document.querySelectorAll(`[data-filterwasdefaultchecked='true'][data-type='${TAG_FILTER_NAME}']`);\r\n currentFilters.forEach(function (filter) {\r\n filterQuerystring += \"&filter=\" + filter.dataset.queryparametername;\r\n });\r\n const builtQuery = '?' + searchUrl.searchParams.toString();\r\n\r\n window.history.pushState({}, '', builtQuery);\r\n }\r\n\r\n function historyReplaceState(term = $('#map-searchinput').val()) {\r\n var searchUrl = new URL(window.location);\r\n var type = shvenergy.search.dealer.getType();\r\n const display = mapStateStore.mapVisible\r\n ? searchUrl.searchParams.get('view') === 'details' ? 'details' : 'map'\r\n : 'list';\r\n\r\n if (!!term) {\r\n searchUrl.searchParams.set('search', term);\r\n }\r\n const currentSearcUrl = '?' + searchUrl.searchParams.toString();\r\n\r\n searchUrl.searchParams.set('view', display);\r\n searchUrl.searchParams.set('dealerType', type);\r\n\r\n const builtQuery = '?' + searchUrl.searchParams.toString();\r\n\r\n if (window.history.replaceState && !(builtQuery === currentSearcUrl)) {\r\n window.history.pushState({}, '', builtQuery);\r\n }\r\n }\r\n\r\n $(\".search__filter.search__pane input[type=checkbox]\").on(\"click\", function (e) {\r\n\r\n e.stopPropagation();\r\n var bounds = shvenergy.maps.getBounds();\r\n var zoomLevel = shvenergy.maps.getZoom();\r\n shvenergy.search.dealer.searchByLocation(bounds, zoomLevel);\r\n\r\n //For autogas dealer brand filters we need to uncheck all sub checkboxes\r\n if (e.target.checked === false && e.target.matches('[data-type=\"Autogas-DealerBrandFilter\"]')) {\r\n const id = e.target.id;\r\n const pane = $(\"[data-paneid='\" + id + \"']\");\r\n const checkboxes = pane.find(\"input[type=checkbox]\");\r\n\r\n checkboxes.each(function (index, element) {\r\n $(this).prop(\"checked\", false);\r\n });\r\n }\r\n shvenergy.search.filters.updateFilterCount();\r\n\r\n let filterTitle;\r\n if (e.target.parentElement.querySelector('label span.filter__title')) {\r\n filterTitle = e.target.parentElement.querySelector('label span.filter__title').innerText\r\n }\r\n else if (e.target.parentElement.querySelector('label span.toggle-switch__title')) {\r\n filterTitle = e.target.parentElement.querySelector('label span.toggle-switch__title').innerText\r\n }\r\n else {\r\n filterTitle = e.target.parentElement.querySelector('label span').innerText;\r\n }\r\n\r\n shvenergy.tracking.trackRawEventData({\r\n 'event': 'clickDFFilter',\r\n 'filterName': filterTitle,\r\n 'action': e.target.checked ? 'on' : 'off'\r\n });\r\n });\r\n\r\n useCurrentLocationButton.on(\"click\", function (e) {\r\n e.stopPropagation();\r\n shvenergy.maps.useGeoLocation(true);\r\n var type = shvenergy.search.dealer.getType();\r\n var term = $(\"#map-searchinput\").val();\r\n window.history.pushState(null, null, '?search=' + term + '&dealerType=' + type);\r\n if (shvenergy.utils.isMobile()) {\r\n shvenergy.search.gui.mapStateStore.mapVisible = true;\r\n }\r\n\r\n shvenergy.tracking.trackRawEventData({\r\n 'event': 'clickDFSearch',\r\n 'searchType': 'Geolocalization',\r\n 'query': term\r\n });\r\n\r\n });\r\n\r\n $(\".search__filter__type-button\").on(\"click\", function () {\r\n var self = $(this);\r\n var id = self.attr(\"id\");\r\n $(\"[data-paneid='\" + id + \"']\").addClass(\"isActive\");\r\n });\r\n\r\n\r\n $(\"[data-closedealerfilter]\").on(\"click\", function (e) {\r\n e.stopPropagation();\r\n $(this).parents(\".search__dealerfilter\").removeClass(\"isActive\");\r\n });\r\n\r\n bactostart.on(\"click\", function (e) {\r\n e.stopPropagation();\r\n\r\n setTimeout(function () {\r\n shvenergy.maps.intro.show();\r\n $(\"#dealerTarget\").empty();\r\n $(\"#map-searchinput\").val(\"\");\r\n shvenergy.search.gui.setBactoStartState(true);\r\n shvenergy.maps.setZoom(shvenergy.maps.initialZoom);\r\n shvenergy.maps.setCenter(shvenergy.maps.initialPosition);\r\n //shvenergy.maps.hideCurrentLocation();\r\n // shvenergy.search.filters.resetFilters();\r\n window.history.pushState({}, document.title, window.location.pathname);\r\n shvenergy.search.gui.mapClearSearchButtonStore.clearSearchButtonVisible = false;\r\n shvenergy.maps.hideMarker();\r\n }, 500);\r\n\r\n });\r\n\r\n // delegations for lazy loaded elements\r\n $(document)\r\n .on(\"mouseenter\", \".search__item\", function () {\r\n var dealerId = $(this).attr(\"dealerid\");\r\n shvenergy.maps.setMarker(dealerId, true);\r\n })\r\n .on(\"mouseleave\", \".search__item\", function () {\r\n var dealerId = $(this).attr(\"dealerid\");\r\n shvenergy.maps.setMarker(dealerId, false);\r\n })\r\n .on(\"click\", \".search__item\", function () {\r\n console.log(\"Reset placedetails in the store\");\r\n shvenergy.search.gui.mapStateStore.placeDetails = null;\r\n shvenergy.maps.storeZoomAndBounds();\r\n shvenergy.search.dealer.getDetails($(this).attr(\"dealerid\"));\r\n var marker = shvenergy.maps.getMarkerById($(this).attr(\"dealerid\"));\r\n shvenergy.maps.zoomAndCenterOnMarker(marker);\r\n })\r\n .on(\"click\", \".search__back\", function (e) {\r\n e.stopPropagation();\r\n $(this).parents('.search__pane').toggleClass('search__pane--active');\r\n $(this).parents('.search__pane').toggleClass('is-invisible');\r\n\r\n // shvenergy.maps.fitBounds(shvenergy.maps.getStoredBounds());\r\n // shvenergy.maps.setZoom(shvenergy.maps.getStoredZoom());\r\n shvenergy.maps.setIsZoomedAndCenteredOnMarker(false);\r\n })\r\n .on(\"click\", \".get-directions.search__details__links\", function (e) {\r\n e.stopPropagation();\r\n shvenergy.tracking.trackRawEventData({\r\n 'event': 'clickDFRetailerAction',\r\n 'action': 'Get Direction'\r\n });\r\n })\r\n .on(\"click\", \".search__details__link__telephone\", function (e) {\r\n e.stopPropagation();\r\n shvenergy.tracking.trackRawEventData({\r\n 'event': 'clickDFRetailerAction',\r\n 'action': 'Phone Number'\r\n });\r\n })\r\n .on(\"click\", \"#openingHoursButton\", function (e) {\r\n e.stopPropagation();\r\n\r\n const placeId = $(this).data(\"placeId\");\r\n if (placeId) {\r\n setOpeningHours(placeId);\r\n } else {\r\n getPlaceId(setOpeningHours);\r\n }\r\n })\r\n .on(\"click\", 'input[name=toggle]', function (e) {\r\n shvenergy.search.dealer.setType(this.value);\r\n\r\n var bounds = shvenergy.maps.getBounds();\r\n var zoomLevel = shvenergy.maps.getZoom();\r\n shvenergy.search.dealer.searchByLocation(bounds, zoomLevel);\r\n shvenergy.search.filters.updateFiltersByType();\r\n $('label[for=\"map-searchinput\"]').text($(this).data(\"searchareahelptext\"));\r\n historyReplaceState($(\"#map-searchinput\").val());\r\n shvenergy.search.filters.updateFilterCount();\r\n clearSuggestions();\r\n const filterButton = $('.search__back--filter');\r\n if ($(this).data('hideavailablefiltersbutton') == true) {\r\n filterButton.hide();\r\n } else {\r\n filterButton.show();\r\n\r\n const checkboxes = $(`input[type=\"checkbox\"][data-dealertypename=\"${this.value}\"]`)\r\n const disabled = checkboxes.length === 0;\r\n filterButton.attr('disabled', disabled);\r\n }\r\n\r\n\r\n toggleMobileListInfoText();\r\n\r\n\r\n shvenergy.tracking.trackRawEventData({\r\n 'event': 'clickDFType',\r\n 'action': this.value\r\n });\r\n })\r\n .on('click', '#map-searchbutton', function (e) {\r\n e.stopPropagation();\r\n\r\n mapSidebar.addClass(\"is-invisible\");\r\n\r\n shvenergy.maps.setKeepSearchingIfNoResults(true);\r\n const val = $(\"#map-searchinput\").val();\r\n\r\n if (val.length <= 0 && shvenergy.utils.isMobile()) {\r\n shvenergy.search.gui.mapStateStore.mapVisible = true;\r\n return;\r\n }\r\n\r\n if (val.length > 0) {\r\n shvenergy.search.gui.mapStateStore.mapVisible = true;\r\n //shvenergy.bounce.clearNamed(constBounceKey);\r\n //shvenergy.search.address.autocomplete(mapSearchInput.val(), currentResults, shvenergy.search.setFirstPrediction);\r\n historyReplaceState(val);\r\n //return;\r\n\r\n shvenergy.tracking.trackRawEventData({\r\n 'event': 'clickDFSearch',\r\n 'searchType': 'Manual search',\r\n 'query': val\r\n });\r\n }\r\n })\r\n .on('click', '#map-clearsearchbutton', function (e) {\r\n e.stopPropagation();\r\n\r\n shvenergy.search.gui.mapClearSearchButtonStore.clearSearchButtonVisible = false;\r\n\r\n const category = $(this).data(\"category\");\r\n const action = $(this).data(\"action\");\r\n const label = $(this).data(\"label\");\r\n\r\n shvenergy.tracking.trackEvent(category, action, label);\r\n })\r\n .on('click', '.search__filters, .js-search-filter', function (e) {\r\n searchFilters.toggleClass(\"search__pane--active\");\r\n searchFilters.toggleClass(\"is-invisible\");\r\n\r\n shvenergy.search.filters.updateFiltersByType();\r\n });\r\n\r\n function getPlaceId(callback) {\r\n var dealerName = $(\"#searchDetails\").data(\"dealername\");\r\n var lat = parseFloat($(\"#searchDetails\").data(\"locationlat\"));\r\n var lng = parseFloat($(\"#searchDetails\").data(\"locationlng\"));\r\n shvenergy.maps.getPlaceId({ lat: lat, lng: lng }, dealerName, callback);\r\n }\r\n\r\n /* while using geo location, Sometimes Search Input is populated with text.\r\n So to enable the clear search button check this code */\r\n $(function () {\r\n shvenergy.search.gui.mapClearSearchButtonStore.clearSearchButtonVisible = $(\"#map-searchinput\").val().length > 0;\r\n });\r\n\r\n function setCurrentSearch(val) {\r\n $(\"#map-searchinput\").val(val);\r\n }\r\n\r\n function clearSuggestions() {\r\n searchResults.empty();\r\n }\r\n\r\n function useFallBackText() {\r\n const fallBackText = $(\"#openingHoursButton\").data(\"no-opening-hours-fallback-text\");\r\n const listItem = $(\"
  • \");\r\n const weekdayNameSpan = $(\"\", {\r\n \"text\": fallBackText,\r\n \"class\": \"weekday-name-label\"\r\n });\r\n weekdayNameSpan.appendTo(listItem);\r\n listItem.appendTo($(\".search__details__links__date-list\"));\r\n toggleOpeningHoursList();\r\n }\r\n\r\n function toggleOpeningHoursList() {\r\n if ($(\"#openingHoursList\").css('display') !== 'none') {\r\n $(\"#openingHoursList\").slideUp();\r\n } else {\r\n $(\"#openingHoursList\").slideDown();\r\n }\r\n }\r\n\r\n function buildOpeningHoursHtml(data) {\r\n console.log(\"DATA:\", data);\r\n if (data && data.weekday_text && data.weekday_text.length) {\r\n\r\n for (var i = 0; i < data.weekday_text.length; i++) {\r\n\r\n var arr = []; //new storage\r\n var listItem = $(\"
  • \");\r\n\r\n var str = data.weekday_text[i].split(' '); //split by spaces\r\n arr.push(str.shift()); //add the number\r\n arr.push(str.join(' ')); //and the rest of the string\r\n\r\n var weekdayNameSpan = $(\"\",\r\n {\r\n \"text\": arr[0],\r\n \"class\": \"weekday-name-label\"\r\n });\r\n\r\n weekdayNameSpan.appendTo(listItem);\r\n\r\n try {\r\n //console.log(arr[1]);\r\n var openingHoursSpan = $(\"\",\r\n {\r\n \"text\": arr[1],\r\n \"class\": \"opening-hours-label\"\r\n });\r\n openingHoursSpan.appendTo(listItem);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n\r\n listItem.appendTo($(\".search__details__links__date-list\"));\r\n\r\n }\r\n\r\n setTimeout(function () {\r\n toggleOpeningHoursList();\r\n }, 500);\r\n\r\n } else {\r\n console.log(\"useFallBackText() function running from within buildOpeningHoursHtml(data)\");\r\n useFallBackText();\r\n }\r\n }\r\n\r\n\r\n\r\n function setOpeningHours(placeId) {\r\n\r\n let fallBackText = $(this).data(\"no-opening-hours-fallback-text\");\r\n\r\n if (fallBackText == undefined) {\r\n fallBackText = $('#openingHoursButton').data(\"no-opening-hours-fallback-text\");\r\n }\r\n\r\n console.log(\"PLACEID clicked:\", placeId);\r\n\r\n\r\n if (!$(\".search__details__links__date-list\").is(\":empty\")) {\r\n //If we have already populated the list with data, don't do it again, but simply toggle the list\r\n toggleOpeningHoursList();\r\n return;\r\n }\r\n\r\n\r\n if (placeId && placeId.length) {\r\n console.log(\"PlaceId exist, now load them from google\");\r\n\r\n if (shvenergy.search.gui.mapStateStore.placeDetails === null) {\r\n console.log(\"We do not have any placeDetails data available, so fetch it from Google\");\r\n const mapservice = shvenergy.maps.loadGoogleMapsService();\r\n\r\n mapservice.getDetails({\r\n placeId: placeId,\r\n fields: ['opening_hours']\r\n }, function (place, status) {\r\n if (status === google.maps.places.PlacesServiceStatus.OK) {\r\n console.log(\"PLACE: \", place);\r\n if (place.opening_hours) {\r\n const data = place.opening_hours;\r\n console.log(\"DATA2__:\", data);\r\n buildOpeningHoursHtml(data);\r\n }\r\n else {\r\n useFallBackText();\r\n }\r\n }\r\n });\r\n } else {\r\n console.log(\"We have placeDetails data available, so use it instead of a new request\");\r\n buildOpeningHoursHtml(shvenergy.search.gui.mapStateStore.placeDetails.opening_hours);\r\n }\r\n } else {\r\n var listItem = $(\"
  • \");\r\n var weekdayNameSpan = $(\"\", {\r\n \"text\": fallBackText,\r\n \"class\": \"weekday-name-label\"\r\n });\r\n weekdayNameSpan.appendTo(listItem);\r\n listItem.appendTo($(\".search__details__links__date-list\"));\r\n\r\n toggleOpeningHoursList();\r\n }\r\n\r\n $(this).removeData(\"placeId\");\r\n }\r\n\r\n function setGooglePhoneNumber(data) {\r\n //console.log(\"data: \", data);\r\n const linkToReplaceNumberIn = $(\"#GooglePhoneNumber\");\r\n\r\n if (linkToReplaceNumberIn && linkToReplaceNumberIn.length && data) {\r\n const span = linkToReplaceNumberIn.find(\"span\");\r\n linkToReplaceNumberIn.attr(\"href\", `tel:${data.replace(\" \", \"\")}`);\r\n span.text(data);\r\n }\r\n linkToReplaceNumberIn.slideDown();\r\n\r\n }\r\n\r\n function hideDetails() {\r\n $(\".map-dealerdetails\").removeClass(\"isActive\");\r\n shvenergy.maps.fitBounds(shvenergy.maps.getStoredBounds());\r\n shvenergy.maps.setZoom(shvenergy.maps.getStoredZoom());\r\n shvenergy.maps.setIsZoomedAndCenteredOnMarker(false);\r\n }\r\n\r\n function setBactoStartState(state) {\r\n bactostart.prop(\"disabled\", state);\r\n }\r\n\r\n\r\n $(function () {\r\n\r\n mobileViewSelectors.addEventListener('change', ev => {\r\n reorderPanels();\r\n });\r\n\r\n searchResultsObserver.observe(\r\n $('#dealerTarget')[0],\r\n { childList: true }\r\n );\r\n\r\n shvenergy.search.filters.updateFilterCount();\r\n toggleMobileListInfoText();\r\n });\r\n\r\n return {\r\n setCurrentSearch: setCurrentSearch,\r\n clearSuggestions: clearSuggestions,\r\n //setOpeningHours: setOpeningHours,\r\n setGooglePhoneNumber: setGooglePhoneNumber,\r\n hideDetails: hideDetails,\r\n mapStateStore: mapStateStore,\r\n mapClearSearchButtonStore: mapClearSearchButtonStore,\r\n setBactoStartState: setBactoStartState,\r\n historyReplaceState: historyReplaceState,\r\n historyPushState: historyPushState,\r\n };\r\n\r\n})(jQuery);","var shvenergy = shvenergy || {};\r\n\r\nshvenergy.maps = (function ($) {\r\n \"use strict\";\r\n var mapsContainer = $(\"#map\");\r\n var cdnvalue = $(\"#cdnInput\").data(\"value\");\r\n var initialLat = mapsContainer.data(\"lat\"),\r\n initialLong = mapsContainer.data(\"long\"),\r\n initialZoom = mapsContainer.data(\"zoom\"),\r\n countryRestrictions = mapsContainer.data(\"country\"),\r\n truncatelongdealernames = mapsContainer.data(\"truncatelongdealernames\");\r\n\r\n var countryRestrictionsArray = countryRestrictions.split('|');\r\n\r\n var numberofsearchresultsbeforeserversideclustering =\r\n mapsContainer.data(\"numberofsearchresultsbeforeserversideclustering\") || 1000;\r\n\r\n var getdirectionstext = mapsContainer.data(\"getdirectionstext\") || \"Get directions\";\r\n\r\n var numberofsearchresultbeforeshowingsearchresults =\r\n mapsContainer.data(\"numberofsearchresultbeforeshowingsearchresults\") || 50;\r\n\r\n var minimumnumbersofdealersshownonmapafterinitialsearch =\r\n mapsContainer.data(\"minimumnumbersofdealersshownonmapafterinitialsearch\") || 50;\r\n\r\n var map;\r\n var mapservice;\r\n var defaultPosition = { lat: initialLat, lng: initialLong };\r\n var initialPosition = { lat: initialLat, lng: initialLong };\r\n var markers = [];\r\n var markerClusterer;\r\n var imagePath = document.documentElement.lang.toLowerCase() !== \"pt\" ? \"\" + cdnvalue + \"/dist/images/maps/m\" : \"\" + cdnvalue + \"/dist/images/maps/supergasbras/m\";\r\n\r\n var useClusterSizeAsText = document.documentElement.lang.toLowerCase() !== \"pt\" ? true : false;\r\n\r\n var intro = $(\".map-sidebar__intro\");\r\n var mapSidebar = $(\"#map-sidebar\");\r\n var searchZoomLevel = 12;\r\n\r\n var errorMessage = $(\".search__details--error__headline\");\r\n\r\n var mcOptions = {\r\n gridSize: 100,\r\n maxZoom: 22,\r\n zoomOnClick: true,\r\n averageCenter: true,\r\n imagePath: imagePath,\r\n styles: {\r\n textColor: \"#fff\"\r\n }\r\n };\r\n\r\n var isZoomedAndCenteredOnMarker = false;\r\n var resultList = $(\".search__list.search__pane\");\r\n var resultListWarning = $(\".search__list-warning\");\r\n var dealerTarget = $(\"#dealerTarget\");\r\n var dealerTemplate = $(\"#dealerTemplate\");\r\n var distanceUnit = dealerTarget.data(\"distanceunit\");\r\n\r\n var currentBounds = null;\r\n var currentZoom = null;\r\n\r\n var infoBox = null;\r\n var infoBoxDefaultOptions = {\r\n disableAutoPan: true,\r\n alignBottom: true,\r\n maxWidth: 0,\r\n zIndex: null,\r\n boxStyle: {\r\n width: \"280px\"\r\n },\r\n closeBoxMargin: \"10px 2px 2px 2px\",\r\n closeBoxURL: \"\",\r\n isHidden: false,\r\n pane: \"floatPane\",\r\n enableEventPropagation: false\r\n };\r\n\r\n var currentLocationMarker = '' + cdnvalue + '/dist/images/maps/my-location.svg';\r\n\r\n var mapStyles = shvenergy.maputils.mapStyles;\r\n\r\n var keepSearchingIfNoResults = false;\r\n\r\n // Keep track of the active marker for handling simulated click\r\n var activeMarker = null;\r\n\r\n //https://mapstyle.withgoogle.com/\r\n\r\n function usePreferredPartenerLabel() {\r\n return $('input[name=toggle]:checked').data(\"promotepreferredpartner\").toUpperCase() === \"TRUE\" ? true : false;\r\n }\r\n\r\n var locationMarker;\r\n var geoCoder = new google.maps.Geocoder();\r\n\r\n function extractLabelFromFilter() {\r\n const type = shvenergy.search.dealer.getType();\r\n const name = `#${type}-dealerPromotedPreferredPartnerFilter`;\r\n const el = $(name);\r\n let legend = \"\";\r\n\r\n if (el.length > 0) {\r\n const label = el.next(\"label\");\r\n legend = label.find(\".filter__title\").text();\r\n }\r\n\r\n return legend;\r\n }\r\n\r\n function extractIconAndLabelFromFilter() {\r\n const type = shvenergy.search.dealer.getType();\r\n const name = `#${type}-dealerPromotedPreferredPartnerFilter`;\r\n const el = $(name);\r\n let icon = \"\";\r\n let legend = \"\";\r\n\r\n if (el.length > 0) {\r\n const label = el.next(\"label\");\r\n icon = label.find(\".small-icon__wrapper\").html();\r\n legend = label.find(\".filter__title\").text();\r\n }\r\n\r\n return `${icon}${legend}`;\r\n }\r\n\r\n function getMobileAddressSettings() {\r\n const toggles = $('[name=toggle]');\r\n const selector = toggles.length === 1\r\n ? '[name=toggle]'\r\n : '[name=toggle]:checked';\r\n\r\n const showAddressInDealerPreviewBox = Boolean($(selector).data('mobileshowaddressindealerpreviewbox')) || false;\r\n const showAddressInListView = Boolean($(selector).data('mobileshowaddressinlistview')) || false;\r\n\r\n return {\r\n showAddressInDealerPreviewBox,\r\n showAddressInListView\r\n };\r\n };\r\n\r\n $.addTemplateFormatter({\r\n UpperCaseFormatter: function (value, template) {\r\n return value.toUpperCase();\r\n },\r\n LowerCaseFormatter: function (value, template) {\r\n return value.toLowerCase();\r\n },\r\n SameCaseFormatter: function (value, template) {\r\n if (template == \"upper\") {\r\n return value.toUpperCase();\r\n } else {\r\n return value.toLowerCase();\r\n }\r\n },\r\n DealerFirstPhoneNumberFormatter: function (value, template) {\r\n if (value.length > 0)\r\n return value[0];\r\n else return \"\";\r\n },\r\n DealerAddressFormatter: function (value, template) {\r\n if (value) {\r\n return value + \"
    \";\r\n }\r\n else return \"\";\r\n },\r\n DealerShortAddressFormatter: function (value) {\r\n const { showAddressInListView } = getMobileAddressSettings();\r\n\r\n if (showAddressInListView) {\r\n return value;\r\n }\r\n return '';\r\n },\r\n DealerDistanceFormatter: function (value, template) {\r\n if (value) {\r\n return value + \" \" + distanceUnit;\r\n }\r\n else return \"\";\r\n },\r\n DealerIdFormatter: function (value, template) {\r\n return \"dealer\" + value;\r\n },\r\n //DealerIconFormatter: function (value, template) {\r\n // return \"/dist/images/maps/\" + iconResolver(value);\r\n //},\r\n DealerIconFormatter2: function (value, template) {\r\n return getDealerIcon(value);\r\n },\r\n DealerPromotedPreferredPartnerFormatter: function (value, template) {\r\n\r\n if (usePreferredPartenerLabel() && value) {\r\n return extractIconAndLabelFromFilter();\r\n }\r\n return \"\";\r\n }\r\n });\r\n\r\n var selectFirstOnEnter = function (input) {\r\n\r\n // store the original event binding function\r\n var eventListener = input.addEventListener ? input.addEventListener : input.attachEvent;\r\n\r\n // Simulate a 'down arrow' keypress on hitting 'return' when no pac suggestion is selected, and then trigger the original listener.\r\n function addEventListenerWrapper(type, listener) {\r\n if (type == \"keydown\") {\r\n var origListener = listener;\r\n listener = function (event) {\r\n var suggestionSelected = $(\".pac-item-selected\").length > 0;\r\n if (event.which == 13 && !suggestionSelected) {\r\n var simulatedDownarrow = $.Event(\"keydown\", { keyCode: 40, which: 40 });\r\n origListener.apply(input, [simulatedDownarrow]);\r\n }\r\n origListener.apply(input, [event]);\r\n };\r\n }\r\n // add the modified listener\r\n eventListener.apply(input, [type, listener]);\r\n }\r\n\r\n if (input.addEventListener) {\r\n input.addEventListener = addEventListenerWrapper;\r\n } else if (input.attachEvent) {\r\n input.attachEvent = addEventListenerWrapper;\r\n }\r\n };\r\n\r\n function setDefaultFilterFromUrlParam() {\r\n var dealerTypeParams = shvenergy.utils.getUrlParameter('dealerType'); // \"edit\"\r\n\r\n if (dealerTypeParams && dealerTypeParams.length) {\r\n switch (dealerTypeParams) {\r\n case \"Cylinder\":\r\n shvenergy.search.dealer.setType(\"Cylinder\");\r\n $(\".toggle[value='Cylinder']\").prop(\"checked\", true);\r\n if ($(\".toggle[value='Cylinder']\").data('hideavailablefiltersbutton') == true) {\r\n $('.search__back--filter').hide();\r\n } else {\r\n const checkboxes = $(`input[type=\"checkbox\"][data-dealertypename=\"Cylinder\"]`)\r\n const disabled = checkboxes.length === 0;\r\n $('.search__back--filter').attr('disabled', disabled);\r\n }\r\n break;\r\n case \"Autogas\":\r\n shvenergy.search.dealer.setType(\"Autogas\");\r\n $(\".toggle[value='Autogas']\").prop(\"checked\", true);\r\n if ($(\".toggle[value='Autogas']\").data('hideavailablefiltersbutton') == true) {\r\n $('.search__back--filter').hide();\r\n } else {\r\n const checkboxes = $(`input[type=\"checkbox\"][data-dealertypename=\"Autogas\"]`)\r\n const disabled = checkboxes.length === 0;\r\n $('.search__back--filter').attr('disabled', disabled);\r\n }\r\n break;\r\n }\r\n } else {\r\n if ($(\".toggle\").data('hideavailablefiltersbutton') == true) {\r\n $('.search__back--filter').hide();\r\n } else {\r\n const shouldDisable = $('input[type=\"checkbox\"][data-dealertypename]').length === 0\r\n $('.search__back--filter').attr('disabled', disabled);\r\n }\r\n }\r\n }\r\n\r\n window.onpopstate = function (event) {\r\n //console.log(`location: ${document.location}, state: ${JSON.stringify(event.state)}`);\r\n\r\n var searchParams = shvenergy.utils.getUrlParameter('search'); // \"edit\"\r\n var dealerId = shvenergy.utils.getUrlParameter('dealerId');\r\n var viewType = shvenergy.utils.getUrlParameter(\"view\");\r\n\r\n if (dealerId) {\r\n goToDealerFromURLId(dealerId);\r\n } else {\r\n shvenergy.maps.getLocationFromAddress(searchParams);\r\n shvenergy.search.gui.setCurrentSearch(searchParams);\r\n setDefaultFilterFromUrlParam();\r\n\r\n // update checkbox values base on url\r\n let urlSearchParameters = new URLSearchParams(window.location.search).getAll(\"filter\");\r\n if (urlSearchParameters) {\r\n var type = shvenergy.search.dealer.getType();\r\n let currentCheckedInputs = $(\"input[data-dealertypename='\" + type + \"']\");\r\n currentCheckedInputs.prop(\"checked\", false);\r\n urlSearchParameters.forEach(item => $(\"input[data-queryparametername='\" + item + \"'][data-dealertypename='\" + type + \"']\").prop(\"checked\", true))\r\n shvenergy.search.filters.updateFilterCount();\r\n }\r\n\r\n if (searchParams === \"\") {\r\n setTimeout(function () {\r\n shvenergy.maps.intro.show();\r\n $(\"#dealerTarget\").empty();\r\n $(\"#map-searchinput\").val(\"\");\r\n shvenergy.search.gui.setBactoStartState(true);\r\n shvenergy.maps.setZoom(shvenergy.maps.initialZoom);\r\n shvenergy.maps.setCenter(shvenergy.maps.initialPosition);\r\n // shvenergy.search.filters.resetFilters();\r\n shvenergy.search.gui.mapClearSearchButtonStore.clearSearchButtonVisible = false;\r\n shvenergy.maps.hideMarker();\r\n $(\".map-dealerdetails\").removeClass(\"isActive\");\r\n removeMobileInfoBoxes()\r\n\r\n if (shvenergy.cookies.getCookie(\"isTouch\") === \"true\") {\r\n shvenergy.search.gui.mapStateStore.mapVisible = true;\r\n }\r\n }, 50);\r\n }\r\n\r\n switch (viewType) {\r\n case \"map\":\r\n shvenergy.search.gui.mapStateStore.mapVisible = true;\r\n break;\r\n\r\n case \"list\":\r\n shvenergy.search.gui.mapStateStore.mapVisible = false;\r\n break;\r\n\r\n default:\r\n shvenergy.search.gui.mapStateStore.mapVisible = true;\r\n break;\r\n }\r\n }\r\n\r\n if ($(\".map-dealerdetails\").hasClass(\"isActive\")) {\r\n shvenergy.search.gui.hideDetails();\r\n }\r\n }\r\n\r\n function goToDealerFromURLId(dealerId, maxTries = 20) {\r\n if (map) {\r\n var coordinates = {\r\n lat: shvenergy.utils.getUrlParameter('lat'),\r\n lng: shvenergy.utils.getUrlParameter('lng')\r\n }\r\n\r\n if (dealerId) {\r\n var viewType = shvenergy.utils.getUrlParameter('view');\r\n\r\n var myLatlng = new google.maps.LatLng(coordinates.lat, coordinates.lng);\r\n setCenter(myLatlng);\r\n map.setZoom(15);\r\n // shvenergy.search.gui.mapStateStore.mapVisible = true;\r\n\r\n if (viewType === 'details') {\r\n if (shvenergy.cookies.getCookie('isTouch') === 'true') {\r\n // Open first details-popup on mobile\r\n activeMarker = dealerId;\r\n } else {\r\n // Show details-view\r\n loadDealer(dealerId);\r\n }\r\n }\r\n\r\n // mapSidebar.addClass(\"is-invisible\");\r\n }\r\n } else if (maxTries > 0) {\r\n setTimeout(function () {\r\n goToDealerFromURLId(dealerId, maxTries - 1);\r\n }, 50);\r\n }\r\n }\r\n\r\n function clickMarkerById(id) {\r\n setTimeout(() => {\r\n var marker = getMarkerById(id);\r\n google.maps.event.trigger(marker, 'click');\r\n activeMarker = null;\r\n }, 200);\r\n }\r\n\r\n function initializeAutocomplete(input = document.getElementById('map-searchinput')) {\r\n var countryRestrictionsOptions = {};\r\n if (countryRestrictionsArray.includes(\"gb\") && countryRestrictionsArray.includes(\"ie\")) {\r\n //NOTE! this is a special scenario for Ireland\r\n //Ireland only want search results from Ireland and Northern Ireland, NOT the rest of the UK\r\n var irelandBounds = new google.maps.LatLngBounds(\r\n new google.maps.LatLng(50.999929, -10.854492),\r\n new google.maps.LatLng(55.354135, -5.339355));\r\n\r\n\r\n countryRestrictionsOptions = {\r\n bounds: irelandBounds,\r\n strictBounds: true\r\n };\r\n }\r\n\r\n var autocomplete = new google.maps.places.Autocomplete(input, countryRestrictionsOptions);\r\n\r\n selectFirstOnEnter(input);\r\n\r\n autocomplete.setTypes(['(regions)']);\r\n\r\n autocomplete.setFields(['address_components', 'geometry', 'icon', 'name']);\r\n\r\n autocomplete.setComponentRestrictions({ 'country': countryRestrictionsArray });\r\n\r\n autocomplete.addListener('place_changed', function () {\r\n $(\"body\").removeClass(\"map-search\");\r\n locationMarker.setVisible(false);\r\n var place = autocomplete.getPlace();\r\n\r\n console.log(\"place: \", place);\r\n\r\n setKeepSearchingIfNoResults(true);\r\n\r\n if (place === \"undefined\" || !place.geometry) {\r\n // User entered the name of a Place that was not suggested and\r\n // pressed the Enter key, or the Place Details request failed.\r\n\r\n //If we do not get a result here try using the geolocation method instead\r\n getLocationFromAddress(place.name);\r\n\r\n } else {\r\n\r\n\r\n // If the place has a geometry, then present it on a map.\r\n if (place.geometry.viewport) {\r\n map.fitBounds(place.geometry.viewport);\r\n map.setZoom(searchZoomLevel);\r\n } else {\r\n map.setCenter(place.geometry.location);\r\n map.setZoom(searchZoomLevel);\r\n }\r\n\r\n //locationMarker.setPosition(place.geometry.location);\r\n locationMarker.setVisible(true);\r\n //useGeoLocation();\r\n shvenergy.search.gui.mapStateStore.mapVisible = true;\r\n shvenergy.tracking.trackEvent(input.dataset.category, input.dataset.action, place.name);\r\n shvenergy.search.gui.historyPushState(input.value);\r\n shvenergy.search.gui.mapClearSearchButtonStore.clearSearchButtonVisible = true;\r\n\r\n shvenergy.tracking.trackRawEventData({\r\n 'event': 'clickDFSearch',\r\n 'searchType': 'Manual search',\r\n 'query': place.name\r\n });\r\n\r\n }\r\n });\r\n }\r\n\r\n function init() {\r\n var searchParams = shvenergy.utils.getUrlParameter('search');\r\n var dealerId = shvenergy.utils.getUrlParameter('dealerId');\r\n var viewType = shvenergy.utils.getUrlParameter('view')\r\n\r\n $(\"body\").addClass(\"map map-search\");\r\n\r\n if (searchParams && viewType && viewType !== \"details\") {\r\n shvenergy.search.gui.mapStateStore.mapVisible = true;\r\n\r\n if (viewType && viewType === \"list\") {\r\n //Toggle list. Map is default\r\n shvenergy.search.gui.mapStateStore.mapVisible = false;\r\n }\r\n }\r\n\r\n fixMobileMenu();\r\n\r\n goToDealerFromURLId(dealerId);\r\n setDefaultFilterFromUrlParam();\r\n\r\n document.body.addEventListener(\"click\", function (e) {\r\n\r\n if (shvenergy.cookies.getCookie(\"isTouch\") === \"true\") {\r\n\r\n if (e.target.nodeName === \"IMG\" && e.target.closest(\"div\").hasAttribute(\"title\")) {\r\n return;\r\n }\r\n\r\n if (!e.target.closest(\".info-box\") !== null) {\r\n //console.log(\"Du har klikket uden for boksen\");\r\n removeMobileInfoBoxes();\r\n }\r\n }\r\n\r\n });\r\n\r\n map = new google.maps.Map(document.getElementById(\"map\"), {\r\n center: defaultPosition,\r\n zoom: initialZoom,\r\n minZoom: 5,\r\n zoomControl: true,\r\n mapTypeControl: false,\r\n allowTaint: true,\r\n useCORS: true,\r\n scaleControl: true,\r\n streetViewControl: true,\r\n rotateControl: true,\r\n fullscreenControl: true,\r\n fullscreenControlOptions: {\r\n position: google.maps.ControlPosition.RIGHT_BOTTOM\r\n },\r\n zoomControlOptions: {\r\n position: google.maps.ControlPosition.RIGHT_BOTTOM\r\n },\r\n streetViewControlOptions: {\r\n position: google.maps.ControlPosition.RIGHT_BOTTOM\r\n },\r\n\r\n styles: mapStyles\r\n });\r\n\r\n locationMarker = new google.maps.Marker({\r\n map: map,\r\n anchorPoint: new google.maps.Point(0, -29),\r\n icon: currentLocationMarker\r\n });\r\n\r\n mapservice = new google.maps.places.PlacesService(map);\r\n\r\n initializeAutocomplete();\r\n\r\n $('#map-searchbutton').on(\"click\", function (e) {\r\n\r\n $(\"body\").removeClass(\"map-search\");\r\n const searchText = input.value;\r\n\r\n if (searchText.length > 0) {\r\n shvenergy.search.gui.historyPushState(searchText);\r\n\r\n shvenergy.tracking.trackEvent(input.dataset.category, input.dataset.action, searchText);\r\n\r\n getLocationFromAddress(searchText);\r\n return;\r\n }\r\n\r\n });\r\n\r\n markerClusterer = new MarkerClusterer(map, markers, mcOptions);\r\n\r\n map.addListener('bounds_changed', function () {\r\n var bounds = map.getBounds();\r\n if (!bounds) {\r\n return;\r\n }\r\n //deleteMarkers();\r\n searchByLocation(\"bounds_changed\");\r\n });\r\n\r\n shvenergy.search.filters.updateFiltersByType();\r\n shvenergy.search.filters.updateFilterCount();\r\n\r\n useGeoLocation();\r\n storeZoomAndBounds();\r\n\r\n if (!dealerId && searchParams && searchParams.length) {\r\n $(\"#map-searchinput\").val(searchParams);\r\n shvenergy.search.gui.mapClearSearchButtonStore.clearSearchButtonVisible = true;\r\n setTimeout(function () {\r\n\r\n getLocationFromAddress(searchParams);\r\n\r\n }, 1200);\r\n }\r\n\r\n }\r\n\r\n function getLocationFromAddress(address) {\r\n\r\n const request = {\r\n address: address\r\n };\r\n\r\n geoCoder.geocode(request, function (results, status) {\r\n if (status === google.maps.GeocoderStatus.OK) {\r\n if (results[0]) {\r\n\r\n //run through address components \r\n if (results[0].address_components) {\r\n\r\n var countryIsOk = false;\r\n\r\n results[0].address_components.forEach(function (element) {\r\n\r\n if (element.hasOwnProperty('short_name')) {\r\n\r\n if (countryRestrictionsArray.includes(element.short_name.toLowerCase())) {\r\n countryIsOk = true;\r\n }\r\n }\r\n });\r\n\r\n if (countryIsOk) {\r\n setKeepSearchingIfNoResults(true);\r\n var myLatlng = new google.maps.LatLng(results[0].geometry.location.lat(),\r\n results[0].geometry.location.lng());\r\n //locationMarker.setPosition(myLatlng);\r\n //locationMarker.setVisible(true);\r\n setCenter(myLatlng);\r\n map.setZoom(searchZoomLevel);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function searchByLocation(src) {\r\n //console.log(src);\r\n const bounds = map.getBounds();\r\n const zoomLevel = map.getZoom();\r\n shvenergy.search.dealer.searchByLocation(bounds, zoomLevel);\r\n }\r\n\r\n //We need a simplified version of the mobile/tablet menu\r\n function fixMobileMenu() {\r\n $(\"html\").css(\"overflow\", \"hidden\");\r\n var mobileHeaderSticky = $(\".mobile-header__sticky\");\r\n mobileHeaderSticky.find(\".auxiliary-links\").remove();\r\n var logo = $(\".mobile-header__logo\");\r\n var logoClone = $(\".mobile-header__logo\").clone(true);\r\n logoClone.prependTo(mobileHeaderSticky);\r\n logo.remove();\r\n }\r\n\r\n function handleLocationError(browserHasGeolocation) {\r\n console.log(browserHasGeolocation ?\r\n 'Error: The Geolocation service failed.' :\r\n 'Error: Your browser doesn\\'t support geolocation.');\r\n }\r\n\r\n function validCountry(result) {\r\n var components = result.address_components;\r\n for (var i = 0; i < components.length; i++) {\r\n //console.log(components[i]);\r\n if (countryRestrictionsArray.includes(components[i].short_name.toLowerCase())) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function useGeoLocation(zoomClose) {\r\n\r\n locationMarker.setVisible(false);\r\n\r\n // Try HTML5 geolocation.\r\n if (navigator.geolocation) {\r\n\r\n console.log(\"The browser supports geolocation\");\r\n\r\n navigator.geolocation.getCurrentPosition(\r\n successCallback,\r\n errorCallbackHighAccuracy, {\r\n maximumAge: 600000,\r\n timeout: 5000,\r\n enableHighAccuracy: true\r\n }\r\n );\r\n\r\n function errorCallbackHighAccuracy(error) {\r\n if (error.code == error.TIMEOUT) {\r\n // Attempt to get GPS loc timed out after 5 seconds, \r\n // try low accuracy location\r\n console.log(\"attempting to get low accuracy location\");\r\n navigator.geolocation.getCurrentPosition(\r\n successCallback,\r\n errorCallbackLowAccuracy,\r\n { maximumAge: 600000, timeout: 10000, enableHighAccuracy: false });\r\n return;\r\n }\r\n\r\n var msg = \"Can't get your location (high accuracy attempt). Error = \";\r\n if (error.code == 1)\r\n msg += \"PERMISSION_DENIED\";\r\n else if (error.code == 2)\r\n msg += \"POSITION_UNAVAILABLE\";\r\n msg += \", msg = \" + error.message;\r\n\r\n console.log(msg);\r\n $(\"#useCurrentLocationButton\").hide();\r\n }\r\n\r\n function errorCallbackLowAccuracy(error) {\r\n var msg = \"Can't get your location (low accuracy attempt). Error = \";\r\n if (error.code == 1)\r\n msg += \"PERMISSION_DENIED\";\r\n else if (error.code == 2)\r\n msg += \"POSITION_UNAVAILABLE\";\r\n else if (error.code == 3)\r\n msg += \"TIMEOUT\";\r\n msg += \", msg = \" + error.message;\r\n\r\n console.log(msg);\r\n $(\"#useCurrentLocationButton\").hide();\r\n }\r\n\r\n function successCallback(position) {\r\n\r\n console.log(\"Current position is\", position);\r\n\r\n var latLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);\r\n\r\n geoCoder.geocode({ 'latLng': latLng }, function (results, status) {\r\n if (status === google.maps.GeocoderStatus.OK) {\r\n\r\n console.log(\"GeocoderStatus is OK\");\r\n\r\n if (results[0]) {\r\n\r\n console.log(\"We have a result\", results[0]);\r\n var formattedAddress = results[0].formatted_address;\r\n console.log(\"formattedAddress:\", formattedAddress);\r\n\r\n if (!validCountry(results[0])) {\r\n //for now dont so anything if not within selected country\r\n console.log(\"You don't seem to be in a country with a countrycode of:\", countryRestrictions);\r\n $(\"#useCurrentLocationButton\").hide();\r\n }\r\n else {\r\n console.log(\"You do in fact seem to be in a country with a countrycode of:\", countryRestrictions);\r\n /*if (formattedAddress) {\r\n $(\"#map-searchinput\").val(formattedAddress);\r\n shvenergy.search.gui.mapClearSearchButtonStore.clearSearchButtonVisible = formattedAddress.length > 0;\r\n }*/\r\n locationMarker.setPosition(latLng);\r\n locationMarker.setVisible(true);\r\n //map.setPosition(latlng);\r\n map.setCenter(latLng);\r\n //searchByLocation(\"bounds_changed\");\r\n\r\n if (zoomClose) {\r\n setKeepSearchingIfNoResults(true);\r\n map.setZoom(searchZoomLevel);\r\n }\r\n\r\n }\r\n }\r\n }\r\n });\r\n\r\n }\r\n\r\n } else {\r\n // Browser doesn't support Geolocation\r\n $(\"#useCurrentLocationButton\").hide();\r\n handleLocationError(false);\r\n }\r\n }\r\n\r\n let myMarkers = [];\r\n\r\n function checkDealerIcon(pinId) {\r\n for (let i = 0; i < myMarkers.length; i++) {\r\n if (myMarkers[i].id === pinId) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function buildDealerIcons(pins, markDone) {\r\n if (!pins || pins.length === 0) {\r\n markDone('No pins to generate.');\r\n return;\r\n }\r\n\r\n const state = {\r\n pinsToHandle: pins.length\r\n };\r\n\r\n pins.forEach(function (pin) {\r\n if (!checkDealerIcon(pin.id)) {\r\n buildIcon(pin, stepDone);\r\n } else {\r\n stepDone();\r\n }\r\n });\r\n\r\n function stepDone() {\r\n state.pinsToHandle -= 1;\r\n if (state.pinsToHandle === 0) {\r\n markDone('Pins handled.');\r\n\r\n // Wait for pins to be ready before we click one\r\n var dealerId = shvenergy.utils.getUrlParameter('dealerId');\r\n if (dealerId) {\r\n clickMarkerById(activeMarker)\r\n }\r\n }\r\n }\r\n }\r\n\r\n function buildIcon(pin, stepDone) {\r\n if (pin.urls.length === 1) {\r\n myMarkers.push({\r\n id: pin.id,\r\n url: pin.urls[0]\r\n });\r\n stepDone();\r\n } else {\r\n var urlArr = [];\r\n pin.urls.forEach(function (pinurl) {\r\n if (pinurl.toLowerCase().includes(cdnvalue.toLowerCase())) {\r\n urlArr.push(pinurl.toLowerCase().replace(cdnvalue.toLowerCase(), \"\"));\r\n }\r\n else {\r\n urlArr.push(pinurl);\r\n }\r\n });\r\n\r\n mergeImages(urlArr).then(function (b64) {\r\n myMarkers.push({\r\n id: pin.id,\r\n url: b64\r\n });\r\n stepDone();\r\n });\r\n }\r\n }\r\n\r\n function getDealerIcon(pinId) {\r\n return myMarkers.find(x => x.id === pinId).url;\r\n }\r\n\r\n function removeMobileInfoBoxes() {\r\n var elements = document.getElementsByClassName('info-box');\r\n while (elements.length > 0) {\r\n elements[0].remove();\r\n }\r\n }\r\n\r\n function loadDealer(id) {\r\n shvenergy.search.dealer.getDetails(id);\r\n storeZoomAndBounds();\r\n }\r\n\r\n function createDealerMarkers(data) {\r\n // https://developers.google.com/maps/documentation/javascript/markers\r\n // https://developers.google.com/maps/documentation/javascript/symbols\r\n\r\n var iconsPromise = new Promise(function (resolve, reject) {\r\n buildDealerIcons(data.iconPins, resolve);\r\n });\r\n\r\n iconsPromise.then(function (value) {\r\n console.log(value);// expected output: \"icons done\"\r\n //console.log(myMarkers);\r\n deleteMarkers();\r\n\r\n $(\"#useCurrentLocationButton\").show();\r\n var count = data.Count;\r\n //var distanceUnit = data.distanceUnit;\r\n var dealers = data.Dealers;\r\n var showDirections = data.ShowGetDirections || false;\r\n markerClusterer.clearMarkers();\r\n\r\n dealerTarget.empty();\r\n\r\n if (count < minimumnumbersofdealersshownonmapafterinitialsearch && getKeepSearchingIfNoResults()) {\r\n console.log(`Not enough results. Must show at least ${minimumnumbersofdealersshownonmapafterinitialsearch}, so zooming out 1 step.`);\r\n shvenergy.maps.setZoom(shvenergy.maps.getZoom() - 1);\r\n return;\r\n\r\n } else {\r\n setKeepSearchingIfNoResults(false);\r\n }\r\n\r\n if (count <= 0) {\r\n var errorString = window.noResultsErrorMessages.NoResultNoDealersInArea.replace(/(\\n)+/g, '
    ');\r\n errorMessage.html(errorString);\r\n $(\".search__details--error\").show();\r\n\r\n if (getKeepSearchingIfNoResults()) {\r\n var myZoom = shvenergy.maps.getZoom();\r\n shvenergy.maps.setZoom(myZoom - 2);\r\n }\r\n return;\r\n }\r\n\r\n setKeepSearchingIfNoResults(false);\r\n\r\n $(\".search__details--error\").hide();\r\n\r\n if (count <= numberofsearchresultsbeforeserversideclustering) {\r\n\r\n for (let dealerCounter = 0; dealerCounter < dealers.length; dealerCounter++) {\r\n\r\n var marker = new google.maps.Marker({\r\n position: dealers[dealerCounter].geometry.location,\r\n //icon: \"/dist/images/maps/\" + iconResolver(dealers[dealerCounter].icon),\r\n\r\n icon: getDealerIcon(dealers[dealerCounter].iconPinId),\r\n\r\n id: dealers[dealerCounter].id,\r\n description: dealers[dealerCounter].description,\r\n dealerPhones: dealers[dealerCounter].dealerPhones,\r\n isPreferredPartner: dealers[dealerCounter].isPreferredPartner,\r\n distance: dealers[dealerCounter].distance,\r\n addresslines: dealers[dealerCounter].addresslines,\r\n shortAddress: dealers[dealerCounter].shortAddress,\r\n });\r\n\r\n marker.addListener(\"click\", function () {\r\n shvenergy.tracking.trackRawEventData({\r\n 'event': 'clickDFRetailer',\r\n 'retailerName': this.description\r\n });\r\n\r\n removeMobileInfoBoxes();\r\n\r\n const isMobile = shvenergy.cookies.getCookie('isTouch') === 'true' && window.matchMedia('(max-width: 640px').matches;\r\n\r\n if (!isMobile) {\r\n //console.log(\"Du er med al sandsynlighed på et desktop device\");\r\n if (!isZoomedAndCenteredOnMarker) {\r\n shvenergy.maps.loadDealer(this.id);\r\n //shvenergy.maps.zoomAndCenterOnMarker(this);\r\n }\r\n\r\n return;\r\n }\r\n\r\n map.setCenter(this.position);\r\n\r\n var mobileInfoBox = document.createElement(\"div\");\r\n\r\n mobileInfoBox.style.position = 'fixed';\r\n mobileInfoBox.style.bottom = '0';\r\n mobileInfoBox.style.left = '0';\r\n mobileInfoBox.style.right = '0';\r\n mobileInfoBox.style.backgroundColor = '#fff';\r\n mobileInfoBox.style.zIndex = '99999';\r\n\r\n mobileInfoBox.classList.add(\"info-box\");\r\n\r\n let dealerPhones = \"\";\r\n\r\n if (this.dealerPhones && this.dealerPhones.length) {\r\n dealerPhones = `\r\n \r\n ${this.dealerPhones[0]}\r\n `;\r\n }\r\n\r\n let isPref = \"\";\r\n if (this.isPreferredPartner && usePreferredPartenerLabel()) {\r\n\r\n var l = extractLabelFromFilter();\r\n\r\n isPref = `${l}`;\r\n }\r\n\r\n let dist = \"\";\r\n\r\n if (this.distance) {\r\n dist = `${this.distance} ${distanceUnit}`;\r\n }\r\n\r\n //let header = \"\";\r\n //if (truncatelongdealernames.toLowerCase() === \"true\") {\r\n // header = `

    ${this.description}

    `;\r\n //} else {\r\n // header = `

    ${this.description}

    `;\r\n //}\r\n\r\n let header = `

    ${this.description}

    `;\r\n\r\n var markerLocation = getDefaultMarkerLocation();\r\n\r\n var directions = '';\r\n if (markerLocation !== null && (showDirections === \"true\" || showDirections === true)) {\r\n directions = `\r\n \r\n ${getdirectionstext}\r\n `;\r\n }\r\n\r\n\r\n let dealerPhonesAndDirections = '';\r\n if (dealerPhones !== '' || directions !== '') {\r\n dealerPhonesAndDirections =\r\n `
    \r\n ${dealerPhones}\r\n ${directions}\r\n
    `;\r\n }\r\n\r\n let shortAddressDiv = '';\r\n if (this.shortAddress && getMobileAddressSettings().showAddressInDealerPreviewBox) {\r\n shortAddressDiv = `
    ${this.shortAddress}
    `\r\n }\r\n\r\n mobileInfoBox.innerHTML = `\r\n
    \r\n \r\n
    \r\n ${dealerPhonesAndDirections}\r\n `;\r\n\r\n $(mobileInfoBox).on('click', 'button', (e) => {\r\n loadDealer(this.id);\r\n e.preventDefault();\r\n })\r\n\r\n document.querySelector(\"body\").appendChild(mobileInfoBox);\r\n\r\n // Create shareable URL for a specific dealer and add to browser history\r\n var dealerLocation = getMarkerById(this.id);\r\n var searchUrl = new URL(window.location);\r\n var oldDealerId = parseInt(searchUrl.searchParams.get(\"dealerId\"));\r\n\r\n if (oldDealerId !== this.id) {\r\n searchUrl.searchParams.set(\"dealerId\", this.id);\r\n searchUrl.searchParams.set(\"lat\", dealerLocation.position.lat());\r\n searchUrl.searchParams.set(\"lng\", dealerLocation.position.lng());\r\n window.history.pushState({}, '', searchUrl);\r\n }\r\n });\r\n\r\n marker.addListener(\"mouseover\", function () {\r\n if (infoBox) {\r\n infoBox.close();\r\n }\r\n\r\n setMarker(this.id, true);\r\n\r\n var boxText = document.createElement(\"div\");\r\n //\t\t\t\t\tconsole.log(this);\r\n var dealerPhones = (this.dealerPhones && this.dealerPhones.length) ? this.dealerPhones.join(\"
    \") : \"\";\r\n\r\n let isPref = \"\";\r\n if (this.isPreferredPartner && usePreferredPartenerLabel()) {\r\n\r\n var l = extractIconAndLabelFromFilter();\r\n\r\n isPref = `${l}`;\r\n }\r\n\r\n let dist = \"\";\r\n\r\n if (this.distance) {\r\n dist = `${this.distance} ${distanceUnit}`;\r\n }\r\n\r\n let header = \"\";\r\n\r\n if (truncatelongdealernames.toLowerCase() === \"true\") {\r\n header = `

    ${this.description}

    `;\r\n } else {\r\n header = `

    ${this.description}

    `;\r\n }\r\n\r\n boxText.innerHTML = `
    \r\n\t\t\t\t\t\t

    ${isPref}${dist}

    \r\n ${header}\r\n\t\t\t\t\t\t

    ${dealerPhones}

    \r\n\t\t\t\t\t
    `;\r\n\r\n var infoBoxOptions = {\r\n content: boxText,\r\n pixelOffset: new google.maps.Size(-140, -80),\r\n infoBoxClearance: new google.maps.Size(1, 1)\r\n };\r\n\r\n var mergedOptions = Object.assign({}, infoBoxDefaultOptions, infoBoxOptions);\r\n\r\n infoBox = new InfoBox(mergedOptions);\r\n infoBox.open(map, this);\r\n\r\n });\r\n\r\n marker.addListener(\"mouseout\", function () {\r\n if (infoBox) {\r\n infoBox.close();\r\n }\r\n\r\n setMarker(this.id, false);\r\n });\r\n\r\n markers.push({\r\n marker: marker,\r\n id: dealers[dealerCounter].id\r\n });\r\n\r\n markerClusterer.addMarker(markers[dealerCounter].marker);\r\n }\r\n if (dealers.length <= 0) {\r\n console.log(\"Ever here????\");\r\n return;\r\n }\r\n if (dealers.length <= numberofsearchresultbeforeshowingsearchresults) {\r\n createDealerList(dealers);\r\n resultList.addClass(\"search__pane--active\");\r\n shvenergy.search.gui.setBactoStartState(false);\r\n resultListWarning.hide();\r\n } else {\r\n resultList.removeClass(\"search__pane--active\");\r\n intro.show();\r\n resultListWarning.show();\r\n //errorMessage.html(window.noResultsErrorMessages.NoResultTooManyDealersInArea);// + \" \" + window.noResultsErrorMessages.NoResultGuideNewsearch);\r\n //$(\".search__details--error\").show();\r\n }\r\n if (count == 1) {\r\n shvenergy.tracking.trackEvent('Dealerfinder', 'Dealer zoomed', dealers[0].id);\r\n }\r\n\r\n } else {\r\n\r\n // console.log(\"Serverside clustering\");\r\n\r\n for (var i = 0; i < dealers.length; i++) {\r\n\r\n var clusterSize = dealers[i].size;\r\n var clusterSizeLength = clusterSize.toString().length;\r\n\r\n var clusterLabel = {\r\n text: \" \",\r\n color: \"white\"\r\n };\r\n\r\n if (useClusterSizeAsText) {\r\n clusterLabel = {\r\n text: \"\" + clusterSize.toString(),\r\n color: \"white\"\r\n };\r\n }\r\n\r\n var marker2 = new google.maps.Marker({\r\n position: dealers[i].geometry.location,\r\n map: map,\r\n icon: imagePath + clusterSizeLength + \".png\",\r\n label: clusterLabel,\r\n bounds: dealers[i].geometry.bounds\r\n });\r\n\r\n marker2.addListener(\"click\", function () {\r\n\r\n //if (markerClusterer.isZoomOnClick()) {\r\n // //Zoom into the cluster.\r\n // this.map_.fitBounds(this.cluster_.getBounds());\r\n //}\r\n\r\n //map.fitBounds(this.bounds);\r\n\r\n console.log(this.bounds);\r\n var pos = this.position;\r\n map.setZoom(map.getZoom() + 1);\r\n map.setCenter(pos);\r\n //fitBounds(new google.maps.LatLngBounds(this.bounds.sw, this.bounds.ne));\r\n //map.setCenter(pos);\r\n //setTimeout(function () {\r\n // map.setZoom(map.getZoom() + 1);\r\n //}, 200);\r\n });\r\n markers.push({\r\n marker: marker2,\r\n id: dealers[i].id\r\n });\r\n\r\n }\r\n }\r\n });\r\n\r\n }\r\n\r\n function createDealerList(dealers) {\r\n //console.log(dealers);\r\n var localDealers = [];\r\n var localMarkers = markerClusterer.getMarkers();\r\n\r\n for (var t = 0; t < localMarkers.length; t++) {\r\n //console.log(localMarkers[t]);\r\n\r\n //if (localMarkers[t].map == null)\r\n // continue;\r\n //else {\r\n if (localMarkers[t].hasOwnProperty('id')) {\r\n var id = localMarkers[t].id;\r\n\r\n var filterObj = dealers.filter(function (obj) {\r\n return obj.id == id;\r\n });\r\n\r\n //console.log(filterObj);\r\n localDealers.push(filterObj);\r\n }\r\n //}\r\n\r\n }\r\n if (localDealers.length > 0) {\r\n console.log({ localDealers });\r\n\r\n dealerTarget.loadTemplate(dealerTemplate, localDealers.slice(0, numberofsearchresultbeforeshowingsearchresults), { append: true });\r\n $(\"#useCurrentLocationButton\").hide();\r\n } else {\r\n $(\"#useCurrentLocationButton\").show();\r\n }\r\n\r\n }\r\n\r\n function setMapOnAll(map) {\r\n for (var i = 0; i < markers.length; i++) {\r\n\r\n markers[i].marker.setMap(map);\r\n }\r\n }\r\n\r\n function clearMarkers() {\r\n setMapOnAll(null);\r\n }\r\n\r\n function deleteMarkers() {\r\n clearMarkers();\r\n markers = [];\r\n }\r\n\r\n function pan(xOffset, yOffset) {\r\n map.panBy(xOffset, yOffset);\r\n }\r\n\r\n function setLocation(location, zoom, skiplocation) {\r\n map.setCenter(location);\r\n if (zoom) {\r\n map.setZoom(zoom);\r\n }\r\n\r\n if (skiplocation)\r\n return;\r\n\r\n //showLocation(location);\r\n\r\n // TODO: Skew by some distance?\r\n //pan((mapSidebar.width() * -1) / 2, 0);\r\n\r\n }\r\n\r\n function fitBounds(bounds) {\r\n\r\n // TODO: Skew by some distance?\r\n if (bounds)\r\n map.fitBounds(bounds);\r\n\r\n }\r\n\r\n function getBounds() {\r\n return map.getBounds();\r\n }\r\n\r\n function getZoom() {\r\n return map.getZoom();\r\n }\r\n\r\n function setZoom(zoom) {\r\n map.setZoom(zoom);\r\n }\r\n\r\n function setCenter(position) {\r\n map.setCenter(position);\r\n }\r\n\r\n function getStoredZoom() {\r\n return currentZoom;\r\n }\r\n\r\n function getStoredBounds() {\r\n return currentBounds;\r\n }\r\n\r\n function storeZoomAndBounds() {\r\n if (!isZoomedAndCenteredOnMarker) {\r\n currentZoom = getZoom();\r\n currentBounds = getBounds();\r\n }\r\n }\r\n\r\n function zoomAndCenterOnMarker(marker) {\r\n shvenergy.maps.setCenter(marker.position);\r\n shvenergy.maps.setZoom(18);\r\n setIsZoomedAndCenteredOnMarker(true);\r\n }\r\n\r\n function setIsZoomedAndCenteredOnMarker(value) {\r\n isZoomedAndCenteredOnMarker = value;\r\n }\r\n\r\n function getDefaultMarkerLocation() {\r\n if (locationMarker) {\r\n var v = locationMarker.getVisible();\r\n if (v) {\r\n return locationMarker.getPosition();\r\n }\r\n return null;\r\n\r\n }\r\n return null;\r\n }\r\n\r\n function getMarkerById(id) {\r\n for (var i = 0; i < markers.length; i++) {\r\n if (markers[i].id == id) {\r\n return markers[i].marker;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function setMarker(dealerId, useDark) {\r\n var myMarker = getMarkerById(dealerId);\r\n myMarker.setAnimation(null);\r\n var str = myMarker.icon;\r\n var n = str.lastIndexOf(\"/\");\r\n str = str.substring(n + 1, str.length);\r\n\r\n //If its a cluster dont do anything\r\n if (str.indexOf(\"m1.png\") !== -1 ||\r\n str.indexOf(\"m2.png\") !== -1 ||\r\n str.indexOf(\"m3.png\") !== -1 ||\r\n str.indexOf(\"m4.png\") !== -1 ||\r\n str.indexOf(\"m5.png\") !== -1) {\r\n\r\n return;\r\n }\r\n\r\n //var newImage = \"/dist/images/maps/\";\r\n if (useDark) {\r\n //newImage += str.replace(\".png\", \"\") + \"-black.png\";\r\n $(\"[dealerid='\" + dealerId + \"']\").addClass(\"active\");\r\n\r\n myMarker.setAnimation(google.maps.Animation.BOUNCE);\r\n } else {\r\n //newImage += str.replace(\"-black\", \"\");\r\n $(\"[dealerid='\" + dealerId + \"']\").removeClass(\"active\");\r\n }\r\n //myMarker.setIcon(newImage);\r\n\r\n }\r\n\r\n function getPlaceId(location, dealerName, callback) {\r\n\r\n var request = {\r\n query: dealerName,\r\n locationBias: { radius: 100, center: { lat: location.lat, lng: location.lng } },\r\n fields: ['place_id']\r\n };\r\n\r\n mapservice.findPlaceFromQuery(request, function (results, status) {\r\n if (status === google.maps.places.PlacesServiceStatus.OK) {\r\n if (results && results.length) {\r\n //console.log(\"A: \" + results[0]);\r\n //console.log(\"B: \" + results[0].place_id);\r\n getDataFromPlaceId(results[0].place_id);\r\n if (callback) {\r\n callback(results[0].place_id);\r\n return;\r\n }\r\n }\r\n }\r\n if (callback) {\r\n callback(undefined);\r\n }\r\n });\r\n\r\n }\r\n\r\n function loadGoogleMapsService() {\r\n return mapservice;\r\n }\r\n\r\n function getDataFromPlaceId(placeId) {\r\n //Set placeId on the openinhours button\r\n $(\"#openingHoursButton\").data(\"placeId\", placeId);\r\n\r\n //We need to check if we have to load placedetails.\r\n //Initially we only need to do this if \"Show phone numbers from Google Maps [shared]\" is set to true in sitecore\r\n //We can check if this is true be searching for id \"#GooglePhoneNumber\" in the DOM. (see line 59 in \"DealerMapDetailsContactInfo.cshtml\")\r\n\r\n if ($(\"#GooglePhoneNumber\").length > 0) {\r\n\r\n console.log(\"Load phone number from Google, and store any place details properties in the store\");\r\n\r\n mapservice.getDetails({\r\n placeId: placeId,\r\n fields: ['formatted_phone_number']\r\n }, function (place, status) {\r\n\r\n if (status === google.maps.places.PlacesServiceStatus.OK) {\r\n if (place.formatted_phone_number) {\r\n shvenergy.search.gui.setGooglePhoneNumber(place.formatted_phone_number);\r\n shvenergy.search.gui.mapStateStore.placeDetails = place;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n function setKeepSearchingIfNoResults(val) {\r\n keepSearchingIfNoResults = val;\r\n }\r\n\r\n function getKeepSearchingIfNoResults() {\r\n return keepSearchingIfNoResults;\r\n }\r\n\r\n function hideMarker() {\r\n locationMarker.setVisible(false);\r\n }\r\n\r\n function areMarkersCreatedAndNotClusters() {\r\n //this function is used by shvenergy.search.dealer.js\r\n //In there we need to make sure that markers are not of type cluster\r\n //Even clusters have an ID property but it is undefined, so that is what we are checking for\r\n var ok = false;\r\n for (var i = 0; i < markers.length; i++) {\r\n if (markers[i].hasOwnProperty(\"id\") && typeof markers[i].id !== \"undefined\")\r\n ok = true;\r\n }\r\n return ok;\r\n }\r\n\r\n\r\n // TODO: ideally this should be wrapped in a document.load event but this will cause\r\n // issues on other that depend on the map service and others to be inititalized ASAP.\r\n // This will require a bigger rework on the init() calls and how we structure this script, \r\n // but for LCP preloading, this should suffice.\r\n\r\n // window.addEventListener('load', function (e) {\r\n /* const image = mapsContainer.data('pageloadimage');\r\n \r\n if (image !== '') {\r\n var frame = document.createElement('iframe');\r\n frame.src = image;\r\n \r\n frame.style.position = 'absolute';\r\n frame.style.top = 0;\r\n frame.style.left = 0;\r\n frame.style.width = '100%';\r\n frame.style.height = '100%';\r\n frame.style.border = '100%';\r\n \r\n mapsContainer.append(frame);\r\n }*/\r\n\r\n init();\r\n // });\r\n\r\n return {\r\n init: init,\r\n initializeAutocomplete,\r\n pan: pan,\r\n useGeoLocation: useGeoLocation,\r\n setLocation: setLocation,\r\n fitBounds: fitBounds,\r\n createDealerMarkers: createDealerMarkers,\r\n getBounds: getBounds,\r\n getZoom: getZoom,\r\n getDefaultMarkerLocation: getDefaultMarkerLocation,\r\n setMarker: setMarker,\r\n getPlaceId: getPlaceId,\r\n intro: intro,\r\n getStoredBounds: getStoredBounds,\r\n getStoredZoom: getStoredZoom,\r\n setZoom: setZoom,\r\n setCenter: setCenter,\r\n storeZoomAndBounds: storeZoomAndBounds,\r\n getMarkerById: getMarkerById,\r\n initialPosition: initialPosition,\r\n initialZoom: initialZoom,\r\n getKeepSearchingIfNoResults: getKeepSearchingIfNoResults,\r\n setKeepSearchingIfNoResults: setKeepSearchingIfNoResults,\r\n usePreferredPartenerLabel: usePreferredPartenerLabel,\r\n areMarkersCreatedAndNotClusters: areMarkersCreatedAndNotClusters,\r\n hideMarker: hideMarker,\r\n locationMarker: locationMarker,\r\n loadGoogleMapsService: loadGoogleMapsService,\r\n loadDealer: loadDealer,\r\n getLocationFromAddress: getLocationFromAddress,\r\n zoomAndCenterOnMarker: zoomAndCenterOnMarker,\r\n setIsZoomedAndCenteredOnMarker: setIsZoomedAndCenteredOnMarker\r\n };\r\n\r\n})(jQuery);"]}