1/*! 2 * jQuery Google Map 3 * 4 * @author Pragmatic Mates, http://pragmaticmates.com 5 * @version 1.2 6 * @license GPL 2 7 * @link https://github.com/PragmaticMates/jquery-google-map 8 */ 9 10 11(function ($) { 12 var settings; 13 var element; 14 var map; 15 var markers = new Array(); 16 var markerCluster; 17 var clustersOnMap = new Array(); 18 var clusterListener; 19 20 var methods = { 21 init: function (options) { 22 element = $(this); 23 var defaults = $.extend({ 24 geolocation: false, 25 styles: null, 26 zoom: 14, 27 markers: [], 28 infowindow: { 29 borderBottomSpacing: 6, 30 height: 150, 31 width: 340, 32 offsetX: -21, 33 offsetY: -21 34 }, 35 marker: { 36 height: 40, 37 width: 40 38 }, 39 cluster: { 40 height: 40, 41 width: 40, 42 gridSize: 40 43 } 44 }); 45 46 settings = $.extend({}, defaults, options); 47 48 loadMap(); 49 50 if (options.callback) { 51 options.callback(); 52 } 53 54 return $(this); 55 }, 56 57 removeMarkers: function () { 58 for (i = 0; i < markers.length; i++) { 59 markers[i].infobox.close(); 60 markers[i].marker.close(); 61 markers[i].setMap(null); 62 } 63 64 markerCluster.clearMarkers(); 65 66 $.each(clustersOnMap, function (index, cluster) { 67 cluster.cluster.close(); 68 }); 69 70 clusterListener.remove(); 71 }, 72 73 addMarkers: function (options) { 74 markers = new Array(); 75 settings.locations = options.locations; 76 settings.contents = options.contents; 77 settings.types = options.types; 78 settings.markers = options.markers; 79 80 renderElements(); 81 82 if (settings.center === undefined) { 83 if ( settings.markers.length > 1 ) { 84 var bound = new google.maps.LatLngBounds(); 85 for (var i in settings.markers) { 86 bound.extend(new google.maps.LatLng(settings.markers[i].latitude, settings.markers[i].longitude)); 87 } 88 map.fitBounds(bound); 89 } else { 90 for (var i in settings.markers) { 91 map.setCenter( new google.maps.LatLng(settings.markers[i].latitude, settings.markers[i].longitude) ); 92 } 93 } 94 } 95 } 96 } 97 98 $.fn.google_map = function (method) { 99 if (methods[method]) { 100 return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1)); 101 } else if (typeof method === 'object' || !method) { 102 return methods.init.apply(this, arguments); 103 } else { 104 $.error('Method ' + method + ' does not exist on Aviators Map'); 105 } 106 }; 107 108 function loadMap() { 109 var mapOptions = { 110 zoom: settings.zoom, 111 styles: settings.styles, 112 mapTypeId: google.maps.MapTypeId.ROADMAP, 113 scrollwheel: false, 114 draggable: true, 115 mapTypeControl: false, 116 panControl: false, 117 zoomControl: true, 118 zoomControlOptions: { 119 style: google.maps.ZoomControlStyle.SMALL, 120 position: google.maps.ControlPosition.LEFT_BOTTOM 121 } 122 }; 123 124 if (settings.center !== undefined) { 125 mapOptions.center = new google.maps.LatLng(settings.center.latitude, settings.center.longitude); 126 } 127 128 map = new google.maps.Map($(element)[0], mapOptions); 129 130 if (settings.geolocation) { 131 if (navigator.geolocation) { 132 browserSupportFlag = true; 133 navigator.geolocation.getCurrentPosition(function (position) { 134 initialLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); 135 map.setCenter(initialLocation); 136 }, function () { 137 map.center = new google.maps.LatLng(settings.center.latitude, settings.center.longitude); 138 }); 139 } else { 140 browserSupportFlag = false; 141 map.center = new google.maps.LatLng(settings.center.latitude, settings.center.longitude); 142 } 143 } 144 145 if (settings.center === undefined) { 146 if ( settings.markers.length > 1 ) { 147 var bound = new google.maps.LatLngBounds(); 148 for (var i in settings.markers) { 149 bound.extend(new google.maps.LatLng(settings.markers[i].latitude, settings.markers[i].longitude)); 150 } 151 map.fitBounds(bound); 152 } else { 153 for (var i in settings.markers) { 154 map.setCenter( new google.maps.LatLng(settings.markers[i].latitude, settings.markers[i].longitude) ); 155 } 156 } 157 } 158 159 google.maps.event.addListener(map, 'zoom_changed', function () { 160 $.each(markers, function (index, marker) { 161 if (marker.infobox !== undefined) { 162 marker.infobox.close(); 163 marker.infobox.isOpen = false;
164 } 165 }); 166 }); 167 168 renderElements(); 169 clickClusterOnMap(); 170 171 $('body').on('click', '.marker', function(){ 172 var id = $(this).data('id'); 173 $.each(markers, function (index, marker) { 174 var marker_content = $(marker.marker.getContent()); 175 var marker_id = marker_content.data('id'); 176 if ( id == marker_id ) { 177 if (marker.infobox !== undefined) { 178 var curMarker = this; 179 180 $.each(markers, function (index, marker) { 181 if (marker !== curMarker) { 182 marker.infobox.close(); 183 marker.infobox.isOpen = false; 184 } 185 }); 186 // center marker 187 map.panTo(curMarker.getPosition()); 188 189 if (curMarker.infobox) { 190 if (curMarker.infobox.isOpen === false) { 191 curMarker.infobox.open(map, this); 192 curMarker.infobox.isOpen = true; 193 } else { 194 curMarker.infobox.close(); 195 curMarker.infobox.isOpen = false; 196 } 197 } 198 } 199 } 200 }); 201 }); 202 } 203 204 function isClusterOnMap(clustersOnMap, cluster) { 205 if (cluster === undefined) { 206 return false; 207 } 208 209 if (clustersOnMap.length == 0) { 210 return false; 211 } 212 213 var val = false; 214 215 $.each(clustersOnMap, function (index, cluster_on_map) { 216 if (cluster_on_map.getCenter() == cluster.getCenter()) { 217 val = cluster_on_map; 218 } 219 }); 220 221 return val; 222 } 223 224 function clickClusterOnMap() { 225 $('body').on('click', '.clusterer', function(){ 226 var center = $(this).data('center'); 227 var cluster = false; 228 $.each(clustersOnMap, function (index, cluster_on_map) { 229 if (cluster_on_map.getCenter() == center) { 230 231 cluster = cluster_on_map; 232 } 233 }); 234 235 if ( cluster ) { 236 map.setCenter(cluster.getCenter()); 237 map.fitBounds(cluster.getBounds()); 238 } 239 }); 240 } 241 242 function addClusterOnMap(cluster) { 243 // Hide all cluster's markers 244 $.each(cluster.getMarkers(), (function () { 245 if (this.marker.isHidden == false) { 246 this.marker.isHidden = true; 247 this.marker.close(); 248 } 249 })); 250 251 var newCluster = new InfoBox({ 252 markers: cluster.getMarkers(), 253 draggable: true, 254 content: '<div class="clusterer" data-center="'+cluster.getCenter()+'"><div class="clusterer-inner">' + cluster.getMarkers().length + '</div></div>', 255 disableAutoPan: true, 256 pixelOffset: new google.maps.Size(-21, -21), 257 position: cluster.getCenter(), 258 closeBoxURL: "", 259 isHidden: false, 260 enableEventPropagation: true, 261 pane: "floatPane" 262 }); 263 264 cluster.cluster = newCluster; 265 266 cluster.markers = cluster.getMarkers(); 267 cluster.cluster.open(map, cluster.marker); 268 clustersOnMap.push(cluster); 269 } 270 271 function renderElements() { 272 $.each(settings.markers, function (index, markerObject) { 273 // Create invisible markers on the map 274 var args = { 275 position: new google.maps.LatLng(markerObject.latitude, markerObject.longitude), 276 map: map, 277 }; 278 279 if (settings.transparentMarkerImage) { 280 args['icon'] = { 281 url: settings.transparentMarkerImage, 282 size: new google.maps.Size(settings.marker.width, settings.marker.height) 283 }; 284 } 285 286 var marker = new google.maps.Marker(args); 287 288 // Create infobox for infowindow 289 if (markerObject.content) { 290 marker.infobox = new InfoBox({ 291 content: markerObject.content, 292 disableAutoPan: true, 293 pixelOffset: new google.maps.Size(settings.infowindow.offsetX, settings.infowindow.offsetY, settings.infowindow.offsetX, settings.infowindow.offsetY), 294 position: new google.maps.LatLng(markerObject.latitude, markerObject.longitude), 295 isHidden: false, 296 closeBoxURL: "", 297 pane: "floatPane", 298 enableEventPropagation: false 299 }); 300 301 marker.infobox.isOpen = false; 302 } 303 304 // Create infobox for marker 305 marker.marker = new InfoBox({ 306 draggable: true, 307 content: markerObject.marker_content, 308 disableAutoPan: true, 309 pixelOffset: new google.maps.Size(-settings.marker.width/2, -settings.marker.height), 310 position: new google.maps.LatLng(markerObject.latitude, markerObject.longitude), 311 closeBoxURL: "", 312 isHidden: false, 313 pane: "floatPane", 314 enableEventPropagation: true, 315 }); 316
317 // Handle logic for opening/closing info windows 318 marker.marker.isHidden = false; 319 marker.marker.open(map, marker); 320 markers.push(marker); 321 322 google.maps.event.addListener(marker, 'click', function (e) { 323 if (marker.infobox !== undefined) { 324 var curMarker = this; 325 326 $.each(markers, function (index, marker) { 327 if (marker !== curMarker) { 328 marker.infobox.close(); 329 marker.infobox.isOpen = false; 330 } 331 }); 332 // center marker 333 map.panTo(curMarker.getPosition()); 334 335 if (curMarker.infobox) { 336 if (curMarker.infobox.isOpen === false) { 337 curMarker.infobox.open(map, this); 338 curMarker.infobox.isOpen = true; 339 } else { 340 curMarker.infobox.close(); 341 curMarker.infobox.isOpen = false; 342 } 343 } 344 } 345 }); 346 }); 347 348 markerCluster = new MarkerClusterer(map, markers, { 349 gridSize: settings.cluster.gridSize, 350 styles: [ 351 { 352 textColor: 'transparent', 353 height: settings.cluster.height, 354 url: settings.transparentClusterImage, 355 width: settings.cluster.width 356 } 357 ] 358 }); 359 360 clustersOnMap = new Array(); 361 clusterListener = google.maps.event.addListener(markerCluster, 'clusteringend', function (clusterer) { 362 var availableClusters = clusterer.getClusters(); 363 var activeClusters = new Array(); 364 365 $.each(availableClusters, function (index, cluster) { 366 if (cluster.getMarkers().length > 1) { 367 activeClusters.push(cluster); 368 } 369 }); 370 371 $.each(availableClusters, function (index, cluster) { 372 if (cluster.getMarkers().length > 1) { 373 var val = isClusterOnMap(clustersOnMap, cluster); 374 375 if (val !== false) { 376 val.cluster.setContent('<div class="clusterer" data-center="'+cluster.getCenter()+'"><div class="clusterer-inner">' + cluster.getMarkers().length + '</div></div>'); 377 val.markers = cluster.getMarkers(); 378 $.each(cluster.getMarkers(), (function (index, marker) { 379 if (marker.marker.isHidden == false) { 380 marker.marker.isHidden = true; 381 marker.marker.close(); 382 } 383 })); 384 } else { 385 addClusterOnMap(cluster); 386 } 387 } else { 388 // Show all markers without the cluster 389 $.each(cluster.getMarkers(), function (index, marker) { 390 if (marker.marker.isHidden == true) { 391 marker.marker.open(map, this); 392 marker.marker.isHidden = false; 393 } 394 }); 395 396 // Remove old cluster 397 $.each(clustersOnMap, function (index, cluster_on_map) { 398 if (cluster !== undefined && cluster_on_map !== undefined) { 399 if (cluster_on_map.getCenter() == cluster.getCenter()) { 400 // Show all cluster's markers 401 cluster_on_map.cluster.close(); 402 clustersOnMap.splice(index, 1); 403 } 404 } 405 }); 406 } 407 }); 408 409 var newClustersOnMap = new Array(); 410 411 $.each(clustersOnMap, function (index, clusterOnMap) { 412 var remove = true; 413 414 $.each(availableClusters, function (index2, availableCluster) { 415 if (availableCluster.getCenter() == clusterOnMap.getCenter()) { 416 remove = false; 417 } 418 }); 419 420 if (!remove) { 421 newClustersOnMap.push(clusterOnMap); 422 } else { 423 clusterOnMap.cluster.close(); 424 } 425 }); 426 427 clustersOnMap = newClustersOnMap; 428 }); 429 430 431 $(document).on('click', '.infobox .close', function(e) { 432 e.preventDefault(); 433 434 $.each(markers, function(index, marker) { 435 marker.infobox.isHidden = true; 436 marker.infobox.close(); 437 }); 438 }); 439 } 440})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.