]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index/history.js
c20d342c5c3bafcdbfab633cd6160386de428fd2
[rails.git] / app / assets / javascripts / index / history.js
1 //= require jquery-simulate/jquery.simulate
2
3 OSM.History = function (map) {
4   var page = {};
5
6   $("#sidebar_content")
7     .on("click", ".changeset_more a", loadMore)
8     .on("mouseover", "[data-changeset]", function () {
9       highlightChangeset($(this).data("changeset").id);
10     })
11     .on("mouseout", "[data-changeset]", function () {
12       unHighlightChangeset($(this).data("changeset").id);
13     });
14
15   var group = L.featureGroup()
16     .on("mouseover", function (e) {
17       highlightChangeset(e.layer.id);
18     })
19     .on("mouseout", function (e) {
20       unHighlightChangeset(e.layer.id);
21     })
22     .on("click", function (e) {
23       clickChangeset(e.layer.id, e);
24     });
25
26   group.getLayerId = function (layer) {
27     return layer.id;
28   };
29
30   function highlightChangeset(id) {
31     var layer = group.getLayer(id);
32     if (layer) layer.setStyle({ fillOpacity: 0.3, color: "#FF6600", weight: 3 });
33     $("#changeset_" + id).addClass("selected");
34   }
35
36   function unHighlightChangeset(id) {
37     var layer = group.getLayer(id);
38     if (layer) layer.setStyle({ fillOpacity: 0, color: "#FF9500", weight: 2 });
39     $("#changeset_" + id).removeClass("selected");
40   }
41
42   function clickChangeset(id, e) {
43     $("#changeset_" + id).find("a.changeset_id").simulate("click", e);
44   }
45
46   function update() {
47     var data = { list: "1" };
48
49     if (window.location.pathname === "/history") {
50       data.bbox = map.getBounds().wrap().toBBoxString();
51     }
52
53     $.ajax({
54       url: window.location.pathname,
55       method: "GET",
56       data: data,
57       success: function (html) {
58         $("#sidebar_content .changesets").html(html);
59         updateMap();
60       }
61     });
62
63     var feedLink = $("link[type=\"application/atom+xml\"]"),
64         feedHref = feedLink.attr("href").split("?")[0];
65
66     feedLink.attr("href", feedHref + "?bbox=" + data.bbox);
67   }
68
69   function loadMore(e) {
70     e.preventDefault();
71     e.stopPropagation();
72
73     var div = $(this).parents(".changeset_more");
74
75     $(this).hide();
76     div.find(".loader").show();
77
78     $.get($(this).attr("href"), function (data) {
79       div.replaceWith(data);
80       updateMap();
81     });
82   }
83
84   var changesets = [];
85
86   function updateBounds() {
87     group.clearLayers();
88
89     changesets.forEach(function (changeset) {
90       var bottomLeft = map.project(L.latLng(changeset.bbox.minlat, changeset.bbox.minlon)),
91           topRight = map.project(L.latLng(changeset.bbox.maxlat, changeset.bbox.maxlon)),
92           width = topRight.x - bottomLeft.x,
93           height = bottomLeft.y - topRight.y,
94           minSize = 20; // Min width/height of changeset in pixels
95
96       if (width < minSize) {
97         bottomLeft.x -= ((minSize - width) / 2);
98         topRight.x += ((minSize - width) / 2);
99       }
100
101       if (height < minSize) {
102         bottomLeft.y += ((minSize - height) / 2);
103         topRight.y -= ((minSize - height) / 2);
104       }
105
106       changeset.bounds = L.latLngBounds(map.unproject(bottomLeft),
107                                         map.unproject(topRight));
108     });
109
110     changesets.sort(function (a, b) {
111       return b.bounds.getSize() - a.bounds.getSize();
112     });
113
114     for (var i = 0; i < changesets.length; ++i) {
115       var changeset = changesets[i],
116           rect = L.rectangle(changeset.bounds,
117                              { weight: 2, color: "#FF9500", opacity: 1, fillColor: "#FFFFAF", fillOpacity: 0 });
118       rect.id = changeset.id;
119       rect.addTo(group);
120     }
121   }
122
123   function updateMap() {
124     changesets = $("[data-changeset]").map(function (index, element) {
125       return $(element).data("changeset");
126     }).get().filter(function (changeset) {
127       return changeset.bbox;
128     });
129
130     updateBounds();
131
132     if (window.location.pathname !== "/history") {
133       var bounds = group.getBounds();
134       if (bounds.isValid()) map.fitBounds(bounds);
135     }
136   }
137
138   page.pushstate = page.popstate = function (path) {
139     $("#history_tab").addClass("current");
140     OSM.loadSidebarContent(path, page.load);
141   };
142
143   page.load = function () {
144     map.addLayer(group);
145
146     if (window.location.pathname === "/history") {
147       map.on("moveend", update);
148     }
149
150     map.on("zoomend", updateBounds);
151
152     update();
153   };
154
155   page.unload = function () {
156     map.removeLayer(group);
157     map.off("moveend", update);
158
159     $("#history_tab").removeClass("current");
160   };
161
162   return page;
163 };