Merge branch 'master' into openstreetbugs
Conflicts: Gemfile app/helpers/application_helper.rb app/views/site/index.html.erb
This commit is contained in:
commit
4d91fe3dd9
177 changed files with 4914 additions and 3062 deletions
|
@ -2,23 +2,46 @@
|
|||
//= require jquery_ujs
|
||||
//= require jquery.autogrowtextarea
|
||||
//= require jquery.timers
|
||||
//= require jquery.cookie
|
||||
//= require augment
|
||||
//= require openlayers
|
||||
//= require i18n/translations
|
||||
//= require globals
|
||||
//= require params
|
||||
//= require piwik
|
||||
//= require browse
|
||||
//= require export
|
||||
//= require map
|
||||
//= require key
|
||||
//= require menu
|
||||
//= require sidebar
|
||||
//= require richtext
|
||||
//= require resize
|
||||
//= require notes
|
||||
|
||||
function zoomPrecision(zoom) {
|
||||
var decimals = Math.pow(10, Math.floor(zoom/3));
|
||||
return function(x) {
|
||||
return Math.round(x * decimals) / decimals;
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* Called as the user scrolls/zooms around to aniplate hrefs of the
|
||||
* view tab and various other links
|
||||
*/
|
||||
function updatelinks(lon,lat,zoom,layers,minlon,minlat,maxlon,maxlat,objtype,objid) {
|
||||
var decimals = Math.pow(10, Math.floor(zoom/3));
|
||||
var toPrecision = zoomPrecision(zoom);
|
||||
var node;
|
||||
|
||||
lat = Math.round(lat * decimals) / decimals;
|
||||
lon = Math.round(lon * decimals) / decimals;
|
||||
lat = toPrecision(lat);
|
||||
lon = toPrecision(lon);
|
||||
|
||||
if (minlon) {
|
||||
minlon = Math.round(minlon * decimals) / decimals;
|
||||
minlat = Math.round(minlat * decimals) / decimals;
|
||||
maxlon = Math.round(maxlon * decimals) / decimals;
|
||||
maxlat = Math.round(maxlat * decimals) / decimals;
|
||||
minlon = toPrecision(minlon);
|
||||
minlat = toPrecision(minlat);
|
||||
maxlon = toPrecision(maxlon);
|
||||
maxlat = toPrecision(maxlat);
|
||||
}
|
||||
|
||||
$(".geolink").each(function (index, link) {
|
||||
|
@ -40,25 +63,21 @@ function updatelinks(lon,lat,zoom,layers,minlon,minlat,maxlon,maxlat,objtype,obj
|
|||
args[objtype] = objid;
|
||||
}
|
||||
|
||||
var classes = $(link).attr("class").split(" ");
|
||||
|
||||
$(classes).each(function (index, classname) {
|
||||
if (match = classname.match(/^minzoom([0-9]+)$/)) {
|
||||
var minzoom = match[1];
|
||||
var minzoom = $(link).data("minzoom");
|
||||
if (minzoom) {
|
||||
var name = link.id.replace(/anchor$/, "");
|
||||
|
||||
$(link).off("click.minzoom");
|
||||
|
||||
if (zoom >= minzoom) {
|
||||
$(link).attr("title", i18n("javascripts.site." + name + "_tooltip"));
|
||||
$(link).attr("title", I18n.t("javascripts.site." + name + "_tooltip"));
|
||||
$(link).removeClass("disabled");
|
||||
} else {
|
||||
$(link).on("click.minzoom", function () { alert(i18n("javascripts.site." + name + "_zoom_alert")); return false; });
|
||||
$(link).attr("title", i18n("javascripts.site." + name + "_disabled_tooltip"));
|
||||
$(link).on("click.minzoom", function () { alert(I18n.t("javascripts.site." + name + "_zoom_alert")); return false; });
|
||||
$(link).attr("title", I18n.t("javascripts.site." + name + "_disabled_tooltip"));
|
||||
$(link).addClass("disabled");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
link.href = setArgs(link.href, args);
|
||||
});
|
||||
|
@ -144,26 +163,6 @@ function setArgs(url, args) {
|
|||
return url.replace(/\?.*$/, "") + "?" + queryitems.join("&");
|
||||
}
|
||||
|
||||
/*
|
||||
* Called to interpolate JavaScript variables in strings using a
|
||||
* similar syntax to rails I18n string interpolation - the only
|
||||
* difference is that [[foo]] is the placeholder syntax instead
|
||||
* of {{foo}} which allows the same string to be processed by both
|
||||
* rails and then later by javascript.
|
||||
*/
|
||||
function i18n(string, keys) {
|
||||
string = i18n_strings[string] || string;
|
||||
|
||||
for (var key in keys) {
|
||||
var re_key = '\\[\\[' + key + '\\]\\]';
|
||||
var re = new RegExp(re_key, "g");
|
||||
|
||||
string = string.replace(re, keys[key]);
|
||||
}
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called to interlace the bits in x and y, making a Morton code.
|
||||
*/
|
||||
|
@ -208,62 +207,18 @@ function makeShortCode(lat, lon, zoom) {
|
|||
}
|
||||
|
||||
/*
|
||||
* Click handler to switch a rich text control to preview mode
|
||||
*/
|
||||
function previewRichtext(event) {
|
||||
var editor = $(this).parents(".richtext_container").find("textarea");
|
||||
var preview = $(this).parents(".richtext_container").find(".richtext_preview");
|
||||
var width = editor.outerWidth() - preview.outerWidth() + preview.innerWidth();
|
||||
var minHeight = editor.outerHeight() - preview.outerHeight() + preview.innerHeight();
|
||||
|
||||
if (preview.contents().length == 0) {
|
||||
preview.oneTime(500, "loading", function () {
|
||||
preview.addClass("loading");
|
||||
});
|
||||
|
||||
preview.load(editor.attr("data-preview-url"), { text: editor.val() }, function () {
|
||||
preview.stopTime("loading");
|
||||
preview.removeClass("loading");
|
||||
});
|
||||
}
|
||||
|
||||
editor.hide();
|
||||
preview.width(width);
|
||||
preview.css("min-height", minHeight + "px");
|
||||
preview.show();
|
||||
|
||||
$(this).siblings(".richtext_doedit").prop("disabled", false);
|
||||
$(this).prop("disabled", true);
|
||||
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
/*
|
||||
* Click handler to switch a rich text control to edit mode
|
||||
*/
|
||||
function editRichtext(event) {
|
||||
var editor = $(this).parents(".richtext_container").find("textarea");
|
||||
var preview = $(this).parents(".richtext_container").find(".richtext_preview");
|
||||
|
||||
preview.hide();
|
||||
editor.show();
|
||||
|
||||
$(this).siblings(".richtext_dopreview").prop("disabled", false);
|
||||
$(this).prop("disabled", true);
|
||||
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup any rich text controls
|
||||
* Forms which have been cached by rails may have he wrong
|
||||
* authenticity token, so patch up any forms with the correct
|
||||
* token taken from the page header.
|
||||
*/
|
||||
$(document).ready(function () {
|
||||
$(".richtext_preview").hide();
|
||||
$(".richtext_content textarea").change(function () {
|
||||
$(this).parents(".richtext_container").find(".richtext_preview").empty();
|
||||
});
|
||||
$(".richtext_doedit").prop("disabled", true);
|
||||
$(".richtext_dopreview").prop("disabled", false);
|
||||
$(".richtext_doedit").click(editRichtext);
|
||||
$(".richtext_dopreview").click(previewRichtext);
|
||||
var auth_token = $("meta[name=csrf-token]").attr("content");
|
||||
$("form input[name=authenticity_token]").val(auth_token);
|
||||
});
|
||||
|
||||
/*
|
||||
* Enable auto expansion for all text areas
|
||||
*/
|
||||
$(document).ready(function () {
|
||||
$("textarea").autoGrow();
|
||||
});
|
549
app/assets/javascripts/browse.js
Normal file
549
app/assets/javascripts/browse.js
Normal file
|
@ -0,0 +1,549 @@
|
|||
function startBrowse(sidebarHtml) {
|
||||
var browseBoxControl;
|
||||
var browseMode = "auto";
|
||||
var browseBounds;
|
||||
var browseFeatureList;
|
||||
var browseActiveFeature;
|
||||
var browseDataLayer;
|
||||
var browseSelectControl;
|
||||
var browseObjectList;
|
||||
var areasHidden = false;
|
||||
|
||||
OpenLayers.Feature.Vector.style['default'].strokeWidth = 3;
|
||||
OpenLayers.Feature.Vector.style['default'].cursor = "pointer";
|
||||
|
||||
map.dataLayer.active = true;
|
||||
|
||||
$("#sidebar_title").html(I18n.t('browse.start_rjs.data_frame_title'));
|
||||
$("#sidebar_content").html(sidebarHtml);
|
||||
|
||||
openSidebar();
|
||||
|
||||
var vectors = new OpenLayers.Layer.Vector();
|
||||
|
||||
browseBoxControl = new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.RegularPolygon, {
|
||||
handlerOptions: {
|
||||
sides: 4,
|
||||
snapAngle: 90,
|
||||
irregular: true,
|
||||
persist: true
|
||||
}
|
||||
});
|
||||
browseBoxControl.handler.callbacks.done = endDrag;
|
||||
map.addControl(browseBoxControl);
|
||||
|
||||
map.events.register("moveend", map, updateData);
|
||||
map.events.triggerEvent("moveend");
|
||||
|
||||
$("#browse_select_view").click(useMap);
|
||||
|
||||
$("#browse_select_box").click(startDrag);
|
||||
|
||||
$("#browse_hide_areas_box").html(I18n.t('browse.start_rjs.hide_areas'));
|
||||
$("#browse_hide_areas_box").show();
|
||||
$("#browse_hide_areas_box").click(hideAreas);
|
||||
|
||||
function updateData() {
|
||||
if (browseMode == "auto") {
|
||||
if (map.getZoom() >= 15) {
|
||||
useMap(false);
|
||||
} else {
|
||||
setStatus(I18n.t('browse.start_rjs.zoom_or_select'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$("#sidebar").one("closed", function () {
|
||||
if (map.dataLayer.active) {
|
||||
map.dataLayer.active = false;
|
||||
|
||||
if (browseSelectControl) {
|
||||
browseSelectControl.destroy();
|
||||
browseSelectControl = null;
|
||||
}
|
||||
|
||||
if (browseBoxControl) {
|
||||
browseBoxControl.destroy();
|
||||
browseBoxControl = null;
|
||||
}
|
||||
|
||||
if (browseActiveFeature) {
|
||||
browseActiveFeature.destroy();
|
||||
browseActiveFeature = null;
|
||||
}
|
||||
|
||||
if (browseDataLayer) {
|
||||
browseDataLayer.destroy();
|
||||
browseDataLayer = null;
|
||||
}
|
||||
|
||||
map.dataLayer.setVisibility(false);
|
||||
map.events.unregister("moveend", map, updateData);
|
||||
}
|
||||
});
|
||||
|
||||
function startDrag() {
|
||||
$("#browse_select_box").html(I18n.t('browse.start_rjs.drag_a_box'));
|
||||
|
||||
browseBoxControl.activate();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function useMap(reload) {
|
||||
var bounds = map.getExtent();
|
||||
var projected = bounds.clone().transform(map.getProjectionObject(), epsg4326);
|
||||
|
||||
if (!browseBounds || !browseBounds.containsBounds(projected)) {
|
||||
var center = bounds.getCenterLonLat();
|
||||
var tileWidth = bounds.getWidth() * 1.2;
|
||||
var tileHeight = bounds.getHeight() * 1.2;
|
||||
var tileBounds = new OpenLayers.Bounds(center.lon - (tileWidth / 2),
|
||||
center.lat - (tileHeight / 2),
|
||||
center.lon + (tileWidth / 2),
|
||||
center.lat + (tileHeight / 2));
|
||||
|
||||
browseBounds = tileBounds;
|
||||
getData(tileBounds, reload);
|
||||
|
||||
browseMode = "auto";
|
||||
|
||||
$("#browse_select_view").hide();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function hideAreas() {
|
||||
$("#browse_hide_areas_box").html(I18n.t('browse.start_rjs.show_areas'));
|
||||
$("#browse_hide_areas_box").show();
|
||||
$("#browse_hide_areas_box").click(showAreas);
|
||||
|
||||
areasHidden = true;
|
||||
|
||||
useMap(true);
|
||||
}
|
||||
|
||||
function showAreas() {
|
||||
$("#browse_hide_areas_box").html(I18n.t('browse.start_rjs.hide_areas'));
|
||||
$("#browse_hide_areas_box").show();
|
||||
$("#browse_hide_areas_box").click(hideAreas);
|
||||
|
||||
areasHidden = false;
|
||||
|
||||
useMap(true);
|
||||
}
|
||||
|
||||
function endDrag(bbox) {
|
||||
var bounds = bbox.getBounds();
|
||||
var projected = bounds.clone().transform(map.getProjectionObject(), epsg4326);
|
||||
|
||||
browseBoxControl.deactivate();
|
||||
browseBounds = projected;
|
||||
getData(bounds);
|
||||
|
||||
browseMode = "manual";
|
||||
|
||||
$("#browse_select_box").html(I18n.t('browse.start_rjs.manually_select'));
|
||||
$("#browse_select_view").show();
|
||||
}
|
||||
|
||||
function displayFeatureWarning(count, limit, callback) {
|
||||
clearStatus();
|
||||
|
||||
var div = document.createElement("div");
|
||||
|
||||
var p = document.createElement("p");
|
||||
p.appendChild(document.createTextNode(I18n.t("browse.start_rjs.loaded_an_area_with_num_features", { num_features: count, max_features: limit })));
|
||||
div.appendChild(p);
|
||||
|
||||
var input = document.createElement("input");
|
||||
input.type = "submit";
|
||||
input.value = I18n.t('browse.start_rjs.load_data');
|
||||
input.onclick = callback;
|
||||
div.appendChild(input);
|
||||
|
||||
$("#browse_content").html("");
|
||||
$("#browse_content").append(div);
|
||||
}
|
||||
|
||||
function customDataLoader(resp, options) {
|
||||
if (map.dataLayer.active) {
|
||||
var request = resp.priv;
|
||||
var doc = request.responseXML;
|
||||
|
||||
if (!doc || !doc.documentElement) {
|
||||
doc = request.responseText;
|
||||
}
|
||||
|
||||
resp.features = this.format.read(doc);
|
||||
|
||||
if (!this.maxFeatures || resp.features.length <= this.maxFeatures) {
|
||||
options.callback.call(options.scope, resp);
|
||||
} else {
|
||||
displayFeatureWarning(resp.features.length, this.maxFeatures, function () {
|
||||
options.callback.call(options.scope, resp);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getData(bounds, reload) {
|
||||
var projected = bounds.clone().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
|
||||
var size = projected.getWidth() * projected.getHeight();
|
||||
|
||||
if (size > OSM.MAX_REQUEST_AREA) {
|
||||
setStatus(I18n.t("browse.start_rjs.unable_to_load_size", { max_bbox_size: OSM.MAX_REQUEST_AREA, bbox_size: size }));
|
||||
} else {
|
||||
loadData("/api/" + OSM.API_VERSION + "/map?bbox=" + projected.toBBOX(), reload);
|
||||
}
|
||||
}
|
||||
|
||||
function loadData(url, reload) {
|
||||
setStatus(I18n.t('browse.start_rjs.loading'));
|
||||
|
||||
$("#browse_content").empty();
|
||||
|
||||
var formatOptions = {
|
||||
checkTags: true,
|
||||
interestingTagsExclude: ['source','source_ref','source:ref','history','attribution','created_by','tiger:county','tiger:tlid','tiger:upload_uuid']
|
||||
};
|
||||
|
||||
if (areasHidden) formatOptions.areaTags = [];
|
||||
|
||||
if (!browseDataLayer || reload) {
|
||||
var style = new OpenLayers.Style();
|
||||
|
||||
style.addRules([new OpenLayers.Rule({
|
||||
symbolizer: {
|
||||
Polygon: { fillColor: '#ff0000', strokeColor: '#ff0000' },
|
||||
Line: { fillColor: '#ffff00', strokeColor: '#000000', strokeOpacity: '0.4' },
|
||||
Point: { fillColor: '#00ff00', strokeColor: '#00ff00' }
|
||||
}
|
||||
})]);
|
||||
|
||||
if (browseDataLayer) browseDataLayer.destroyFeatures();
|
||||
|
||||
/*
|
||||
* Modern browsers are quite happy showing far more than 100 features in
|
||||
* the data browser, so increase the limit to 2000 by default, but keep
|
||||
* it restricted to 500 for IE8 and 100 for older IEs.
|
||||
*/
|
||||
var maxFeatures = 2000;
|
||||
|
||||
/*@cc_on
|
||||
if (navigator.appVersion < 8) {
|
||||
maxFeatures = 100;
|
||||
} else if (navigator.appVersion < 9) {
|
||||
maxFeatures = 500;
|
||||
}
|
||||
@*/
|
||||
|
||||
browseDataLayer = new OpenLayers.Layer.Vector("Data", {
|
||||
strategies: [
|
||||
new OpenLayers.Strategy.Fixed()
|
||||
],
|
||||
protocol: new OpenLayers.Protocol.HTTP({
|
||||
url: url,
|
||||
format: new OpenLayers.Format.OSM(formatOptions),
|
||||
maxFeatures: maxFeatures,
|
||||
handleRead: customDataLoader
|
||||
}),
|
||||
projection: new OpenLayers.Projection("EPSG:4326"),
|
||||
displayInLayerSwitcher: false,
|
||||
styleMap: new OpenLayers.StyleMap({
|
||||
'default': style,
|
||||
'select': { strokeColor: '#0000ff', strokeWidth: 8 }
|
||||
})
|
||||
});
|
||||
browseDataLayer.events.register("loadend", browseDataLayer, dataLoaded );
|
||||
map.addLayer(browseDataLayer);
|
||||
|
||||
browseSelectControl = new OpenLayers.Control.SelectFeature(browseDataLayer, { onSelect: onFeatureSelect });
|
||||
browseSelectControl.handlers.feature.stopDown = false;
|
||||
browseSelectControl.handlers.feature.stopUp = false;
|
||||
map.addControl(browseSelectControl);
|
||||
browseSelectControl.activate();
|
||||
} else {
|
||||
browseDataLayer.destroyFeatures();
|
||||
browseDataLayer.refresh({ url: url });
|
||||
}
|
||||
|
||||
browseActiveFeature = null;
|
||||
}
|
||||
|
||||
function dataLoaded() {
|
||||
if (this.map.dataLayer.active) {
|
||||
clearStatus();
|
||||
|
||||
browseObjectList = document.createElement("div");
|
||||
|
||||
var heading = document.createElement("p");
|
||||
heading.className = "browse_heading";
|
||||
heading.appendChild(document.createTextNode(I18n.t('browse.start_rjs.object_list.heading')));
|
||||
browseObjectList.appendChild(heading);
|
||||
|
||||
var list = document.createElement("ul");
|
||||
|
||||
for (var i = 0; i < this.features.length; i++) {
|
||||
var feature = this.features[i];
|
||||
|
||||
// Type, for linking
|
||||
var type = featureType(feature);
|
||||
var typeName = featureTypeName(feature);
|
||||
var li = document.createElement("li");
|
||||
li.appendChild(document.createTextNode(typeName + " "));
|
||||
|
||||
// Link, for viewing in the tab
|
||||
var link = document.createElement("a");
|
||||
link.href = "/browse/" + type + "/" + feature.osm_id;
|
||||
var name = featureName(feature);
|
||||
link.appendChild(document.createTextNode(name));
|
||||
link.feature = feature;
|
||||
link.onclick = OpenLayers.Function.bind(viewFeatureLink, link);
|
||||
li.appendChild(link);
|
||||
|
||||
list.appendChild(li);
|
||||
}
|
||||
|
||||
browseObjectList.appendChild(list);
|
||||
|
||||
var link = document.createElement("a");
|
||||
link.href = this.protocol.url;
|
||||
link.appendChild(document.createTextNode(I18n.t('browse.start_rjs.object_list.api')));
|
||||
browseObjectList.appendChild(link);
|
||||
|
||||
$("#browse_content").html(browseObjectList);
|
||||
}
|
||||
}
|
||||
|
||||
function viewFeatureLink() {
|
||||
var layer = this.feature.layer;
|
||||
|
||||
for (var i = 0; i < layer.selectedFeatures.length; i++) {
|
||||
var f = layer.selectedFeatures[i];
|
||||
layer.drawFeature(f, layer.styleMap.createSymbolizer(f, "default"));
|
||||
}
|
||||
|
||||
onFeatureSelect(this.feature);
|
||||
|
||||
if (browseMode != "auto") {
|
||||
map.setCenter(this.feature.geometry.getBounds().getCenterLonLat());
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function loadObjectList() {
|
||||
$("#browse_content").empty();
|
||||
$("#browse_content").append(browseObjectList);
|
||||
|
||||
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 tr = document.createElement("tr");
|
||||
table.appendChild(tr);
|
||||
|
||||
var heading = document.createElement("td");
|
||||
heading.appendChild(document.createTextNode(featureNameSelect(feature)));
|
||||
tr.appendChild(heading);
|
||||
|
||||
var td = document.createElement("td");
|
||||
td.align = "right";
|
||||
tr.appendChild(td);
|
||||
|
||||
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);
|
||||
|
||||
var div = document.createElement("div");
|
||||
div.className = "browse_details";
|
||||
|
||||
$("#browse_content").append(div);
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
div.appendChild(ul);
|
||||
|
||||
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
|
||||
});
|
||||
|
||||
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)
|
||||
});
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function displayHistory(request) {
|
||||
if (browseActiveFeature.osm_id != this.feature.osm_id || $("#browse_content").firstChild == browseObjectList) {
|
||||
return false;
|
||||
}
|
||||
|
||||
this.link.parentNode.removeChild(this.link);
|
||||
|
||||
var doc = request.responseXML;
|
||||
|
||||
var table = document.createElement("table");
|
||||
table.width = "100%";
|
||||
table.className = "browse_heading";
|
||||
$("#browse_content").append(table);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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 });
|
||||
}
|
||||
}
|
||||
|
||||
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 });
|
||||
}
|
||||
}
|
||||
|
||||
function setStatus(status) {
|
||||
$("#browse_status").html(status);
|
||||
$("#browse_status").show();
|
||||
}
|
||||
|
||||
function clearStatus() {
|
||||
$("#browse_status").html("");
|
||||
$("#browse_status").hide();
|
||||
}
|
||||
}
|
318
app/assets/javascripts/export.js
Normal file
318
app/assets/javascripts/export.js
Normal file
|
@ -0,0 +1,318 @@
|
|||
function startExport(sidebarHtml) {
|
||||
var vectors,
|
||||
box,
|
||||
transform,
|
||||
markerLayer,
|
||||
markerControl,
|
||||
epsg4326 = new OpenLayers.Projection("EPSG:4326"),
|
||||
epsg900913 = new OpenLayers.Projection("EPSG:900913");
|
||||
|
||||
vectors = new OpenLayers.Layer.Vector("Vector Layer", {
|
||||
displayInLayerSwitcher: false
|
||||
});
|
||||
map.addLayer(vectors);
|
||||
|
||||
box = new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.RegularPolygon, {
|
||||
handlerOptions: {
|
||||
sides: 4,
|
||||
snapAngle: 90,
|
||||
irregular: true,
|
||||
persist: true
|
||||
}
|
||||
});
|
||||
box.handler.callbacks.done = endDrag;
|
||||
map.addControl(box);
|
||||
|
||||
transform = new OpenLayers.Control.TransformFeature(vectors, {
|
||||
rotate: false,
|
||||
irregular: true
|
||||
});
|
||||
transform.events.register("transformcomplete", transform, transformComplete);
|
||||
map.addControl(transform);
|
||||
|
||||
map.events.register("moveend", map, mapMoved);
|
||||
map.events.register("changebaselayer", map, htmlUrlChanged);
|
||||
|
||||
$("#sidebar_title").html(I18n.t('export.start_rjs.export'));
|
||||
$("#sidebar_content").html(sidebarHtml);
|
||||
|
||||
$("#maxlat,#minlon,#maxlon,#minlat").change(boundsChanged);
|
||||
|
||||
$("#drag_box").click(startDrag);
|
||||
|
||||
$("#add_marker").click(startMarker);
|
||||
|
||||
$("#format_osm,#format_mapnik,#format_html").click(formatChanged);
|
||||
|
||||
$("#mapnik_scale").change(mapnikSizeChanged);
|
||||
|
||||
openSidebar();
|
||||
|
||||
if (map.baseLayer.name == "Mapnik") {
|
||||
$("#format_mapnik").prop("checked", true);
|
||||
}
|
||||
|
||||
formatChanged();
|
||||
setBounds(map.getExtent());
|
||||
|
||||
$("body").removeClass("site-index").addClass("site-export");
|
||||
|
||||
$("#sidebar").one("closed", function () {
|
||||
$("body").removeClass("site-export").addClass("site-index");
|
||||
|
||||
clearBox();
|
||||
clearMarker();
|
||||
map.events.unregister("moveend", map, mapMoved);
|
||||
map.events.unregister("changebaselayer", map, htmlUrlChanged);
|
||||
map.removeLayer(vectors);
|
||||
});
|
||||
|
||||
function getMercatorBounds() {
|
||||
var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(),
|
||||
$("#maxlon").val(), $("#maxlat").val());
|
||||
|
||||
return bounds.transform(epsg4326, epsg900913);
|
||||
}
|
||||
|
||||
function boundsChanged() {
|
||||
var bounds = getMercatorBounds();
|
||||
|
||||
map.events.unregister("moveend", map, mapMoved);
|
||||
map.zoomToExtent(bounds);
|
||||
|
||||
clearBox();
|
||||
drawBox(bounds);
|
||||
|
||||
validateControls();
|
||||
mapnikSizeChanged();
|
||||
}
|
||||
|
||||
function startDrag() {
|
||||
$("#drag_box").html(I18n.t('export.start_rjs.drag_a_box'));
|
||||
|
||||
clearBox();
|
||||
box.activate();
|
||||
};
|
||||
|
||||
function endDrag(bbox) {
|
||||
var bounds = bbox.getBounds();
|
||||
|
||||
map.events.unregister("moveend", map, mapMoved);
|
||||
setBounds(bounds);
|
||||
drawBox(bounds);
|
||||
box.deactivate();
|
||||
validateControls();
|
||||
|
||||
$("#drag_box").html(I18n.t('export.start_rjs.manually_select'));
|
||||
}
|
||||
|
||||
function transformComplete(event) {
|
||||
setBounds(event.feature.geometry.bounds);
|
||||
validateControls();
|
||||
}
|
||||
|
||||
function startMarker() {
|
||||
$("#add_marker").html(I18n.t('export.start_rjs.click_add_marker'));
|
||||
|
||||
if (!markerLayer) {
|
||||
markerLayer = new OpenLayers.Layer.Vector("",{
|
||||
displayInLayerSwitcher: false,
|
||||
style: {
|
||||
externalGraphic: OpenLayers.Util.getImageLocation("marker.png"),
|
||||
graphicXOffset: -10.5,
|
||||
graphicYOffset: -25,
|
||||
graphicWidth: 21,
|
||||
graphicHeight: 25
|
||||
}
|
||||
});
|
||||
map.addLayer(markerLayer);
|
||||
|
||||
markerControl = new OpenLayers.Control.DrawFeature(markerLayer, OpenLayers.Handler.Point);
|
||||
map.addControl(markerControl);
|
||||
|
||||
markerLayer.events.on({ "featureadded": endMarker });
|
||||
}
|
||||
|
||||
markerLayer.destroyFeatures();
|
||||
markerControl.activate();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function endMarker(event) {
|
||||
markerControl.deactivate();
|
||||
|
||||
$("#add_marker").html(I18n.t('export.start_rjs.change_marker'));
|
||||
$("#marker_inputs").show();
|
||||
|
||||
var geom = event.feature.geometry.clone().transform(epsg900913, epsg4326);
|
||||
|
||||
$("#marker_lon").val(geom.x.toFixed(5));
|
||||
$("#marker_lat").val(geom.y.toFixed(5));
|
||||
|
||||
htmlUrlChanged();
|
||||
}
|
||||
|
||||
function clearMarker() {
|
||||
$("#marker_lon,#marker_lat").val("");
|
||||
$("#marker_inputs").hide();
|
||||
$("#add_marker").html(I18n.t('export.start_rjs.add_marker'));
|
||||
|
||||
if (markerLayer) {
|
||||
markerControl.destroy();
|
||||
markerLayer.destroy();
|
||||
markerLayer = null;
|
||||
markerControl = null;
|
||||
}
|
||||
}
|
||||
|
||||
function mapMoved() {
|
||||
setBounds(map.getExtent());
|
||||
validateControls();
|
||||
}
|
||||
|
||||
function setBounds(bounds) {
|
||||
var toPrecision = zoomPrecision(map.getZoom());
|
||||
|
||||
bounds = bounds.clone().transform(map.getProjectionObject(), epsg4326);
|
||||
|
||||
$("#minlon").val(toPrecision(bounds.left));
|
||||
$("#minlat").val(toPrecision(bounds.bottom));
|
||||
$("#maxlon").val(toPrecision(bounds.right));
|
||||
$("#maxlat").val(toPrecision(bounds.top));
|
||||
|
||||
mapnikSizeChanged();
|
||||
htmlUrlChanged();
|
||||
}
|
||||
|
||||
function clearBox() {
|
||||
transform.deactivate();
|
||||
vectors.destroyFeatures();
|
||||
}
|
||||
|
||||
function drawBox(bounds) {
|
||||
var feature = new OpenLayers.Feature.Vector(bounds.toGeometry());
|
||||
|
||||
vectors.addFeatures(feature);
|
||||
transform.setFeature(feature);
|
||||
}
|
||||
|
||||
function validateControls() {
|
||||
var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(), $("#maxlon").val(), $("#maxlat").val());
|
||||
|
||||
if (bounds.getWidth() * bounds.getHeight() > OSM.MAX_REQUEST_AREA) {
|
||||
$("#export_osm_too_large").show();
|
||||
} else {
|
||||
$("#export_osm_too_large").hide();
|
||||
}
|
||||
|
||||
var max_scale = maxMapnikScale();
|
||||
var disabled = true;
|
||||
|
||||
if ($("#format_osm").prop("checked")) {
|
||||
disabled = bounds.getWidth() * bounds.getHeight() > OSM.MAX_REQUEST_AREA;
|
||||
} else if ($("#format_mapnik").prop("checked")) {
|
||||
disabled = $("#mapnik_scale").val() < max_scale;
|
||||
}
|
||||
|
||||
$("#export_commit").prop("disabled", disabled);
|
||||
$("#mapnik_max_scale").html(roundScale(max_scale));
|
||||
}
|
||||
|
||||
function htmlUrlChanged() {
|
||||
var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(), $("#maxlon").val(), $("#maxlat").val());
|
||||
var layerName = map.baseLayer.keyid;
|
||||
var url = "http://" + OSM.SERVER_URL + "/export/embed.html?bbox=" + bounds.toBBOX() + "&layer=" + layerName;
|
||||
var markerUrl = "";
|
||||
|
||||
if ($("#marker_lat").val() && $("#marker_lon").val()) {
|
||||
markerUrl = "&mlat=" + $("#marker_lat").val() + "&mlon=" + $("#marker_lon").val();
|
||||
url += "&marker=" + $("#marker_lat").val() + "," + $("#marker_lon").val();
|
||||
}
|
||||
|
||||
var html = '<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="'+url+'" style="border: 1px solid black"></iframe>';
|
||||
|
||||
// Create "larger map" link
|
||||
var center = bounds.getCenterLonLat();
|
||||
|
||||
bounds.transform(epsg4326, epsg900913);
|
||||
var zoom = map.getZoomForExtent(bounds);
|
||||
|
||||
var layers = getMapLayers();
|
||||
|
||||
var text = I18n.t('export.start_rjs.view_larger_map');
|
||||
var escaped = [];
|
||||
|
||||
for (var i = 0; i < text.length; ++i) {
|
||||
var c = text.charCodeAt(i);
|
||||
escaped.push(c < 127 ? text.charAt(i) : "&#" + c + ";");
|
||||
}
|
||||
|
||||
html += '<br /><small><a href="http://' + OSM.SERVER_URL + '/?lat='+center.lat+'&lon='+center.lon+'&zoom='+zoom+'&layers='+layers+markerUrl+'">'+escaped.join("")+'</a></small>';
|
||||
|
||||
$("#export_html_text").val(html);
|
||||
|
||||
if ($("#format_html").prop("checked")) {
|
||||
$("#export_html_text").prop("selected", true);
|
||||
}
|
||||
}
|
||||
|
||||
function formatChanged() {
|
||||
$("#export_commit").show();
|
||||
|
||||
if ($("#format_osm").prop("checked")) {
|
||||
$("#export_osm").show();
|
||||
} else {
|
||||
$("#export_osm").hide();
|
||||
}
|
||||
|
||||
if ($("#format_mapnik").prop("checked")) {
|
||||
$("#mapnik_scale").val(roundScale(map.getScale()));
|
||||
$("#export_mapnik").show();
|
||||
|
||||
mapnikSizeChanged();
|
||||
} else {
|
||||
$("#export_mapnik").hide();
|
||||
}
|
||||
|
||||
if ($("#format_html").prop("checked")) {
|
||||
$("#export_html").show();
|
||||
$("#export_commit").hide();
|
||||
$("#export_html_text").prop("selected", true);
|
||||
} else {
|
||||
$("#export_html").hide();
|
||||
|
||||
clearMarker();
|
||||
}
|
||||
|
||||
validateControls();
|
||||
}
|
||||
|
||||
function maxMapnikScale() {
|
||||
var bounds = getMercatorBounds();
|
||||
|
||||
return Math.floor(Math.sqrt(bounds.getWidth() * bounds.getHeight() / 0.3136));
|
||||
}
|
||||
|
||||
function mapnikImageSize(scale) {
|
||||
var bounds = getMercatorBounds();
|
||||
|
||||
return new OpenLayers.Size(Math.round(bounds.getWidth() / scale / 0.00028),
|
||||
Math.round(bounds.getHeight() / scale / 0.00028));
|
||||
}
|
||||
|
||||
function roundScale(scale) {
|
||||
var precision = 5 * Math.pow(10, Math.floor(Math.LOG10E * Math.log(scale)) - 2);
|
||||
|
||||
return precision * Math.ceil(scale / precision);
|
||||
}
|
||||
|
||||
function mapnikSizeChanged() {
|
||||
var size = mapnikImageSize($("#mapnik_scale").val());
|
||||
|
||||
$("#mapnik_image_width").html(size.w);
|
||||
$("#mapnik_image_height").html(size.h);
|
||||
|
||||
validateControls();
|
||||
}
|
||||
}
|
9
app/assets/javascripts/globals.js.erb
Normal file
9
app/assets/javascripts/globals.js.erb
Normal file
|
@ -0,0 +1,9 @@
|
|||
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 %>
|
||||
};
|
36
app/assets/javascripts/key.js
Normal file
36
app/assets/javascripts/key.js
Normal file
|
@ -0,0 +1,36 @@
|
|||
$(document).ready(function () {
|
||||
$("#open_map_key").click(function (e) {
|
||||
var url = $(this).attr('href'),
|
||||
title = $(this).text();
|
||||
|
||||
function updateMapKey() {
|
||||
var mapLayer = map.baseLayer.keyid,
|
||||
mapZoom = map.getZoom();
|
||||
|
||||
$(".mapkey-table-entry").each(function () {
|
||||
var data = $(this).data();
|
||||
|
||||
if (mapLayer == data.layer &&
|
||||
mapZoom >= data.zoomMin && mapZoom <= data.zoomMax) {
|
||||
$(this).show();
|
||||
} else {
|
||||
$(this).hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$("#sidebar_content").load(url, updateMapKey);
|
||||
|
||||
openSidebar({ title: title });
|
||||
|
||||
$("#sidebar").one("closed", function () {
|
||||
map.events.unregister("zoomend", map, updateMapKey);
|
||||
map.events.unregister("changelayer", map, updateMapKey);
|
||||
});
|
||||
|
||||
map.events.register("zoomend", map, updateMapKey);
|
||||
map.events.register("changelayer", map, updateMapKey);
|
||||
|
||||
e.preventDefault();
|
||||
});
|
||||
});
|
|
@ -22,7 +22,7 @@ function createMap(divName, options) {
|
|||
theme: "<%= asset_path 'theme/openstreetmap/style.css' %>"
|
||||
});
|
||||
|
||||
var mapnik = new OpenLayers.Layer.OSM.Mapnik(i18n("javascripts.map.base.standard"), {
|
||||
var mapnik = new OpenLayers.Layer.OSM.Mapnik(I18n.t("javascripts.map.base.standard"), {
|
||||
attribution: "",
|
||||
keyid: "mapnik",
|
||||
displayOutsideMaxExtent: true,
|
||||
|
@ -31,7 +31,7 @@ function createMap(divName, options) {
|
|||
});
|
||||
map.addLayer(mapnik);
|
||||
|
||||
var cyclemap = new OpenLayers.Layer.OSM.CycleMap(i18n("javascripts.map.base.cycle_map"), {
|
||||
var cyclemap = new OpenLayers.Layer.OSM.CycleMap(I18n.t("javascripts.map.base.cycle_map"), {
|
||||
attribution: "Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
|
||||
keyid: "cyclemap",
|
||||
displayOutsideMaxExtent: true,
|
||||
|
@ -40,7 +40,7 @@ function createMap(divName, options) {
|
|||
});
|
||||
map.addLayer(cyclemap);
|
||||
|
||||
var transportmap = new OpenLayers.Layer.OSM.TransportMap(i18n("javascripts.map.base.transport_map"), {
|
||||
var transportmap = new OpenLayers.Layer.OSM.TransportMap(I18n.t("javascripts.map.base.transport_map"), {
|
||||
attribution: "Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
|
||||
keyid: "transportmap",
|
||||
displayOutsideMaxExtent: true,
|
||||
|
@ -49,7 +49,7 @@ function createMap(divName, options) {
|
|||
});
|
||||
map.addLayer(transportmap);
|
||||
|
||||
var mapquest = new OpenLayers.Layer.OSM(i18n("javascripts.map.base.mapquest"), [
|
||||
var mapquest = new OpenLayers.Layer.OSM(I18n.t("javascripts.map.base.mapquest"), [
|
||||
"http://otile1.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png",
|
||||
"http://otile2.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png",
|
||||
"http://otile3.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png",
|
||||
|
@ -71,6 +71,16 @@ function createMap(divName, options) {
|
|||
});
|
||||
map.addLayer(markers);
|
||||
|
||||
map.dataLayer = new OpenLayers.Layer(I18n.t('browse.start_rjs.data_layer_name'), {
|
||||
visibility: false,
|
||||
displayInLayerSwitcher: false
|
||||
});
|
||||
map.addLayer(map.dataLayer);
|
||||
|
||||
$("#" + divName).on("resized", function () {
|
||||
map.updateSize();
|
||||
});
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
|
|
|
@ -35,3 +35,5 @@ OpenLayers.Util.origGetImageLocation = OpenLayers.Util.getImageLocation;
|
|||
OpenLayers.Util.getImageLocation = function(image) {
|
||||
return OpenLayers.Util.imageURLs[image] || OpenLayers.Util.origGetImageLocation(image);
|
||||
};
|
||||
|
||||
OpenLayers.Lang.setCode($('html').attr('lang'));
|
||||
|
|
100
app/assets/javascripts/params.js
Normal file
100
app/assets/javascripts/params.js
Normal file
|
@ -0,0 +1,100 @@
|
|||
OSM.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 = true;
|
||||
mapParams.object_zoom = true;
|
||||
|
||||
if (params.node) {
|
||||
mapParams.object_type = 'node';
|
||||
mapParams.object_id = parseInt(params.node);
|
||||
} else if (params.way) {
|
||||
mapParams.object_type = 'way';
|
||||
mapParams.object_id = parseInt(params.way);
|
||||
} else if (params.relation) {
|
||||
mapParams.object_type = 'relation';
|
||||
mapParams.object_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;
|
||||
}
|
||||
|
||||
var scale = parseFloat(params.scale);
|
||||
if (scale > 0) {
|
||||
mapParams.zoom = Math.log(360.0 / (scale * 512.0)) / Math.log(2.0);
|
||||
}
|
||||
|
||||
return mapParams;
|
||||
};
|
21
app/assets/javascripts/piwik.js
Normal file
21
app/assets/javascripts/piwik.js
Normal file
|
@ -0,0 +1,21 @@
|
|||
if (OSM.PIWIK_LOCATION && OSM.PIWIK_SITE) {
|
||||
$(document).ready(function () {
|
||||
var base = document.location.protocol + "//" + OSM.PIWIK_LOCATION + "/";
|
||||
|
||||
$.ajax({
|
||||
url: base + "piwik.js",
|
||||
dataType: "script",
|
||||
cache: true,
|
||||
success: function () {
|
||||
var piwikTracker = Piwik.getTracker(base + "piwik.php", OSM.PIWIK_SITE);
|
||||
|
||||
piwikTracker.trackPageView();
|
||||
piwikTracker.enableLinkTracking();
|
||||
|
||||
$("meta[name=piwik-goal]").each(function () {
|
||||
piwikTracker.trackGoal($(this).attr("content"));
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
53
app/assets/javascripts/resize.js
Normal file
53
app/assets/javascripts/resize.js
Normal file
|
@ -0,0 +1,53 @@
|
|||
function resizeContent() {
|
||||
var content = $("#content");
|
||||
var leftMargin = parseInt(content.css("left"));
|
||||
var rightMargin = parseInt(content.css("right"));
|
||||
var bottomMargin = parseInt(content.css("bottom"));
|
||||
|
||||
if ($("html").attr("dir") == "ltr") {
|
||||
content.width($(window).width() - content.prop("offsetLeft") - rightMargin);
|
||||
} else {
|
||||
content.width($(window).width() - content.prop("offsetRight") - leftMargin);
|
||||
}
|
||||
|
||||
content.height($(window).height() - content.prop("offsetTop") - bottomMargin);
|
||||
}
|
||||
|
||||
function resizeMap() {
|
||||
var content_width = $("#content").width();
|
||||
var content_height = $("#content").height();
|
||||
var sidebar_width = 0;
|
||||
var left_border = parseFloat($("#map").css("border-left-width"));
|
||||
var right_border = parseFloat($("#map").css("border-right-width"));
|
||||
var top_border = parseFloat($("#map").css("border-top-width"));
|
||||
var bottom_border = parseFloat($("#map").css("border-bottom-width"));
|
||||
|
||||
$("#sidebar:visible").each(function () {
|
||||
sidebar_width = sidebar_width + $(this).outerWidth(true);
|
||||
});
|
||||
|
||||
if ($("html").attr("dir") == "ltr") {
|
||||
$("#map").css("left", (sidebar_width) + "px");
|
||||
} else {
|
||||
$("#map").css("right", (sidebar_width) + "px");
|
||||
}
|
||||
|
||||
$("#map").width(content_width - sidebar_width - left_border - right_border);
|
||||
$("#map").height(content_height - top_border - bottom_border);
|
||||
$("#map").trigger("resized");
|
||||
}
|
||||
|
||||
function handleResize() {
|
||||
var brokenContentSize = $("#content").prop("offsetWidth") == 0;
|
||||
|
||||
if (brokenContentSize) {
|
||||
resizeContent();
|
||||
}
|
||||
|
||||
resizeMap();
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
$("#sidebar").on("opened", resizeMap);
|
||||
$("#sidebar").on("closed", resizeMap);
|
||||
});
|
68
app/assets/javascripts/richtext.js
Normal file
68
app/assets/javascripts/richtext.js
Normal file
|
@ -0,0 +1,68 @@
|
|||
$(document).ready(function () {
|
||||
/* Hide the preview panes */
|
||||
$(".richtext_preview").hide();
|
||||
|
||||
/*
|
||||
* When the text in an edit pane is changed, clear the contents of
|
||||
* the associated preview pne so that it will be regenerated when
|
||||
* the user next switches to it.
|
||||
*/
|
||||
$(".richtext_content textarea").change(function () {
|
||||
$(this).parents(".richtext_container").find(".richtext_preview").empty();
|
||||
});
|
||||
|
||||
/* Disable all the edit buttons */
|
||||
$(".richtext_doedit").prop("disabled", true);
|
||||
|
||||
/* Enable the preview buttons */
|
||||
$(".richtext_dopreview").prop("disabled", false);
|
||||
|
||||
/*
|
||||
* Install a click handler to switch to edit mode when the
|
||||
* edit button is pressed.
|
||||
*/
|
||||
$(".richtext_doedit").click(function (event) {
|
||||
var editor = $(this).parents(".richtext_container").find("textarea");
|
||||
var preview = $(this).parents(".richtext_container").find(".richtext_preview");
|
||||
|
||||
preview.hide();
|
||||
editor.show();
|
||||
|
||||
$(this).siblings(".richtext_dopreview").prop("disabled", false);
|
||||
$(this).prop("disabled", true);
|
||||
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
/*
|
||||
* Install a click handler to switch to preview mode when the
|
||||
* preview button is pressed.
|
||||
*/
|
||||
$(".richtext_dopreview").click(function (event) {
|
||||
var editor = $(this).parents(".richtext_container").find("textarea");
|
||||
var preview = $(this).parents(".richtext_container").find(".richtext_preview");
|
||||
var width = editor.outerWidth() - preview.outerWidth() + preview.innerWidth();
|
||||
var minHeight = editor.outerHeight() - preview.outerHeight() + preview.innerHeight();
|
||||
|
||||
if (preview.contents().length == 0) {
|
||||
preview.oneTime(500, "loading", function () {
|
||||
preview.addClass("loading");
|
||||
});
|
||||
|
||||
preview.load(editor.data("previewUrl"), { text: editor.val() }, function () {
|
||||
preview.stopTime("loading");
|
||||
preview.removeClass("loading");
|
||||
});
|
||||
}
|
||||
|
||||
editor.hide();
|
||||
preview.width(width);
|
||||
preview.css("min-height", minHeight + "px");
|
||||
preview.show();
|
||||
|
||||
$(this).siblings(".richtext_doedit").prop("disabled", false);
|
||||
$(this).prop("disabled", true);
|
||||
|
||||
event.preventDefault();
|
||||
});
|
||||
});
|
24
app/assets/javascripts/sidebar.js
Normal file
24
app/assets/javascripts/sidebar.js
Normal file
|
@ -0,0 +1,24 @@
|
|||
function openSidebar(options) {
|
||||
options = options || {};
|
||||
|
||||
$("#sidebar").trigger("closed");
|
||||
|
||||
if (options.title) { $("#sidebar_title").html(options.title); }
|
||||
|
||||
if (options.width) { $("#sidebar").width(options.width); }
|
||||
else { $("#sidebar").width("30%"); }
|
||||
|
||||
$("#sidebar").css("display", "block");
|
||||
|
||||
$("#sidebar").trigger("opened");
|
||||
};
|
||||
|
||||
$(document).ready(function () {
|
||||
$(".sidebar_close").click(function (e) {
|
||||
$("#sidebar").css("display", "none");
|
||||
|
||||
$("#sidebar").trigger("closed");
|
||||
|
||||
e.preventDefault();
|
||||
});
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue