function GCMap(centerLocation, mapTypeId, elementId){ var myOptions = { center: centerLocation, mapTypeId: mapTypeId }; this.map = new google.maps.Map(document.getElementById(elementId), myOptions); this.gcMarkers = []; this.bounds = new google.maps.LatLngBounds(); } GCMap.prototype = { map : undefined, bounds : undefined, refMarker : undefined, gcMarkers : undefined, defaultEventType : 0, listen: function(){ var self = this; //Escuchamos los eventos que nos lleguen (postMessage). Solo afectan al refMarker bindEvent(window, 'message', function (e) { var data = JSON.parse(e.data); if(data.radio){ if(self.refMarker){ if(!data.radio.isNaN){ self.refMarker.setAccuracy(data.radio); } } } if(data.position){ var latLng = new google.maps.LatLng(data.position.lat, data.position.lng); if(self.refMarker){ self.setLocationRefMarker(latLng); }else{ var refMarker = new GCMarker(latLng, false); self.setRefMarker(refMarker); self.setLocationRefMarker(latLng); } } }); }, setDefaulEventType: function(type){ this.defaultEventType = type; }, setRefMarker: function(gcMarker){ gcMarker.setMap(this.map, gcMarker.visible); this.refMarker = gcMarker; if(gcMarker.title != undefined){ gcMarker.marker.title = gcMarker.title; } var dotIcon = "green-dot.png"; if(gcMarker.icon != undefined){ dotIcon = gcMarker.icon; } this.refMarker.marker.setIcon("/gisc/icons/"+dotIcon); this.bounds.extend(this.refMarker.marker.position); this.refMarker.setEventType(this.defaultEventType); }, setLocationRefMarker: function(latLng, viewport){ if(this.refMarker != undefined){ this.refMarker.clean(); } this.refMarker.marker.position = latLng; this.refMarker.marker.setMap(this.map); if(this.refMarker.accuracy != undefined){ this.refMarker.setAccuracy(this.refMarker.accuracy); } if (viewport) { this.resetBounds(); this.unionBounds(viewport); }else{ this.extendBounds(latLng); } this.fitBounds(); this.refMarker.calculateAddress(true); }, addMarker: function(gcMarker){ gcMarker.setMap(this.map, gcMarker.visible); this.gcMarkers.push(gcMarker); if(gcMarker.visible){ this.bounds.extend(gcMarker.marker.position); } gcMarker.setEventType(this.defaultEventType); var dotIcon = "red-dot.png"; if(gcMarker.icon != undefined){ dotIcon = gcMarker.icon; } gcMarker.marker.setIcon("/gisc/icons/"+dotIcon); if(gcMarker.title != undefined){ gcMarker.marker.title = gcMarker.title; } }, fitBounds: function(){ this.map.fitBounds(this.bounds); }, extendBounds: function(location){ this.bounds.extend(location); }, unionBounds: function(viewport){ this.bounds.union(viewport); }, setZoom:function(zoom){ if(!zoom.isNaN){ var self = this; var listener = google.maps.event.addListener(this.map, "idle", function() { if (self.map.getZoom() != zoom) { self.map.setZoom(zoom); } google.maps.event.removeListener(listener); }); } }, resetBounds: function(){ this.bounds = null; delete this.bounds; this.bounds = new google.maps.LatLngBounds(null); if(this.refMarker != undefined){ this.bounds.extend(this.refMarker.marker.getPosition()); } for(var i in this.markers){ this.bounds.extend(this.markers[i].marker.getPosition()); } this.map.fitBounds(this.bounds); }, drawSearchBox: function(elementId){ var self = this; //Metemos el buscador de googlemaps var input = document.getElementById(elementId); var searchBox = new google.maps.places.SearchBox(input); this.map.controls[google.maps.ControlPosition.TOP_LEFT].push(input); //Bias the SearchBox results towards current map's viewport. this.map.addListener('bounds_changed', function() { searchBox.setBounds(self.map.getBounds()); }); // [START region_getplaces] // Listen for the event fired when the user selects a prediction and retrieve // more details for that place. searchBox.addListener('places_changed', function() { var places = searchBox.getPlaces(); if (places.length == 0) { return; } var place = places[0]; self.setLocationRefMarker(place.geometry.location, place.geometry.viewport); }); }, drawRedVial: function(carreteraElementId, kmElementId, btnElementId, resultsElementId){ var self = this; var resultsSelect = document.getElementById(resultsElementId); var btn = document.getElementById(btnElementId); var carretera = document.getElementById(carreteraElementId); var km = document.getElementById(kmElementId); var results = []; btn.addEventListener('click', function(event){ //Limpiamos todas las opciones anteriores for(i = resultsSelect.options.length - 1 ; i >= 0 ; i--){ resultsSelect.remove(i); } resultsSelect.style.visibility = 'hidden'; var xhr = new XMLHttpRequest(); xhr.open("GET","/gisc/services/roadsgeocoder.do?carretera="+carretera.value+"&km="+km.value,true); xhr.send(); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ results = JSON.parse(xhr.responseText); if(results != undefined && results.length > 1){ resultsSelect.style.visibility = 'visible'; for(var i=0; i