]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/id.js
Merge pull request #5388 from AntonKhorev/map-layer-can-embed
[rails.git] / app / assets / javascripts / id.js
1 //= require iD
2
3 /* globals iD */
4
5 document.addEventListener("DOMContentLoaded", function () {
6   var container = document.getElementById("id-container");
7
8   if (typeof iD === "undefined" || !iD.utilDetect().support) {
9     container.innerHTML = "This editor is supported " +
10       "in Firefox, Chrome, Safari, Opera and Edge. " +
11       "Please upgrade your browser or use JOSM to edit the map.";
12     container.className = "unsupported";
13   } else {
14     var idContext = iD.coreContext();
15     idContext.connection().apiConnections([]);
16     var url = location.protocol + "//" + location.host;
17     idContext.preauth({
18       url: url,
19       apiUrl: url === "https://www.openstreetmap.org" ? "https://api.openstreetmap.org" : url,
20       access_token: container.dataset.token
21     });
22
23     var id = idContext
24       .embed(true)
25       .assetPath("iD/")
26       .assetMap(JSON.parse(container.dataset.assetMap))
27       .locale(container.dataset.locale)
28       .containerNode(container)
29       .init();
30
31     if (parent === window) {
32       // iD not opened in an iframe -> skip setting of parent  handlers
33       return;
34     }
35
36     var hashChangedAutomatically = false;
37     id.map().on("move.embed", parent.$.throttle(250, function () {
38       if (id.inIntro()) return;
39       var zoom = ~~id.map().zoom(),
40           center = id.map().center(),
41           llz = { lon: center[0], lat: center[1], zoom: zoom };
42
43       parent.updateLinks(llz, zoom);
44
45       // Manually resolve URL to avoid iframe JS context weirdness.
46       // https://gist.github.com/jfirebaugh/5439412
47       var hash = parent.OSM.formatHash(llz);
48       if (hash !== parent.location.hash) {
49         hashChangedAutomatically = true;
50         parent.location.replace(parent.location.href.replace(/(#.*|$)/, hash));
51       }
52     }));
53
54     function goToLocation(data) {
55       // 0ms timeout to avoid iframe JS context weirdness.
56       // https://gist.github.com/jfirebaugh/5439412
57       setTimeout(function () {
58         id.map().centerZoom(
59           [data.lon, data.lat],
60           Math.max(data.zoom || 15, 13));
61       }, 0);
62     }
63
64     parent.$("body").on("click", "a.set_position", function (e) {
65       e.preventDefault();
66       var data = parent.$(this).data();
67       goToLocation(data);
68     });
69
70     parent.addEventListener("hashchange", function (e) {
71       if (hashChangedAutomatically) {
72         hashChangedAutomatically = false;
73         return;
74       }
75       e.preventDefault();
76       var data = parent.OSM.mapParams();
77       goToLocation(data);
78     });
79   }
80 });