/*
* JavaScript Code for displaying Sage developers on a Google Map.
* Author: Harald Schilly, 2014
* License: Apache 2.0
*/
var markerClusterer = null;
var map = null;
var imageUrl = "pix/developer_map/sagepin.png";
var contributors_xml = "res/contributors.xml";
var contributors = null;
var geocode_xml = "res/geocode.xml";
var geocode = null;
var devmap = null; // the map dom element;
var map_aspect = 1.6; // height = width / map_aspect;
var map_max_width = 800; // max width of map;
var overlay_max_width = null; //this is the width of the overlay div to restrict too wide layouts
var dx_base = parseFloat("2"); // disturbance in degrees (=dy)
var zoom_level = 3; //holds current zoom level, for jitter
var markers = [];
var points = [];
var cld = null;
var infoWindow = new google.maps.InfoWindow({});
var markerImage = {
url: imageUrl,
size: new google.maps.Size(32, 32),
anchor: new google.maps.Point(16, 16)
};
var mapOptions = {
scaleControl: true,
zoomControl: true,
panControl: true,
overviewMapControl: true,
overviewMapControlOptions:{opened:true},
zoom: 2,
center: new google.maps.LatLng(39.91, 116.38),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
function getPointFromLoc(loc) {
if (loc == null) return null;
for (var i=0; i";
//GLog.write("added pix = " + pix);
}
txt += "
";
if (url != null) {
txt += "
"+dev+"";
} else {
txt += "
"+dev+""
}
if (work != null) {txt += "
" + work + "";}
if (loc != null) {txt += "
" + loc + "";}
if (descr != null) {
if (descr.indexOf(";") >= 0) { //we have a ";"
descr = descr.replace(/; /g, "
");//eat space if there
descr = descr.replace(/;/g , "");
}
descr = "";//always a list is prettier
txt += ""+ descr+"
";
}
txt += " ";
return txt;
}
// builds the cloud of names below the map
function addDevCloud(dev, loc, point, marker, work, descr, url, pix, size, trac) {
cld.appendChild(document.createTextNode(" "));
var spn = document.createElement("span");
spn.setAttribute("class", "highlight");
var style = "";
if (size != null) {
style += "font-size:"+size+"%;";
}
spn.setAttribute("style", style);
spn.appendChild(document.createTextNode(dev));
if(point != null) { //only those who have locations
$(spn).click(function() {
if (map.getZoom() < 5) {map.setZoom(5);}
infoWindow.setContent(getInfoText(dev,loc,work,descr,url,pix,trac));
infoWindow.open(map, marker);
});
} else {
spn.removeAttribute("class");
}
cld.appendChild(spn);
}
function pinMarker(dev,loc,point,work,descr,url,pix,trac) {
if (loc == null || point == null) { return null; }
return pinToPoint(point,dev,loc,work,descr,url,pix,trac);
}
function pinToPoint(point,dev,loc,work,descr,url,pix,trac) {
var marker = new google.maps.Marker({
position: point,
draggable: false,
icon: markerImage
});
marker.title = dev;
//map.addOverlay(marker);
//GLog.write("marker point = lat: " + marker.getPoint().lat() + " lng: " + marker.getPoint().lng())
google.maps.event.addListener(marker, "click", function() {
//map.openInfoWindowHtml(point, getInfoText(dev,loc,work,descr,url,pix,trac));
infoWindow.setContent(getInfoText(dev,loc,work,descr,url,pix,trac));
infoWindow.open(map, this);
});
return marker;
}
function refreshMap() {
if (markers.length == 0) {
if (markerClusterer != null) {
markerClusterer.clearMarkers();
}
for (var i = 0; i < contribs.length; i++) {
var dev = contribs[i].getAttribute("name");
var loc = contribs[i].getAttribute("location");
var work = contribs[i].getAttribute("work");
var descr = contribs[i].getAttribute("description");
var url = contribs[i].getAttribute("url");
var pix = contribs[i].getAttribute("pix");
var size = contribs[i].getAttribute("size");
var jitter= contribs[i].getAttribute("jitter");
var trac = contribs[i].getAttribute("trac");
// cache to avoid render errors
//if (pix != null) {new Image().src = pix;}
if (jitter == null) { jitter = 1; }
if (trac == null) {trac = dev; }; // else {trac = trac + " " + dev;}
// and to table
var point = null;
var pointOrig = getPointFromLoc(loc);
if (pointOrig != null) {
point = jitterPoint(pointOrig, jitter);
}
var m = pinMarker(dev,loc,point,work,descr,url,pix,trac);
// broken: clicking on the a does not zoom to the right place
// also too much text anyway.
//addDevCloud(dev,loc,point,m,work,descr,url,pix,size,trac);
if (m != null) {
markers.push(m);
points.push(pointOrig);
}
}
markerClusterer = new MarkerClusterer(map, markers, {
//maxZoom: zoom,
gridSize: 20,
imagePath: 'pix/developer_map/m',
//styles: styles[style]
});
} else { // never hit until now, see caching info above
for (var i = 0; i < markers.length; i++) {
markers[i].setPoint(jitterPoint(points[i], 1));
}
markerClusterer.redraw();
}
//var zoom = parseInt(document.getElementById('zoom').value, 10);
//var size = parseInt(document.getElementById('size').value, 10);
//var style = parseInt(document.getElementById('style').value, 10);
//zoom = zoom == -1 ? null : zoom;
//size = size == -1 ? null : size;
//style = style == -1 ? null: style;
}
function adaptMapSize() {
var devlist = document.getElementById("devlist");
var mapwidth = Math.min(devlist.offsetWidth, map_max_width);
//GLog.write("mapwidth = " + mapwidth);
//var mapwidth = document.body.clientWidth*0.9;
var mapheight = mapwidth/map_aspect;
devmap = document.getElementById("devmap");
// devmap.setAttribute("style","width: "+Math.floor(mapwidth)+"px; height: "+Math.floor(mapheight)+"px");
devmap.setAttribute("style","width: 100%; height: "+Math.floor(mapheight)+"px");
//GLog.write("clientWidth = " +document.body.clientWidth+ " / width = " + Math.floor(mapwidth));
overlay_max_width = Math.floor(mapwidth/3);
}
function initMap() {
cld = document.getElementById("devcloud");
adaptMapSize();
map = new google.maps.Map(devmap, mapOptions);
zoomTo("ALL");
//on zoom, recalc disturbance factor and redraw
google.maps.event.addDomListener(map, "zoomend", function(oldz,newz) {
zoom_level = newz;
refreshMap();
});
$.get(geocode_xml, function(data) {
geocode = data.documentElement.getElementsByTagName("loc");
$.get(contributors_xml, function(data) {
contribs = data.documentElement.getElementsByTagName("contributor");
refreshMap();
});
});
}
function clearClusters(e) {
e.preventDefault();
e.stopPropagation();
markerClusterer.clearMarkers();
}
function zoomTo(where) {
if (where == "USA") {
map.setCenter(new google.maps.LatLng(37, -93));
map.setZoom(4);
} else if (where == "Europe") {
map.setCenter(new google.maps.LatLng(51, 14));
map.setZoom(4);
} else if (where == "UW") {
map.setCenter(new google.maps.LatLng(47.658345, -122.303017));
map.setZoom(10);
} else if (where == "USAW") {
map.setCenter(new google.maps.LatLng(42,-110));
map.setZoom(5);
} else if (where == "USAE") {
map.setCenter(new google.maps.LatLng(38, -84));
map.setZoom(5);
} else if (where == "SAM") {
map.setCenter(new google.maps.LatLng(-25, -75));
map.setZoom(3);
} else if (where == "Africa") {
map.setCenter(new google.maps.LatLng(3, 35));
map.setZoom(3);
} else if (where == "Asia") {
map.setCenter(new google.maps.LatLng(38, 90));
map.setZoom(3);
} else if (where == "Australia") {
map.setCenter(new google.maps.LatLng(-32, 145));
map.setZoom(3);
} else { // ALL
map.setCenter(new google.maps.LatLng(20, 15));
map.setZoom(2);
}
return false;
}
$(initMap);