// **************************************************
//
// Copyright (C) 2005 chelseaartgalleries.com
// All Rights Reserved
//
// **************************************************
var map = null;
var drawMap = false;
var globalMarkers = [];
var globalMapInfo = {};
var globalMapArray = [];
var enableZoomTool = false;
var enableTypeTool = false;
var mapZoomLevel = 15;
var geocoder = null;
var mapPoly = null;
var enableMapPolygon = false;
var mapPolygonInfo = [];
var locationMaps = {};
var locationMapsCnt = {};
var initLocationsFunction = function() {return false;};
var neighborhoodPolygons = {};
// Create a base icon for all of our markers that specifies the shadow, icon
// dimensions, etc.
//var baseIcon = new google.maps.Marker(
// new Size(20, 34),
//baseIcon.shadow =
//baseIcon.iconSize = new G
//baseIcon.shadowSize = new GSize(37, 34);
//baseIcon.iconAnchor = new GPoint(9, 34);
//baseIcon.infoWindowAnchor = new GPoint(9, 2);
//baseIcon.infoShadowAnchor = new GPoint(18, 25);
function pushMarker(div, marker) {
globalMapInfo[div].markers.push(marker);
}
function enableMap(enableZoom, enableType) {
drawMap = true;
enableZoomTool = enableZoom;
enableTypeTool = enableType;
}
function enableMapWithMarkers(enableZoom, enableType, markers) {
drawMap = true;
enableZoomTool = enableZoom;
enableTypeTool = enableType;
globalMarkers = markers;
}
function moveCenter(longitude, latitude, zoom, divName) {
//map.centerAndZoom(new GPoint(longitude, latitude), zoom);
// use bounds, and allow arrays of coords
if (divName == null) divName = 'mapcontainer'; // backwd compatible
var map = globalMapInfo[divName].map;
if (! (longitude instanceof Array)) {
longitude = [longitude];
latitude = [latitude];
}
var bounds = null;
for (i = 0; i < longitude.length; i++) {
var longcoord = longitude[i];
var latcoord = latitude[i];
var point = new google.maps.LatLng(latcoord, longcoord);
if (i == 0) {
bounds = new google.maps.LatLngBounds(point, point);
// make sure map not too small
bounds.extend(new google.maps.LatLng(latcoord + 0.005, longcoord + 0.005));
bounds.extend(new google.maps.LatLng(latcoord - 0.005, longcoord - 0.005));
}
else {
bounds.extend(point);
}
}
map.fitBounds(bounds); //setCenter(lastPoint);
}
function setZoomLevel(zoomLevel) {
mapZoomLevel = zoomLevel;
}
var standardMapShadow = null;
var smallMapShadow = null;
var starMapShadow = null;
function setPositionFromCoordinates(div, cnt) {
var latitude = document.getElementById('latitude_' + cnt).value;
var longitude = document.getElementById('longitude_' + cnt).value;
var point = new google.maps.LatLng(latitude, longitude);
var mapInfo = locationMaps[div];
var map = mapInfo[3];
var dragMarker = mapInfo[4];
dragMarker.setPosition(point);
map.setCenter(point);
}
function updateAddressFromAddress(div, cnt, doit) {
var addr = document.getElementById('address_' + cnt).value;
var city = document.getElementById('city_' + cnt).value;
var region = document.getElementById('state_region_' + cnt).value;
var postal = document.getElementById('postal_code_' + cnt).value;
var el = document.getElementById('country_' + cnt);
var country = el.options[el.selectedIndex].text;
document.getElementById(div + "_address").value = addr + ', ' + city + ', ' + region + ', ' + postal + ', ' + country;
locationUnVerified(cnt);
if (doit != null || (cnt == '' && country != '')) {
setMapWarning(div, '');
codeAddress(cnt, div, city, country);
}
else if (country != '') {
setMapWarning(div, 'Address has changed. You might want to map the new address by clicking MAP ADDRESS above.');
displayRemapAddressChange(cnt, true);
}
}
function codeAddress(cnt, div, city, country) {
var address = document.getElementById(div + "_address").value;
var mapInfo = locationMaps[div];
var map = mapInfo[3];
var dragMarker = mapInfo[4];
if (geocoder) {
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var type = results[0].geometry.location_type;
//if (google.maps.GeocoderStatus.OK
var viewPort = results[0].geometry.viewport;
var point = results[0].geometry.location;
if (type == google.maps.GeocoderLocationType.ROOFTOP) {
map.setCenter(point);
map.setZoom(16);
setMapWarning(div, 'If you are happy with generated position, please press CONFIRM LOCATION above. You may manually adjust the location by dragging the star above.', true);
}
else if (type == google.maps.GeocoderLocationType.RANGE_INTERPOLATED) {
map.setCenter(point);
map.setZoom(16);
setMapWarning(div, 'The map position is approximate. You might want to adjust it by dragging the star above into a more accurate position. When you are happy with position, please press CONFIRM LOCATION above.');
}
else {
// GEOMETRIC_CENTER
// APPROXIMATE
map.fitBounds(viewPort);
//var zoom = map.getZoom();
alert('The map position is approximate. You need to zoom in to set the exact location.');
setMapWarning(div, 'Zoom in (click the [+] on the map), then fine adjust the position my dragging the star above into a more accurate position.');
}
dragMarker.setPosition(point);
updateMarkerPosition(cnt, point);
displayRemapAddressChange(cnt, false);
} else {
if (city != '' && country != '') {
geocoder.geocode( { 'address': city + ', ' + country}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var viewPort = results[0].geometry.viewport;
var point = results[0].geometry.location;
map.fitBounds(viewPort);
dragMarker.setPosition(point);
updateMarkerPosition(cnt, point);
alert("Location not found");
displayRemapAddressChange(cnt, true);
setMapWarning(div, 'No exact position could be set for this address. You may modify the address and try again, or you can zoom in (using [+] on the map) and drag the star manually to set the correct location. Click CONFIRM LOCATION when done. If no accurate map exists, you may reject mapping by clicking DISPLAY NO MAP.', true);
}
} );
}
else {
alert("Location not found");
displayRemapAddressChange(cnt, true);
setMapWarning(div, 'No exact position could be set for this address. You may modify the address and try again, or you can zoom in (using [+] on the map) and drag the star manually to set the correct location. Click CONFIRM LOCATION when done. If no accurate map exists, you may reject mapping by clicking DISPLAY NO MAP.', true);
}
}
});
}
}
function setMapWarning(div, txt, warning) {
if (txt == '') {
document.getElementById(div + '_warning').innerHTML = txt;
}
else {
if (warning != null) {
document.getElementById(div + '_warning').innerHTML = '
' + txt + '
';
}
else {
document.getElementById(div + '_warning').innerHTML = '' + txt + '
';
}
}
}
// for editing gallery info locations, including adjusting gallery marker position
// not used for display!
function initLocationMap(cnt, div) {
var mapInfo = locationMaps[div];
var mapDiv = document.getElementById(div);
var precision = 0;
if (mapDiv != null) {
var longitude = mapInfo[0];
var latitude = mapInfo[1];
var precision = mapInfo[2];
var zoomLevel = 16;
var warn = '';
if (longitude == '') {
latitude = 0;
longitude = 0;
zoomLevel = 0;
warn = 'NO MAPPED LOCATION IS YET AVAILABLE.
Enter an address to set a location, or zoom in and move the star above to the correct location.';
setMapWarning(div, warn);
}
var point = new google.maps.LatLng(latitude, longitude);
var mapOptions = {zoom: zoomLevel,
center: point,
mapTypeId: google.maps.MapTypeId.ROADMAP};
var map = new google.maps.Map(mapDiv, mapOptions);
createMarker(map, point, -1, 4, 'Original Location', 'HTML');
var dragMarker = createMarker(map, point, -1, 3, '', '', true);
// Add dragging event listeners.
google.maps.event.addListener(dragMarker, 'dragstart', function() {
//updateMarkerAddress(div, 'Dragging...');
});
google.maps.event.addListener(dragMarker, 'drag', function() {
//updateMarkerStatus(div, 'Dragging...');
updateMarkerPosition(cnt, dragMarker.getPosition());
});
google.maps.event.addListener(dragMarker, 'dragend', function() {
updateMarkerStatus(cnt, div, 'Drag ended');
});
locationMaps[div][3] = map;
locationMaps[div][4] = dragMarker;
locationMaps[div][5] = point;
locationMaps[div][6] = zoomLevel;
locationMaps[div][7] = warn;
locationMaps[div][8] = cnt;
}
return precision;
}
function adjustPolyLabels(map) {
if (map.getZoom() < 12) {
hidePolyLabels();
}
else {
showPolyLabels();
}
}
function hidePolyLabels(map) {
mapPolyOverlay.hideLabels();
mapPolyOverlay.labelIsHidden = true;
}
function showPolyLabels(map) {
mapPolyOverlay.showLabels();
mapPolyOverlay.labelIsHidden = false;
}
function renderNeighborhoodPolygons(map, polygons, forPrint) {
mapPolyOverlay = map.OAWOverlay; // new OAWOverlay(map);
var totalLatMin = 10000;
var totalLatMax = -10000;
var totalLongMin = 10000;
var totalLongMax = -10000;
for (var hood in polygons) {
var polygonArray = polygons[hood].poly;
var label = polygons[hood].label;
var color = polygons[hood].color;
var edit = polygons[hood].edit;
var nurl = polygons[hood].url;
label.replace(' & ', ' ');
var paths = new google.maps.MVCArray();
var pathCoordinates = new google.maps.MVCArray();
paths.insertAt(0, pathCoordinates);
var polyOptions = {
paths: paths,
strokeColor: '#333333',
strokeOpacity: 0.8,
strokeWeight: 1,
fillColor: color
}
var hoodPoly = new google.maps.Polygon(polyOptions);
if (edit) {
mapPoly = hoodPoly;
}
var latTotal = 0;
var longTotal = 0;
var latMin = 10000;
var latMax = -10000;
var longMin = 10000;
var longMax = -10000;
for (var i = 0; i < polygonArray.length; i++) {
var latitude = polygonArray[i][0];
var longitude = polygonArray[i][1];
latTotal += latitude;
longTotal += longitude;
if (latitude < latMin) latMin = latitude;
if (latitude > latMax) latMax = latitude;
if (longitude < longMin) longMin = longitude;
if (longitude > longMax) longMax = longitude;
if (edit) {
addLatLngPolyPoint(new google.maps.LatLng(latitude, longitude), i, map);
}
else {
pathCoordinates.push(new google.maps.LatLng(latitude, longitude));
}
}
if (latMin < totalLatMin) totalLatMin = latMin;
if (latMax > totalLatMax) totalLatMax = latMax;
if (longMin < totalLongMin) totalLongMin = longMin;
if (longMax > totalLongMax) totalLongMax = longMax;
var overlayPoint = new google.maps.LatLng((latMax + latMin) / 2,
(longMax + longMin) / 2);
//google.maps.event.addListener(hoodPoly, 'click', function(h) {return function(event) {alert(h);}}(hood));
hoodPoly.setMap(map);
var obj = new MapOverlayObject('text', overlayPoint, [label,nurl], true);
mapPolyOverlay.addObject(obj);
google.maps.event.addListener(hoodPoly,"mousemove",function(obj_,hood_) {return function(event) {showPolyLabel(event, obj_, hood_)}}(obj, hood));
}
var point = new google.maps.LatLng(totalLatMin, totalLongMin);
var bounds = new google.maps.LatLngBounds(point, point);
bounds.extend(new google.maps.LatLng(totalLatMax, totalLongMax));
return bounds;
}
function MapOverlayObject(type, latlng, value, allowHiding) {
this.type = type;
this.latlng = latlng;
this.value = value;
this.adjustX = 0;
this.adjustY = 0;
this.allowHiding = (allowHiding?true:false);
this.labelIsHidden = false;
}
var oldPolyLabelInfo = null;
function tweenOutPolyLabel(el) {
var cfun = function() {el.style.display = 'none'; setOpacity(el.style, 50); showPolyLabel(null, null, '')};
var gfun = function(obj) {return 50;};
JSTweener.addTween(el.style, {time: 0.5, transition: 'easeOutQuad', opacity:0, getter:{opacity:gfun}, setter:{opacity:setOpacity}, onComplete:cfun});
}
function showPolyLabel(event, obj, hood) {
if (oldPolyLabelInfo != null) {
clearTimeout(oldPolyLabelInfo[2]);
if (oldPolyLabelInfo[0] != hood) {
if (oldPolyLabelInfo[1]) {
oldPolyLabelInfo[1].div.style.display = 'none';
}
}
}
if (obj != null) {
if (obj.labelIsHidden) {
JSTweener.addTween(obj.div, {});
var tim = setTimeout(function() {tweenOutPolyLabel(obj.div);}, 1000);
oldPolyLabelInfo = [hood, obj, tim];
obj.div.style.display = 'block';
}
}
}
function resetMarkerPosition(cnt, div, longitude, latitude) {
var mapInfo = locationMaps[div];
var longitude = mapInfo[0];
var latitude = mapInfo[1];
var precision = mapInfo[2];
if (mapInfo.oldPrecision) {
precision = mapInfo.oldPrecision;
locationMaps[div][2] = precision;
}
var map = mapInfo[3];
var dragMarker = mapInfo[4];
var point = mapInfo[5];
var zoomLevel = mapInfo[6];
var warn = mapInfo[7];
dragMarker.setPosition(point);
map.setCenter(point);
map.setZoom(zoomLevel);
updateMarkerPosition(cnt, point, precision);
setMapWarning(div, warn);
if (precision >= 100) {
locationVerified(cnt, true);
}
displayCancelGeoChange(cnt, false);
}
function getMapZoomLevel(div) {
var mapInfo = locationMaps[div];
var map = mapInfo[3];
var zoom = map.getZoom();
return zoom;
}
function updateMarkerStatus(cnt, div, str) {
//document.getElementById(div + '_markerStatus').innerHTML = str;
var mapInfo = locationMaps[div];
var longitude = mapInfo[0];
var latitude = mapInfo[1];
var map = mapInfo[3];
var zoom = map.getZoom();
setMapWarning(div, 'The position has changed!
You need to confirm it above before saving.');
locationUnVerified(cnt);
displayCancelGeoChange(cnt, true);
/**
if (zoom < 16) {
alert('You need to zoom in to set the exact location.');
setMapWarning(div, 'Zoom In (click the [+] on the map),
then fine adjust the position by moving the star.');
}
else {
}
**/
}
function updateMarkerPosition(cnt, latLng, precision) {
document.getElementById('longitude_' + cnt).value = latLng.lng();
document.getElementById('latitude_' + cnt).value = latLng.lat();
if (precision != null) {
document.getElementById('geo_precision_' + cnt).value = precision;
}
}
function updateMarkerAddress(div, str) {
//document.getElementById(div + '_address').innerHTML = str;
}
function enablePolygonCreation(map) {
// We create pathCoordinates as an MVCArray so we can
// manipulate it using the insertAt() method
var paths = new google.maps.MVCArray();
var pathCoordinates = new google.maps.MVCArray();
paths.insertAt(0, pathCoordinates);
var polyOptions = {
paths: paths,
strokeColor: '#444444',
strokeOpacity: 0.8,
strokeWeight: 2
}
mapPoly = new google.maps.Polygon(polyOptions);
mapPoly.setMap(map);
// Add a listener for the click event
google.maps.event.addListener(map, 'click', function(event) {addLatLngPoly(event, map);});
}
function updateMapPolyDisplay() {
el = document.getElementById(enableMapPolygon);
if (el != null) {
var path = mapPoly.getPath();
var len = path.getLength();
var str = '';
for (var i = 0; i < len; i++) {
var point = path.getAt(i);
str += 'array' + point.toString() + ',';
}
el.value = str;
}
}
function splitMapPolyPoint(ppos) {
var pos = mapPolygonInfo[ppos][0];
var win = mapPolygonInfo[ppos][2];
var path = mapPoly.getPath();
var point = path.getAt(pos);
win.close();
addLatLngPolyPoint(point, pos + 1, map);
}
function deleteMapPolyPoint(ppos) {
var pos = mapPolygonInfo[ppos][0];
var marker = mapPolygonInfo[ppos][1];
var win = mapPolygonInfo[ppos][2];
var path = mapPoly.getPath();
path.removeAt(pos);
marker.setMap(null); // remove marker
win.close();
mapPolygonInfo[ppos][0] = -1;
mapPolygonInfo[ppos][1] = null;
mapPolygonInfo[ppos][2] = null;
for (var i = 0; i < mapPolygonInfo.length; i++) {
if (mapPolygonInfo[i][0] >= pos) {
mapPolygonInfo[i][0]--;
}
}
updateMapPolyDisplay();
}
function addLatLngPoly(event, map) {
var point = event.latLng;
var path = mapPoly.getPath();
var pos = path.length;
addLatLngPolyPoint(point, pos, map);
}
function addLatLngPolyPoint(point, pos, map) {
var path = mapPoly.getPath();
for (var i = 0; i < mapPolygonInfo.length; i++) {
if (mapPolygonInfo[i][0] >= pos) {
mapPolygonInfo[i][0]++;
}
}
var ppos = mapPolygonInfo.length;
// Because path is an MVCArray, we can simply append a new coordinate
// and it will automatically appear
path.insertAt(pos, point);
updateMapPolyDisplay();
var image = starGrayMapIcon;
var shadow = starMapShadow;
var marker = new google.maps.Marker({ position: point,
title: 'Area Corner',
map: map,
icon: image.markerImage,
shadow: shadow.markerImage,
draggable: true
});
google.maps.event.addListener(marker, 'drag', function() {
point = marker.getPosition();
path.setAt(mapPolygonInfo[ppos][0], point);
});
google.maps.event.addListener(marker, 'dragend', function() {
updateMapPolyDisplay();
});
var infowindow = new google.maps.InfoWindow({});
mapPolygonInfo[ppos] = [pos, marker, infowindow];
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent('');
infowindow.open(map,marker);
});
}
function OAWMarkerImage(url, size, origin, anchor) {
this.url = url;
this.size = size;
this.origin = origin;
this.anchor = anchor;
this.markerImage = new google.maps.MarkerImage(url, size, origin, anchor);
}
function initMap(forPrint) {
// initialize maps as defined in the globalMapArray
// c__animated.gif
standardMapIcon = new OAWMarkerImage("/images/maps/c.png", // "/images/maps/c.png",
new google.maps.Size(18,18),
new google.maps.Point(0,0),
new google.maps.Point(9,9));
standardAnimatedMapIcon = new OAWMarkerImage("/images/maps/c_animated.gif", // "/images/maps/c.png",
new google.maps.Size(18,18),
new google.maps.Point(0,0),
new google.maps.Point(9,9));
standardGrayMapIcon = new OAWMarkerImage("/images/maps/cgray.png",
new google.maps.Size(18,18),
new google.maps.Point(0,0),
new google.maps.Point(9,9));
standardMapShadow = new OAWMarkerImage("/images/maps/cs.png",
new google.maps.Size(27,27),
new google.maps.Point(0,0),
new google.maps.Point(8,16));
smallMapIcon = new OAWMarkerImage("/images/maps/b.png",
new google.maps.Size(9,9),
new google.maps.Point(0,0),
new google.maps.Point(4,4));
smallAnimatedMapIcon = new OAWMarkerImage("/images/maps/b_animated.gif", // "/images/maps/c.png",
new google.maps.Size(9,9),
new google.maps.Point(0,0),
new google.maps.Point(4,4));
smallMapShadow = new OAWMarkerImage("/images/maps/bs.png",
new google.maps.Size(14,14),
new google.maps.Point(0,0),
new google.maps.Point(4,8));
starMapIcon = new OAWMarkerImage("/images/maps/star.png",
new google.maps.Size(20,19),
new google.maps.Point(0,0),
new google.maps.Point(10,9));
starGrayMapIcon = new OAWMarkerImage("/images/maps/stargray_transparent50.png",
new google.maps.Size(20,19),
new google.maps.Point(0,0),
new google.maps.Point(10,9));
starMapShadow = new OAWMarkerImage("/images/maps/star_s.png",
new google.maps.Size(20,19),
new google.maps.Point(0,0),
new google.maps.Point(7,10));
geocoder = new google.maps.Geocoder();
//if (! drawMap) return;
for (var i = 0; i < globalMapArray.length; i++) {
var mapInfo = globalMapInfo[globalMapArray[i]];
var divName = mapInfo.div;
var mapDiv = document.getElementById(divName);
if (mapDiv != null) { // && GBrowserIsCompatible()) {
var mapOptions = {zoom: 15,
// center: new google.maps.LatLng(40.749155, -74.00523),
mapTypeId: google.maps.MapTypeId.ROADMAP};
var map = new google.maps.Map(mapDiv, mapOptions);
map.OAWOverlay = new OAWOverlay(map);
globalMapInfo[globalMapArray[i]].map = map;
// note: initLocationsFunction uses the globalMapInfo array
var polyBounds = null;
if (mapInfo.polygons && ! forPrint) {
polyBounds = renderNeighborhoodPolygons(map, mapInfo.polygons);
map.fitBounds(polyBounds);
google.maps.event.addListener(map,"zoom_changed",function() {adjustPolyLabels(map);});
adjustPolyLabels(map);
}
var bounds = addMarkers(map, mapInfo.markers, forPrint);
if (! initLocationsFunction()) {
if (bounds != null) { // && polyBounds == null // should focus in on galleries, even if hoods are drawn
//map.centerAndZoom(lastPoint, mapZoomLevel);
map.fitBounds(bounds); //setCenter(lastPoint);
//map.setZoom(mapZoomLevel);
}
}
}
}
}
//var mapColors = ['_green', '_yellow', '_orange', '_grey', '_brown'];
function createMarker(map, point, index, status, title, popupHTML, draggable, forPrint) {
var col = 'orange_weak';
var letter = '';
if (! draggable) draggable = false;
var markerImage = smallMapIcon;
var shadow = smallMapShadow;
if (index > -1) {
// numbered large
letter = index;
image = "/images/maps/c" + letter + ".png";
shadow = standardMapShadow;
markerImage = new OAWMarkerImage(image,
new google.maps.Size(18,18),
new google.maps.Point(0,0),
new google.maps.Point(9,9));
}
else if (status == 1) {
// highlighted (LARGE)
markerImage = standardMapIcon;
shadow = standardMapShadow;
}
else if (status == 2) {
// gray (LARGE)
markerImage = standardGrayMapIcon;
shadow = standardMapShadow;
}
else if (status == 3) {
// star
markerImage = starMapIcon;
shadow = starMapShadow;
}
else if (status == 4) {
// gray star
markerImage = starGrayMapIcon;
shadow = starMapShadow;
}
else if (status == 5) {
// highlighted
markerImage = smallAnimatedMapIcon;
shadow = smallMapShadow;
}
else if (status == 6) {
// highlighted
markerImage = standardAnimatedMapIcon;
shadow = standardMapShadow;
}
if (popupHTML == '') {
popupHTML = title;
}
var marker = null;
if (! forPrint) {
marker = new google.maps.Marker({ position: point,
title: title,
map: map,
icon: markerImage.markerImage,
shadow: shadow.markerImage,
zIndex: (draggable?10:(status==4?0:5)),
draggable: draggable
});
if (popupHTML != '') {
var infowindow = new google.maps.InfoWindow({});
google.maps.event.addListener(marker, 'click', function() {
//marker.setIcon("/images/maps/star_" + "green" + ".png");
setMapPopupHTML(map, marker, infowindow, popupHTML);
});
}
if (! map.oawmarkers) {
map.oawmarkers = [];
}
map.oawmarkers.push(marker);
}
else {
var overlay = map.OAWOverlay;
overlay.addObject(new MapOverlayObject('marker', point, [markerImage,shadow]));
}
return marker;
}
function addMarkers(map, markers, forPrint) {
if (markers == null) return null;
var bounds = null;
for (i = 0; i < markers.length; i++) {
var longcoord = markers[i][0];
var latcoord = markers[i][1];
var index = markers[i][2];
var status = markers[i][3];
var title = markers[i][4];
var popupHTML = markers[i][5];
var latlng = new google.maps.LatLng(latcoord, longcoord);
if (i == 0) {
bounds = new google.maps.LatLngBounds(latlng, latlng);
}
// make sure map not too small
bounds.extend(new google.maps.LatLng(latcoord + 0.005, longcoord + 0.005));
bounds.extend(new google.maps.LatLng(latcoord - 0.005, longcoord - 0.005));
//var marker = null;
//marker = createMarker(map, latlng, index, status, title, popupHTML, false, forPrint);
}
map.OAWOverlay.drawMarkers = function() {updateMarkers(map, this, markers, forPrint);};
return bounds;
}
function updateMarkers(map, overlay, markers, forPrint) {
// delete any old markers
if (map.oawmarkers) {
for (var i = 0; i < map.oawmarkers.length; i++) {
map.oawmarkers[i].setMap(null);
}
}
map.OAWOverlay.removeObjects('marker');
var mergedMarkers = {};
for (i = 0; i < markers.length; i++) {
var marker = markers[i];
var longcoord = marker[0];
var latcoord = marker[1];
var index = marker[2];
var status = marker[3];
var title = marker[4];
var popupHTML = marker[5];
var latlng = new google.maps.LatLng(latcoord, longcoord);
var projection = overlay.getProjection();
var point = projection.fromLatLngToDivPixel(latlng);
var mod = 10;
var ix = Math.floor(point.x/mod) + ':' + Math.floor(point.y / mod);
if (! mergedMarkers[ix]) {
mergedMarkers[ix] = [marker[0],marker[1],marker[2],marker[3],marker[4],[marker[5]]];
}
else {
marker = mergedMarkers[ix];
mergedMarkers[ix][4] += (title != '' ? ' - ' + title : '');
mergedMarkers[ix][5].push(popupHTML);
var newStatus = 1;
if (index <= -1) {
if (status == 5 || marker[3] == 5 || marker[3] == 6) {
newStatus = 6;
}
}
mergedMarkers[ix][3] = newStatus;
}
}
for (ix in mergedMarkers) {
marker = mergedMarkers[ix];
longcoord = marker[0];
latcoord = marker[1];
index = marker[2];
status = marker[3];
title = marker[4];
popupHTML = marker[5];
latlng = new google.maps.LatLng(latcoord, longcoord);
createMarker(map, latlng, index, status, title, popupHTML, false, forPrint);
}
}
function popupHTMLToString(popupHTML) {
if (popupHTML.displayclass == null) {
className = "mapShowPopup";
}
else {
className = popupHTML.displayclass;
}
return "" + popupHTML.address + "
" + popupHTML.html + "
";
}
function setMapPopupHTML(map, marker, infowindow, popupHTML) {
var html = '';
if (popupHTML instanceof Function) {
popupHTML(marker, infowindow);
}
else if (popupHTML instanceof Array) {
// multiple objects that should be concatenated
for (var i = 0; i < popupHTML.length; i++) {
if (popupHTML[i] instanceof Object) {
html += popupHTMLToString(popupHTML[i]);
}
else {
html += popupHTML[i];
}
}
infowindow.setContent(html);
}
else if (popupHTML instanceof Object) {
// includes arrays
html = popupHTMLToString(popupHTML);
infowindow.setContent(html);
}
else {
infowindow.setContent(popupHTML);
}
infowindow.open(map, marker);
}
function OAWOverlay(map) {
// Now initialize all properties.
this.map_ = map;
this.objects_ = [];
// Explicitly call setMap() on this overlay
this.setMap(map);
}
OAWOverlay.prototype = new google.maps.OverlayView();
OAWOverlay.prototype.addObject = function(obj) {
this.objects_.push(obj);
}
OAWOverlay.prototype.removeObjects = function(type) {
var newObjects = [];
for (var i = 0; i < this.objects_.length; i++) {
var o = this.objects_[i];
if (o.type != type) {
newObjects.push(o);
}
else {
DOM.removeSelf(o.div);
}
}
this.objects_ = newObjects;
}
OAWOverlay.prototype.displayObject = function(obj) {
}
OAWOverlay.prototype.setDivs = function() {
// need this function to create a new context for each callback, otherwise
// all of them will refer to the last value in the loop below
function createTextDiv(url, label) {
var f = function(e, el) {document.location.href = url;};
return DOM.div([STYLE.cursor('pointer'),CLASSNAME('mapOAWLabel very_translucent'),EVENTHANDLER.click(f),ATTR.title('Click to see galleries and museums in ' + label)], []);
}
var panes = this.getPanes();
for (i = 0; i < this.objects_.length; i++) {
var obj = this.objects_[i];
var div = null;
if (obj.type == 'text') {
if (! obj.div) {
var label = obj.value[0];
var url = obj.value[1];
div = createTextDiv(url, label);
div.innerHTML = label;
obj.adjustX = -30;
obj.adjustY = -4;
}
else {
div = obj.div;
}
}
else if (obj.type == 'marker') {
marker = obj.value[0];
div = DOM.div([CLASSNAME('mapOAWObject')], [DOM.img([STYLE.position('relative'),STYLE.top((- marker.anchor.y) + 'px'),STYLE.left((- marker.anchor.x) + 'px'),ATTR.src(marker.url)])]);
//div.innerHTML = '
';
}
this.objects_[i].div = div;
//obj.div = div;
// We'll add this overlay to the overlayImage pane.
if (div != null) {
panes.overlayImage.appendChild(div);
}
}
}
OAWOverlay.prototype.onAdd = function() {
// Note: an overlay's receipt of onAdd() indicates that
// the map's panes are now available for attaching
// the overlay to the map via the DOM.
// need to be here, so that objects_ are updated for print
this.drawMarkers();
this.setDivs();
}
OAWOverlay.prototype.draw = function() {
// Size and position the overlay. We use a southwest and northeast
// position of the overlay to peg it to the correct position and size.
// We need to retrieve the projection from this overlay to do this.
var overlayProjection = this.getProjection();
// need to be here, so that executed when zooming in/out
this.drawMarkers();
this.setDivs();
for (i = 0; i < this.objects_.length; i++) {
var obj = this.objects_[i];
var point = obj.latlng;
var div = obj.div;
var pos = overlayProjection.fromLatLngToDivPixel(point);
div.style.left = (pos.x + obj.adjustX) + 'px';
div.style.top = (pos.y + obj.adjustY) + 'px';
if (obj.labelIsHidden) {
div.style.display = 'none';
}
}
}
OAWOverlay.prototype.onRemove = function() {
for (i = 0; i < this.objects_.length; i++) {
var obj = this.objects_[i];
var div = obj.div;
div_.parentNode.removeChild(div);
}
this.objects_ = [];
}
OAWOverlay.prototype.hideLabels = function() {
for (i = 0; i < this.objects_.length; i++) {
var obj = this.objects_[i];
if (obj.allowHiding) {
var div = obj.div;
if (div != null) {
div.style.display = 'none';
}
obj.labelIsHidden = true;
}
}
}
OAWOverlay.prototype.showLabels = function() {
for (i = 0; i < this.objects_.length; i++) {
var obj = this.objects_[i];
if (obj.allowHiding) {
var div = obj.div;
if (div != null) {
div.style.display = 'block';
}
obj.labelIsHidden = false;
}
}
}
OAWOverlay.prototype.drawMarkers = function() {
// by default, nothing
return;
}