{"version":3,"sources":["webpack:///./src/components/googleMaps/googleMaps.vue?a8fe","webpack:///./node_modules/quasar/src/components/skeleton/QSkeleton.js","webpack:///./node_modules/quasar/src/components/space/QSpace.js","webpack:///./src/views/MapPrototype.vue?b0a4","webpack:///./src/components/googleMaps/googleMaps.vue?4b31","webpack:///src/components/googleMaps/googleMaps.vue","webpack:///./src/components/googleMaps/googleMaps.vue?5855","webpack:///./src/components/googleMaps/googleMaps.vue","webpack:///src/views/MapPrototype.vue","webpack:///./src/views/MapPrototype.vue?c547","webpack:///./src/views/MapPrototype.vue","webpack:///./src/views/MapPrototype.vue?f522","webpack:///./node_modules/quasar/src/components/page/QPage.js","webpack:///./node_modules/vue2-google-maps/dist/components/cluster.js","webpack:///./node_modules/marker-clusterer-plus/src/markerclusterer.js"],"names":["skeletonTypes","skeletonAnimations","Vue","extend","name","mixins","DarkMixin","TagMixin","ListenersMixin","props","type","String","validator","v","includes","default","animation","square","Boolean","bordered","size","width","height","computed","style","this","classes","isDark","render","h","tag","staticClass","class","on","qListeners","slot","_vm","_h","$createElement","_c","_self","staticStyle","ref","attrs","lng","lat","markers","zoomControl","fullscreenControl","streetViewControl","mapTypeControl","styles","elementType","stylers","color","featureType","visibility","updateCenterPOS","val","$router","push","showDevices","_v","$event","showDeviceDetails","_l","device","index","key","_s","id","battery","temp","long","comment","isHub","mirror","parentKey","organizations_name","flagged","pcb_id","version","sim","_f","lastMessageReceived","_e","deviceEvents","deviceEventsLoading","event","eventIndex","created_at","filterDialog","model","value","callback","$$v","expression","deviceFilter","staticRenderFns","center","zoom","mapType","options","dot","overlayAllData","path","fillColor","strokeColors","lowerLimit","upperLimit","fillOpacity","strokeColor","strokeOpacity","panToLocation","$emit","survey","currentPosition","length","currentRange","showRangeCircles","returnFalse","clustorMarkers","handleClusterClick","m","data","refInFor","icon","component","QPage","QCard","QCardSection","QSeparator","QSpace","QBtn","QScrollArea","QTooltip","QSkeleton","QDialog","QRadio","inject","pageContainer","console","error","layout","padding","styleFn","Function","offset","header","space","footer","container","containerHeight","$q","screen","minHeight","Object","defineProperty","exports","_markerClustererPlus","_markerClustererPlus2","_interopRequireDefault","_mapElementFactory","_mapElementFactory2","obj","__esModule","_objectWithoutProperties","keys","target","i","indexOf","prototype","hasOwnProperty","call","maxZoom","Number","twoWay","batchSizeIE","calculator","enableRetinaIcons","gridSize","ignoreHidden","imageExtension","imagePath","imageSizes","Array","minimumClusterSize","zoomOnClick","events","mappedProps","ctr","Error","ctrArgs","_ref","map","otherOptions","$slots","afterCreate","inst","reinsertMarkers","oldMarkers","getMarkers","clearMarkers","addMarkers","prop","$on","toLowerCase","updated","$clusterObject","repaint","beforeDestroy","_this","$children","forEach","marker","ClusterIcon","cluster","getMarkerClusterer","google","maps","OverlayView","cluster_","className_","getClusterClass","styles_","center_","div_","sums_","visible_","setMap","getMap","Cluster","mc","markerClusterer_","map_","gridSize_","getGridSize","minClusterSize_","getMinimumClusterSize","averageCenter_","getAverageCenter","markers_","bounds_","clusterIcon_","getStyles","MarkerClusterer","opt_markers","opt_options","clusters_","listeners_","activeMap_","ready_","maxZoom_","title_","title","zoomOnClick_","undefined","averageCenter","ignoreHidden_","enableRetinaIcons_","imagePath_","IMAGE_PATH","imageExtension_","IMAGE_EXTENSION","imageSizes_","IMAGE_SIZES","calculator_","CALCULATOR","batchSize_","batchSize","BATCH_SIZE","batchSizeIE_","BATCH_SIZE_IE","clusterClass_","clusterClass","navigator","userAgent","setupStyles_","onAdd","cMouseDownInCluster","cDraggingMapByCluster","cClusterIcon","document","createElement","className","show","getPanes","overlayMouseTarget","appendChild","boundsChangedListener_","addListener","addDomListener","e","theBounds","mz","trigger","getZoomOnClick","getMaxZoom","getBounds","fitBounds","setTimeout","getZoom","setZoom","cancelBubble","stopPropagation","onRemove","parentNode","hide","removeListener","clearInstanceListeners","removeChild","draw","pos","getPosFromLatLng_","top","y","left","x","display","img","bp","backgroundPosition_","split","spriteH","parseInt","replace","spriteV","cssText","createCss","url_","width_","height_","innerHTML","anchorText_","textColor_","textSize_","fontFamily_","fontWeight_","fontStyle_","textDecoration_","text","getTitle","useStyle","sums","Math","max","min","url","anchorText","anchorIcon_","anchorIcon","textColor","textSize","textDecoration","fontWeight","fontStyle","fontFamily","backgroundPosition","setCenter","join","latlng","getProjection","fromLatLngToDivPixel","getSize","getCenter","bounds","LatLngBounds","getPosition","remove","addMarker","mCount","isMarkerAlreadyAdded_","l","LatLng","calculateBounds_","isAdded","updateIcon_","isMarkerInClusterBounds","contains","getExtendedBounds","numStyles","getCalculator","cMarkerClusterer","resetViewport_","get","redraw_","fitMapToMarkers","setGridSize","setMinimumClusterSize","setMaxZoom","setStyles","setTitle","setZoomOnClick","setAverageCenter","getIgnoreHidden","setIgnoreHidden","getEnableRetinaIcons","setEnableRetinaIcons","getImageExtension","setImageExtension","getImagePath","setImagePath","getImageSizes","setImageSizes","setCalculator","getBatchSizeIE","setBatchSizeIE","setClusterClass","getTotalMarkers","getClusters","getTotalClusters","opt_nodraw","pushMarkerTo_","getDraggable","removeMarker","removed","removeMarker_","removeMarkers","r","splice","oldClusters","slice","projection","tr","getNorthEast","bl","getSouthWest","trPix","blPix","ne","fromDivPixelToLatLng","sw","createClusters_","opt_hide","distanceBetweenPoints_","p1","p2","R","dLat","PI","dLon","a","sin","cos","c","atan2","sqrt","d","isMarkerInBounds_","addToClosestCluster_","distance","clusterToAddTo","iFirst","mapBounds","timerRefStatic","clearTimeout","iLast","getVisible","obj1","obj2","object","property","apply","count","toString","dv","module"],"mappings":"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","file":"js/map.8df505c5.js","sourcesContent":["export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/vue-cli-plugin-quasar/lib/loader.auto-import.js?kebab!../../../node_modules/cache-loader/dist/cjs.js??ref--0-1!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./googleMaps.vue?vue&type=style&index=0&lang=scss&\"","import Vue from 'vue'\n\nimport DarkMixin from '../../mixins/dark.js'\nimport TagMixin from '../../mixins/tag.js'\nimport ListenersMixin from '../../mixins/listeners.js'\n\nimport { slot } from '../../utils/slot.js'\n\nexport const skeletonTypes = [\n 'text', 'rect', 'circle',\n 'QBtn', 'QBadge', 'QChip', 'QToolbar',\n 'QCheckbox', 'QRadio', 'QToggle',\n 'QSlider', 'QRange', 'QInput',\n 'QAvatar'\n]\n\nexport const skeletonAnimations = [\n 'wave', 'pulse', 'pulse-x', 'pulse-y', 'fade', 'blink', 'none'\n]\n\nexport default Vue.extend({\n name: 'QSkeleton',\n\n mixins: [ DarkMixin, TagMixin, ListenersMixin ],\n\n props: {\n type: {\n type: String,\n validator: v => skeletonTypes.includes(v),\n default: 'rect'\n },\n\n animation: {\n type: String,\n validator: v => skeletonAnimations.includes(v),\n default: 'wave'\n },\n\n square: Boolean,\n bordered: Boolean,\n\n size: String,\n width: String,\n height: String\n },\n\n computed: {\n style () {\n return this.size !== void 0\n ? { width: this.size, height: this.size }\n : { width: this.width, height: this.height }\n },\n\n classes () {\n return `q-skeleton--${this.isDark === true ? 'dark' : 'light'} q-skeleton--type-${this.type}` +\n (this.animation !== 'none' ? ` q-skeleton--anim q-skeleton--anim-${this.animation}` : '') +\n (this.square === true ? ' q-skeleton--square' : '') +\n (this.bordered === true ? ' q-skeleton--bordered' : '')\n }\n },\n\n render (h) {\n return h(this.tag, {\n staticClass: 'q-skeleton',\n class: this.classes,\n style: this.style,\n on: { ...this.qListeners }\n }, slot(this, 'default'))\n }\n})\n","import Vue from 'vue'\n\nimport ListenersMixin from '../../mixins/listeners.js'\n\nexport default Vue.extend({\n name: 'QSpace',\n\n mixins: [ ListenersMixin ],\n\n render (h) {\n return h('div', {\n staticClass: 'q-space',\n on: { ...this.qListeners }\n })\n }\n})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('q-page',[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-12\"},[_c('q-card',[_c('q-separator'),_c('q-card-section',{staticClass:\"q-pa-none\"},[_c('div',[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col mt-0 pt-0\",staticStyle:{\"height\":\"calc(100vh - 83px) !important\"}},[_c('googleMaps',{ref:\"gmap\",staticStyle:{\"height\":\"100%\",\"width\":\"100%\",\"position\":\"relative\",\"z-index\":\"1\"},attrs:{\"center\":{ lng: 172.64715, lat: -43.5781 },\"zoom\":7,\"clustorMarkers\":_vm.markers,\"mapType\":\"terrain\",\"options\":{\n zoomControl: false,\n fullscreenControl: false,\n streetViewControl: false,\n mapTypeControl: true,\n styles: [\n {\n elementType: 'geometry',\n stylers: [{ color: '#242f3e' }],\n },\n {\n elementType: 'labels.text.stroke',\n stylers: [{ color: '#242f3e' }],\n },\n {\n elementType: 'labels.text.fill',\n stylers: [{ color: '#746855' }],\n },\n {\n featureType: 'administrative.locality',\n elementType: 'labels.text.fill',\n stylers: [{ color: '#d59563' }],\n },\n {\n featureType: 'poi',\n elementType: 'labels',\n stylers: [{ visibility: 'off' }],\n },\n {\n featureType: 'poi.park',\n elementType: 'geometry',\n stylers: [{ color: '#263c3f' }],\n },\n {\n featureType: 'poi.park',\n elementType: 'labels.text.fill',\n stylers: [{ color: '#6b9a76' }],\n },\n {\n featureType: 'road',\n elementType: 'geometry',\n stylers: [{ color: '#38414e' }],\n },\n {\n featureType: 'road',\n elementType: 'geometry.stroke',\n stylers: [{ color: '#212a37' }],\n },\n {\n featureType: 'road',\n elementType: 'labels.text.fill',\n stylers: [{ color: '#9ca5b3' }],\n },\n {\n featureType: 'road.highway',\n elementType: 'geometry',\n stylers: [{ color: '#746855' }],\n },\n {\n featureType: 'road.highway',\n elementType: 'geometry.stroke',\n stylers: [{ color: '#1f2835' }],\n },\n {\n featureType: 'road.highway',\n elementType: 'labels.text.fill',\n stylers: [{ color: '#f3d19c' }],\n },\n {\n featureType: 'transit',\n elementType: 'geometry',\n stylers: [{ color: '#2f3948' }],\n },\n {\n featureType: 'transit.station',\n elementType: 'labels.text.fill',\n stylers: [{ color: '#d59563' }],\n },\n {\n featureType: 'water',\n elementType: 'geometry',\n stylers: [{ color: '#17263c' }],\n },\n {\n featureType: 'water',\n elementType: 'labels.text.fill',\n stylers: [{ color: '#515c6d' }],\n },\n {\n featureType: 'water',\n elementType: 'labels.text.stroke',\n stylers: [{ color: '#17263c' }],\n } ],\n }},on:{\"updatePos\":_vm.updateCenterPOS,\"clustorMapMarkerClicked\":function (val) { return _vm.$router.push((\"/mobile-view/survey-mp-report/\" + (val.id))); },\"showMarkers\":_vm.showDevices}})],1),(_vm.showDeviceDetails)?_c('q-card',{staticClass:\"deviceInfoOverlayCard\",attrs:{\"tile\":\"\"}},[_c('q-card-section',{staticClass:\"q-pa-sm q-pl-md\"},[_c('div',{staticClass:\"row items-center\"},[_c('div',{staticClass:\"text-h6\",staticStyle:{\"display\":\"inline-block\"}},[_vm._v(\" Selected Devices \")]),_c('q-space'),_c('q-btn',{attrs:{\"color\":\"accent2\",\"round\":\"\",\"flat\":\"\",\"icon\":\"mdi-close\"},on:{\"click\":function($event){_vm.showDeviceDetails = false}}})],1)]),_c('q-separator'),_c('q-scroll-area',{staticStyle:{\"height\":\"calc(100% - 60px)\"}},_vm._l((_vm.selectedDevices),function(device,index){return _c('div',{key:(\"deviceList_\" + index),staticClass:\"q-pa-sm q-mb-md\"},[_c('b',[_vm._v(\"Device # \")]),_vm._v(_vm._s(device.id)+\" \"),_c('br'),_c('hr',{staticClass:\"gmapInfoWindowHR\"}),_c('table',[_c('tr',[_c('td',[_c('b',[_vm._v(\"Battery:\")])]),_c('td',[_vm._v(_vm._s(device.battery))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Temp:\")])]),_c('td',[_vm._v(_vm._s(device.temp))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Lat:\")])]),_c('td',[_vm._v(_vm._s(device.lat))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Long:\")])]),_c('td',[_vm._v(_vm._s(device.long))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Comment:\")])]),_c('td',[_vm._v(_vm._s(device.comment))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Is a Hub:\")])]),_c('td',[_vm._v(_vm._s(device.isHub))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Is Mirroring:\")])]),_c('td',[_vm._v(_vm._s(device.mirror))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Parent Key:\")])]),_c('td',[_vm._v(_vm._s(device.parentKey))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Organization:\")])]),_c('td',[_vm._v(_vm._s(device.organizations_name))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Flagged:\")])]),_c('td',[_vm._v(_vm._s(device.flagged))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"PCB ID:\")])]),_c('td',[_vm._v(_vm._s(device.pcb_id))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Version:\")])]),_c('td',[_vm._v(_vm._s(device.version))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Sim:\")])]),_c('td',[_vm._v(_vm._s(device.sim))])]),_c('tr',[_c('td',[_c('b',[_vm._v(\"Last message received:\")])]),(device.lastMessageReceived)?_c('td',[_vm._v(\" \"+_vm._s(_vm._f(\"momentFromNow\")(device.lastMessageReceived))+\" \"),_c('q-tooltip',[_vm._v(\" \"+_vm._s(_vm._f(\"momentFormat\")(device.lastMessageReceived))+\" \")])],1):_c('td',[_vm._v(\"No Event Received\")])])])])}),0)],1):_vm._e(),(_vm.showDeviceDetails)?_c('q-card',{staticClass:\"deviceEventsOverlayCard\",attrs:{\"tile\":\"\"}},[_c('q-card-section',{staticClass:\"q-pa-sm q-pl-md\"},[_c('div',{staticClass:\"row items-center\"},[_c('div',{staticClass:\"text-h6\",staticStyle:{\"display\":\"inline-block\"}},[_vm._v(\" Device Events \")])])]),_c('q-separator'),_c('q-scroll-area',{staticStyle:{\"height\":\"calc(100% - 60px)\"}},_vm._l((_vm.selectedDevices),function(device,index){return _c('div',{key:(\"deviceList_\" + index),staticClass:\"q-pa-sm q-mb-md\"},[_c('b',[_vm._v(\"Device # \")]),_vm._v(_vm._s(device.id)+\" \"),_c('br'),_c('hr',{staticClass:\"gmapInfoWindowHR\"}),(_vm.deviceEventsLoading)?_c('q-skeleton',{attrs:{\"animation\":\"pulse\"}}):_vm._e(),(_vm.deviceEvents[device.id] && !_vm.deviceEventsLoading)?_c('div',{staticClass:\"row\"},_vm._l((_vm.deviceEvents[device.id]),function(event,eventIndex){return _c('div',{key:(\"event_\" + eventIndex),staticClass:\"col-12 cursor-pointer\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col text-capitalize\"},[_c('b',[_vm._v(\"Type:\")]),_vm._v(\" \"+_vm._s(event.type)+\" \")]),_c('div',{staticClass:\"col\"},[_vm._v(\" \"+_vm._s(_vm._f(\"momentFromNow\")(event.created_at))+\" \"),_c('q-tooltip',[_vm._v(\" Server Upload Time \"),_c('br'),_vm._v(\" \"+_vm._s(_vm._f(\"momentFormat\")(device.created_at))+\" \")])],1)])])}),0):_vm._e()],1)}),0)],1):_vm._e(),_c('q-card',{staticClass:\"filtersOverlay shadow-0\",attrs:{\"tile\":\"\"}},[_c('q-card-section',{staticClass:\"q-pa-sm q-pl-md\"},[_c('div',{staticClass:\"row items-center\"},[_c('q-btn',{staticClass:\"bg-white\",attrs:{\"flat\":\"\",\"color\":\"black\",\"icon\":\"mdi-filter\"},on:{\"click\":function($event){_vm.filterDialog = true}}})],1)])],1)],1)])])],1)],1),_c('q-dialog',{attrs:{\"max-width\":\"600px\"},model:{value:(_vm.filterDialog),callback:function ($$v) {_vm.filterDialog=$$v},expression:\"filterDialog\"}},[(_vm.filterDialog)?_c('q-card',{staticClass:\"dateRangeDialog\",staticStyle:{\"width\":\"90vw\",\"max-width\":\"600px\"},attrs:{\"tile\":\"\"}},[_c('q-card-section',{staticClass:\"q-pa-sm q-pl-md\"},[_c('div',{staticClass:\"row items-center\"},[_c('div',{staticClass:\"text-h6\",staticStyle:{\"display\":\"inline-block\"}},[_vm._v(\"Filters\")]),_c('q-space'),_c('q-btn',{attrs:{\"color\":\"accent2\",\"round\":\"\",\"flat\":\"\",\"icon\":\"mdi-close\"},on:{\"click\":function($event){_vm.filterDialog = false}}})],1)]),_c('q-separator'),_c('q-card-section',[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-12\"},[_c('q-radio',{attrs:{\"val\":\"all\",\"label\":\"Show All\"},model:{value:(_vm.deviceFilter),callback:function ($$v) {_vm.deviceFilter=$$v},expression:\"deviceFilter\"}}),_c('q-radio',{attrs:{\"val\":\"recentEvents\",\"label\":\"Recent Events\"},model:{value:(_vm.deviceFilter),callback:function ($$v) {_vm.deviceFilter=$$v},expression:\"deviceFilter\"}}),_c('q-radio',{attrs:{\"val\":\"failedHeartBeat\",\"label\":\"Failed Heart Beat\"},model:{value:(_vm.deviceFilter),callback:function ($$v) {_vm.deviceFilter=$$v},expression:\"deviceFilter\"}})],1)])])],1):_vm._e()],1)],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('GmapMap',{ref:\"googleMaps\",staticStyle:{\"height\":\"100%\",\"width\":\"100%\"},attrs:{\"center\":_vm.center,\"zoom\":_vm.zoom,\"map-type-id\":_vm.mapType,\"options\":_vm.options}},[(_vm.renderLine)?_c('div',[(_vm.dot && !_vm.overlayAllData)?_c('div',_vm._l((_vm.normalizedData),function(path,index){return _c('gmap-circle',{key:(\"circle_\" + index),attrs:{\"center\":path,\"radius\":4,\"visible\":true,\"options\":{\n fillColor:\n _vm.strokeColors[\n path.value < _vm.lowerLimit ? 0 : path.value > _vm.upperLimit ? 2 : 1\n ],\n fillOpacity: 1.0,\n strokeColor: _vm.strokeColors[path.value - 1],\n strokeOpacity: 0.0,\n }},on:{\"click\":function($event){_vm.panToLocation(path);\n _vm.$emit('dotClicked', index);}}})}),1):_vm._e(),(_vm.dot && _vm.overlayAllData)?_c('div',_vm._l((_vm.profileData),function(survey,index){return _c('div',{key:(\"circleSurvey_\" + index)},_vm._l((survey),function(path,index){return _c('gmap-circle',{key:(\"circle_\" + index),attrs:{\"center\":path,\"radius\":4,\"visible\":true,\"options\":{\n fillColor:\n _vm.strokeColors[\n path.value < _vm.lowerLimit\n ? 0\n : path.value > _vm.upperLimit\n ? 2\n : 1\n ],\n fillOpacity: 1.0,\n strokeColor: _vm.strokeColors[path.value - 1],\n strokeOpacity: 0.0,\n }},on:{\"click\":function($event){_vm.panToLocation(path);\n _vm.$emit('dotClicked', index);}}})}),1)}),0):_vm._e(),(_vm.currentPosition.length > 0)?_c('div',_vm._l((_vm.currentPosition),function(path,index){return _c('gmap-circle',{key:(\"cp_\" + index),attrs:{\"center\":path,\"radius\":6,\"visible\":true,\"options\":{\n fillColor: 'black',\n fillOpacity: 1.0,\n strokeOpacity: 0.0,\n }}})}),1):_vm._e(),(_vm.currentRange.length > 0 && _vm.showRangeCircles)?_c('div',_vm._l((_vm.currentRange),function(path,index){return _c('gmap-circle',{key:(\"cr_\" + index),attrs:{\"center\":path,\"radius\":8,\"visible\":true,\"options\":{\n fillColor: '#5491f5',\n fillOpacity: 0.8,\n strokeOpacity: 0.0,\n }}})}),1):_vm._e(),(_vm.polyline)?_c('div',_vm._l((_vm.paths),function(path,index){return _c('gmap-polyline',{key:(\"line_\" + index),attrs:{\"path\":path,\"options\":{\n strokeColor:\n _vm.strokeColors[\n path[0].value < _vm.lowerLimit\n ? 0\n : path[0].value > _vm.upperLimit\n ? 2\n : 1\n ],\n }},on:{\"click\":function($event){return _vm.returnFalse()}}})}),1):_vm._e(),(_vm.clustorMarkers != null)?_c('div',[_c('gmap-cluster',{ref:\"cluster\",attrs:{\"gridSize\":30,\"zoomOnClick\":true,\"enableRetinaIcons\":true,\"minimumClusterSize\":10},on:{\"click\":_vm.handleClusterClick}},_vm._l((_vm.clustorMarkers),function(m,index){return _c('gmap-marker',{key:index,ref:(\"marker_\" + (m.data.id)),refInFor:true,attrs:{\"position\":m,\"clickable\":true,\"draggable\":false,\"icon\":m.icon\n ? m.icon\n : 'https://simple-software-tools.s3.ap-southeast-2.amazonaws.com/map-icons/mapicon-red-resized.png',\"title\":m.data.id},on:{\"click\":function($event){_vm.$emit('updatePos', m);\n _vm.$emit('showMarkers', [m.data.id]);}}})}),1)],1):_vm._e()]):_vm._e()])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n
\n
\n \n
\n \n \n Battery: \n {{ device.battery }} \n \n \n Temp: \n {{ device.temp }} \n \n \n Lat: \n {{ device.lat }} \n \n \n Long: \n {{ device.long }} \n \n \n Comment: \n {{ device.comment }} \n \n \n Is a Hub: \n {{ device.isHub }} \n \n \n Is Mirroring: \n {{ device.mirror }} \n \n \n Parent Key: \n {{ device.parentKey }} \n \n \n Organization: \n {{ device.organizations_name }} \n \n \n Flagged: \n {{ device.flagged }} \n \n \n PCB ID: \n {{ device.pcb_id }} \n \n \n Version: \n {{ device.version }} \n \n \n Sim: \n {{ device.sim }} \n \n \n Last message received: \n \n {{ device.lastMessageReceived | momentFromNow }}\n\n \n No Event Received \n
\n
\n
\n {{ device.created_at | momentFormat }}\n
\n * This is an enhanced V3 implementation of the\n * V2 MarkerClusterer by Xiaoxi Wu. It is based on the\n * V3 MarkerClusterer port by Luke Mahe. MarkerClustererPlus was created by Gary Little.\n *
\n * v2.0 release: MarkerClustererPlus v2.0 is backward compatible with MarkerClusterer v1.0. It\n * adds support for the ignoreHidden
, title
, batchSizeIE
,\n * and calculator
properties as well as support for four more events. It also allows\n * greater control over the styling of the text that appears on the cluster marker. The\n * documentation has been significantly improved and the overall code has been simplified and\n * polished. Very large numbers of markers can now be managed without causing Javascript timeout\n * errors on Internet Explorer. Note that the name of the clusterclick
event has been\n * deprecated. The new name is click
, so please change your application code now.\n */\n\n/**\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * @name ClusterIconStyle\n * @class This class represents the object for values in the styles
array passed\n * to the {@link MarkerClusterer} constructor. The element in this array that is used to\n * style the cluster icon is determined by calling the calculator
function.\n *\n * @property {string} url The URL of the cluster icon image file. Required.\n * @property {number} height The display height (in pixels) of the cluster icon. Required.\n * @property {number} width The display width (in pixels) of the cluster icon. Required.\n * @property {Array} [anchorText] The position (in pixels) from the center of the cluster icon to\n * where the text label is to be centered and drawn. The format is [yoffset, xoffset]
\n * where yoffset
increases as you go down from center and xoffset
\n * increases to the right of center. The default is [0, 0]
.\n * @property {Array} [anchorIcon] The anchor position (in pixels) of the cluster icon. This is the\n * spot on the cluster icon that is to be aligned with the cluster position. The format is\n * [yoffset, xoffset]
where yoffset
increases as you go down and\n * xoffset
increases to the right of the top-left corner of the icon. The default\n * anchor position is the center of the cluster icon.\n * @property {string} [textColor=\"black\"] The color of the label text shown on the\n * cluster icon.\n * @property {number} [textSize=11] The size (in pixels) of the label text shown on the\n * cluster icon.\n * @property {string} [textDecoration=\"none\"] The value of the CSS text-decoration
\n * property for the label text shown on the cluster icon.\n * @property {string} [fontWeight=\"bold\"] The value of the CSS font-weight
\n * property for the label text shown on the cluster icon.\n * @property {string} [fontStyle=\"normal\"] The value of the CSS font-style
\n * property for the label text shown on the cluster icon.\n * @property {string} [fontFamily=\"Arial,sans-serif\"] The value of the CSS font-family
\n * property for the label text shown on the cluster icon.\n * @property {string} [backgroundPosition=\"0 0\"] The position of the cluster icon image\n * within the image defined by url
. The format is \"xpos ypos\"
\n * (the same format as for the CSS background-position
property). You must set\n * this property appropriately when the image defined by url
represents a sprite\n * containing multiple images. Note that the position must be specified in px units.\n */\n/**\n * @name ClusterIconInfo\n * @class This class is an object containing general information about a cluster icon. This is\n * the object that a calculator
function returns.\n *\n * @property {string} text The text of the label to be shown on the cluster icon.\n * @property {number} index The index plus 1 of the element in the styles
\n * array to be used to style the cluster icon.\n * @property {string} title The tooltip to display when the mouse moves over the cluster icon.\n * If this value is undefined
or \"\"
, title
is set to the\n * value of the title
property passed to the MarkerClusterer.\n */\n/**\n * A cluster icon.\n *\n * @constructor\n * @extends google.maps.OverlayView\n * @param {Cluster} cluster The cluster with which the icon is to be associated.\n * @param {Array} [styles] An array of {@link ClusterIconStyle} defining the cluster icons\n * to use for various cluster sizes.\n * @private\n */\nfunction ClusterIcon(cluster, styles) {\n cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);\n\n this.cluster_ = cluster;\n this.className_ = cluster.getMarkerClusterer().getClusterClass();\n this.styles_ = styles;\n this.center_ = null;\n this.div_ = null;\n this.sums_ = null;\n this.visible_ = false;\n\n this.setMap(cluster.getMap()); // Note: this causes onAdd to be called\n}\n\n\n/**\n * Adds the icon to the DOM.\n */\nClusterIcon.prototype.onAdd = function () {\n var cClusterIcon = this;\n var cMouseDownInCluster;\n var cDraggingMapByCluster;\n\n this.div_ = document.createElement(\"div\");\n this.div_.className = this.className_;\n if (this.visible_) {\n this.show();\n }\n\n this.getPanes().overlayMouseTarget.appendChild(this.div_);\n\n // Fix for Issue 157\n this.boundsChangedListener_ = google.maps.event.addListener(this.getMap(), \"bounds_changed\", function () {\n cDraggingMapByCluster = cMouseDownInCluster;\n });\n\n google.maps.event.addDomListener(this.div_, \"mousedown\", function () {\n cMouseDownInCluster = true;\n cDraggingMapByCluster = false;\n });\n\n google.maps.event.addDomListener(this.div_, \"click\", function (e) {\n cMouseDownInCluster = false;\n if (!cDraggingMapByCluster) {\n var theBounds;\n var mz;\n var mc = cClusterIcon.cluster_.getMarkerClusterer();\n /**\n * This event is fired when a cluster marker is clicked.\n * @name MarkerClusterer#click\n * @param {Cluster} c The cluster that was clicked.\n * @event\n */\n google.maps.event.trigger(mc, \"click\", cClusterIcon.cluster_);\n google.maps.event.trigger(mc, \"clusterclick\", cClusterIcon.cluster_); // deprecated name\n\n // The default click handler follows. Disable it by setting\n // the zoomOnClick property to false.\n if (mc.getZoomOnClick()) {\n // Zoom into the cluster.\n mz = mc.getMaxZoom();\n theBounds = cClusterIcon.cluster_.getBounds();\n mc.getMap().fitBounds(theBounds);\n // There is a fix for Issue 170 here:\n setTimeout(function () {\n mc.getMap().fitBounds(theBounds);\n // Don't zoom beyond the max zoom level\n if (mz !== null && (mc.getMap().getZoom() > mz)) {\n mc.getMap().setZoom(mz + 1);\n }\n }, 100);\n }\n\n // Prevent event propagation to the map:\n e.cancelBubble = true;\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n }\n });\n\n google.maps.event.addDomListener(this.div_, \"mouseover\", function () {\n var mc = cClusterIcon.cluster_.getMarkerClusterer();\n /**\n * This event is fired when the mouse moves over a cluster marker.\n * @name MarkerClusterer#mouseover\n * @param {Cluster} c The cluster that the mouse moved over.\n * @event\n */\n google.maps.event.trigger(mc, \"mouseover\", cClusterIcon.cluster_);\n });\n\n google.maps.event.addDomListener(this.div_, \"mouseout\", function () {\n var mc = cClusterIcon.cluster_.getMarkerClusterer();\n /**\n * This event is fired when the mouse moves out of a cluster marker.\n * @name MarkerClusterer#mouseout\n * @param {Cluster} c The cluster that the mouse moved out of.\n * @event\n */\n google.maps.event.trigger(mc, \"mouseout\", cClusterIcon.cluster_);\n });\n};\n\n\n/**\n * Removes the icon from the DOM.\n */\nClusterIcon.prototype.onRemove = function () {\n if (this.div_ && this.div_.parentNode) {\n this.hide();\n google.maps.event.removeListener(this.boundsChangedListener_);\n google.maps.event.clearInstanceListeners(this.div_);\n this.div_.parentNode.removeChild(this.div_);\n this.div_ = null;\n }\n};\n\n\n/**\n * Draws the icon.\n */\nClusterIcon.prototype.draw = function () {\n if (this.visible_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.top = pos.y + \"px\";\n this.div_.style.left = pos.x + \"px\";\n }\n};\n\n\n/**\n * Hides the icon.\n */\nClusterIcon.prototype.hide = function () {\n if (this.div_) {\n this.div_.style.display = \"none\";\n }\n this.visible_ = false;\n};\n\n\n/**\n * Positions and shows the icon.\n */\nClusterIcon.prototype.show = function () {\n if (this.div_) {\n var img = \"\";\n // NOTE: values must be specified in px units\n var bp = this.backgroundPosition_.split(\" \");\n var spriteH = parseInt(bp[0].replace(/^\\s+|\\s+$/g, \"\"), 10);\n var spriteV = parseInt(bp[1].replace(/^\\s+|\\s+$/g, \"\"), 10);\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n img = \"\";\n this.div_.innerHTML = img + \"
MarkerClusterer
object with which this\n * cluster is associated.\n */\nfunction Cluster(mc) {\n this.markerClusterer_ = mc;\n this.map_ = mc.getMap();\n this.gridSize_ = mc.getGridSize();\n this.minClusterSize_ = mc.getMinimumClusterSize();\n this.averageCenter_ = mc.getAverageCenter();\n this.markers_ = [];\n this.center_ = null;\n this.bounds_ = null;\n this.clusterIcon_ = new ClusterIcon(this, mc.getStyles());\n}\n\n\n/**\n * Returns the number of markers managed by the cluster. You can call this from\n * a click
, mouseover
, or mouseout
event handler\n * for the MarkerClusterer
object.\n *\n * @return {number} The number of markers in the cluster.\n */\nCluster.prototype.getSize = function () {\n return this.markers_.length;\n};\n\n\n/**\n * Returns the array of markers managed by the cluster. You can call this from\n * a click
, mouseover
, or mouseout
event handler\n * for the MarkerClusterer
object.\n *\n * @return {Array} The array of markers in the cluster.\n */\nCluster.prototype.getMarkers = function () {\n return this.markers_;\n};\n\n\n/**\n * Returns the center of the cluster. You can call this from\n * a click
, mouseover
, or mouseout
event handler\n * for the MarkerClusterer
object.\n *\n * @return {google.maps.LatLng} The center of the cluster.\n */\nCluster.prototype.getCenter = function () {\n return this.center_;\n};\n\n\n/**\n * Returns the map with which the cluster is associated.\n *\n * @return {google.maps.Map} The map.\n * @ignore\n */\nCluster.prototype.getMap = function () {\n return this.map_;\n};\n\n\n/**\n * Returns the MarkerClusterer
object with which the cluster is associated.\n *\n * @return {MarkerClusterer} The associated marker clusterer.\n * @ignore\n */\nCluster.prototype.getMarkerClusterer = function () {\n return this.markerClusterer_;\n};\n\n\n/**\n * Returns the bounds of the cluster.\n *\n * @return {google.maps.LatLngBounds} the cluster bounds.\n * @ignore\n */\nCluster.prototype.getBounds = function () {\n var i;\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n var markers = this.getMarkers();\n for (i = 0; i < markers.length; i++) {\n bounds.extend(markers[i].getPosition());\n }\n return bounds;\n};\n\n\n/**\n * Removes the cluster from the map.\n *\n * @ignore\n */\nCluster.prototype.remove = function () {\n this.clusterIcon_.setMap(null);\n this.markers_ = [];\n delete this.markers_;\n};\n\n\n/**\n * Adds a marker to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to be added.\n * @return {boolean} True if the marker was added.\n * @ignore\n */\nCluster.prototype.addMarker = function (marker) {\n var i;\n var mCount;\n var mz;\n\n if (this.isMarkerAlreadyAdded_(marker)) {\n return false;\n }\n\n if (!this.center_) {\n this.center_ = marker.getPosition();\n this.calculateBounds_();\n } else {\n if (this.averageCenter_) {\n var l = this.markers_.length + 1;\n var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l;\n var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l;\n this.center_ = new google.maps.LatLng(lat, lng);\n this.calculateBounds_();\n }\n }\n\n marker.isAdded = true;\n this.markers_.push(marker);\n\n mCount = this.markers_.length;\n mz = this.markerClusterer_.getMaxZoom();\n if (mz !== null && this.map_.getZoom() > mz) {\n // Zoomed in past max zoom, so show the marker.\n if (marker.getMap() !== this.map_) {\n marker.setMap(this.map_);\n }\n } else if (mCount < this.minClusterSize_) {\n // Min cluster size not reached so show the marker.\n if (marker.getMap() !== this.map_) {\n marker.setMap(this.map_);\n }\n } else if (mCount === this.minClusterSize_) {\n // Hide the markers that were showing.\n for (i = 0; i < mCount; i++) {\n this.markers_[i].setMap(null);\n }\n } else {\n marker.setMap(null);\n }\n\n this.updateIcon_();\n return true;\n};\n\n\n/**\n * Determines if a marker lies within the cluster's bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker lies in the bounds.\n * @ignore\n */\nCluster.prototype.isMarkerInClusterBounds = function (marker) {\n return this.bounds_.contains(marker.getPosition());\n};\n\n\n/**\n * Calculates the extended bounds of the cluster with the grid.\n */\nCluster.prototype.calculateBounds_ = function () {\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);\n};\n\n\n/**\n * Updates the cluster icon.\n */\nCluster.prototype.updateIcon_ = function () {\n var mCount = this.markers_.length;\n var mz = this.markerClusterer_.getMaxZoom();\n\n if (mz !== null && this.map_.getZoom() > mz) {\n this.clusterIcon_.hide();\n return;\n }\n\n if (mCount < this.minClusterSize_) {\n // Min cluster size not yet reached.\n this.clusterIcon_.hide();\n return;\n }\n\n var numStyles = this.markerClusterer_.getStyles().length;\n var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);\n this.clusterIcon_.setCenter(this.center_);\n this.clusterIcon_.useStyle(sums);\n this.clusterIcon_.show();\n};\n\n\n/**\n * Determines if a marker has already been added to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker has already been added.\n */\nCluster.prototype.isMarkerAlreadyAdded_ = function (marker) {\n var i;\n if (this.markers_.indexOf) {\n return this.markers_.indexOf(marker) !== -1;\n } else {\n for (i = 0; i < this.markers_.length; i++) {\n if (marker === this.markers_[i]) {\n return true;\n }\n }\n }\n return false;\n};\n\n\n/**\n * @name MarkerClustererOptions\n * @class This class represents the optional parameter passed to\n * the {@link MarkerClusterer} constructor.\n * @property {number} [gridSize=60] The grid size of a cluster in pixels. The grid is a square.\n * @property {number} [maxZoom=null] The maximum zoom level at which clustering is enabled or\n * null
if clustering is to be enabled at all zoom levels.\n * @property {boolean} [zoomOnClick=true] Whether to zoom the map when a cluster marker is\n * clicked. You may want to set this to false
if you have installed a handler\n * for the click
event and it deals with zooming on its own.\n * @property {boolean} [averageCenter=false] Whether the position of a cluster marker should be\n * the average position of all markers in the cluster. If set to false
, the\n * cluster marker is positioned at the location of the first marker added to the cluster.\n * @property {number} [minimumClusterSize=2] The minimum number of markers needed in a cluster\n * before the markers are hidden and a cluster marker appears.\n * @property {boolean} [ignoreHidden=false] Whether to ignore hidden markers in clusters. You\n * may want to set this to true
to ensure that hidden markers are not included\n * in the marker count that appears on a cluster marker (this count is the value of the\n * text
property of the result returned by the default calculator
).\n * If set to true
and you change the visibility of a marker being clustered, be\n * sure to also call MarkerClusterer.repaint()
.\n * @property {string} [title=\"\"] The tooltip to display when the mouse moves over a cluster\n * marker. (Alternatively, you can use a custom calculator
function to specify a\n * different tooltip for each cluster marker.)\n * @property {function} [calculator=MarkerClusterer.CALCULATOR] The function used to determine\n * the text to be displayed on a cluster marker and the index indicating which style to use\n * for the cluster marker. The input parameters for the function are (1) the array of markers\n * represented by a cluster marker and (2) the number of cluster icon styles. It returns a\n * {@link ClusterIconInfo} object. The default calculator
returns a\n * text
property which is the number of markers in the cluster and an\n * index
property which is one higher than the lowest integer such that\n * 10^i
exceeds the number of markers in the cluster, or the size of the styles\n * array, whichever is less. The styles
array element used has an index of\n * index
minus 1. For example, the default calculator
returns a\n * text
value of \"125\"
and an index
of 3
\n * for a cluster icon representing 125 markers so the element used in the styles
\n * array is 2
. A calculator
may also return a title
\n * property that contains the text of the tooltip to be used for the cluster marker. If\n * title
is not defined, the tooltip is set to the value of the title
\n * property for the MarkerClusterer.\n * @property {string} [clusterClass=\"cluster\"] The name of the CSS class defining general styles\n * for the cluster markers. Use this class to define CSS styles that are not set up by the code\n * that processes the styles
array.\n * @property {Array} [styles] An array of {@link ClusterIconStyle} elements defining the styles\n * of the cluster markers to be used. The element to be used to style a given cluster marker\n * is determined by the function defined by the calculator
property.\n * The default is an array of {@link ClusterIconStyle} elements whose properties are derived\n * from the values for imagePath
, imageExtension
, and\n * imageSizes
.\n * @property {boolean} [enableRetinaIcons=false] Whether to allow the use of cluster icons that\n * have sizes that are some multiple (typically double) of their actual display size. Icons such\n * as these look better when viewed on high-resolution monitors such as Apple's Retina displays.\n * Note: if this property is true
, sprites cannot be used as cluster icons.\n * @property {number} [batchSize=MarkerClusterer.BATCH_SIZE] Set this property to the\n * number of markers to be processed in a single batch when using a browser other than\n * Internet Explorer (for Internet Explorer, use the batchSizeIE property instead).\n * @property {number} [batchSizeIE=MarkerClusterer.BATCH_SIZE_IE] When Internet Explorer is\n * being used, markers are processed in several batches with a small delay inserted between\n * each batch in an attempt to avoid Javascript timeout errors. Set this property to the\n * number of markers to be processed in a single batch; select as high a number as you can\n * without causing a timeout error in the browser. This number might need to be as low as 100\n * if 15,000 markers are being managed, for example.\n * @property {string} [imagePath=MarkerClusterer.IMAGE_PATH]\n * The full URL of the root name of the group of image files to use for cluster icons.\n * The complete file name is of the form imagePath
n.imageExtension
\n * where n is the image file number (1, 2, etc.).\n * @property {string} [imageExtension=MarkerClusterer.IMAGE_EXTENSION]\n * The extension name for the cluster icon image files (e.g., \"png\"
or\n * \"jpg\"
).\n * @property {Array} [imageSizes=MarkerClusterer.IMAGE_SIZES]\n * An array of numbers containing the widths of the group of\n * imagePath
n.imageExtension
image files.\n * (The images are assumed to be square.)\n */\n/**\n * Creates a MarkerClusterer object with the options specified in {@link MarkerClustererOptions}.\n * @constructor\n * @extends google.maps.OverlayView\n * @param {google.maps.Map} map The Google map to attach to.\n * @param {Array.gridSize
property.\n *\n * @return {number} The grid size.\n */\nMarkerClusterer.prototype.getGridSize = function () {\n return this.gridSize_;\n};\n\n\n/**\n * Sets the value of the gridSize
property.\n *\n * @param {number} gridSize The grid size.\n */\nMarkerClusterer.prototype.setGridSize = function (gridSize) {\n this.gridSize_ = gridSize;\n};\n\n\n/**\n * Returns the value of the minimumClusterSize
property.\n *\n * @return {number} The minimum cluster size.\n */\nMarkerClusterer.prototype.getMinimumClusterSize = function () {\n return this.minClusterSize_;\n};\n\n/**\n * Sets the value of the minimumClusterSize
property.\n *\n * @param {number} minimumClusterSize The minimum cluster size.\n */\nMarkerClusterer.prototype.setMinimumClusterSize = function (minimumClusterSize) {\n this.minClusterSize_ = minimumClusterSize;\n};\n\n\n/**\n * Returns the value of the maxZoom
property.\n *\n * @return {number} The maximum zoom level.\n */\nMarkerClusterer.prototype.getMaxZoom = function () {\n return this.maxZoom_;\n};\n\n\n/**\n * Sets the value of the maxZoom
property.\n *\n * @param {number} maxZoom The maximum zoom level.\n */\nMarkerClusterer.prototype.setMaxZoom = function (maxZoom) {\n this.maxZoom_ = maxZoom;\n};\n\n\n/**\n * Returns the value of the styles
property.\n *\n * @return {Array} The array of styles defining the cluster markers to be used.\n */\nMarkerClusterer.prototype.getStyles = function () {\n return this.styles_;\n};\n\n\n/**\n * Sets the value of the styles
property.\n *\n * @param {Array.title
property.\n *\n * @return {string} The content of the title text.\n */\nMarkerClusterer.prototype.getTitle = function () {\n return this.title_;\n};\n\n\n/**\n * Sets the value of the title
property.\n *\n * @param {string} title The value of the title property.\n */\nMarkerClusterer.prototype.setTitle = function (title) {\n this.title_ = title;\n};\n\n\n/**\n * Returns the value of the zoomOnClick
property.\n *\n * @return {boolean} True if zoomOnClick property is set.\n */\nMarkerClusterer.prototype.getZoomOnClick = function () {\n return this.zoomOnClick_;\n};\n\n\n/**\n * Sets the value of the zoomOnClick
property.\n *\n * @param {boolean} zoomOnClick The value of the zoomOnClick property.\n */\nMarkerClusterer.prototype.setZoomOnClick = function (zoomOnClick) {\n this.zoomOnClick_ = zoomOnClick;\n};\n\n\n/**\n * Returns the value of the averageCenter
property.\n *\n * @return {boolean} True if averageCenter property is set.\n */\nMarkerClusterer.prototype.getAverageCenter = function () {\n return this.averageCenter_;\n};\n\n\n/**\n * Sets the value of the averageCenter
property.\n *\n * @param {boolean} averageCenter The value of the averageCenter property.\n */\nMarkerClusterer.prototype.setAverageCenter = function (averageCenter) {\n this.averageCenter_ = averageCenter;\n};\n\n\n/**\n * Returns the value of the ignoreHidden
property.\n *\n * @return {boolean} True if ignoreHidden property is set.\n */\nMarkerClusterer.prototype.getIgnoreHidden = function () {\n return this.ignoreHidden_;\n};\n\n\n/**\n * Sets the value of the ignoreHidden
property.\n *\n * @param {boolean} ignoreHidden The value of the ignoreHidden property.\n */\nMarkerClusterer.prototype.setIgnoreHidden = function (ignoreHidden) {\n this.ignoreHidden_ = ignoreHidden;\n};\n\n\n/**\n * Returns the value of the enableRetinaIcons
property.\n *\n * @return {boolean} True if enableRetinaIcons property is set.\n */\nMarkerClusterer.prototype.getEnableRetinaIcons = function () {\n return this.enableRetinaIcons_;\n};\n\n\n/**\n * Sets the value of the enableRetinaIcons
property.\n *\n * @param {boolean} enableRetinaIcons The value of the enableRetinaIcons property.\n */\nMarkerClusterer.prototype.setEnableRetinaIcons = function (enableRetinaIcons) {\n this.enableRetinaIcons_ = enableRetinaIcons;\n};\n\n\n/**\n * Returns the value of the imageExtension
property.\n *\n * @return {string} The value of the imageExtension property.\n */\nMarkerClusterer.prototype.getImageExtension = function () {\n return this.imageExtension_;\n};\n\n\n/**\n * Sets the value of the imageExtension
property.\n *\n * @param {string} imageExtension The value of the imageExtension property.\n */\nMarkerClusterer.prototype.setImageExtension = function (imageExtension) {\n this.imageExtension_ = imageExtension;\n};\n\n\n/**\n * Returns the value of the imagePath
property.\n *\n * @return {string} The value of the imagePath property.\n */\nMarkerClusterer.prototype.getImagePath = function () {\n return this.imagePath_;\n};\n\n\n/**\n * Sets the value of the imagePath
property.\n *\n * @param {string} imagePath The value of the imagePath property.\n */\nMarkerClusterer.prototype.setImagePath = function (imagePath) {\n this.imagePath_ = imagePath;\n};\n\n\n/**\n * Returns the value of the imageSizes
property.\n *\n * @return {Array} The value of the imageSizes property.\n */\nMarkerClusterer.prototype.getImageSizes = function () {\n return this.imageSizes_;\n};\n\n\n/**\n * Sets the value of the imageSizes
property.\n *\n * @param {Array} imageSizes The value of the imageSizes property.\n */\nMarkerClusterer.prototype.setImageSizes = function (imageSizes) {\n this.imageSizes_ = imageSizes;\n};\n\n\n/**\n * Returns the value of the calculator
property.\n *\n * @return {function} the value of the calculator property.\n */\nMarkerClusterer.prototype.getCalculator = function () {\n return this.calculator_;\n};\n\n\n/**\n * Sets the value of the calculator
property.\n *\n * @param {function(Array.batchSizeIE
property.\n *\n * @return {number} the value of the batchSizeIE property.\n */\nMarkerClusterer.prototype.getBatchSizeIE = function () {\n return this.batchSizeIE_;\n};\n\n\n/**\n * Sets the value of the batchSizeIE
property.\n *\n * @param {number} batchSizeIE The value of the batchSizeIE property.\n */\nMarkerClusterer.prototype.setBatchSizeIE = function (batchSizeIE) {\n this.batchSizeIE_ = batchSizeIE;\n};\n\n\n/**\n * Returns the value of the clusterClass
property.\n *\n * @return {string} the value of the clusterClass property.\n */\nMarkerClusterer.prototype.getClusterClass = function () {\n return this.clusterClass_;\n};\n\n\n/**\n * Sets the value of the clusterClass
property.\n *\n * @param {string} clusterClass The value of the clusterClass property.\n */\nMarkerClusterer.prototype.setClusterClass = function (clusterClass) {\n this.clusterClass_ = clusterClass;\n};\n\n\n/**\n * Returns the array of markers managed by the clusterer.\n *\n * @return {Array} The array of markers managed by the clusterer.\n */\nMarkerClusterer.prototype.getMarkers = function () {\n return this.markers_;\n};\n\n\n/**\n * Returns the number of markers managed by the clusterer.\n *\n * @return {number} The number of markers.\n */\nMarkerClusterer.prototype.getTotalMarkers = function () {\n return this.markers_.length;\n};\n\n\n/**\n * Returns the current array of clusters formed by the clusterer.\n *\n * @return {Array} The array of clusters formed by the clusterer.\n */\nMarkerClusterer.prototype.getClusters = function () {\n return this.clusters_;\n};\n\n\n/**\n * Returns the number of clusters formed by the clusterer.\n *\n * @return {number} The number of clusters formed by the clusterer.\n */\nMarkerClusterer.prototype.getTotalClusters = function () {\n return this.clusters_.length;\n};\n\n\n/**\n * Adds a marker to the clusterer. The clusters are redrawn unless\n * opt_nodraw
is set to true
.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @param {boolean} [opt_nodraw] Set to true
to prevent redrawing.\n */\nMarkerClusterer.prototype.addMarker = function (marker, opt_nodraw) {\n this.pushMarkerTo_(marker);\n if (!opt_nodraw) {\n this.redraw_();\n }\n};\n\n\n/**\n * Adds an array of markers to the clusterer. The clusters are redrawn unless\n * opt_nodraw
is set to true
.\n *\n * @param {Array.true
to prevent redrawing.\n */\nMarkerClusterer.prototype.addMarkers = function (markers, opt_nodraw) {\n var key;\n for (key in markers) {\n if (markers.hasOwnProperty(key)) {\n this.pushMarkerTo_(markers[key]);\n }\n } \n if (!opt_nodraw) {\n this.redraw_();\n }\n};\n\n\n/**\n * Pushes a marker to the clusterer.\n *\n * @param {google.maps.Marker} marker The marker to add.\n */\nMarkerClusterer.prototype.pushMarkerTo_ = function (marker) {\n // If the marker is draggable add a listener so we can update the clusters on the dragend:\n if (marker.getDraggable()) {\n var cMarkerClusterer = this;\n google.maps.event.addListener(marker, \"dragend\", function () {\n if (cMarkerClusterer.ready_) {\n this.isAdded = false;\n cMarkerClusterer.repaint();\n }\n });\n }\n marker.isAdded = false;\n this.markers_.push(marker);\n};\n\n\n/**\n * Removes a marker from the cluster. The clusters are redrawn unless\n * opt_nodraw
is set to true
. Returns true
if the\n * marker was removed from the clusterer.\n *\n * @param {google.maps.Marker} marker The marker to remove.\n * @param {boolean} [opt_nodraw] Set to true
to prevent redrawing.\n * @return {boolean} True if the marker was removed from the clusterer.\n */\nMarkerClusterer.prototype.removeMarker = function (marker, opt_nodraw) {\n var removed = this.removeMarker_(marker);\n\n if (!opt_nodraw && removed) {\n this.repaint();\n }\n\n return removed;\n};\n\n\n/**\n * Removes an array of markers from the cluster. The clusters are redrawn unless\n * opt_nodraw
is set to true
. Returns true
if markers\n * were removed from the clusterer.\n *\n * @param {Array.true
to prevent redrawing.\n * @return {boolean} True if markers were removed from the clusterer.\n */\nMarkerClusterer.prototype.removeMarkers = function (markers, opt_nodraw) {\n var i, r;\n var removed = false;\n\n for (i = 0; i < markers.length; i++) {\n r = this.removeMarker_(markers[i]);\n removed = removed || r;\n }\n\n if (!opt_nodraw && removed) {\n this.repaint();\n }\n\n return removed;\n};\n\n\n/**\n * Removes a marker and returns true if removed, false if not.\n *\n * @param {google.maps.Marker} marker The marker to remove\n * @return {boolean} Whether the marker was removed or not\n */\nMarkerClusterer.prototype.removeMarker_ = function (marker) {\n var i;\n var index = -1;\n if (this.markers_.indexOf) {\n index = this.markers_.indexOf(marker);\n } else {\n for (i = 0; i < this.markers_.length; i++) {\n if (marker === this.markers_[i]) {\n index = i;\n break;\n }\n }\n }\n\n if (index === -1) {\n // Marker is not in our list of markers, so do nothing:\n return false;\n }\n\n marker.setMap(null);\n this.markers_.splice(index, 1); // Remove the marker from the list of managed markers\n return true;\n};\n\n\n/**\n * Removes all clusters and markers from the map and also removes all markers\n * managed by the clusterer.\n */\nMarkerClusterer.prototype.clearMarkers = function () {\n this.resetViewport_(true);\n this.markers_ = [];\n};\n\n\n/**\n * Recalculates and redraws all the marker clusters from scratch.\n * Call this after changing any properties.\n */\nMarkerClusterer.prototype.repaint = function () {\n var oldClusters = this.clusters_.slice();\n this.clusters_ = [];\n this.resetViewport_(false);\n this.redraw_();\n\n // Remove the old clusters.\n // Do it in a timeout to prevent blinking effect.\n setTimeout(function () {\n var i;\n for (i = 0; i < oldClusters.length; i++) {\n oldClusters[i].remove();\n }\n }, 0);\n};\n\n\n/**\n * Returns the current bounds extended by the grid size.\n *\n * @param {google.maps.LatLngBounds} bounds The bounds to extend.\n * @return {google.maps.LatLngBounds} The extended bounds.\n * @ignore\n */\nMarkerClusterer.prototype.getExtendedBounds = function (bounds) {\n var projection = this.getProjection();\n\n // Turn the bounds into latlng.\n var tr = new google.maps.LatLng(bounds.getNorthEast().lat(),\n bounds.getNorthEast().lng());\n var bl = new google.maps.LatLng(bounds.getSouthWest().lat(),\n bounds.getSouthWest().lng());\n\n // Convert the points to pixels and the extend out by the grid size.\n var trPix = projection.fromLatLngToDivPixel(tr);\n trPix.x += this.gridSize_;\n trPix.y -= this.gridSize_;\n\n var blPix = projection.fromLatLngToDivPixel(bl);\n blPix.x -= this.gridSize_;\n blPix.y += this.gridSize_;\n\n // Convert the pixel points back to LatLng\n var ne = projection.fromDivPixelToLatLng(trPix);\n var sw = projection.fromDivPixelToLatLng(blPix);\n\n // Extend the bounds to contain the new bounds.\n bounds.extend(ne);\n bounds.extend(sw);\n\n return bounds;\n};\n\n\n/**\n * Redraws all the clusters.\n */\nMarkerClusterer.prototype.redraw_ = function () {\n this.createClusters_(0);\n};\n\n\n/**\n * Removes all clusters from the map. The markers are also removed from the map\n * if opt_hide
is set to true
.\n *\n * @param {boolean} [opt_hide] Set to true
to also remove the markers\n * from the map.\n */\nMarkerClusterer.prototype.resetViewport_ = function (opt_hide) {\n var i, marker;\n // Remove all the clusters\n for (i = 0; i < this.clusters_.length; i++) {\n this.clusters_[i].remove();\n }\n this.clusters_ = [];\n\n // Reset the markers to not be added and to be removed from the map.\n for (i = 0; i < this.markers_.length; i++) {\n marker = this.markers_[i];\n marker.isAdded = false;\n if (opt_hide) {\n marker.setMap(null);\n }\n }\n};\n\n\n/**\n * Calculates the distance between two latlng locations in km.\n *\n * @param {google.maps.LatLng} p1 The first lat lng point.\n * @param {google.maps.LatLng} p2 The second lat lng point.\n * @return {number} The distance between the two points in km.\n * @see http://www.movable-type.co.uk/scripts/latlong.html\n*/\nMarkerClusterer.prototype.distanceBetweenPoints_ = function (p1, p2) {\n var R = 6371; // Radius of the Earth in km\n var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;\n var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;\n var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *\n Math.sin(dLon / 2) * Math.sin(dLon / 2);\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n var d = R * c;\n return d;\n};\n\n\n/**\n * Determines if a marker is contained in a bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @param {google.maps.LatLngBounds} bounds The bounds to check against.\n * @return {boolean} True if the marker is in the bounds.\n */\nMarkerClusterer.prototype.isMarkerInBounds_ = function (marker, bounds) {\n return bounds.contains(marker.getPosition());\n};\n\n\n/**\n * Adds a marker to a cluster, or creates a new cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n */\nMarkerClusterer.prototype.addToClosestCluster_ = function (marker) {\n var i, d, cluster, center;\n var distance = 40000; // Some large number\n var clusterToAddTo = null;\n for (i = 0; i < this.clusters_.length; i++) {\n cluster = this.clusters_[i];\n center = cluster.getCenter();\n if (center) {\n d = this.distanceBetweenPoints_(center, marker.getPosition());\n if (d < distance) {\n distance = d;\n clusterToAddTo = cluster;\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker);\n } else {\n cluster = new Cluster(this);\n cluster.addMarker(marker);\n this.clusters_.push(cluster);\n }\n};\n\n\n/**\n * Creates the clusters. This is done in batches to avoid timeout errors\n * in some browsers when there is a huge number of markers.\n *\n * @param {number} iFirst The index of the first marker in the batch of\n * markers to be added to clusters.\n */\nMarkerClusterer.prototype.createClusters_ = function (iFirst) {\n var i, marker;\n var mapBounds;\n var cMarkerClusterer = this;\n if (!this.ready_) {\n return;\n }\n\n // Cancel previous batch processing if we're working on the first batch:\n if (iFirst === 0) {\n /**\n * This event is fired when the MarkerClusterer
begins\n * clustering markers.\n * @name MarkerClusterer#clusteringbegin\n * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, \"clusteringbegin\", this);\n\n if (typeof this.timerRefStatic !== \"undefined\") {\n clearTimeout(this.timerRefStatic);\n delete this.timerRefStatic;\n }\n }\n\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n //\n // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:\n if (this.getMap().getZoom() > 3) {\n mapBounds = new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),\n this.getMap().getBounds().getNorthEast());\n } else {\n mapBounds = new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472, -178.48388434375), new google.maps.LatLng(-85.08136444384544, 178.00048865625));\n }\n var bounds = this.getExtendedBounds(mapBounds);\n\n var iLast = Math.min(iFirst + this.batchSize_, this.markers_.length);\n\n for (i = iFirst; i < iLast; i++) {\n marker = this.markers_[i];\n if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\n if (!this.ignoreHidden_ || (this.ignoreHidden_ && marker.getVisible())) {\n this.addToClosestCluster_(marker);\n }\n }\n }\n\n if (iLast < this.markers_.length) {\n this.timerRefStatic = setTimeout(function () {\n cMarkerClusterer.createClusters_(iLast);\n }, 0);\n } else {\n delete this.timerRefStatic;\n\n /**\n * This event is fired when the MarkerClusterer
stops\n * clustering markers.\n * @name MarkerClusterer#clusteringend\n * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, \"clusteringend\", this);\n }\n};\n\n\n/**\n * Extends an object's prototype by another's.\n *\n * @param {Object} obj1 The object to be extended.\n * @param {Object} obj2 The object to extend with.\n * @return {Object} The new extended object.\n * @ignore\n */\nMarkerClusterer.prototype.extend = function (obj1, obj2) {\n return (function (object) {\n var property;\n for (property in object.prototype) {\n this.prototype[property] = object.prototype[property];\n }\n return this;\n }).apply(obj1, [obj2]);\n};\n\n\n/**\n * The default function for determining the label text and style\n * for a cluster icon.\n *\n * @param {Array.