]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index/notes.js.erb
876aeb193d46924a670ee0175cf8881964ddcc02
[rails.git] / app / assets / javascripts / index / notes.js.erb
1 //= require templates/notes/show
2 //= require templates/notes/new
3
4 $(document).ready(function () {
5   var params = OSM.mapParams();
6
7   var noteIcons = {
8     "new": L.icon({
9       iconUrl: "<%= image_path 'new_note_marker.png' %>",
10       iconSize: [22, 22],
11       iconAnchor: [11, 11]
12     }),
13     "open": L.icon({
14       iconUrl: "<%= image_path 'open_note_marker.png' %>",
15       iconSize: [22, 22],
16       iconAnchor: [11, 11]
17     }),
18     "closed": L.icon({
19       iconUrl: "<%= image_path 'closed_note_marker.png' %>",
20       iconSize: [22, 22],
21       iconAnchor: [11, 11]
22     })
23   };
24
25   var noteLayer = new L.LayerGroup();
26   var notes = {};
27
28   map.on("layeradd", function (e) {
29     if (e.layer == noteLayer) {
30       loadNotes();
31       map.on("moveend", loadNotes);
32     }
33   });
34
35   map.on("layerremove", function (e) {
36     if (e.layer == noteLayer) {
37       map.off("moveend", loadNotes);
38       noteLayer.clearLayers();
39     }
40   });
41
42   if (OSM.STATUS != 'api_offline' && OSM.STATUS != 'database_offline') {
43     map.layersControl.addOverlay(noteLayer, I18n.t("browse.start_rjs.notes_layer_name"));
44
45     if (params.notes) map.addLayer(noteLayer);
46   }
47
48   function updateMarker(marker, feature) {
49     var icon = noteIcons[feature.properties.status];
50     var popupContent = createPopupContent(marker, feature.properties);
51
52     if (marker)
53     {
54       marker.setIcon(noteIcons[feature.properties.status]);
55       marker._popup.setContent(popupContent);
56     }
57     else
58     {
59       marker = L.marker(feature.geometry.coordinates.reverse(), {
60         icon: icon,
61         opacity: 0.7
62       });
63
64       marker.addTo(noteLayer).bindPopup(popupContent);
65     }
66
67     return marker;
68   }
69
70   function loadNotes() {
71     var bounds = map.getBounds();
72     var url = "/api/" + OSM.API_VERSION + "/notes.json?bbox=" + bounds.toBBOX();
73
74     $.ajax({
75       url: url,
76       success: function (json) {
77         var oldNotes = notes;
78
79         notes = {};
80
81         json.features.forEach(function (feature) {
82           var marker = oldNotes[feature.properties.id];
83
84           delete oldNotes[feature.properties.id];
85
86           notes[feature.properties.id] = updateMarker(marker, feature);
87         });
88
89         for (id in oldNotes) {
90           noteLayer.removeLayer(oldNotes[id]);
91         }
92       }
93     });
94   };
95
96   function createPopupContent(marker, properties) {
97     var content = $(JST["templates/notes/show"]({ note: properties }));
98
99     content.find("textarea").on("input", function (e) {
100       var form = e.target.form;
101
102       if ($(e.target).val() == "") {
103         $(form.close).val(I18n.t("javascripts.notes.show.close"));
104         $(form.comment).prop("disabled", true);
105       } else {
106         $(form.close).val(I18n.t("javascripts.notes.show.comment_and_close"));
107         $(form.comment).prop("disabled", false);
108       }
109     });
110
111     content.find("input[type=submit]").on("click", function (e) {
112       e.preventDefault();
113       updateNote(marker, e.target.form, $(e.target).data("url"));
114     });
115
116     return content[0];
117   }
118
119   function createNote(marker, form, url) {
120     var location = marker.getLatLng();
121
122     $(form).find("input[type=submit]").prop("disabled", true);
123
124     $.ajax({
125       url: url,
126       type: "POST",
127       data: {
128         lat: location.lat,
129         lon: location.lng,
130         text: $(form.text).val()
131       },
132       success: function (feature) {
133         notes[feature.properties.id] = updateMarker(marker, feature);
134
135         $(".leaflet-popup-close-button").off("click.close");
136       }
137     });
138   }
139
140   function updateNote(marker, form, url) {
141     $(form).find("input[type=submit]").prop("disabled", true);
142
143     $.ajax({
144       url: url,
145       type: "POST",
146       data: {
147         text: $(form.text).val()
148       },
149       success: function (feature) {
150         var popupContent = createPopupContent(marker, feature.properties);
151
152         marker.setIcon(noteIcons[feature.properties.status]);
153         marker._popup.setContent(popupContent);
154       }
155     });
156   }
157
158   $("#createnoteanchor").click(function (e) {
159     e.preventDefault();
160
161     map.addLayer(noteLayer);
162
163     var marker = L.marker(map.getCenter(), {
164       icon: noteIcons["new"],
165       opacity: 0.7,
166       draggable: true
167     });
168
169     var popupContent = $(JST["templates/notes/new"]({ create_url: $(e.target).attr("href") }));
170
171     popupContent.find("input[type=submit]").on("click", function (e) {
172       e.preventDefault();
173       createNote(marker, e.target.form, $(e.target).data("url"));
174     });
175
176     marker.addTo(noteLayer).bindPopup(popupContent[0]).openPopup();
177
178     $(".leaflet-popup-close-button").on("click.close", function (e) {
179       map.removeLayer(marker);
180     });
181
182     marker.on("dragend", function (e) {
183       e.target.openPopup();
184     });
185   });
186 });