Currently I have an array called localMarker that stores both the
marker and the "respective" information window.
So localMarker looks something like this:
localMarker[0] = {marker object, information window object}
localMarker[1] = {marker object, information window object}
...
Anyways I use the term "respective" because the marker and the
information windows are linked in a way that the information window
shows the coordinates and the formatted address of the marker.
Currently my code properly displays the correct text in the
information window.
One last thing I have in the information window is an <a> link with an
onClick = "deleteMarker". So basically when you click the link I want
it to delete both the marker and the respective information window
from the map.
So here is the question: how do I pass the object of the information
window and the respective marker from the information window text?
(I know that I could alternatively assign the deleteMarker to
something else like clicking the marker, but I already have a function
for clicking the marker: it open/closes the information window)
Also sorry I can't post links, I'm under a corporate firewall and I
can't simply transfer the file to an online host since the site
requires a SQL database as well. I can post a copy of the JS script.
Here are some lines to notice:
Line 27: the piece of string that has the "Delete this marker" for the
information window content
Line 503: listener for clicking the map
Line 531: creating a single marker and its respective information
window
Line 622: "marking up" the plain text for the information window (I
keep the plain text for AJAX)
====================================================
var debugMode = true;
var mapShareURL = "mapshare.php";
var updateInterval = 1000;
var maxMarkerLimit = 10;
//var panStepInterval = 30;
//var panTime = 1000;
var map;
var geocoder;
var oMap;
var oStatus;
var oDebug;
// default view
var lat = 32.5;
var lng = 175;
var zoom = 3;
var mapType = "roadmap";
var newMarkersToSend = new Array();
var markersLocal = new Array();
var modifiedMarkersToSend = new Array();
var markersLocalIdentified = 0;
var markerDeleteString = "<br><br><a href='#' onClick='deleteMarker
(this);'>Delete this marker</a>";
//var tilesLoadingStatus = "Loading...";
var xmlHttpUpdateMap = createXmlHttpRequestObject();
var xmlRequestInfo;
var params;
var response;
window.onload = init;
function init() {
// debugging only available in Firefox's FireBug
if(typeof console === "undefined") {
console = {
log: function() {},
groupCollapsed: function() {},
groupEnd: function() {},
warn: function() {},
info: function() {}
};
}
console.log(modifiedMarkersToSend);
//console.log("init(): mode: " + xmlRequestInfo.mode);
oMap = document.getElementById("map");
oStatus = document.getElementById("status");
oDebug = document.getElementById("debug");
showStatus("Loading...");
map = new google.maps.Map(oMap, {
zoom: zoom,
center: new google.maps.LatLng(lat, lng),
mapTypeId: mapType
});
geocoder = new google.maps.Geocoder();
resetXmlRequest();
xmlRequestInfo.mode = "init"; // for updateMap();
xmlRequestInfo.center = true;
xmlRequestInfo.zoom = true;
xmlRequestInfo.mapType = true;
updateMap();
google.maps.event.addListener(map, 'center_changed', function()
{ eventCenterChanged(); } );
google.maps.event.addListener(map, 'zoom_changed', function()
{ eventZoomChanged(); } );
//google.maps.event.addListener(map, 'dragend', function()
{ eventDragEnd(); } );
google.maps.event.addListener(map, 'click', function(event)
{ eventClick(event.latLng); } );
google.maps.event.addListener(map, 'mapTypeId_changed', function()
{ eventMapTypeChanged(); } );
//google.maps.event.addListener(map, 'tilesloaded', function()
{ eventTilesLoaded(); } );
debugUpdateCenter();
debugUpdateZoom();
debugUpdateView();
debugUpdateTiles();
if(debugMode) {
oDebug.style.visibility = "visible";
document.getElementById("debug_markerId").innerHTML =
"No
markers selected.";
document.getElementById("debug_markerWindowOpen").innerHTML =
"No
markers selected.";
}
}
function showStatus(message) {
oStatus.innerHTML = message;
}
function createXmlHttpRequestObject() {
var xmlHttp;
try {
xmlHttp = new XMLHttpRequest();
} catch(e) {
// IE6 or older
var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
"MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP");
for(var i = 0; i < XmlHttpVersions.length && !xmlHttp; i++) {
try{
xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
} catch(e) { }
}
}
if(!xmlHttp)
alert("Error creating the XMLHttpRequest object.");
else
return xmlHttp;
}
function updateMap() {
console.log("mode", xmlRequestInfo.mode);
console.groupCollapsed("markers");
console.log("markersLocal", markersLocal);
console.log("modifiedMarkersToSend", modifiedMarkersToSend);
console.log("newMarkersToSend", newMarkersToSend);
console.groupEnd();
if(xmlHttpUpdateMap) {
//try {
if(xmlHttpUpdateMap.readyState == 4 ||
xmlHttpUpdateMap.readyState == 0) {
showStatus("Updating...");
params = "mode=" + xmlRequestInfo.mode;
//console.log("updateMap(): mode: " +
xmlRequestInfo.mode);
if(xmlRequestInfo.mode == "send" ||
xmlRequestInfo.mode == "init")
{
if(xmlRequestInfo.center)
params += "&lat=" + lat +
"&lng=" + lng;
if(xmlRequestInfo.zoom)
params += "&zoom=" + zoom;
if(xmlRequestInfo.mapType)
params += "&mapType=" + mapType;
if(xmlRequestInfo.clearMarkers) {
params += "&marker_count=0" +
"&newMarkers=deleteAll";
} else {
if(xmlRequestInfo.modifiedMarkers) {
// modified markers
already have ids
params +=
"&modifiedMarkers=" + createMarkersXml
(modifiedMarkersToSend, false);
}
if(xmlRequestInfo.newMarkers) {
// new markers don't
have ids
params +=
"&marker_count=" + newMarkersToSend.length +
"&newMarkers=" + createMarkersXml(newMarkersToSend, true);
}
}
}
xmlHttpUpdateMap.open("POST", mapShareURL,
true);
xmlHttpUpdateMap.setRequestHeader("Content-Type", "application/x-
www-form-urlencoded");
xmlHttpUpdateMap.onreadystatechange =
handleUpdatingMap;
xmlHttpUpdateMap.send(params);
} else { // busy
setTimeout("updateMap();", 1000);
}
//} catch(e) {
//alert("Can't connect to server:\n" + e.toString());
//}
} else {
alert("The XMLHttpRequest object is null!");
}
}
function handleUpdatingMap() {
if(xmlHttpUpdateMap.readyState == 4) {
if(xmlHttpUpdateMap.status == 200) {
//try {
//console.log("handleUpdateMap(): mode: " +
xmlRequestInfo.mode);
displayUpdates();
//} catch(e) {
//alert("Error updating the map:\n" +
e.toString() + "\n" +
xmlHttpUpdateMap.responseText);
//}
} else {
alert("There was a problem when updating the map:\n" +
xmlHttpUpdateMap.statusText);
}
}
}
function displayUpdates() {
console.log("displayUpdate()");
function parseAndCheckMarkers(markersXmlReceived) {
console.log("parseAndCheckMarkers()");
function isSameMarker(markerLocal, markerReceived) {
console.log("isSameMarker()");
// local markers are API markers, received markers are
custom made
// thus lat, lng, and text must be handled differently
between the
2 markers
console.log("local lat",
markerLocal.marker.position.lat(),
"received lat", markerReceived.lat);
if(markerLocal.marker.position.lat() !=
markerReceived.lat)
return false;
console.log("local lng",
markerLocal.marker.position.lng(),
"received lng", markerReceived.lng);
if(markerLocal.marker.position.lng() !=
markerReceived.lng)
return false;
console.log("local windowOpen",
markerLocal.marker.windowOpen,
"received windowOpen", markerReceived.windowOpen);
if(markerLocal.marker.windowOpen !=
markerReceived.windowOpen)
return false;
return true;
} // isSameMarker()
console.log("markersXmlReceived.length",
markersXmlReceived.length);
console.log("markersLocal.length", markersLocal.length);
console.log("markersXmlReceived", markersXmlReceived);
var markersReceived = new Array();
var i;
for(i = 0; i < markersXmlReceived.length; i++) {
markersReceived[i] = {
id: 0,
lat: 0,
lng: 0,
text: "",
windowOpen: false,
isLocal: false
};
markersReceived[i].id =
parseInt(markersXmlReceived
[i].getAttribute("id"));
markersReceived[i].lat =
parseFloat(markersXmlReceived
[i].getAttribute("lat"));
markersReceived[i].lng =
parseFloat(markersXmlReceived
[i].getAttribute("lng"));
markersReceived[i].text =
markersXmlReceived[i].getAttribute
("text");
markersReceived[i].windowOpen =
markersXmlReceived[i].getAttribute
("windowOpen") === "true";
}
console.log("markersReceived", markersReceived);
console.info("Identifying local markers...");
for(i = 0; i < markersLocal.length; i++) {
if(i < markersLocalIdentified) {
if(markersLocal[i].marker.id ==
markersReceived[i].id) {
markersReceived[i].isLocal = true;
} else {
console.warn("WARNING: Old marker ids
are somehow out of sync!");
console.groupCollapsed("Local marker #"
+ (i + 1) + " does not
sync with received marker #" + (i + 1));
console.log("Local id:",
markersLocal[i].marker.id);
console.log("Received id:",
markersReceived[i].id);
console.groupEnd();
}
} else {
console.warn("Local marker #" + (i + 1) + " is
unidentified!");
console.log("The unidentified marker",
markersLocal[i].marker);
// sync marker ids
var identified = false;
var j;
for(j = 0; j < markersReceived.length; j++) {
if(!markersReceived[j].isLocal) {
console.log("markersXmlReceived[" + j + "]", markersReceived
[j]);
if(isSameMarker(markersLocal[i], markersReceived[j])) {
markersLocal[i].marker.id = j + 1;
markersLocal[i].marker.set_zIndex(j + 1);
markersLocal[i].infoWindow.set_zIndex(j + 1);
identified = true;
markersLocalIdentified++;
markersReceived[j].isLocal = true;
break;
}
}
}
if(identified) {
console.info("Unidentified local marker
#" + (i + 1) + "
identified as " + (j + 1));
} else {
console.warn("WARNING: Sent local
marker # " + (i + 1) + " could
not be identified!");
}
}
}
if(markersLocal.length != markersLocalIdentified)
console.warn("WARNING: Something went wrong...");
console.info("Creating new markers...");
for(i = 0; i < markersReceived.length; i++) {
if(!markersReceived[i].isLocal) {
var location = new
google.maps.LatLng(markersReceived[i].lat,
markersReceived[i].lng);
createSingleMarker(location,
markersReceived[i].text,
markersReceived[i].windowOpen, markersReceived[i].id);
}
}
console.info("Sorting local markers...");
console.log("Unsorted", markersLocal);
markersLocal = markersLocal.sort(function(a, b) {
return a.marker.id - b.marker.id;
});
console.log("Sorted", markersLocal);
console.info("Validating local markers id...");
var error = false;
if(markersLocal.length != markersReceived.length) {
console.warn("Local markers length and received markers
length are
different!");
error = true;
} else {
for(i = 0; i < markersLocal.length; i++) {
if(markersLocal[i].marker.id !=
markersReceived[i].id) {
console.warn("WARNING: Marker ids are
somehow out of sync!");
console.groupCollapsed("Local marker #"
+ (i + 1) + " does not
sync with received marker #" + (i + 1));
console.log("Local id:",
markersLocal[i].marker.id);
console.log("Received id:",
markersReceived[i].id);
console.groupEnd();
error = true;
}
}
}
if(!error) {
console.log("Local markers ids valid");
}
console.info("Checking local markers for changes...");
var change = false;
for(i = 0; i < markersLocal.length; i++) {
// check for modifications and update markers if needed
if(markersLocal[i].marker.position.lat() !=
markersReceived[i].lat
|| markersLocal[i].marker.position.lng() != markersReceived[i].lng) {
console.log("marker position different");
markersLocal[i].marker.position = new
google.maps.LatLng
(markersReceived[i].lat, markersReceived[i].lng);
markersLocal[i].marker.set_map(null);
markersLocal[i].marker.set_map(map);
change = true;
}
if(markersLocal[i].marker.windowOpen != markersReceived
[i].windowOpen) {
console.log("marker windowOpen different");
markersLocal[i].marker.windowOpen =
markersReceived[i].windowOpen;
if(markersReceived[i].windowOpen) {
markersLocal[i].infoWindow.open(map,
markersLocal[i].marker);
} else {
markersLocal[i].infoWindow.close();
}
change = true;
}
var location = new
google.maps.LatLng(markersReceived[i].lat,
markersReceived[i].lng);
//console.log("Local marker's get_content()",
markersLocal
[i].infoWindow.get_content());
//console.log("Received marker's text", markupMarkerText
(markersReceived[i].text, location));
if(markersLocal[i].infoWindow.get_content() !=
markupMarkerText
(markersReceived[i].text, location)) {
console.log("marker text different");
markersLocal[i].infoWindow.set_content(markupMarkerText
(markersReceived[i].text, location));
change = true;
}
}
if(!change) {
console.log("All local markers are in sync.")
}
} // parseAndCheckMarkers()
response = xmlHttpUpdateMap.responseText;
if(response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0
|| response.length == 0)
throw(response.length == 0 ? "Response was empty!" : response);
response = xmlHttpUpdateMap.responseXML.documentElement;
var responseStatus = response.getElementsByTagName("status").item
(0).firstChild.data;
//console.log("displayUpdates()1: mode: " + xmlRequestInfo.mode);
if(responseStatus.indexOf("WARNING") >= 0) {
console.warn(responseStatus);
} else {
console.info(responseStatus);
}
lat = parseFloat(response.getElementsByTagName("lat").item
(0).firstChild.data);
lng = parseFloat(response.getElementsByTagName("lng").item
(0).firstChild.data);
zoom = parseInt(response.getElementsByTagName("zoom").item
(0).firstChild.data);
mapType = response.getElementsByTagName("mapType").item
(0).firstChild.data;
//console.log("displayUpdates()3: mode: " + xmlRequestInfo.mode);
var markerCountServer = parseInt(response.getElementsByTagName
("marker_count").item(0).firstChild.data);
var markersXmlReceived = response.getElementsByTagName("marker");
// need to create new markers locally
if(markersLocal.length && !markerCountServer) {
deleteAllMarkers(true);
} else if(markersLocal.length > markerCountServer) {
console.warn("WARNING: Local markers > Server. Something went
wrong!");
} else {
if(!xmlRequestInfo.clearMarkers && markersXmlReceived.length >
0)
parseAndCheckMarkers(markersXmlReceived);
}
// weird: after this block of code, xmlRequestInfo.mode = "send" ???
console.info("Checking if map view needs to be updated...");
var change = false;
if(lat != map.get_center().lat() || lng != map.get_center().lng()) {
console.log("map center different");
map.set_center(new google.maps.LatLng(lat, lng));
//panTo(map, oldLat, oldLng, lat, lng); // hopefully v3 API will
replace this custom made function in the future
change = true;
}
if(zoom != map.get_zoom()) {
console.log("map zoom different");
map.set_zoom(zoom);
change = true;
}
if(mapType != map.get_mapTypeId()) {
console.log("map type different");
map.set_mapTypeId(mapType);
change = true;
}
if(!change) {
console.log("Map is in sync.");
}
showStatus("Idle");
resetXmlRequest();
modifiedMarkersToSend.length = 0;
newMarkersToSend.length = 0;
if(!debugMode) setTimeout("updateMap();", updateInterval);
}
function createMarkerFromAddress(whichInput) {
var address = document.getElementById("address" + whichInput).value;
console.log("Address", address);
if(geocoder) {
geocoder.geocode({
address: address
}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (status !=
google.maps.GeocoderStatus.ZERO_RESULTS) {
var markerText = "";
xmlRequestInfo.mode = "send";
xmlRequestInfo.newMarkers = true;
if(status ==
google.maps.GeocoderStatus.OK) {
markerText = "Address: " +
results[0].formatted_address;
} else {
markerText = "Address: " +
status;
}
createSingleMarker(results[0].geometry.location, markerText,
true, 0);
} else {
alert("No results found.");
}
} else {
alert("Geocode was not successful for the
following reason: " +
status);
}
});
}
}
function getDirections() {
alert("Sorry, directions are currently not supported in version 3 of
Google Maps API.");
}
function resetXmlRequest() {
xmlRequestInfo = {
mode: "retrieve",
center: false,
zoom: false,
mapType: false,
modifiedMarkers: false,
newMarkers: false,
clearMarkers: false
};
}
function eventCenterChanged() {
tilesLoadingStatus = "Loading...";
xmlRequestInfo.mode = "send";
xmlRequestInfo.center = true;
lat = map.get_center().lat();
lng = map.get_center().lng();
debugUpdateCenter();
debugUpdateTiles();
}
function eventZoomChanged() {
tilesLoadingStatus = "Loading...";
xmlRequestInfo.mode = "send";
xmlRequestInfo.zoom = true;
zoom = map.get_zoom();
debugUpdateZoom();
debugUpdateTiles();
}
function eventMapTypeChanged() {
tilesLoadingStatus = "Loading...";
xmlRequestInfo.mode = "send";
xmlRequestInfo.mapType = true;
mapType = map.get_mapTypeId();
debugUpdateView();
debugUpdateTiles();
}
function eventDragEnd() {
}
function eventClick(location) {
console.log("eventClick()");
if(markersLocal.length >= maxMarkerLimit) {
alert("Sorry, too many markers!");
return;
}
if(geocoder) {
geocoder.geocode({
latLng: location
},
function(results, status) {
var markerText = "";
xmlRequestInfo.mode = "send";
xmlRequestInfo.newMarkers = true;
if(status == google.maps.GeocoderStatus.OK) {
markerText = "Address: " +
results[0].formatted_address;
} else {
markerText = "Address: " + status;
}
//console.log("evenClick(): " + markerText);
createSingleMarker(location, markerText, true, 0);
});
}
}
function createSingleMarker(location, markerText, markerWindowOpen,
id) {
console.groupCollapsed("createSingleMarker()");
console.log("markerWindowOpen", markerWindowOpen);
console.log("id", id);
console.groupEnd();
var marker = new google.maps.Marker({
position: location,
map: map,
zIndex: id//,
//draggable: true
});
var infoWindow = new google.maps.InfoWindow({
disableAutoPan: xmlRequestInfo.mode == "init",
zIndex: id
});
infoWindow.set_content(markupMarkerText(markerText, location));
if(markerWindowOpen) {
infoWindow.open(map, marker);
marker.windowOpen = true;
} else
marker.windowOpen = false;
google.maps.event.addListener(marker, 'click', function() {
if(marker.windowOpen) {
infoWindow.close();
marker.windowOpen = false;
} else {
infoWindow.open(map, marker);
marker.windowOpen = true;
}
modifiedMarkersToSend[marker.id] = {
marker: marker,
infoWindow: infoWindow
};
xmlRequestInfo.mode = "send";
xmlRequestInfo.modifiedMarkers = true;
});
google.maps.event.addListener(infoWindow, 'closeclick', function() {
xmlRequestInfo.mode = "send";
infoWindow.close();
marker.windowOpen = false;
modifiedMarkersToSend[marker.id] = {
marker: marker,
infoWindow: infoWindow
};
xmlRequestInfo.mode = "send";
xmlRequestInfo.modifiedMarkers = true;
});
if(debugMode) {
google.maps.event.addListener(marker, 'mouseover', function() {
var text;
if(!marker.id) {
text = "Not yet identified";
} else {
text = marker.id;
}
document.getElementById("debug_markerId").innerHTML =
text;
document.getElementById("debug_markerWindowOpen").innerHTML =
marker.windowOpen;
});
google.maps.event.addListener(marker, 'mouseout', function() {
document.getElementById("debug_markerId").innerHTML
= "No
markers selected.";
document.getElementById("debug_markerWindowOpen").innerHTML = "No
markers selected.";
});
}
if(id) { // Has id: Received
marker.id = id;
markersLocalIdentified++;
} else { // Doesn't have id: Local
newMarkersToSend.push({
marker: marker,
infoWindow: infoWindow
});
}
markersLocal.push({
marker: marker,
infoWindow: infoWindow
});
}
function markupMarkerText(markerText, location) {
markerText = "Lat: " + location.lat() + " Lng: " + location.lng() + "
" + markerText;
var prettyMarkerText = markerText.replace("Lat: ", "<b>Lat: </
b>").replace(" Lng: ", "<br><b>Lng: </b>").replace(" Address: ",
"<br><b>Address: </b>");
prettyMarkerText += markerDeleteString;
return prettyMarkerText;
}
function markdownMarkerText(prettyMarkerText) {
//console.groupCollapsed("markdownMarkerText()");
//console.log("prettyMarkerText", prettyMarkerText);
var markerText = prettyMarkerText.replace("<b>Lat: </b>", "Lat:
").replace("<br><b>Lng: </b>", " Lng: ").replace("<br><b>Address: </
b>", " Address: ").replace(markerDeleteString, "");
//console.log("markerText", markerText);
markerText = markerText.substring(markerText.indexOf(" Address: ") +
1, markerText.length);
//console.log("markerText", markerText);
//console.groupEnd();
return markerText;
}
function createMarkersXml(markersArrayToSend, isCreation) {
console.groupCollapsed("createMarkersXml()");
function createGeneralMarkersXml(markerGeneralArraytoSend,
isCreation) {
var xmlString = "";
for(i = 0; i < markerGeneralArraytoSend.length; i++) {
markerLat =
markerGeneralArraytoSend[i].marker.position.lat
();
markerLng =
markerGeneralArraytoSend[i].marker.position.lng
();
markerWindowOpen =
markerGeneralArraytoSend[i].marker.windowOpen;
prettyMarkerText = markerGeneralArraytoSend
[i].infoWindow.get_content();
//console.log("i = " + i + " markerLat: " + markerLat);
//console.log("i = " + i + " markerLng: " + markerLng);
//console.log("i = " + i + " markerWindowOpen: " +
markerWindowOpen);
//console.log("i = " + i + " prettyMarkerText: " +
prettyMarkerText);
xmlString += "<marker ";
if(!isCreation) {
xmlString += "id='" +
markerGeneralArraytoSend[i].marker.id + "'
";
}
xmlString += "lat='" + markerLat + "' lng='" +
markerLng + "'
text='" + markdownMarkerText(prettyMarkerText) + "' windowOpen='" +
markerWindowOpen + "'/>";
}
return xmlString;
}
console.log("isCreation", isCreation);
var markerGeneralArraytoSend = new Array();
var markerLat, markerLng, prettyMarkerText, markerWindowOpen;
var i;
if(!isCreation) { // for modifiedMarkers
for(i = 0; i < markersArrayToSend.length; i++) {
console.log("markersArrayToSend[" + i + "]",
markersArrayToSend
[i]);
if(typeof(markersArrayToSend[i]) != "undefined") {
markerGeneralArraytoSend.push(markersArrayToSend[i]);
}
}
} else { // for newMarkers
markerGeneralArraytoSend = markersArrayToSend;
}
console.log("markerGeneralArraytoSend", markerGeneralArraytoSend);
var xmlString = createGeneralMarkersXml(markerGeneralArraytoSend,
isCreation);
console.log("xmlString", xmlString);
console.groupEnd();
return xmlString;
}
function deleteMarker(obj) {
console.log("Deleting...");
}
function deleteAllMarkers(forcedAction) {
var confirmation = true;
if(!forcedAction)
confirmation = confirm("Delete all markers?");
if(confirmation) {
for(i = 0; i < markersLocal.length; i++) {
markersLocal[i].marker.set_map(null);
markersLocal[i].infoWindow.close();
}
markersLocal.length = 0;
markersLocalIdentified = 0;
xmlRequestInfo.mode = "send";
xmlRequestInfo.clearMarkers = true;
}
}
function openAllInfoWindows() {
modifiedMarkerArrayAllInfoWindow(true);
}
function closeAllInfoWindows() {
modifiedMarkerArrayAllInfoWindow(false);
}
function modifiedMarkerArrayAllInfoWindow(toOpen) {
modifiedMarkersToSend.length = 0;
var i;
for(i = 0; i < markersLocal.length; i++) {
var marker = markersLocal[i].marker;
var infoWindow = markersLocal[i].infoWindow;
var isOpen = marker.windowOpen;
var markerModified = false;
if(toOpen && !isOpen) {
marker.windowOpen = true;
infoWindow.open(map, marker);
markerModified = true;
} else if(!toOpen && isOpen) {
marker.windowOpen = false;
infoWindow.close();
markerModified = true;
}
if(markerModified) {
modifiedMarkersToSend[marker.id] = {
marker: marker,
infoWindow: infoWindow
};
xmlRequestInfo.mode = "send";
xmlRequestInfo.modifiedMarkers = true;
}
}
}
function eventTilesLoaded() {
tilesLoadingStatus = "Loading done!";
debugUpdateTiles();
}
function debugUpdateCenter() {
document.getElementById("debug_lat").innerHTML = lat;
document.getElementById("debug_lng").innerHTML = lng;
}
function debugUpdateZoom() {
document.getElementById("debug_zoom").innerHTML = zoom;
}
function debugUpdateView() {
document.getElementById("debug_mapType").innerHTML = mapType;
}
function debugUpdateTiles() {
// document.getElementById("debug_tiles").innerHTML =
tilesLoadingStatus;
}
// function is really buggy and thus currently deactivated
function panTo(map, oldLat, oldLng, lat, lng) {
function sign(exp) {
if(exp > 0) return 1;
if(exp < 0) return -1;
return 0;
}
function distance(lngFrom, lngTo) {
//convert to 0->360: 0 is the same position
function convert(lng) {
if(lng < 0) lng = 180 + Math.abs(180 + lng);
return lng;
}
lngFrom = convert(lngFrom);
lngTo = convert(lngTo);
return (lngTo - lngFrom) % 360;
}
function panAnimation(map, x, y) {
map.set_center(new google.maps.LatLng(x[step], y[step]));
step++;
setTimeout(function() {panAnimation(map, x, y)}, panTime /
panStepInterval);
}
var x = new Array();
var y = new Array();
var goEast = sign(180 - (lng - oldLng) % 360); // thanks Joel!
var goNorth = sign(lat - oldLat);
//console.log("goEast: " + goEast);
//console.log("goNorth: " + goNorth);
//convert lng to 0->360: 0 is the same position
//if(oldLng < 0) oldLng = 180 + Math.abs(180 + oldLng);
//if(lng < 0) lng = 180 + Math.abs(180 + lng);
var lngStep = distance(oldLng, lng) / (panStepInterval);
var latStep = distance(oldLat, lat) / (panStepInterval);
var step, value;
for(step = 0; step <= panStepInterval; step++) {
lngValue = oldLng + goEast * step * lngStep;
if(lngValue > 180) lngValue = -180 + lngValue % 180;
latValue = oldLat + goNorth * step * latStep;
x[step] = lngValue;
y[step] = latValue;
}
//console.log(x);
//console.log(y);
step = 0;
panAnimation(map, x, y);
}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Google Maps API" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/Google-Maps-API?hl=en
-~----------~----~----~----~------~----~------~--~---