]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index/browse.js
752c84fecee841505b14bc402ce324c9f5cde7d6
[rails.git] / app / assets / javascripts / index / browse.js
1 function initializeBrowse(map) {
2   var browseBounds;
3   var selectedLayer;
4   var dataLayer = map.dataLayer;
5
6   dataLayer.setStyle({
7     way: {
8       weight: 3,
9       color: "#000000",
10       opacity: 0.4
11     },
12     area: {
13       weight: 3,
14       color: "#ff0000"
15     },
16     node: {
17       color: "#00ff00"
18     }
19   });
20
21   dataLayer.isWayArea = function () {
22     return false;
23   };
24
25   dataLayer.on("click", function (e) {
26     onSelect(e.layer);
27   });
28
29   map.on('layeradd', function (e) {
30     if (e.layer === dataLayer) {
31       map.on("moveend", updateData);
32       updateData();
33     }
34   });
35
36   map.on('layerremove', function (e) {
37     if (e.layer === dataLayer) {
38       map.off("moveend", updateData);
39       $('#browse_status').empty();
40     }
41   });
42
43   function updateData() {
44     var bounds = map.getBounds();
45     getData(!browseBounds || !browseBounds.contains(bounds));
46     browseBounds = bounds;
47   }
48
49   function displayFeatureWarning(count, limit, callback) {
50     $('#browse_status').html(
51       $("<p class='warning'></p>")
52         .text(I18n.t("browse.start_rjs.loaded_an_area_with_num_features", { num_features: count, max_features: limit }))
53         .append(
54           $("<input type='submit'>")
55             .val(I18n.t('browse.start_rjs.load_data'))
56             .click(callback)));
57   }
58
59   var dataLoader;
60
61   function getData(inPrevious) {
62     var bounds = map.getBounds();
63     var size = bounds.getSize();
64
65     if (size > OSM.MAX_REQUEST_AREA) {
66       $('#browse_status').html(
67         $("<p class='warning'></p>")
68           .text(I18n.t("browse.start_rjs.unable_to_load_size", { max_bbox_size: OSM.MAX_REQUEST_AREA, bbox_size: size.toFixed(2) })));
69       return;
70     }
71
72     if (inPrevious) return;
73
74     var url = "/api/" + OSM.API_VERSION + "/map?bbox=" + bounds.toBBoxString();
75
76     /*
77      * Modern browsers are quite happy showing far more than 100 features in
78      * the data browser, so increase the limit to 2000 by default, but keep
79      * it restricted to 500 for IE8 and 100 for older IEs.
80      */
81     var maxFeatures = 2000;
82
83     /*@cc_on
84       if (navigator.appVersion < 8) {
85         maxFeatures = 100;
86       } else if (navigator.appVersion < 9) {
87         maxFeatures = 500;
88       }
89     @*/
90
91     if (dataLoader) dataLoader.abort();
92
93     dataLoader = $.ajax({
94       url: url,
95       success: function (xml) {
96         dataLayer.clearLayers();
97         selectedLayer = null;
98
99         var features = dataLayer.buildFeatures(xml);
100
101         function addFeatures() {
102           $('#browse_status').empty();
103           dataLayer.addData(features);
104         }
105
106         if (features.length < maxFeatures) {
107           addFeatures();
108         } else {
109           displayFeatureWarning(features.length, maxFeatures, addFeatures);
110         }
111
112         dataLoader = null;
113       }
114     });
115   }
116
117   function onSelect(layer) {
118     // Unselect previously selected feature
119     if (selectedLayer) {
120       selectedLayer.setStyle(selectedLayer.originalStyle);
121     }
122
123     // Redraw in selected style
124     layer.originalStyle = layer.options;
125     layer.setStyle({color: '#0000ff', weight: 8});
126
127     OSM.route('/browse/' + layer.feature.type + '/' + layer.feature.id);
128
129     // Stash the currently drawn feature
130     selectedLayer = layer;
131   }
132 }