1 OSM.initializeDataLayer = function (map) {
 
   2   let dataLoader, loadedBounds;
 
   3   const dataLayer = map.dataLayer;
 
  20   dataLayer.isWayArea = function () {
 
  24   dataLayer.on("click", function (e) {
 
  28   dataLayer.on("add", function () {
 
  29     map.fire("overlayadd", { layer: this });
 
  30     map.on("moveend", updateData);
 
  34   dataLayer.on("remove", function () {
 
  35     if (dataLoader) dataLoader.abort();
 
  37     map.off("moveend", updateData);
 
  38     $("#browse_status").empty();
 
  39     map.fire("overlayremove", { layer: this });
 
  42   function updateData() {
 
  43     var bounds = map.getBounds();
 
  44     if (!loadedBounds || !loadedBounds.contains(bounds)) {
 
  49   function displayFeatureWarning(num_features, add, cancel) {
 
  50     $("#browse_status").html(
 
  51       $("<div class='p-3'>").append(
 
  52         $("<div class='d-flex'>").append(
 
  53           $("<h2 class='flex-grow-1 text-break'>")
 
  54             .text(I18n.t("browse.start_rjs.load_data")),
 
  56             $("<button type='button' class='btn-close'>")
 
  57               .attr("aria-label", I18n.t("javascripts.close"))
 
  59         $("<p class='alert alert-warning'>")
 
  60           .text(I18n.t("browse.start_rjs.feature_warning", { num_features })),
 
  61         $("<input type='submit' class='btn btn-primary d-block mx-auto'>")
 
  62           .val(I18n.t("browse.start_rjs.load_data"))
 
  66   function displayLoadError(message, close) {
 
  67     $("#browse_status").html(
 
  68       $("<div class='p-3'>").append(
 
  69         $("<div class='d-flex'>").append(
 
  70           $("<h2 class='flex-grow-1 text-break'>")
 
  71             .text(I18n.t("browse.start_rjs.load_data")),
 
  73             $("<button type='button' class='btn-close'>")
 
  74               .attr("aria-label", I18n.t("javascripts.close"))
 
  76         $("<p class='alert alert-warning'>")
 
  77           .text(I18n.t("browse.start_rjs.feature_error", { message: message }))));
 
  81     var bounds = map.getBounds();
 
  82     var url = "/api/" + OSM.API_VERSION + "/map?bbox=" + bounds.toBBoxString();
 
  85      * Modern browsers are quite happy showing far more than 100 features in
 
  86      * the data browser, so increase the limit to 4000 by default.
 
  88     const maxFeatures = 4000;
 
  90     if (dataLoader) dataLoader.abort();
 
  95       success: function (data) {
 
  96         dataLayer.clearLayers();
 
  98         var features = dataLayer.buildFeatures(data);
 
 100         function addFeatures() {
 
 101           $("#browse_status").empty();
 
 102           dataLayer.addData(features);
 
 103           loadedBounds = bounds;
 
 106         function cancelAddFeatures() {
 
 107           $("#browse_status").empty();
 
 110         if (features.length < maxFeatures) {
 
 113           displayFeatureWarning(features.length, addFeatures, cancelAddFeatures);
 
 116         if (map._objectLayer) {
 
 117           map._objectLayer.bringToFront();
 
 122       error: function (XMLHttpRequest, textStatus) {
 
 124         if (textStatus === "abort") { return; }
 
 126         function closeError() {
 
 127           $("#browse_status").empty();
 
 130         if (XMLHttpRequest.status === 400 && XMLHttpRequest.responseText) {
 
 131           displayLoadError(XMLHttpRequest.responseText, closeError);
 
 132         } else if (XMLHttpRequest.statusText) {
 
 133           displayLoadError(XMLHttpRequest.statusText, closeError);
 
 135           displayLoadError(String(XMLHttpRequest.status), closeError);
 
 141   function onSelect(layer) {
 
 142     OSM.router.route("/" + layer.feature.type + "/" + layer.feature.id);