+ 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_js("#{I18n.t('browse.start_rjs.edited_by_user_at_timestamp', :user => '{{user}}', :timestamp => '{{timestamp}}')}", { user: user, timestamp: timestamp })));
+ history.appendChild(item);
+ }
+ div.appendChild(history);
+
+ $("browse_content").appendChild(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 featureNameSelect(feature) {
+ if (feature.attributes.name) {
+ return feature.attributes.name;
+ } else if (featureType(feature) == "node") {
+ return i18n_js("#{I18n.t('browse.start_rjs.object_list.selected.type.node', :id => '{{id}}')}", { id: feature.osm_id });
+ } else if (featureType(feature) == "way") {
+ return i18n_js("#{I18n.t('browse.start_rjs.object_list.selected.type.way', :id => '{{id}}')}", { id: feature.osm_id });
+ }
+ }
+
+ function featureNameHistory(feature) {
+ if (feature.attributes.name) {
+ return feature.attributes.name;
+ } else if (featureType(feature) == "node") {
+ return i18n_js("#{I18n.t('browse.start_rjs.object_list.history.type.node', :id => '{{id}}')}", { id: feature.osm_id });
+ } else if (featureType(feature) == "way") {
+ return i18n_js("#{I18n.t('browse.start_rjs.object_list.history.type.way', :id => '{{id}}')}", { id: feature.osm_id });
+ }
+ }
+
+ /*
+ This is a hack so that we can interpolate JavaScript variables in
+ translation strings from Ruby, doing the string replacement
+ client-side instead of on the server.
+ */
+ function i18n_js(string, keys) {
+ for (var key in keys) {
+ var re_key = '\{\{' + key + '\}\}';
+ var re = new RegExp(re_key, "g");
+
+ string = string.replace(re, keys[key]);