Add note creation to the sidebar
[rails.git] / app / assets / javascripts / index / notes.js.erb
1 function initializeNotes(map) {
2   var noteLayer = map.noteLayer,
3       notes = {},
4       newNote;
5
6   var noteIcons = {
7     "new": L.icon({
8       iconUrl: "<%= image_path 'new_note_marker.png' %>",
9       iconSize: [25, 40],
10       iconAnchor: [12, 40]
11     }),
12     "open": L.icon({
13       iconUrl: "<%= image_path 'open_note_marker.png' %>",
14       iconSize: [25, 40],
15       iconAnchor: [12, 40]
16     }),
17     "closed": L.icon({
18       iconUrl: "<%= image_path 'closed_note_marker.png' %>",
19       iconSize: [25, 40],
20       iconAnchor: [12, 40]
21     })
22   };
23
24   map.on("layeradd", function (e) {
25     if (e.layer == noteLayer) {
26       loadNotes();
27       map.on("moveend", loadNotes);
28     }
29   }).on("layerremove", function (e) {
30     if (e.layer == noteLayer) {
31       map.off("moveend", loadNotes);
32       noteLayer.clearLayers();
33       notes = {};
34     }
35   }).on("popupclose", function (e) {
36     if (newNote && e.popup == newNote._popup) {
37       $(newNote).oneTime(10, "removenote", function () {
38         map.removeLayer(newNote);
39         newNote = null;
40       });
41     } 
42   })
43
44   noteLayer.on('click', function(e) {
45     OSM.route('/browse/note/' + e.layer.id);
46   })
47
48   function updateMarker(marker, feature) {
49     if (marker) {
50       marker.setIcon(noteIcons[feature.properties.status]);
51     } else {
52       marker = L.marker(feature.geometry.coordinates.reverse(), {
53         icon: noteIcons[feature.properties.status],
54         opacity: 0.9,
55         clickable: true
56       });
57       marker.id = feature.properties.id;
58       marker.addTo(noteLayer);
59     }
60     return marker;
61   }
62
63   noteLayer.getLayerId = function(marker) {
64     return marker.id;
65   };
66
67   var noteLoader;
68
69   function loadNotes() {
70     var bounds = map.getBounds();
71     var size = bounds.getSize();
72
73     if (size <= OSM.MAX_NOTE_REQUEST_AREA) {
74       var url = "/api/" + OSM.API_VERSION + "/notes.json?bbox=" + bounds.toBBoxString();
75
76       if (noteLoader) noteLoader.abort();
77
78       noteLoader = $.ajax({
79         url: url,
80         success: success
81       });
82     }
83
84     function success(json) {
85       var oldNotes = notes;
86       notes = {};
87       json.features.forEach(updateMarkers);
88
89       function updateMarkers(feature) {
90         var marker = oldNotes[feature.properties.id];
91         delete oldNotes[feature.properties.id];
92         notes[feature.properties.id] = updateMarker(marker, feature);
93       }
94
95       for (id in oldNotes) {
96         noteLayer.removeLayer(oldNotes[id]);
97       }
98
99       noteLoader = null;
100     }
101   };
102 }