diff --git a/Makefile b/Makefile
index f99342a98..4ba02a7b0 100644
--- a/Makefile
+++ b/Makefile
@@ -18,6 +18,7 @@ data/data.js: $(DATA_FILES)
js/lib/d3.v3.js \
js/lib/d3.combobox.js \
js/lib/d3.geo.tile.js \
+ js/lib/d3.jsonp.js \
js/lib/d3.keybinding.js \
js/lib/d3.one.js \
js/lib/d3.size.js \
diff --git a/index.html b/index.html
index 5b928ea28..d0fbab9d8 100644
--- a/index.html
+++ b/index.html
@@ -23,6 +23,7 @@
+
diff --git a/js/id/renderer/background_source.js b/js/id/renderer/background_source.js
index 14e15852f..fc644e3ff 100644
--- a/js/id/renderer/background_source.js
+++ b/js/id/renderer/background_source.js
@@ -34,29 +34,29 @@ iD.BackgroundSource.template = function(data) {
};
iD.BackgroundSource.Bing = function(data) {
+ // http://msdn.microsoft.com/en-us/library/ff701716.aspx
+ // http://msdn.microsoft.com/en-us/library/ff701701.aspx
+
var bing = iD.BackgroundSource.template(data),
- url = "http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/0,0?zl=1&mapVersion=v1&key=Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU&include=ImageryProviders&output=xml";
+ key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
+ url = 'http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' + key + '&jsonp={callback}';
- var providers;
-
- d3.json(url, function(err, json) {
- if (json) {
- providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
- return {
- attribution: provider.attribution,
- areas: provider.areas.map(function(area) {
- return {
- zoom: [area.zoomMin, area.zoomMax],
- extent: iD.geo.Extent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
- }
- })
- };
- });
- }
+ d3.jsonp(url, function(json) {
+ bing.providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
+ return {
+ attribution: provider.attribution,
+ areas: provider.coverageAreas.map(function(area) {
+ return {
+ zoom: [area.zoomMin, area.zoomMax],
+ extent: iD.geo.Extent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
+ }
+ })
+ };
+ });
});
bing.copyrightNotices = function(zoom, extent) {
- return providers.filter(function(provider) {
+ return bing.providers.filter(function(provider) {
return _.any(provider.areas, function(area) {
return extent.intersects(area.extent) &&
area.zoom[0] <= zoom &&
diff --git a/js/lib/d3.jsonp.js b/js/lib/d3.jsonp.js
new file mode 100644
index 000000000..e0cd4a80e
--- /dev/null
+++ b/js/lib/d3.jsonp.js
@@ -0,0 +1,25 @@
+d3.jsonp = function (url, callback) {
+ function rand() {
+ var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
+ c = '', i = -1;
+ while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
+ return c;
+ }
+
+ function create(url) {
+ var e = url.match(/callback=d3.jsonp.(\w+)/),
+ c = e ? e[1] : rand();
+ d3.jsonp[c] = function(data) {
+ callback(data);
+ delete d3.jsonp[c];
+ script.remove();
+ };
+ return 'd3.jsonp.' + c;
+ }
+
+ var cb = create(url),
+ script = d3.select('head')
+ .append('script')
+ .attr('type', 'text/javascript')
+ .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
+};
diff --git a/test/index.html b/test/index.html
index c6c1f11c7..b08719039 100644
--- a/test/index.html
+++ b/test/index.html
@@ -26,6 +26,7 @@
+