Merge branch 'master' into notes
authorTom Hughes <tom@compton.nu>
Sat, 13 Oct 2012 14:55:34 +0000 (15:55 +0100)
committerTom Hughes <tom@compton.nu>
Sat, 13 Oct 2012 14:55:34 +0000 (15:55 +0100)
Conflicts:
Gemfile.lock
app/views/browse/_map.html.erb
app/views/site/index.html.erb

17 files changed:
1  2 
Gemfile
Gemfile.lock
app/assets/javascripts/application.js
app/assets/javascripts/browse.js
app/assets/javascripts/notes.js.erb
app/assets/javascripts/osm.js.erb
app/assets/stylesheets/common.css.scss
app/controllers/browse_controller.rb
app/views/browse/_map.html.erb
app/views/site/index.html.erb
app/views/user/view.html.erb
config/locales/de.yml
config/locales/en.yml
config/openlayers.cfg
config/routes.rb
db/structure.sql
vendor/assets/openlayers/OpenLayers.js

diff --cc Gemfile
Simple merge
diff --cc Gemfile.lock
@@@ -32,7 -32,7 +32,7 @@@ GE
      arel (3.0.2)
      bigdecimal (1.1.0)
      builder (3.0.3)
-     cocaine (0.3.0)
 -    cocaine (0.3.2)
++    cocaine (0.4.0)
      coffee-rails (3.2.2)
        coffee-script (>= 2.2.0)
        railties (~> 3.2.0)
@@@ -52,8 -53,8 +53,8 @@@
      hike (1.2.1)
      htmlentities (4.3.1)
      http_accept_language (1.0.2)
-     httpauth (0.1)
-     httpclient (2.2.7)
+     httpauth (0.2.0)
 -    httpclient (2.2.7)
++    httpclient (2.3.0.1)
      i18n (0.6.1)
      i18n-js (3.0.0.rc2)
        i18n
@@@ -76,9 -72,9 +77,9 @@@
        i18n (>= 0.4.0)
        mime-types (~> 1.16)
        treetop (~> 1.4.8)
-     memcached (1.4.5)
+     memcached (1.4.6)
      mime-types (1.19)
-     minitest (3.4.0)
 -    minitest (4.0.0)
++    minitest (4.1.0)
      multi_json (1.3.6)
      multipart-post (1.1.5)
      nokogiri (1.5.5)
@@@ -96,7 -92,7 +97,7 @@@
        rack (~> 1.2)
      open_id_authentication (1.1.0)
        rack-openid (~> 1.3)
-     paperclip (2.7.0)
 -    paperclip (2.7.1)
++    paperclip (2.8.0)
        activerecord (>= 2.3.0)
        activesupport (>= 2.3.2)
        cocaine (>= 0.0.2)
      rake (0.9.2.2)
      rdoc (3.12)
        json (~> 1.4)
--    redcarpet (2.1.1)
--    rinku (1.7.0)
-     ruby-openid (2.2.0)
++    redcarpet (2.2.1)
++    rinku (1.7.2)
+     ruby-openid (2.2.1)
      sanitize (2.0.3)
        nokogiri (>= 1.4.4, < 1.6)
      sass (3.2.1)
        libv8 (~> 3.3.10)
      thor (0.16.0)
      tilt (1.3.3)
-     timecop (0.5.1)
-     treetop (1.4.10)
+     timecop (0.5.2)
 -    treetop (1.4.10)
++    treetop (1.4.11)
        polyglot
        polyglot (>= 0.3.1)
      tzinfo (0.3.33)
Simple merge
@@@ -341,209 -21,63 +21,79 @@@ $(document).ready(function () 
      return false;
    }
  
-   function onFeatureSelect(feature) {
-     // Unselect previously selected feature
-     if (browseActiveFeature) {
-       browseActiveFeature.layer.drawFeature(
-         browseActiveFeature,
-         browseActiveFeature.layer.styleMap.createSymbolizer(browseActiveFeature, "default")
-       );
-     }
-     // Redraw in selected style
-     feature.layer.drawFeature(
-       feature, feature.layer.styleMap.createSymbolizer(feature, "select")
-     );
-     // If the current object is the list, don't innerHTML="", since that could clear it.
-     if ($("#browse_content").firstChild == browseObjectList) {
-       $("#browse_content").removeChild(browseObjectList);
-     } else {
-       $("#browse_content").empty();
-     }
-     // Create a link back to the object list
-     var div = document.createElement("div");
-     div.style.textAlign = "center";
-     div.style.marginBottom = "20px";
-     $("#browse_content").append(div);
-     var link = document.createElement("a");
-     link.href = "#";
-     link.onclick = loadObjectList;
-     link.appendChild(document.createTextNode(I18n.t('browse.start_rjs.object_list.back')));
-     div.appendChild(link);
-     var table = document.createElement("table");
-     table.width = "100%";
-     table.className = "browse_heading";
-     $("#browse_content").append(table);
+   var map = createMap("small_map", {
+     controls: [ new OpenLayers.Control.Navigation() ]
+   });
  
-     var tr = document.createElement("tr");
-     table.appendChild(tr);
+   var params = $("#small_map").data();
+   if (params.type == "changeset") {
+     var bbox = new OpenLayers.Bounds(params.minlon, params.minlat, params.maxlon, params.maxlat);
+     var centre = bbox.getCenterLonLat();
  
-     var heading = document.createElement("td");
-     heading.appendChild(document.createTextNode(featureNameSelect(feature)));
-     tr.appendChild(heading);
+     map.zoomToExtent(proj(bbox));
+     addBoxToMap(bbox);
  
-     var td = document.createElement("td");
-     td.align = "right";
-     tr.appendChild(td);
+     $("#loading").hide();
+     $("#browse_map .geolink").show();
  
-     var type = featureType(feature);
-     var link = document.createElement("a");
-     link.href = "/browse/" + type + "/" + feature.osm_id;
-     link.appendChild(document.createTextNode(I18n.t('browse.start_rjs.object_list.details')));
-     td.appendChild(link);
+     $("a[data-editor=remote]").click(function () {
+       return remoteEditHandler(bbox);
+     });
  
-     var div = document.createElement("div");
-     div.className = "browse_details";
+     updatelinks(centre.lon, centre.lat, 16, null, params.minlon, params.minlat, params.maxlon, params.maxlat);
++  } else if (params.type == "note") {
++    var centre = new OpenLayers.LonLat(params.lon, params.lat);
 +
-     $("#browse_content").append(div);
++    setMapCenter(centre, 16);
++    addMarkerToMap(centre);
 +
-     // Now the list of attributes
-     var ul = document.createElement("ul");
-     for (var key in feature.attributes) {
-       var li = document.createElement("li");
-       var b = document.createElement("b");
-       b.appendChild(document.createTextNode(key));
-       li.appendChild(b);
-       li.appendChild(document.createTextNode(": " + feature.attributes[key]));
-       ul.appendChild(li);
-     }
++    var bbox = getMapExtent();
 +
-     div.appendChild(ul);
++    $("#loading").hide();
++    $("#browse_map .geolink").show();
 +
-     var link = document.createElement("a");
-     link.href =  "/browse/" + type + "/" + feature.osm_id + "/history";
-     link.appendChild(document.createTextNode(I18n.t('browse.start_rjs.show_history')));
-     link.onclick = OpenLayers.Function.bind(loadHistory, {
-       type: type, feature: feature, link: link
++    $("a[data-editor=remote]").click(function () {
++      return remoteEditHandler(bbox);
 +    });
 +
-     div.appendChild(link);
-     // Stash the currently drawn feature
-     browseActiveFeature = feature;
-   }
-   function loadHistory() {
-     this.link.href = "";
-     this.link.innerHTML = I18n.t('browse.start_rjs.wait');
-     $.ajax("/api/" + OSM.API_VERSION + "/" + this.type + "/" + this.feature.osm_id + "/history", {
-       complete: OpenLayers.Function.bind(displayHistory, this)
-     });
++    updatelinks(centre.lon, centre.lat, 16, null, bbox.left, bbox.bottom, bbox.right, bbox.top)
+   } else {
+     $("#object_larger_map").hide();
+     $("#object_edit").hide();
  
-     return false;
-   }
+     var object = {type: params.type, id: params.id};
  
-   function displayHistory(request) {
-     if (browseActiveFeature.osm_id != this.feature.osm_id || $("#browse_content").firstChild == browseObjectList)  {
-         return false;
+     if (!params.visible) {
+       object.version = params.version - 1;
      }
  
-     this.link.parentNode.removeChild(this.link);
+     addObjectToMap(object, true, function(extent) {
+       $("#loading").hide();
+       $("#browse_map .geolink").show();
  
-     var doc = request.responseXML;
+       if (extent) {
+         extent = unproj(extent);
  
-     var table = document.createElement("table");
-     table.width = "100%";
-     table.className = "browse_heading";
-     $("#browse_content").append(table);
+         var centre = extent.getCenterLonLat();
  
-     var tr = document.createElement("tr");
-     table.appendChild(tr);
-     var heading = document.createElement("td");
-     heading.appendChild(document.createTextNode(I18n.t("browse.start_rjs.history_for_feature", { feature: featureNameHistory(this.feature) })));
-     tr.appendChild(heading);
-     var td = document.createElement("td");
-     td.align = "right";
-     tr.appendChild(td);
-     var link = document.createElement("a");
-     link.href = "/browse/" + this.type + "/" + this.feature.osm_id + "/history";
-     link.appendChild(document.createTextNode(I18n.t('browse.start_rjs.details')));
-     td.appendChild(link);
-     var div = document.createElement("div");
-     div.className = "browse_details";
-     var nodes = doc.getElementsByTagName(this.type);
-     var history = document.createElement("ul");
-     for (var i = nodes.length - 1; i >= 0; i--) {
-       var user = nodes[i].getAttribute("user") || I18n.t('browse.start_rjs.private_user');
-       var timestamp = nodes[i].getAttribute("timestamp");
-       var item = document.createElement("li");
-       item.appendChild(document.createTextNode(I18n.t("browse.start_rjs.edited_by_user_at_timestamp", { user: user, timestamp: timestamp })));
-       history.appendChild(item);
-     }
-     div.appendChild(history);
-     $("#browse_content").append(div);
-   }
-   function featureType(feature) {
-     if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
-       return "node";
-     } else {
-       return "way";
-     }
-   }
-   function featureTypeName(feature) {
-     if (featureType(feature) == "node") {
-       return I18n.t('browse.start_rjs.object_list.type.node');
-     } else if (featureType(feature) == "way") {
-       return I18n.t('browse.start_rjs.object_list.type.way');
-     }
-   }
-   function featureName(feature) {
-     var lang = $('html').attr('lang');
-     if (feature.attributes['name:' + lang]) {
-       return feature.attributes['name:' + lang];
-     } else if (feature.attributes.name) {
-       return feature.attributes.name;
-     } else {
-       return feature.osm_id;
-     }
-   }
+         $("a.bbox[data-editor=remote]").click(function () {
+           return remoteEditHandler(extent);
+         });
  
-   function featureNameSelect(feature) {
-     var lang = $('html').attr('lang');
-     if (feature.attributes['name:' + lang]) {
-       return feature.attributes['name:' + lang];
-     } else if (feature.attributes.name) {
-       return feature.attributes.name;
-     } else if (featureType(feature) == "node") {
-       return I18n.t("browse.start_rjs.object_list.selected.type.node", { id: feature.osm_id });
-     } else if (featureType(feature) == "way") {
-       return I18n.t("browse.start_rjs.object_list.selected.type.way", { id: feature.osm_id });
-     }
-   }
+         $("a.object[data-editor=remote]").click(function () {
+           return remoteEditHandler(extent, params.type + params.id);
+         });
  
-   function featureNameHistory(feature) {
-     var lang = $('html').attr('lang');
-     if (feature.attributes['name:' + lang]) {
-       return feature.attributes['name:' + lang];
-     } else if (feature.attributes.name) {
-       return feature.attributes.name;
-     } else if (featureType(feature) == "node") {
-       return I18n.t("browse.start_rjs.object_list.history.type.node", { id: feature.osm_id });
-     } else if (featureType(feature) == "way") {
-       return I18n.t("browse.start_rjs.object_list.history.type.way", { id: feature.osm_id });
-     }
-   }
+         $("#object_larger_map").show();
+         $("#object_edit").show();
  
-   function setStatus(status) {
-     $("#browse_status").html(status);
-     $("#browse_status").show();
+         updatelinks(centre.lon, centre.lat, 16, null, extent.left, extent.bottom, extent.right, extent.top, object);
+       } else {
+         $("#small_map").hide();
+       }
+     });
    }
  
-   function clearStatus() {
-     $("#browse_status").html("");
-     $("#browse_status").hide();
-   }
- }
+   createMenu("area_edit", "area_edit_menu", "right");
+   createMenu("object_edit", "object_edit_menu", "right");
+ });
index c55c11e,0000000..63047b3
mode 100644,000000..100644
--- /dev/null
@@@ -1,213 -1,0 +1,227 @@@
- function addNoteLayer(map, notesUrl, newNoteControls, newNoteForm, minZoom) {
-   var newNotes;
-   var saveNewNotes = function (o) {
-     var layer = o.object;
-     newNotes = layer.getFeaturesByAttribute("status", "new")
-     layer.removeFeatures(newNotes, { silent: true });
-   };
-   var restoreNewNotes = function (o) {
-     var layer = o.object;
-     layer.addFeatures(newNotes);
-     newNotes = undefined;
-   };
-   var describeNote = function (n) {
-     var description = "<h2>Note " + n.id + "</h2>";
-     n.comments.forEach(function (c) {
-       description += "<p><small class='deemphasize'>" + c.action + " by ";
-       description += c.user + " at " + c.date + "</small><br/>" + c.text + "</p>";
-     });
++$(document).ready(function () {
++  var params = OSM.mapParams();
 +
-     return description;
-   }
++//  map.noteLayer = addNoteLayer(map, $("#show_notes").attr("href"), $("#createnoteanchor"), $("#new-note"), 11);
 +
-   var noteSelected = function (o) {
-     var feature = o.feature;
-     var location = feature.geometry.getBounds().getCenterLonLat();
-     var content;
-     var close;
-     if (feature.attributes.status === "new") {
-       var form = newNoteForm.clone();
-       form.removeClass("hidden");
-       content = form.html();
-       close = false;
-     } else {
-       content = describeNote(feature.attributes);
-       close = true;
-     };
++  $("#show_notes").click(function () {
++    map.noteLayer.setVisibility(true);
++  });
 +
-     feature.popup = new OpenLayers.Popup.FramedCloud(
-       feature.attributes.id, location, null, content, null, close,
-       function (e) { map.noteSelector.unselect(feature) }
-     );
++  if (params.notes) {
++    map.noteLayer.setVisibility(true);
++  }
 +
-     map.addPopup(feature.popup);
-     // feature.popup.show();
++  function addNoteLayer(map, notesUrl, newNoteControls, newNoteForm, minZoom) {
++    var newNotes;
 +
-     $(feature.popup.contentDiv).find("textarea").autoGrow();
++    var saveNewNotes = function (o) {
++      var layer = o.object;
++      newNotes = layer.getFeaturesByAttribute("status", "new")
++      layer.removeFeatures(newNotes, { silent: true });
++    };
++
++    var restoreNewNotes = function (o) {
++      var layer = o.object;
++      layer.addFeatures(newNotes);
++      newNotes = undefined;
++    };
 +
-     $(feature.popup.contentDiv).find("input#note-submit").click(function (e) {
-       var location = unproj(feature.geometry.getBounds().getCenterLonLat());
-       var form = $(e.target).parents("form").first();
++    var describeNote = function (n) {
++      var description = "<h2>Note " + n.id + "</h2>";
 +
-       $.ajax(form.prop("action"), {
-         type: form.prop("method"),
-         data: {
-           lon: location.lon,
-           lat: location.lat,
-           text: form.find("textarea#comment").val()
-         },
-         success: function (data) {
-           map.noteSelector.unselect(feature);
++      n.comments.forEach(function (c) {
++        description += "<p><small class='deemphasize'>" + c.action + " by ";
++        description += c.user + " at " + c.date + "</small><br/>" + c.text + "</p>";
++      });
 +
-           feature.attributes.status = "open";
-           feature.attributes.id = data;
++      return description;
++    }
 +
-           map.noteLayer.drawFeature(feature);
++    var noteSelected = function (o) {
++      var feature = o.feature;
++      var location = feature.geometry.getBounds().getCenterLonLat();
++      var content;
++      var close;
++
++      if (feature.attributes.status === "new") {
++        var form = newNoteForm.clone();
++        form.removeClass("hidden");
++        content = form.html();
++        close = false;
++      } else {
++        content = describeNote(feature.attributes);
++        close = true;
++      };
++
++      feature.popup = new OpenLayers.Popup.FramedCloud(
++        feature.attributes.id, location, null, content, null, close,
++        function (e) { map.noteSelector.unselect(feature) }
++      );
++
++      map.addPopup(feature.popup);
++      // feature.popup.show();
++
++      $(feature.popup.contentDiv).find("textarea").autoGrow();
++
++      $(feature.popup.contentDiv).find("input#note-submit").click(function (e) {
++        var location = unproj(feature.geometry.getBounds().getCenterLonLat());
++        var form = $(e.target).parents("form").first();
++
++        $.ajax(form.prop("action"), {
++          type: form.prop("method"),
++          data: {
++            lon: location.lon,
++            lat: location.lat,
++            text: form.find("textarea#comment").val()
++          },
++          success: function (data) {
++            map.noteSelector.unselect(feature);
++
++            feature.attributes.status = "open";
++            feature.attributes.id = data;
++
++            map.noteLayer.drawFeature(feature);
++
++            map.noteMover.deactivate();
++          }
++        });
 +
-           map.noteMover.deactivate();
-         }
++        e.preventDefault();
 +      });
 +
-       e.preventDefault();
-     });
++      $(feature.popup.contentDiv).find("input#note-cancel").click(function (e) {
++        feature.attributes.status = "cancelled";
 +
-     $(feature.popup.contentDiv).find("input#note-cancel").click(function (e) {
-       feature.attributes.status = "cancelled";
++        map.noteSelector.unselect(feature);
++        map.noteLayer.removeFeatures(feature);
 +
-       map.noteSelector.unselect(feature);
-       map.noteLayer.removeFeatures(feature);
++        feature.destroy();
 +
-       feature.destroy();
++        map.noteMover.deactivate();
 +
-       map.noteMover.deactivate();
++        e.preventDefault();
++      });
 +
-       e.preventDefault();
-     });
++      feature.popup.updateSize();
++    };
 +
-     feature.popup.updateSize();
-   };
++    var noteUnselected = function (o) {
++      var feature = o.feature;
 +
-   var noteUnselected = function (o) {
-     var feature = o.feature;
++      map.removePopup(feature.popup);
++
++      delete feature.popup;
++    };
 +
-     map.removePopup(feature.popup);
++    var allowNoteReports = function () { 
++      if (map.getZoom() > minZoom) {
++        newNoteControls.show();
++      } else {
++        newNoteControls.hide();
++      }
++    };
 +
-     delete feature.popup;
-   };
++    var addNote = function () {
++      var lonlat = map.getCenter();
++      var layer = map.noteLayer;
++      var geometry = new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat);
++      var feature = new OpenLayers.Feature.Vector(geometry, {
++        status: "new"
++      });
 +
-   var allowNoteReports = function () { 
-     if (map.getZoom() > minZoom) {
-       newNoteControls.show();
-     } else {
-       newNoteControls.hide();
-     }
-   };
-   var addNote = function () {
-     var lonlat = map.getCenter();
-     var layer = map.noteLayer;
-     var geometry = new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat);
-     var feature = new OpenLayers.Feature.Vector(geometry, {
-       status: "new"
-     });
++      layer.addFeatures(feature);
++      map.noteSelector.unselectAll();
++      map.noteSelector.select(feature);
++      map.noteMover.activate();
++      map.noteLayer.setVisibility(true);
++    };
 +
-     layer.addFeatures(feature);
-     map.noteSelector.unselectAll();
-     map.noteSelector.select(feature);
-     map.noteMover.activate();
-     map.noteLayer.setVisibility(true);
-   };
-   map.noteLayer = new OpenLayers.Layer.Vector("Notes", {
-     visibility: false,
-     displayInLayerSwitcher: false,
-     projection: new OpenLayers.Projection("EPSG:4326"),
-     styleMap: new OpenLayers.StyleMap(new OpenLayers.Style({
-       graphicWidth: 22,
-       graphicHeight: 22,
-       graphicOpacity: 0.7,
-       graphicXOffset: -11,
-       graphicYOffset: -11
-     }, {
-       rules: [
-         new OpenLayers.Rule({
-           filter: new OpenLayers.Filter.Comparison({
-             type: OpenLayers.Filter.Comparison.EQUAL_TO,
-             property: "status",
-             value: "new"
++    map.noteLayer = new OpenLayers.Layer.Vector("Notes", {
++      visibility: false,
++      displayInLayerSwitcher: false,
++      projection: new OpenLayers.Projection("EPSG:4326"),
++      styleMap: new OpenLayers.StyleMap(new OpenLayers.Style({
++        graphicWidth: 22,
++        graphicHeight: 22,
++        graphicOpacity: 0.7,
++        graphicXOffset: -11,
++        graphicYOffset: -11
++      }, {
++        rules: [
++          new OpenLayers.Rule({
++            filter: new OpenLayers.Filter.Comparison({
++              type: OpenLayers.Filter.Comparison.EQUAL_TO,
++              property: "status",
++              value: "new"
++            }),
++            symbolizer: {
++              externalGraphic: "<%= image_path 'new_note_marker.png' %>"
++            }
 +          }),
-           symbolizer: {
-             externalGraphic: "<%= image_path 'new_note_marker.png' %>"
-           }
-         }),
-         new OpenLayers.Rule({
-           filter: new OpenLayers.Filter.Comparison({
-             type: OpenLayers.Filter.Comparison.EQUAL_TO,
-             property: "status",
-             value: "open"
-           }),
-           symbolizer: {
-             externalGraphic: "<%= image_path 'open_note_marker.png' %>"
-           }
-         }),
-         new OpenLayers.Rule({
-           filter: new OpenLayers.Filter.Comparison({
-             type: OpenLayers.Filter.Comparison.EQUAL_TO,
-             property: "status",
-             value: "closed"
++          new OpenLayers.Rule({
++            filter: new OpenLayers.Filter.Comparison({
++              type: OpenLayers.Filter.Comparison.EQUAL_TO,
++              property: "status",
++              value: "open"
++            }),
++            symbolizer: {
++              externalGraphic: "<%= image_path 'open_note_marker.png' %>"
++            }
 +          }),
-           symbolizer: {
-             externalGraphic: "<%= image_path 'closed_note_marker.png' %>"
-           }
-         })
-       ]
-     })),
-     strategies: [
-       new OpenLayers.Strategy.BBOX()
-     ],
-     protocol: new OpenLayers.Protocol.HTTP({
-       url: notesUrl,
-       format: new OpenLayers.Format.GeoJSON()
-     })
-   });
++          new OpenLayers.Rule({
++            filter: new OpenLayers.Filter.Comparison({
++              type: OpenLayers.Filter.Comparison.EQUAL_TO,
++              property: "status",
++              value: "closed"
++            }),
++            symbolizer: {
++              externalGraphic: "<%= image_path 'closed_note_marker.png' %>"
++            }
++          })
++        ]
++      })),
++      strategies: [
++        new OpenLayers.Strategy.BBOX()
++      ],
++      protocol: new OpenLayers.Protocol.HTTP({
++        url: notesUrl,
++        format: new OpenLayers.Format.GeoJSON()
++      })
++    });
 +
-   map.noteLayer.events.register("beforefeaturesremoved", map, saveNewNotes);
-   map.noteLayer.events.register("featuresremoved", map, restoreNewNotes);
-   map.noteLayer.events.register("featureselected", map, noteSelected);
-   map.noteLayer.events.register("featureunselected", map, noteUnselected);
++    map.noteLayer.events.register("beforefeaturesremoved", map, saveNewNotes);
++    map.noteLayer.events.register("featuresremoved", map, restoreNewNotes);
++    map.noteLayer.events.register("featureselected", map, noteSelected);
++    map.noteLayer.events.register("featureunselected", map, noteUnselected);
 +
-   map.addLayer(map.noteLayer);
++    map.addLayer(map.noteLayer);
 +
-   map.noteSelector = new OpenLayers.Control.SelectFeature(map.noteLayer, {
-     autoActivate: true
-   });
++    map.noteSelector = new OpenLayers.Control.SelectFeature(map.noteLayer, {
++      autoActivate: true
++    });
 +
-   map.addControl(map.noteSelector);
-   map.noteMover = new OpenLayers.Control.DragFeature(map.noteLayer, {
-     onDrag: function (feature, pixel) {
-       feature.popup.lonlat = feature.geometry.getBounds().getCenterLonLat();
-       feature.popup.updatePosition();
-     },
-     featureCallbacks: {
-       over: function (feature) {
-         if (feature.attributes.status === "new") {
-           map.noteMover.overFeature.apply(map.noteMover, [feature]);
++    map.addControl(map.noteSelector);
++
++    map.noteMover = new OpenLayers.Control.DragFeature(map.noteLayer, {
++      onDrag: function (feature, pixel) {
++        feature.popup.lonlat = feature.geometry.getBounds().getCenterLonLat();
++        feature.popup.updatePosition();
++      },
++      featureCallbacks: {
++        over: function (feature) {
++          if (feature.attributes.status === "new") {
++            map.noteMover.overFeature.apply(map.noteMover, [feature]);
++          }
 +        }
 +      }
-     }
-   });
++    });
 +
-   map.addControl(map.noteMover);
++    map.addControl(map.noteMover);
 +
-   newNoteControls.click(addNote);
++    newNoteControls.click(addNote);
 +
-   map.events.register("zoomend", map, allowNoteReports);
++    map.events.register("zoomend", map, allowNoteReports);
 +
-   return map.noteLayer;
- }
++    return map.noteLayer;
++  }
++});
index 0000000,75562ad..33f1904
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,119 +1,121 @@@
+ OSM = {
+ <% if defined?(PIWIK_LOCATION) and defined?(PIWIK_SITE) %>
+   PIWIK_LOCATION:   <%= PIWIK_LOCATION.to_json %>,
+   PIWIK_SITE:       <%= PIWIK_SITE.to_json %>,
+ <% end %>
+   MAX_REQUEST_AREA: <%= MAX_REQUEST_AREA.to_json %>,
+   SERVER_URL:       <%= SERVER_URL.to_json %>,
+   API_VERSION:      <%= API_VERSION.to_json %>,
+   apiUrl: function (object) {
+     var url = "/api/" + OSM.API_VERSION + "/" + object.type + "/" + object.id;
+     if (object.type != "node") {
+       url += "/full";
+     } else if (object.version) {
+       url += "/" + object.version;
+     }
+     return url;
+   },
+   mapParams: function (search) {
+     var params = {}, mapParams = {}, loc;
+     search = (search || window.location.search).replace('?', '').split('&');
+     for (var i = 0; i < search.length; ++i) {
+       var pair = search[i],
+         j = pair.indexOf('='),
+         key = pair.slice(0, j),
+         val = pair.slice(++j);
+       params[key] = decodeURIComponent(val);
+     }
+     if (params.mlon && params.mlat) {
+       mapParams.marker = true;
+       mapParams.mlon = parseFloat(params.mlon);
+       mapParams.mlat = parseFloat(params.mlat);
+     }
+     if (params.layers) {
+       mapParams.layers = params.layers;
+     }
+     if (params.node || params.way || params.relation) {
+       mapParams.object_zoom = true;
+       if (params.node) {
+         mapParams.object = {type: 'node', id: parseInt(params.node)};
+       } else if (params.way) {
+         mapParams.object = {type: 'way', id: parseInt(params.way)};
+       } else if (params.relation) {
+         mapParams.object = {type: 'relation', id: parseInt(params.relation)};
+       }
+     }
+     // Decide on a lat lon to initialise the map with. Various ways of doing this
+     if (params.bbox) {
+       var bbox = params.bbox.split(",");
+       mapParams.bbox = true;
+       mapParams.minlon = parseFloat(bbox[0]);
+       mapParams.minlat = parseFloat(bbox[1]);
+       mapParams.maxlon = parseFloat(bbox[2]);
+       mapParams.maxlat = parseFloat(bbox[3]);
+       mapParams.object_zoom = false;
+     } else if (params.minlon && params.minlat && params.maxlon && params.maxlat) {
+       mapParams.bbox = true;
+       mapParams.minlon = parseFloat(params.minlon);
+       mapParams.minlat = parseFloat(params.minlat);
+       mapParams.maxlon = parseFloat(params.maxlon);
+       mapParams.maxlat = parseFloat(params.maxlat);
+       mapParams.object_zoom = false;
+     } else if (params.lon && params.lat) {
+       mapParams.lon = parseFloat(params.lon);
+       mapParams.lat = parseFloat(params.lat);
+       mapParams.zoom = parseInt(params.zoom || 5);
+       mapParams.object_zoom = false;
+     } else if (params.mlon && params.mlat) {
+       mapParams.lon = parseFloat(params.mlon);
+       mapParams.lat = parseFloat(params.mlat);
+       mapParams.zoom = parseInt(params.zoom || 12);
+       mapParams.object_zoom = false;
+     } else if (loc = $.cookie('_osm_location')) {
+       loc = loc.split("|");
+       mapParams.lon = parseFloat(loc[0]);
+       mapParams.lat = parseFloat(loc[1]);
+       mapParams.zoom = parseInt(loc[2]);
+       mapParams.layers = loc[3];
+     } else if (OSM.home) {
+       mapParams.lon = OSM.home.lon;
+       mapParams.lat = OSM.home.lat;
+       mapParams.zoom = 10;
+     } else if (OSM.location) {
+       mapParams.bbox = true;
+       mapParams.minlon = OSM.location.minlon;
+       mapParams.minlat = OSM.location.minlat;
+       mapParams.maxlon = OSM.location.maxlon;
+       mapParams.maxlat = OSM.location.maxlat;
+     } else {
+       mapParams.lon = -0.1;
+       mapParams.lat = 51.5;
+       mapParams.zoom = parseInt(params.zoom || 5);
+     }
+     if (mapParams.bbox) {
+       mapParams.box = params.box == "yes";
+       mapParams.lon = (mapParams.minlon + mapParams.maxlon) / 2;
+       mapParams.lat = (mapParams.minlat + mapParams.maxlat) / 2;
+     }
++    mapParams.notes = params.notes == "yes";
++
+     var scale = parseFloat(params.scale);
+     if (scale > 0) {
+       mapParams.zoom = Math.log(360.0 / (scale * 512.0)) / Math.log(2.0);
+     }
+     return mapParams;
+   }
+ };
Simple merge
@@@ -2,23 -2,60 +2,73 @@@
  </iframe>
  
  <div id="browse_map">
-   <% if map.instance_of? Changeset or (map.instance_of? Node and map.version > 1) or map.visible? %>
-   <div id="small_map">
-   </div>
+   <% if map.instance_of? Changeset or (map.instance_of? Node and map.version > 1) or map.visible %>
+   <% content_for :head do %>
+     <%= javascript_include_tag "browse" %>
+   <% end %>
+   <%
+      if map.instance_of? Changeset
+        bbox = map.bbox.to_unscaled
+        data = {
+          :type   => "changeset",
+          :id     => map.id,
+          :minlon => bbox.min_lon,
+          :minlat => bbox.min_lat,
+          :maxlon => bbox.max_lon,
+          :maxlat => bbox.max_lat
+        }
++     elsif map.instance_of? Note
++       data = {
++         :type => "note",
++         :lon  => map.lon,
++         :lon  => map.lat
++       }
+      else
+        data = {
+          :type    => map.class.name.downcase,
+          :id      => map.id,
+          :version => map.version,
+          :visible => map.visible
+        }
+      end
+   %>
+   <%= content_tag "div", "", :id => "small_map", :data => data %>
    <span id="loading"><%= t 'browse.map.loading' %></span>
 -  <%= link_to t("browse.map.larger.area"),
 -              root_path(:box => "yes"),
 -              :id => "area_larger_map",
 -              :class => "geolink bbox" %>
-   <%= link_to(t("browse.map.larger.area"), { :controller => :site, :action => :index, :notes => "yes" }, { :id => "area_larger_map", :class => "geolink bbox" }) %>
 +  <% if map.instance_of? Note -%>
-   <%= link_to(t("browse.map.larger.area"), { :controller => :site, :action => :index, :box => "yes" }, { :id => "area_larger_map", :class => "geolink bbox" }) %>
++    <%= link_to t("browse.map.larger.area"),
++                root_path(:note => "yes"),
++                :id => "area_larger_map",
++                :class => "geolink bbox" %>
 +  <% else -%>
++    <%= link_to t("browse.map.larger.area"),
++                root_path(:box => "yes"),
++                :id => "area_larger_map",
++                :class => "geolink bbox" %>
 +  <% end -%>
    <br />
-   <%= link_to(h(t("browse.map.edit.area")) + content_tag(:span, "▾", :class => "menuicon"), { :controller => :site, :action => :edit }, { :id => "area_edit", :class => "geolink bbox" }) %>
+   <%= link_to h(t("browse.map.edit.area")) + content_tag(:span, "▾", :class => "menuicon"),
+               edit_path,
+               :id => "area_edit",
+               :data => { :editor => preferred_editor },
+               :class => "geolink bbox" %>
 -  <% unless map.instance_of? Changeset %>
 +  <% unless map.instance_of? Changeset or map.instance_of? Note %>
      <br />
-     <%= link_to(t("browse.map.larger." + map.class.to_s.downcase), { :controller => :site, :action => :index }, { :id => "object_larger_map", :class => "geolink object" }) %>
+     <%= link_to t("browse.map.larger." + map.class.to_s.downcase),
+                 root_path,
+                 :id => "object_larger_map",
+                 :class => "geolink object" %>
      <br />
-     <%= link_to(h(t("browse.map.edit." + map.class.to_s.downcase)) + content_tag(:span, "▾", :class => "menuicon"), { :controller => :site, :action => :edit }, { :id => "object_edit", :class => "geolink object" }) %>
+     <%= link_to h(t("browse.map.edit." + map.class.to_s.downcase)) + content_tag(:span, "▾", :class => "menuicon"),
+                 edit_path,
+                 :id => "object_edit",
+                 :data => { :editor => preferred_editor },
+                 :class => "geolink object" %>
    <% end %>
    <% else %>
      <%= t 'browse.map.deleted' %>
    <% end %>
@@@ -6,7 -4,6 +4,7 @@@
  
  <% unless STATUS == :api_offline or STATUS == :database_offline -%>
    <% content_for :editmenu do -%>
-     <li><%= link_to t("browse.start_rjs.notes_layer_name"), "#", :id => "show_notes" %></li>
++    <li><%= link_to t("browse.start_rjs.notes_layer_name"), notes_url(:format => :json), :id => "show_notes" %></li>
      <li><%= link_to t("browse.start_rjs.data_layer_name"), { :controller => :browse, :action => :start }, :id => "show_data" %></li>
    <% end -%>
  <% end -%>
      </tr>
    </table>
  </div>
- <script type="text/javascript">
-   var marker;
-   var map;
-   var params = OSM.mapParams();
-   <% if @user %>
-     var loginName = "<%= @user.display_name %>"
-   <% end %>
-   function mapInit(){
-     map = createMap("map");
-     <% unless STATUS == :api_offline or STATUS == :database_offline %>
-       map.dataLayer = new OpenLayers.Layer("<%= I18n.t 'browse.start_rjs.data_layer_name' %>", {
-           visibility: false,
-           displayInLayerSwitcher: false
-       });
-       map.addLayer(map.dataLayer);
-       map.noteLayer = addNoteLayer(map, "<%= notes_url :format => 'json' %>", $("#createnoteanchor"), $("#new-note"), 11);
-       <% if params[:notes] == "yes" -%>
-       map.noteLayer.setVisibility(true);
-       <% end -%>
-     <% end %>
-     if (!params.object_zoom) {
-       if (params.bbox) {
-         var bbox = new OpenLayers.Bounds(params.minlon, params.minlat, params.maxlon, params.maxlat);
-         map.zoomToExtent(proj(bbox));
-         if (params.box) {
-           $(window).load(function() { addBoxToMap(bbox) });
-         }
-       } else {
-         setMapCenter(new OpenLayers.LonLat(params.lon, params.lat), params.zoom);
-       }
-     }
-     if (params.layers) {
-       setMapLayers(params.layers);
-     }
-     if (params.marker) {
-       marker = addMarkerToMap(new OpenLayers.LonLat(params.mlon, params.mlat));
-     }
-     if (params.object) {
-       var url = "/api/" + OSM.API_VERSION + "/" + params.object_type + "/" + params.object_id;
-       if (params.object_type != "node") {
-         url += "/full";
-       }
-       $(window).load(function() { addObjectToMap(url, params.object_zoom) });
-     }
-     map.events.register("moveend", map, updateLocation);
-     map.events.register("changelayer", map, updateLocation);
-     updateLocation();
-     handleResize();
-   }
-   $(document).ready(function () {
-     $("#show_notes").click(function () {
-       map.noteLayer.setVisibility(true);
-     });
-     $("#show_data").click(function (e) {
-       $.ajax({ url: $(this).attr('href'), success: function (sidebarHtml) {
-         startBrowse(sidebarHtml);
-       }});
-       e.preventDefault();
-     });
-     $("body").on("click", "a.set_position", function () {
-       var lat = parseFloat($(this).attr("data-lat"));
-       var lon = parseFloat($(this).attr("data-lon"));
-       var zoom = parseInt($(this).attr("data-zoom"));
-       var min_lon = parseFloat($(this).attr("data-min-lon"));
-       var min_lat = parseFloat($(this).attr("data-min-lat"));
-       var max_lon = parseFloat($(this).attr("data-max-lon"));
-       var max_lat = parseFloat($(this).attr("data-max-lat"));
-       var centre = new OpenLayers.LonLat(lon, lat);
-       if (min_lon && min_lat && max_lon && max_lat) {
-         var bbox = new OpenLayers.Bounds(min_lon, min_lat, max_lon, max_lat);
-         map.zoomToExtent(proj(bbox));
-       } else {
-         setMapCenter(centre, zoom);
-       }
-       if (marker) {
-         removeMarkerFromMap(marker);
-       }
-       marker = addMarkerToMap(centre, getArrowIcon());
-       return false;
-     });
-   });
-   function updateLocation() {
-     var lonlat = unproj(map.getCenter());
-     var zoom = map.getZoom();
-     var layers = getMapLayers();
-     var extents = unproj(map.getExtent());
-     var expiry = new Date();
-     updatelinks(lonlat.lon, lonlat.lat, zoom, layers, extents.left, extents.bottom, extents.right, extents.top, params.object_type, params.object_id);
-     expiry.setYear(expiry.getFullYear() + 10);
-     $.cookie("_osm_location", [lonlat.lon, lonlat.lat, zoom, layers].join("|"), {expires: expiry});
-   }
-   function remoteEditHandler(event) {
-     var extent = unproj(map.getExtent());
-     var loaded = false;
-     $("#linkloader").load(function () { loaded = true; });
-     $("#linkloader").attr("src", "http://127.0.0.1:8111/load_and_zoom?left=" + extent.left + "&top=" + extent.top + "&right=" + extent.right + "&bottom=" + extent.bottom);
-     setTimeout(function () {
-       if (!loaded) alert("<%=j t('site.index.remote_failed') %>");
-     }, 1000);
-     return false;
-   }
-   function installEditHandler() {
-     $("#remoteanchor").click(remoteEditHandler);
-     <% if preferred_editor == "remote" %>
-       $("#editanchor").click(remoteEditHandler);
-       <% if params[:action] == "edit" %>
-         remoteEditHandler();
-       <% end %>
-     <% end %>
-   }
-   $(document).ready(mapInit);
-   $(document).ready(installEditHandler);
-   $(document).ready(handleResize);
-   $(window).resize(function() {
-     var centre = map.getCenter();
-     var zoom = map.getZoom();
-     handleResize();
-     map.setCenter(centre, zoom);
-   });
-   $(document).ready(function () {
-     $("#exportanchor").click(function (e) {
-       $.ajax({ url: "<%= url_for :controller => :export, :action => :start %>", success: function (sidebarHtml) {
-         startExport(sidebarHtml);
-       }});
-       e.preventDefault();
-     });
-     <% if params[:export] -%>
-     $("#exportanchor").click();
-     <% end -%>
-     <% if params[:query] -%>
-     doSearch("<%= params[:query] %>");
-     <% end %>
-   });
- // -->
- </script>
 +
 +<div id="new-note" class="hidden"><%= render :partial => "notes/new" %></div>
      <%= link_to t('user.view.my traces'), :controller => 'trace', :action=>'mine' %>
      <span class='count-number'><%= number_with_delimiter(@user.traces.size) %></span>
      |
 +    <%= link_to t('user.view.my notes'), :controller => 'note', :action=> 'mine' %>
 +    |
      <%= link_to t('user.view.my diary'), :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %>
+     <span class='count-number'><%= number_with_delimiter(@user.diary_entries.size) %></span>
      |
      <%= link_to t('user.view.my comments' ), :controller => 'diary_entry', :action => 'comments', :display_name => @user.display_name %>
      |
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1195,55 -1138,9 +1172,78 @@@ if(this.imageDiv!=null){if(this.px==nul
  OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,{x:this.px.x+this.offset.x,y:this.px.y+this.offset.y});}}},display:function(display){this.imageDiv.style.display=(display)?"":"none";},isDrawn:function(){var isDrawn=(this.imageDiv&&this.imageDiv.parentNode&&(this.imageDiv.parentNode.nodeType!=11));return isDrawn;},CLASS_NAME:"OpenLayers.Icon"});OpenLayers.Marker=OpenLayers.Class({icon:null,lonlat:null,events:null,map:null,initialize:function(lonlat,icon){this.lonlat=lonlat;var newIcon=(icon)?icon:OpenLayers.Marker.defaultIcon();if(this.icon==null){this.icon=newIcon;}else{this.icon.url=newIcon.url;this.icon.size=newIcon.size;this.icon.offset=newIcon.offset;this.icon.calculateOffset=newIcon.calculateOffset;}
  this.events=new OpenLayers.Events(this,this.icon.imageDiv);},destroy:function(){this.erase();this.map=null;this.events.destroy();this.events=null;if(this.icon!=null){this.icon.destroy();this.icon=null;}},draw:function(px){return this.icon.draw(px);},erase:function(){if(this.icon!=null){this.icon.erase();}},moveTo:function(px){if((px!=null)&&(this.icon!=null)){this.icon.moveTo(px);}
  this.lonlat=this.map.getLonLatFromLayerPx(px);},isDrawn:function(){var isDrawn=(this.icon&&this.icon.isDrawn());return isDrawn;},onScreen:function(){var onScreen=false;if(this.map){var screenBounds=this.map.getExtent();onScreen=screenBounds.containsLonLat(this.lonlat);}
- return onScreen;},inflate:function(inflate){if(this.icon){this.icon.setSize({w:this.icon.size.w*inflate,h:this.icon.size.h*inflate});}},setOpacity:function(opacity){this.icon.setOpacity(opacity);},setUrl:function(url){this.icon.setUrl(url);},display:function(display){this.icon.display(display);},CLASS_NAME:"OpenLayers.Marker"});OpenLayers.Marker.defaultIcon=function(){return new OpenLayers.Icon(OpenLayers.Util.getImageLocation("marker.png"),{w:21,h:25},{x:-10.5,y:-25});};OpenLayers.Format.GeoJSON=OpenLayers.Class(OpenLayers.Format.JSON,{ignoreExtraDims:false,read:function(json,type,filter){type=(type)?type:"FeatureCollection";var results=null;var obj=null;if(typeof json=="string"){obj=OpenLayers.Format.JSON.prototype.read.apply(this,[json,filter]);}else{obj=json;}
 -return onScreen;},inflate:function(inflate){if(this.icon){this.icon.setSize({w:this.icon.size.w*inflate,h:this.icon.size.h*inflate});}},setOpacity:function(opacity){this.icon.setOpacity(opacity);},setUrl:function(url){this.icon.setUrl(url);},display:function(display){this.icon.display(display);},CLASS_NAME:"OpenLayers.Marker"});OpenLayers.Marker.defaultIcon=function(){return new OpenLayers.Icon(OpenLayers.Util.getImageLocation("marker.png"),{w:21,h:25},{x:-10.5,y:-25});};OpenLayers.Lang["ru"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Необработанный запрос вернул ${statusText}",'Permalink':"Постоянная ссылка",'Overlays':"Слои",'Base Layer':"Основной слой",'noFID':"Невозможно обновить объект, для которого нет FID.",'browserNotSupported':"Ваш браузер не поддерживает векторную графику. На данный момент поддерживаются:\n${renderers}",'minZoomLevelError':"Свойство minZoomLevel предназначено только для использования со слоями, являющимися потомками FixedZoomLevels. То, что этот WFS-слой проверяется на minZoomLevel — реликт прошлого. Однако мы не можем удалить эту функцию, так как, возможно, от неё зависят некоторые основанные на OpenLayers приложения. Функция объявлена устаревшей — проверка minZoomLevel будет удалена в 3.0. Пожалуйста, используйте вместо неё настройку мин/макс разрешения, описанную здесь: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Транзакция WFS: УСПЕШНО ${response}",'commitFailed':"Транзакция WFS: ОШИБКА ${response}",'googleWarning':"Слой Google не удалось нормально загрузить.\x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека Google Maps не была включена или не содержит корректного API-ключа для вашего сайта.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eщёлкните тут\x3c/a\x3e",'getLayerWarning':"Слой ${layerType} не удалось нормально загрузить. \x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека ${layerLib} не была включена или была включена некорректно.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eщёлкните тут\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Масштаб = 1 : ${scaleDenom}",'W':"З",'E':"В",'N':"С",'S':"Ю",'reprojectDeprecated':"Вы используете опцию \'reproject\' для слоя ${layerName}. Эта опция является устаревшей: ее использование предполагалось для поддержки показа данных поверх коммерческих базовых карт, но теперь этот функционал несёт встроенная поддержка сферической проекции Меркатора. Больше сведений доступно на http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Этот метод считается устаревшим и будет удалён в версии 3.0. Пожалуйста, пользуйтесь ${newMethod}."});OpenLayers.Lang["nn"]=OpenLayers.Util.applyDefaults({'Scale = 1 : ${scaleDenom}':"Skala = 1 : ${scaleDenom}"});OpenLayers.Lang["fi"]=OpenLayers.Util.applyDefaults({'Permalink':"Ikilinkki",'Overlays':"Kerrokset",'Base Layer':"Peruskerros",'W':"L",'E':"I",'N':"P",'S':"E"});OpenLayers.Lang.es={'unhandledRequest':"Respuesta a petición no gestionada ${statusText}",'Permalink':"Enlace permanente",'Overlays':"Capas superpuestas",'Base Layer':"Capa Base",'noFID':"No se puede actualizar un elemento para el que no existe FID.",'browserNotSupported':"Su navegador no soporta renderización vectorial. Los renderizadores soportados actualmente son:\n${renderers}",'minZoomLevelError':"La propiedad minZoomLevel debe sólo utilizarse "+"con las capas que tienen FixedZoomLevels. El hecho de que "+"una capa wfs compruebe minZoomLevel es una reliquia del "+"pasado. Sin embargo, no podemos eliminarla sin discontinuar "+"probablemente las aplicaciones OL que puedan depender de ello. "+"Así pues estamos haciéndolo obsoleto --la comprobación "+"minZoomLevel se eliminará en la versión 3.0. Utilice el ajuste "+"de resolution min/max en su lugar, tal como se describe aquí: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacción WFS: ÉXITO ${response}",'commitFailed':"Transacción WFS: FALLÓ ${response}",'googleWarning':"La capa Google no pudo ser cargada correctamente.<br><br>"+"Para evitar este mensaje, seleccione una nueva Capa Base "+"en el selector de capas en la esquina superior derecha.<br><br>"+"Probablemente, esto se debe a que el script de la biblioteca de "+"Google Maps no fue correctamente incluido en su página, o no "+"contiene la clave del API correcta para su sitio.<br><br>"+"Desarrolladores: Para ayudar a hacer funcionar esto correctamente, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>haga clic aquí</a>",'getLayerWarning':"La capa ${layerType} no pudo ser cargada correctamente.<br><br>"+"Para evitar este mensaje, seleccione una nueva Capa Base "+"en el selector de capas en la esquina superior derecha.<br><br>"+"Probablemente, esto se debe a que el script de "+"la biblioteca ${layerLib} "+"no fue correctamente incluido en su página.<br><br>"+"Desarrolladores: Para ayudar a hacer funcionar esto correctamente, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>haga clic aquí</a>",'Scale = 1 : ${scaleDenom}':"Escala = 1 : ${scaleDenom}",'W':'O','E':'E','N':'N','S':'S','Graticule':'Retícula','reprojectDeprecated':"Está usando la opción 'reproject' en la capa "+"${layerName}. Esta opción es obsoleta: su uso fue diseñado "+"para soportar la visualización de datos sobre mapas base comerciales, "+"pero ahora esa funcionalidad debería conseguirse mediante el soporte "+"de la proyección Spherical Mercator. Más información disponible en "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Este método es obsoleto y se eliminará en la versión 3.0. "+"Por favor utilice el método ${newMethod} en su lugar.",'end':''};OpenLayers.Layer.SphericalMercator={getExtent:function(){var extent=null;if(this.sphericalMercator){extent=this.map.calculateBounds();}else{extent=OpenLayers.Layer.FixedZoomLevels.prototype.getExtent.apply(this);}
++return onScreen;},inflate:function(inflate){if(this.icon){this.icon.setSize({w:this.icon.size.w*inflate,h:this.icon.size.h*inflate});}},setOpacity:function(opacity){this.icon.setOpacity(opacity);},setUrl:function(url){this.icon.setUrl(url);},display:function(display){this.icon.display(display);},CLASS_NAME:"OpenLayers.Marker"});OpenLayers.Marker.defaultIcon=function(){return new OpenLayers.Icon(OpenLayers.Util.getImageLocation("marker.png"),{w:21,h:25},{x:-10.5,y:-25});};OpenLayers.Format.JSON=OpenLayers.Class(OpenLayers.Format,{indent:"    ",space:" ",newline:"\n",level:0,pretty:false,nativeJSON:(function(){return!!(window.JSON&&typeof JSON.parse=="function"&&typeof JSON.stringify=="function");})(),read:function(json,filter){var object;if(this.nativeJSON){object=JSON.parse(json,filter);}else try{if(/^[\],:{}\s]*$/.test(json.replace(/\\["\\\/bfnrtu]/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){object=eval('('+json+')');if(typeof filter==='function'){function walk(k,v){if(v&&typeof v==='object'){for(var i in v){if(v.hasOwnProperty(i)){v[i]=walk(i,v[i]);}}}
++return filter(k,v);}
++object=walk('',object);}}}catch(e){}
++if(this.keepData){this.data=object;}
++return object;},write:function(value,pretty){this.pretty=!!pretty;var json=null;var type=typeof value;if(this.serialize[type]){try{json=(!this.pretty&&this.nativeJSON)?JSON.stringify(value):this.serialize[type].apply(this,[value]);}catch(err){OpenLayers.Console.error("Trouble serializing: "+err);}}
++return json;},writeIndent:function(){var pieces=[];if(this.pretty){for(var i=0;i<this.level;++i){pieces.push(this.indent);}}
++return pieces.join('');},writeNewline:function(){return(this.pretty)?this.newline:'';},writeSpace:function(){return(this.pretty)?this.space:'';},serialize:{'object':function(object){if(object==null){return"null";}
++if(object.constructor==Date){return this.serialize.date.apply(this,[object]);}
++if(object.constructor==Array){return this.serialize.array.apply(this,[object]);}
++var pieces=['{'];this.level+=1;var key,keyJSON,valueJSON;var addComma=false;for(key in object){if(object.hasOwnProperty(key)){keyJSON=OpenLayers.Format.JSON.prototype.write.apply(this,[key,this.pretty]);valueJSON=OpenLayers.Format.JSON.prototype.write.apply(this,[object[key],this.pretty]);if(keyJSON!=null&&valueJSON!=null){if(addComma){pieces.push(',');}
++pieces.push(this.writeNewline(),this.writeIndent(),keyJSON,':',this.writeSpace(),valueJSON);addComma=true;}}}
++this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),'}');return pieces.join('');},'array':function(array){var json;var pieces=['['];this.level+=1;for(var i=0,len=array.length;i<len;++i){json=OpenLayers.Format.JSON.prototype.write.apply(this,[array[i],this.pretty]);if(json!=null){if(i>0){pieces.push(',');}
++pieces.push(this.writeNewline(),this.writeIndent(),json);}}
++this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),']');return pieces.join('');},'string':function(string){var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};if(/["\\\x00-\x1f]/.test(string)){return'"'+string.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c;}
++c=b.charCodeAt();return'\\u00'+
++Math.floor(c/16).toString(16)+
++(c%16).toString(16);})+'"';}
++return'"'+string+'"';},'number':function(number){return isFinite(number)?String(number):"null";},'boolean':function(bool){return String(bool);},'date':function(date){function format(number){return(number<10)?'0'+number:number;}
++return'"'+date.getFullYear()+'-'+
++format(date.getMonth()+1)+'-'+
++format(date.getDate())+'T'+
++format(date.getHours())+':'+
++format(date.getMinutes())+':'+
++format(date.getSeconds())+'"';}},CLASS_NAME:"OpenLayers.Format.JSON"});OpenLayers.Format.GeoJSON=OpenLayers.Class(OpenLayers.Format.JSON,{ignoreExtraDims:false,read:function(json,type,filter){type=(type)?type:"FeatureCollection";var results=null;var obj=null;if(typeof json=="string"){obj=OpenLayers.Format.JSON.prototype.read.apply(this,[json,filter]);}else{obj=json;}
 +if(!obj){OpenLayers.Console.error("Bad JSON: "+json);}else if(typeof(obj.type)!="string"){OpenLayers.Console.error("Bad GeoJSON - no type: "+json);}else if(this.isValidType(obj,type)){switch(type){case"Geometry":try{results=this.parseGeometry(obj);}catch(err){OpenLayers.Console.error(err);}
 +break;case"Feature":try{results=this.parseFeature(obj);results.type="Feature";}catch(err){OpenLayers.Console.error(err);}
 +break;case"FeatureCollection":results=[];switch(obj.type){case"Feature":try{results.push(this.parseFeature(obj));}catch(err){results=null;OpenLayers.Console.error(err);}
 +break;case"FeatureCollection":for(var i=0,len=obj.features.length;i<len;++i){try{results.push(this.parseFeature(obj.features[i]));}catch(err){results=null;OpenLayers.Console.error(err);}}
 +break;default:try{var geom=this.parseGeometry(obj);results.push(new OpenLayers.Feature.Vector(geom));}catch(err){results=null;OpenLayers.Console.error(err);}}
 +break;}}
 +return results;},isValidType:function(obj,type){var valid=false;switch(type){case"Geometry":if(OpenLayers.Util.indexOf(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","Box","GeometryCollection"],obj.type)==-1){OpenLayers.Console.error("Unsupported geometry type: "+
 +obj.type);}else{valid=true;}
 +break;case"FeatureCollection":valid=true;break;default:if(obj.type==type){valid=true;}else{OpenLayers.Console.error("Cannot convert types from "+
 +obj.type+" to "+type);}}
 +return valid;},parseFeature:function(obj){var feature,geometry,attributes,bbox;attributes=(obj.properties)?obj.properties:{};bbox=(obj.geometry&&obj.geometry.bbox)||obj.bbox;try{geometry=this.parseGeometry(obj.geometry);}catch(err){throw err;}
 +feature=new OpenLayers.Feature.Vector(geometry,attributes);if(bbox){feature.bounds=OpenLayers.Bounds.fromArray(bbox);}
 +if(obj.id){feature.fid=obj.id;}
 +return feature;},parseGeometry:function(obj){if(obj==null){return null;}
 +var geometry,collection=false;if(obj.type=="GeometryCollection"){if(!(OpenLayers.Util.isArray(obj.geometries))){throw"GeometryCollection must have geometries array: "+obj;}
 +var numGeom=obj.geometries.length;var components=new Array(numGeom);for(var i=0;i<numGeom;++i){components[i]=this.parseGeometry.apply(this,[obj.geometries[i]]);}
 +geometry=new OpenLayers.Geometry.Collection(components);collection=true;}else{if(!(OpenLayers.Util.isArray(obj.coordinates))){throw"Geometry must have coordinates array: "+obj;}
 +if(!this.parseCoords[obj.type.toLowerCase()]){throw"Unsupported geometry type: "+obj.type;}
 +try{geometry=this.parseCoords[obj.type.toLowerCase()].apply(this,[obj.coordinates]);}catch(err){throw err;}}
 +if(this.internalProjection&&this.externalProjection&&!collection){geometry.transform(this.externalProjection,this.internalProjection);}
 +return geometry;},parseCoords:{"point":function(array){if(this.ignoreExtraDims==false&&array.length!=2){throw"Only 2D points are supported: "+array;}
 +return new OpenLayers.Geometry.Point(array[0],array[1]);},"multipoint":function(array){var points=[];var p=null;for(var i=0,len=array.length;i<len;++i){try{p=this.parseCoords["point"].apply(this,[array[i]]);}catch(err){throw err;}
 +points.push(p);}
 +return new OpenLayers.Geometry.MultiPoint(points);},"linestring":function(array){var points=[];var p=null;for(var i=0,len=array.length;i<len;++i){try{p=this.parseCoords["point"].apply(this,[array[i]]);}catch(err){throw err;}
 +points.push(p);}
 +return new OpenLayers.Geometry.LineString(points);},"multilinestring":function(array){var lines=[];var l=null;for(var i=0,len=array.length;i<len;++i){try{l=this.parseCoords["linestring"].apply(this,[array[i]]);}catch(err){throw err;}
 +lines.push(l);}
 +return new OpenLayers.Geometry.MultiLineString(lines);},"polygon":function(array){var rings=[];var r,l;for(var i=0,len=array.length;i<len;++i){try{l=this.parseCoords["linestring"].apply(this,[array[i]]);}catch(err){throw err;}
 +r=new OpenLayers.Geometry.LinearRing(l.components);rings.push(r);}
 +return new OpenLayers.Geometry.Polygon(rings);},"multipolygon":function(array){var polys=[];var p=null;for(var i=0,len=array.length;i<len;++i){try{p=this.parseCoords["polygon"].apply(this,[array[i]]);}catch(err){throw err;}
 +polys.push(p);}
 +return new OpenLayers.Geometry.MultiPolygon(polys);},"box":function(array){if(array.length!=2){throw"GeoJSON box coordinates must have 2 elements";}
 +return new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing([new OpenLayers.Geometry.Point(array[0][0],array[0][1]),new OpenLayers.Geometry.Point(array[1][0],array[0][1]),new OpenLayers.Geometry.Point(array[1][0],array[1][1]),new OpenLayers.Geometry.Point(array[0][0],array[1][1]),new OpenLayers.Geometry.Point(array[0][0],array[0][1])])]);}},write:function(obj,pretty){var geojson={"type":null};if(OpenLayers.Util.isArray(obj)){geojson.type="FeatureCollection";var numFeatures=obj.length;geojson.features=new Array(numFeatures);for(var i=0;i<numFeatures;++i){var element=obj[i];if(!element instanceof OpenLayers.Feature.Vector){var msg="FeatureCollection only supports collections "+"of features: "+element;throw msg;}
 +geojson.features[i]=this.extract.feature.apply(this,[element]);}}else if(obj.CLASS_NAME.indexOf("OpenLayers.Geometry")==0){geojson=this.extract.geometry.apply(this,[obj]);}else if(obj instanceof OpenLayers.Feature.Vector){geojson=this.extract.feature.apply(this,[obj]);if(obj.layer&&obj.layer.projection){geojson.crs=this.createCRSObject(obj);}}
 +return OpenLayers.Format.JSON.prototype.write.apply(this,[geojson,pretty]);},createCRSObject:function(object){var proj=object.layer.projection.toString();var crs={};if(proj.match(/epsg:/i)){var code=parseInt(proj.substring(proj.indexOf(":")+1));if(code==4326){crs={"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}};}else{crs={"type":"name","properties":{"name":"EPSG:"+code}};}}
 +return crs;},extract:{'feature':function(feature){var geom=this.extract.geometry.apply(this,[feature.geometry]);var json={"type":"Feature","properties":feature.attributes,"geometry":geom};if(feature.fid!=null){json.id=feature.fid;}
 +return json;},'geometry':function(geometry){if(geometry==null){return null;}
 +if(this.internalProjection&&this.externalProjection){geometry=geometry.clone();geometry.transform(this.internalProjection,this.externalProjection);}
 +var geometryType=geometry.CLASS_NAME.split('.')[2];var data=this.extract[geometryType.toLowerCase()].apply(this,[geometry]);var json;if(geometryType=="Collection"){json={"type":"GeometryCollection","geometries":data};}else{json={"type":geometryType,"coordinates":data};}
 +return json;},'point':function(point){return[point.x,point.y];},'multipoint':function(multipoint){var array=[];for(var i=0,len=multipoint.components.length;i<len;++i){array.push(this.extract.point.apply(this,[multipoint.components[i]]));}
 +return array;},'linestring':function(linestring){var array=[];for(var i=0,len=linestring.components.length;i<len;++i){array.push(this.extract.point.apply(this,[linestring.components[i]]));}
 +return array;},'multilinestring':function(multilinestring){var array=[];for(var i=0,len=multilinestring.components.length;i<len;++i){array.push(this.extract.linestring.apply(this,[multilinestring.components[i]]));}
 +return array;},'polygon':function(polygon){var array=[];for(var i=0,len=polygon.components.length;i<len;++i){array.push(this.extract.linestring.apply(this,[polygon.components[i]]));}
 +return array;},'multipolygon':function(multipolygon){var array=[];for(var i=0,len=multipolygon.components.length;i<len;++i){array.push(this.extract.polygon.apply(this,[multipolygon.components[i]]));}
 +return array;},'collection':function(collection){var len=collection.components.length;var array=new Array(len);for(var i=0;i<len;++i){array[i]=this.extract.geometry.apply(this,[collection.components[i]]);}
- return array;}},CLASS_NAME:"OpenLayers.Format.GeoJSON"});OpenLayers.Lang["nn"]=OpenLayers.Util.applyDefaults({'Scale = 1 : ${scaleDenom}':"Skala = 1 : ${scaleDenom}"});OpenLayers.Lang["fi"]=OpenLayers.Util.applyDefaults({'Permalink':"Ikilinkki",'Overlays':"Kerrokset",'Base Layer':"Peruskerros",'W':"L",'E':"I",'N':"P",'S':"E"});OpenLayers.Lang.es={'unhandledRequest':"Respuesta a petición no gestionada ${statusText}",'Permalink':"Enlace permanente",'Overlays':"Capas superpuestas",'Base Layer':"Capa Base",'noFID':"No se puede actualizar un elemento para el que no existe FID.",'browserNotSupported':"Su navegador no soporta renderización vectorial. Los renderizadores soportados actualmente son:\n${renderers}",'minZoomLevelError':"La propiedad minZoomLevel debe sólo utilizarse "+"con las capas que tienen FixedZoomLevels. El hecho de que "+"una capa wfs compruebe minZoomLevel es una reliquia del "+"pasado. Sin embargo, no podemos eliminarla sin discontinuar "+"probablemente las aplicaciones OL que puedan depender de ello. "+"Así pues estamos haciéndolo obsoleto --la comprobación "+"minZoomLevel se eliminará en la versión 3.0. Utilice el ajuste "+"de resolution min/max en su lugar, tal como se describe aquí: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacción WFS: ÉXITO ${response}",'commitFailed':"Transacción WFS: FALLÓ ${response}",'googleWarning':"La capa Google no pudo ser cargada correctamente.<br><br>"+"Para evitar este mensaje, seleccione una nueva Capa Base "+"en el selector de capas en la esquina superior derecha.<br><br>"+"Probablemente, esto se debe a que el script de la biblioteca de "+"Google Maps no fue correctamente incluido en su página, o no "+"contiene la clave del API correcta para su sitio.<br><br>"+"Desarrolladores: Para ayudar a hacer funcionar esto correctamente, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>haga clic aquí</a>",'getLayerWarning':"La capa ${layerType} no pudo ser cargada correctamente.<br><br>"+"Para evitar este mensaje, seleccione una nueva Capa Base "+"en el selector de capas en la esquina superior derecha.<br><br>"+"Probablemente, esto se debe a que el script de "+"la biblioteca ${layerLib} "+"no fue correctamente incluido en su página.<br><br>"+"Desarrolladores: Para ayudar a hacer funcionar esto correctamente, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>haga clic aquí</a>",'Scale = 1 : ${scaleDenom}':"Escala = 1 : ${scaleDenom}",'W':'O','E':'E','N':'N','S':'S','Graticule':'Retícula','reprojectDeprecated':"Está usando la opción 'reproject' en la capa "+"${layerName}. Esta opción es obsoleta: su uso fue diseñado "+"para soportar la visualización de datos sobre mapas base comerciales, "+"pero ahora esa funcionalidad debería conseguirse mediante el soporte "+"de la proyección Spherical Mercator. Más información disponible en "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Este método es obsoleto y se eliminará en la versión 3.0. "+"Por favor utilice el método ${newMethod} en su lugar.",'end':''};OpenLayers.Layer.SphericalMercator={getExtent:function(){var extent=null;if(this.sphericalMercator){extent=this.map.calculateBounds();}else{extent=OpenLayers.Layer.FixedZoomLevels.prototype.getExtent.apply(this);}
++return array;}},CLASS_NAME:"OpenLayers.Format.GeoJSON"});OpenLayers.Lang["nn"]=OpenLayers.Util.applyDefaults({'Scale = 1 : ${scaleDenom}':"Skala = 1 : ${scaleDenom}"});OpenLayers.Lang["fi"]=OpenLayers.Util.applyDefaults({'Permalink':"Ikilinkki",'Overlays':"Kerrokset",'Base Layer':"Peruskerros",'W':"L",'E':"I",'N':"P",'S':"E"});OpenLayers.Lang["pl"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nieobsługiwane żądanie zwróciło ${statusText}",'Permalink':"Permalink",'Overlays':"Nakładki",'Base Layer':"Warstwa podstawowa",'noFID':"Nie można zaktualizować funkcji, dla których nie ma FID.",'browserNotSupported':"Twoja przeglądarka nie obsługuje renderowania wektorów. Obecnie obsługiwane renderowanie to:\n${renderers}",'minZoomLevelError':"Właściwość minZoomLevel jest przeznaczona tylko do użytku "+"z warstwami FixedZoomLevels-descendent."+"Warstwa wfs, która sprawdza minZoomLevel jest reliktem przeszłości."+"Nie możemy jej jednak usunąc bez mozliwości łamania OL aplikacji, "+"które mogą być od niej zależne. "+"Dlatego jesteśmy za deprecjację -- minZoomLevel "+"zostanie usunięta w wersji 3.0. W zamian prosze użyj "+"min/max rozdzielczości w sposób opisany tutaj: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transakcja WFS: SUKCES ${response}",'commitFailed':"Transakcja WFS: FAILED ${response}",'googleWarning':"Warstwa Google nie był w stanie załadować się poprawnie.<br><br>"+"Aby pozbyć się tej wiadomości, wybierz nową Warstwe podstawową "+"w przełączniku warstw w górnym prawym rogu mapy.<br><br>"+"Najprawdopodobniej jest to spowodowane tym, że biblioteka Google Maps "+"nie jest załadowana, lub nie zawiera poprawnego klucza do API dla twojej strony<br><br>"+"Programisto: Aby uzyskać pomoc , "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>kliknij tutaj</a>",'getLayerWarning':"Warstwa ${layerType} nie mogła zostać załadowana poprawnie.<br><br>"+"Aby pozbyć się tej wiadomości, wybierz nową Warstwe podstawową "+"w przełączniku warstw w górnym prawym rogu mapy.<br><br>"+"Najprawdopodobniej jest to spowodowane tym, że biblioteka ${layerLib} "+"nie jest załadowana, lub może(o ile biblioteka tego wymaga) "+"byc potrzebny klucza do API dla twojej strony<br><br>"+"Programisto: Aby uzyskać pomoc , "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>kliknij tutaj</a>",'Scale = 1 : ${scaleDenom}':"Skala = 1 : ${scaleDenom}",'W':'ZACH','E':'WSCH','N':'PN','S':'PD','Graticule':'Siatka','reprojectDeprecated':"w warstwie ${layerName} używasz opcji 'reproject'. "+"Ta opcja jest przestarzała: "+"jej zastosowanie został zaprojektowany, aby wspierać wyświetlania danych przez komercyjne mapy, "+"jednak obecnie ta funkcjonalność powinien zostać osiągnięty za pomocą Spherical Mercator "+"its use was designed to support displaying data over commercial. Więcje informacji na ten temat możesz znaleźć na stronie "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Ta metoda jest przestarzała i będzie usunięta od wersji 3.0. "+"W zamian użyj ${newMethod}.",'proxyNeeded':"Prawdopodobnie musisz ustawić OpenLayers.ProxyHost aby otrzymać dostęp do ${url}."+"See http://trac.osgeo.org/openlayers/wiki/FrequentlyAskedQuestions#ProxyHost"});OpenLayers.Lang.es={'unhandledRequest':"Respuesta a petición no gestionada ${statusText}",'Permalink':"Enlace permanente",'Overlays':"Capas superpuestas",'Base Layer':"Capa Base",'noFID':"No se puede actualizar un elemento para el que no existe FID.",'browserNotSupported':"Su navegador no soporta renderización vectorial. Los renderizadores soportados actualmente son:\n${renderers}",'minZoomLevelError':"La propiedad minZoomLevel debe sólo utilizarse "+"con las capas que tienen FixedZoomLevels. El hecho de que "+"una capa wfs compruebe minZoomLevel es una reliquia del "+"pasado. Sin embargo, no podemos eliminarla sin discontinuar "+"probablemente las aplicaciones OL que puedan depender de ello. "+"Así pues estamos haciéndolo obsoleto --la comprobación "+"minZoomLevel se eliminará en la versión 3.0. Utilice el ajuste "+"de resolution min/max en su lugar, tal como se describe aquí: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacción WFS: ÉXITO ${response}",'commitFailed':"Transacción WFS: FALLÓ ${response}",'googleWarning':"La capa Google no pudo ser cargada correctamente.<br><br>"+"Para evitar este mensaje, seleccione una nueva Capa Base "+"en el selector de capas en la esquina superior derecha.<br><br>"+"Probablemente, esto se debe a que el script de la biblioteca de "+"Google Maps no fue correctamente incluido en su página, o no "+"contiene la clave del API correcta para su sitio.<br><br>"+"Desarrolladores: Para ayudar a hacer funcionar esto correctamente, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>haga clic aquí</a>",'getLayerWarning':"La capa ${layerType} no pudo ser cargada correctamente.<br><br>"+"Para evitar este mensaje, seleccione una nueva Capa Base "+"en el selector de capas en la esquina superior derecha.<br><br>"+"Probablemente, esto se debe a que el script de "+"la biblioteca ${layerLib} "+"no fue correctamente incluido en su página.<br><br>"+"Desarrolladores: Para ayudar a hacer funcionar esto correctamente, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>haga clic aquí</a>",'Scale = 1 : ${scaleDenom}':"Escala = 1 : ${scaleDenom}",'W':'O','E':'E','N':'N','S':'S','Graticule':'Retícula','reprojectDeprecated':"Está usando la opción 'reproject' en la capa "+"${layerName}. Esta opción es obsoleta: su uso fue diseñado "+"para soportar la visualización de datos sobre mapas base comerciales, "+"pero ahora esa funcionalidad debería conseguirse mediante el soporte "+"de la proyección Spherical Mercator. Más información disponible en "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Este método es obsoleto y se eliminará en la versión 3.0. "+"Por favor utilice el método ${newMethod} en su lugar.",'end':''};OpenLayers.Layer.SphericalMercator={getExtent:function(){var extent=null;if(this.sphericalMercator){extent=this.map.calculateBounds();}else{extent=OpenLayers.Layer.FixedZoomLevels.prototype.getExtent.apply(this);}
  return extent;},getLonLatFromViewPortPx:function(viewPortPx){return OpenLayers.Layer.prototype.getLonLatFromViewPortPx.apply(this,arguments);},getViewPortPxFromLonLat:function(lonlat){return OpenLayers.Layer.prototype.getViewPortPxFromLonLat.apply(this,arguments);},initMercatorParameters:function(){this.RESOLUTIONS=[];var maxResolution=156543.03390625;for(var zoom=0;zoom<=this.MAX_ZOOM_LEVEL;++zoom){this.RESOLUTIONS[zoom]=maxResolution/Math.pow(2,zoom);}
 -this.units="m";this.projection=this.projection||"EPSG:900913";},forwardMercator:(function(){var gg=new OpenLayers.Projection("EPSG:4326");var sm=new OpenLayers.Projection("EPSG:900913");return function(lon,lat){var point=OpenLayers.Projection.transform({x:lon,y:lat},gg,sm);return new OpenLayers.LonLat(point.x,point.y);};})(),inverseMercator:(function(){var gg=new OpenLayers.Projection("EPSG:4326");var sm=new OpenLayers.Projection("EPSG:900913");return function(x,y){var point=OpenLayers.Projection.transform({x:x,y:y},sm,gg);return new OpenLayers.LonLat(point.x,point.y);};})()};OpenLayers.Lang["hsb"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Wotmołwa njewobdźěłaneho naprašowanja ${statusText}",'Permalink':"Trajny wotkaz",'Overlays':"Naworštowanja",'Base Layer':"Zakładna runina",'noFID':"Funkcija, za kotruž FID njeje, njeda so aktualizować.",'browserNotSupported':"Twój wobhladowak wektorowe rysowanje njepodpěruje. Tuchwilu podpěrowane rysowaki su:\n${renderers}",'minZoomLevelError':"Kajkosć minZoomLevel je jenož za wužiwanje z worštami myslena, kotrež wot FixedZoomLevels pochadźeja. Zo tuta woršta wfs za minZoomLevel přepruwuje, je relikt zańdźenosće. Njemóžemy wšak ju wotstronić, bjeztoho zo aplikacije, kotrež na OpenLayers bazěruja a snano tutu kajkosć wužiwaja, hižo njefunguja. Tohodla smy ju jako zestarjenu woznamjenili -- přepruwowanje za minZoomLevel budu so we wersiji 3.0 wotstronjeć. Prošu wužij město toho nastajenje min/max, kaž je tu wopisane: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-Transakcija: WUSPĚŠNA ${response}",'commitFailed':"WFS-Transakcija: NJEPORADŹENA ${response}",'googleWarning':"Woršta Google njemóžeše so korektnje začitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbył, wubjer nowy BaseLayer z wuběra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelž skript biblioteki Google Maps pak njebu zapřijaty pak njewobsahuje korektny kluč API za twoje sydło.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",'getLayerWarning':"Woršta ${layerType} njemóžeše so korektnje začitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbył, wubjer nowy BaseLayer z wuběra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelž skript biblioteki ${layerLib} njebu korektnje zapřijaty.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Měritko = 1 : ${scaleDenom}",'W':"Z",'E':"W",'N':"S",'S':"J",'reprojectDeprecated':"Wužiwaš opciju \"reproject\" wořšty ${layerName}. Tuta opcija je zestarjena: jeje wužiwanje bě myslene, zo by zwobraznjenje datow nad komercielnymi bazowymi kartami podpěrało, ale funkcionalnosć měła so nětko z pomocu Sperical Mercator docpěć. Dalše informacije steja na http://trac.openlayers.org/wiki/SphericalMercator k dispoziciji.",'methodDeprecated':"Tuta metoda je so njeschwaliła a budźe so w 3.0 wotstronjeć. Prošu wužij ${newMethod} město toho."});OpenLayers.Lang["de"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Unbehandelte Anfragerückmeldung ${statusText}",'Permalink':"Permalink",'Overlays':"Overlays",'Base Layer':"Grundkarte",'noFID':"Ein Feature, für das keine FID existiert, kann nicht aktualisiert werden.",'browserNotSupported':"Ihr Browser unterstützt keine Vektordarstellung. Aktuell unterstützte Renderer:\n${renderers}",'minZoomLevelError':"Die \x3ccode\x3eminZoomLevel\x3c/code\x3e-Eigenschaft ist nur für die Verwendung mit \x3ccode\x3eFixedZoomLevels\x3c/code\x3e-untergeordneten Layers vorgesehen. Das dieser \x3ctt\x3ewfs\x3c/tt\x3e-Layer die \x3ccode\x3eminZoomLevel\x3c/code\x3e-Eigenschaft überprüft ist ein Relikt der Vergangenheit. Wir können diese Überprüfung nicht entfernen, ohne das OL basierende Applikationen nicht mehr funktionieren. Daher markieren wir es als veraltet - die \x3ccode\x3eminZoomLevel\x3c/code\x3e-Überprüfung wird in Version 3.0 entfernt werden. Bitte verwenden Sie stattdessen die Min-/Max-Lösung, wie sie unter http://trac.openlayers.org/wiki/SettingZoomLevels beschrieben ist.",'commitSuccess':"WFS-Transaktion: Erfolgreich ${response}",'commitFailed':"WFS-Transaktion: Fehlgeschlagen ${response}",'googleWarning':"Der Google-Layer konnte nicht korrekt geladen werden.\x3cbr\x3e\x3cbr\x3eUm diese Meldung nicht mehr zu erhalten, wählen Sie einen anderen Hintergrundlayer aus dem LayerSwitcher in der rechten oberen Ecke.\x3cbr\x3e\x3cbr\x3eSehr wahrscheinlich tritt dieser Fehler auf, weil das Skript der Google-Maps-Bibliothek nicht eingebunden wurde oder keinen gültigen API-Schlüssel für Ihre URL enthält.\x3cbr\x3e\x3cbr\x3eEntwickler: Besuche \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3edas Wiki\x3c/a\x3e für Hilfe zum korrekten Einbinden des Google-Layers",'getLayerWarning':"Der ${layerType}-Layer konnte nicht korrekt geladen werden.\x3cbr\x3e\x3cbr\x3eUm diese Meldung nicht mehr zu erhalten, wählen Sie einen anderen Hintergrundlayer aus dem LayerSwitcher in der rechten oberen Ecke.\x3cbr\x3e\x3cbr\x3eSehr wahrscheinlich tritt dieser Fehler auf, weil das Skript der \'${layerLib}\'-Bibliothek nicht eingebunden wurde.\x3cbr\x3e\x3cbr\x3eEntwickler: Besuche \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3edas Wiki\x3c/a\x3e für Hilfe zum korrekten Einbinden von Layern",'Scale = 1 : ${scaleDenom}':"Maßstab = 1 : ${scaleDenom}",'W':"W",'E':"O",'N':"N",'S':"S",'reprojectDeprecated':"Sie verwenden die „Reproject“-Option des Layers ${layerName}. Diese Option ist veraltet: Sie wurde entwickelt um die Anzeige von Daten auf kommerziellen Basiskarten zu unterstützen, aber diese Funktion sollte jetzt durch Unterstützung der „Spherical Mercator“ erreicht werden. Weitere Informationen sind unter http://trac.openlayers.org/wiki/SphericalMercator verfügbar.",'methodDeprecated':"Die Methode ist veraltet und wird in 3.0 entfernt. Bitte verwende stattdessen ${newMethod}."});OpenLayers.ProxyHost="";OpenLayers.Request={DEFAULT_CONFIG:{method:"GET",url:window.location.href,async:true,user:undefined,password:undefined,params:null,proxy:OpenLayers.ProxyHost,headers:{},data:null,callback:function(){},success:null,failure:null,scope:null},URL_SPLIT_REGEX:/([^:]*:)\/\/([^:]*:?[^@]*@)?([^:\/\?]*):?([^\/\?]*)/,events:new OpenLayers.Events(this),makeSameOrigin:function(url,proxy){var sameOrigin=url.indexOf("http")!==0;var urlParts=!sameOrigin&&url.match(this.URL_SPLIT_REGEX);if(urlParts){var location=window.location;sameOrigin=urlParts[1]==location.protocol&&urlParts[3]==location.hostname;var uPort=urlParts[4],lPort=location.port;if(uPort!=80&&uPort!=""||lPort!="80"&&lPort!=""){sameOrigin=sameOrigin&&uPort==lPort;}}
 +this.units="m";this.projection=this.projection||"EPSG:900913";},forwardMercator:(function(){var gg=new OpenLayers.Projection("EPSG:4326");var sm=new OpenLayers.Projection("EPSG:900913");return function(lon,lat){var point=OpenLayers.Projection.transform({x:lon,y:lat},gg,sm);return new OpenLayers.LonLat(point.x,point.y);};})(),inverseMercator:(function(){var gg=new OpenLayers.Projection("EPSG:4326");var sm=new OpenLayers.Projection("EPSG:900913");return function(x,y){var point=OpenLayers.Projection.transform({x:x,y:y},sm,gg);return new OpenLayers.LonLat(point.x,point.y);};})()};OpenLayers.Lang["ru"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Необработанный запрос вернул ${statusText}",'Permalink':"Постоянная ссылка",'Overlays':"Слои",'Base Layer':"Основной слой",'noFID':"Невозможно обновить объект, для которого нет FID.",'browserNotSupported':"Ваш браузер не поддерживает векторную графику. На данный момент поддерживаются:\n${renderers}",'minZoomLevelError':"Свойство minZoomLevel предназначено только для использования со слоями, являющимися потомками FixedZoomLevels. То, что этот WFS-слой проверяется на minZoomLevel — реликт прошлого. Однако мы не можем удалить эту функцию, так как, возможно, от неё зависят некоторые основанные на OpenLayers приложения. Функция объявлена устаревшей — проверка minZoomLevel будет удалена в 3.0. Пожалуйста, используйте вместо неё настройку мин/макс разрешения, описанную здесь: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Транзакция WFS: УСПЕШНО ${response}",'commitFailed':"Транзакция WFS: ОШИБКА ${response}",'googleWarning':"Слой Google не удалось нормально загрузить.\x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека Google Maps не была включена или не содержит корректного API-ключа для вашего сайта.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eщёлкните тут\x3c/a\x3e",'getLayerWarning':"Слой ${layerType} не удалось нормально загрузить. \x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека ${layerLib} не была включена или была включена некорректно.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eщёлкните тут\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Масштаб = 1 : ${scaleDenom}",'W':"З",'E':"В",'N':"С",'S':"Ю",'reprojectDeprecated':"Вы используете опцию \'reproject\' для слоя ${layerName}. Эта опция является устаревшей: ее использование предполагалось для поддержки показа данных поверх коммерческих базовых карт, но теперь этот функционал несёт встроенная поддержка сферической проекции Меркатора. Больше сведений доступно на http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Этот метод считается устаревшим и будет удалён в версии 3.0. Пожалуйста, пользуйтесь ${newMethod}."});OpenLayers.Lang["hsb"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Wotmołwa njewobdźěłaneho naprašowanja ${statusText}",'Permalink':"Trajny wotkaz",'Overlays':"Naworštowanja",'Base Layer':"Zakładna runina",'noFID':"Funkcija, za kotruž FID njeje, njeda so aktualizować.",'browserNotSupported':"Twój wobhladowak wektorowe rysowanje njepodpěruje. Tuchwilu podpěrowane rysowaki su:\n${renderers}",'minZoomLevelError':"Kajkosć minZoomLevel je jenož za wužiwanje z worštami myslena, kotrež wot FixedZoomLevels pochadźeja. Zo tuta woršta wfs za minZoomLevel přepruwuje, je relikt zańdźenosće. Njemóžemy wšak ju wotstronić, bjeztoho zo aplikacije, kotrež na OpenLayers bazěruja a snano tutu kajkosć wužiwaja, hižo njefunguja. Tohodla smy ju jako zestarjenu woznamjenili -- přepruwowanje za minZoomLevel budu so we wersiji 3.0 wotstronjeć. Prošu wužij město toho nastajenje min/max, kaž je tu wopisane: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-Transakcija: WUSPĚŠNA ${response}",'commitFailed':"WFS-Transakcija: NJEPORADŹENA ${response}",'googleWarning':"Woršta Google njemóžeše so korektnje začitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbył, wubjer nowy BaseLayer z wuběra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelž skript biblioteki Google Maps pak njebu zapřijaty pak njewobsahuje korektny kluč API za twoje sydło.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",'getLayerWarning':"Woršta ${layerType} njemóžeše so korektnje začitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbył, wubjer nowy BaseLayer z wuběra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelž skript biblioteki ${layerLib} njebu korektnje zapřijaty.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Měritko = 1 : ${scaleDenom}",'W':"Z",'E':"W",'N':"S",'S':"J",'reprojectDeprecated':"Wužiwaš opciju \"reproject\" wořšty ${layerName}. Tuta opcija je zestarjena: jeje wužiwanje bě myslene, zo by zwobraznjenje datow nad komercielnymi bazowymi kartami podpěrało, ale funkcionalnosć měła so nětko z pomocu Sperical Mercator docpěć. Dalše informacije steja na http://trac.openlayers.org/wiki/SphericalMercator k dispoziciji.",'methodDeprecated':"Tuta metoda je so njeschwaliła a budźe so w 3.0 wotstronjeć. Prošu wužij ${newMethod} město toho."});OpenLayers.Lang["de"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Unbehandelte Anfragerückmeldung ${statusText}",'Permalink':"Permalink",'Overlays':"Overlays",'Base Layer':"Grundkarte",'noFID':"Ein Feature, für das keine FID existiert, kann nicht aktualisiert werden.",'browserNotSupported':"Ihr Browser unterstützt keine Vektordarstellung. Aktuell unterstützte Renderer:\n${renderers}",'minZoomLevelError':"Die \x3ccode\x3eminZoomLevel\x3c/code\x3e-Eigenschaft ist nur für die Verwendung mit \x3ccode\x3eFixedZoomLevels\x3c/code\x3e-untergeordneten Layers vorgesehen. Das dieser \x3ctt\x3ewfs\x3c/tt\x3e-Layer die \x3ccode\x3eminZoomLevel\x3c/code\x3e-Eigenschaft überprüft ist ein Relikt der Vergangenheit. Wir können diese Überprüfung nicht entfernen, ohne das OL basierende Applikationen nicht mehr funktionieren. Daher markieren wir es als veraltet - die \x3ccode\x3eminZoomLevel\x3c/code\x3e-Überprüfung wird in Version 3.0 entfernt werden. Bitte verwenden Sie stattdessen die Min-/Max-Lösung, wie sie unter http://trac.openlayers.org/wiki/SettingZoomLevels beschrieben ist.",'commitSuccess':"WFS-Transaktion: Erfolgreich ${response}",'commitFailed':"WFS-Transaktion: Fehlgeschlagen ${response}",'googleWarning':"Der Google-Layer konnte nicht korrekt geladen werden.\x3cbr\x3e\x3cbr\x3eUm diese Meldung nicht mehr zu erhalten, wählen Sie einen anderen Hintergrundlayer aus dem LayerSwitcher in der rechten oberen Ecke.\x3cbr\x3e\x3cbr\x3eSehr wahrscheinlich tritt dieser Fehler auf, weil das Skript der Google-Maps-Bibliothek nicht eingebunden wurde oder keinen gültigen API-Schlüssel für Ihre URL enthält.\x3cbr\x3e\x3cbr\x3eEntwickler: Besuche \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3edas Wiki\x3c/a\x3e für Hilfe zum korrekten Einbinden des Google-Layers",'getLayerWarning':"Der ${layerType}-Layer konnte nicht korrekt geladen werden.\x3cbr\x3e\x3cbr\x3eUm diese Meldung nicht mehr zu erhalten, wählen Sie einen anderen Hintergrundlayer aus dem LayerSwitcher in der rechten oberen Ecke.\x3cbr\x3e\x3cbr\x3eSehr wahrscheinlich tritt dieser Fehler auf, weil das Skript der \'${layerLib}\'-Bibliothek nicht eingebunden wurde.\x3cbr\x3e\x3cbr\x3eEntwickler: Besuche \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3edas Wiki\x3c/a\x3e für Hilfe zum korrekten Einbinden von Layern",'Scale = 1 : ${scaleDenom}':"Maßstab = 1 : ${scaleDenom}",'W':"W",'E':"O",'N':"N",'S':"S",'reprojectDeprecated':"Sie verwenden die „Reproject“-Option des Layers ${layerName}. Diese Option ist veraltet: Sie wurde entwickelt um die Anzeige von Daten auf kommerziellen Basiskarten zu unterstützen, aber diese Funktion sollte jetzt durch Unterstützung der „Spherical Mercator“ erreicht werden. Weitere Informationen sind unter http://trac.openlayers.org/wiki/SphericalMercator verfügbar.",'methodDeprecated':"Die Methode ist veraltet und wird in 3.0 entfernt. Bitte verwende stattdessen ${newMethod}."});OpenLayers.ProxyHost="";OpenLayers.Request={DEFAULT_CONFIG:{method:"GET",url:window.location.href,async:true,user:undefined,password:undefined,params:null,proxy:OpenLayers.ProxyHost,headers:{},data:null,callback:function(){},success:null,failure:null,scope:null},URL_SPLIT_REGEX:/([^:]*:)\/\/([^:]*:?[^@]*@)?([^:\/\?]*):?([^\/\?]*)/,events:new OpenLayers.Events(this),makeSameOrigin:function(url,proxy){var sameOrigin=url.indexOf("http")!==0;var urlParts=!sameOrigin&&url.match(this.URL_SPLIT_REGEX);if(urlParts){var location=window.location;sameOrigin=urlParts[1]==location.protocol&&urlParts[3]==location.hostname;var uPort=urlParts[4],lPort=location.port;if(uPort!=80&&uPort!=""||lPort!="80"&&lPort!=""){sameOrigin=sameOrigin&&uPort==lPort;}}
  if(!sameOrigin){if(proxy){if(typeof proxy=="function"){url=proxy(url);}else{url=proxy+encodeURIComponent(url);}}else{OpenLayers.Console.warn(OpenLayers.i18n("proxyNeeded"),{url:url});}}
  return url;},issue:function(config){var defaultConfig=OpenLayers.Util.extend(this.DEFAULT_CONFIG,{proxy:OpenLayers.ProxyHost});config=OpenLayers.Util.applyDefaults(config,defaultConfig);var customRequestedWithHeader=false,headerKey;for(headerKey in config.headers){if(config.headers.hasOwnProperty(headerKey)){if(headerKey.toLowerCase()==='x-requested-with'){customRequestedWithHeader=true;}}}
  if(customRequestedWithHeader===false){config.headers['X-Requested-With']='XMLHttpRequest';}