openstreetmap-website/app/assets/javascripts/index.js
Tom Hughes 9cc9a00988 Restore autofocusing of the search field
Use the HTML5 autofocus attribute, and focus on load for browsers
which don't support it.

Also change the removal of the "Where am I?" prompt to happen on
input rather than when the field is focused, so that it is properly
removed and restored when the field has been autofocused.

Fixes https://trac.openstreetmap.org/ticket/5065
2013-12-10 19:45:28 +00:00

340 lines
8.5 KiB
JavaScript

//= require_self
//= require leaflet.sidebar
//= require leaflet.locate
//= require leaflet.layers
//= require leaflet.key
//= require leaflet.note
//= require leaflet.share
//= require index/search
//= require index/browse
//= require index/export
//= require index/notes
//= require index/history
//= require index/note
//= require index/new_note
//= require router
(function() {
var loaderTimeout;
OSM.loadSidebarContent = function(path, callback) {
clearTimeout(loaderTimeout);
loaderTimeout = setTimeout(function() {
$('#sidebar_loader').show();
}, 200);
// IE<10 doesn't respect Vary: X-Requested-With header, so
// prevent caching the XHR response as a full-page URL.
if (path.indexOf('?') >= 0) {
path += '&xhr=1'
} else {
path += '?xhr=1'
}
$('#sidebar_content')
.empty();
$.ajax({
url: path,
dataType: "html",
complete: function(xhr) {
clearTimeout(loaderTimeout);
$('#flash').empty();
$('#sidebar_loader').hide();
var content = $(xhr.responseText);
if (xhr.getResponseHeader('X-Page-Title')) {
var title = xhr.getResponseHeader('X-Page-Title');
document.title = decodeURIComponent(escape(title));
}
$('head')
.find('link[type="application/atom+xml"]')
.remove();
$('head')
.append(content.filter('link[type="application/atom+xml"]'));
$('#sidebar_content').html(content.not('link[type="application/atom+xml"]'));
if (callback) {
callback();
}
}
});
};
})();
$(document).ready(function () {
var params = OSM.mapParams();
var map = new L.OSM.Map("map", {
zoomControl: false,
layerControl: false
});
map.attributionControl.setPrefix('');
map.updateLayers(params.layers);
map.on("baselayerchange", function (e) {
if (map.getZoom() > e.layer.options.maxZoom) {
map.setView(map.getCenter(), e.layer.options.maxZoom, { reset: true });
}
});
var position = $('html').attr('dir') === 'rtl' ? 'topleft' : 'topright';
L.OSM.zoom({position: position})
.addTo(map);
L.control.locate({
position: position,
strings: {
title: I18n.t('javascripts.map.locate.title'),
popup: I18n.t('javascripts.map.locate.popup')
}
}).addTo(map);
var sidebar = L.OSM.sidebar('#map-ui')
.addTo(map);
L.OSM.layers({
position: position,
layers: map.baseLayers,
sidebar: sidebar
}).addTo(map);
L.OSM.key({
position: position,
sidebar: sidebar
}).addTo(map);
L.OSM.share({
position: position,
sidebar: sidebar,
short: true
}).addTo(map);
L.OSM.note({
position: position,
sidebar: sidebar
}).addTo(map);
L.control.scale()
.addTo(map);
if (OSM.STATUS != 'api_offline' && OSM.STATUS != 'database_offline') {
initializeNotes(map);
if (params.layers.indexOf(map.noteLayer.options.code) >= 0) {
map.addLayer(map.noteLayer);
}
initializeBrowse(map);
if (params.layers.indexOf(map.dataLayer.options.code) >= 0) {
map.addLayer(map.dataLayer);
}
}
$('.leaflet-control .control-button').tooltip({placement: 'left', container: 'body'});
var expiry = new Date();
expiry.setYear(expiry.getFullYear() + 10);
map.on('moveend layeradd layerremove', function() {
updateLinks(
map.getCenter().wrap(),
map.getZoom(),
map.getLayersCode(),
map._object);
$.cookie("_osm_location", cookieContent(map), { expires: expiry });
});
if ($.cookie('_osm_welcome') == 'hide') {
$('.welcome').hide();
}
$('.welcome .close').on('click', function() {
$('.welcome').hide();
$.cookie("_osm_welcome", 'hide', { expires: expiry });
});
if (OSM.PIWIK) {
map.on('layeradd', function (e) {
if (e.layer.options) {
var goal = OSM.PIWIK.goals[e.layer.options.keyid];
if (goal) {
$('body').trigger('piwikgoal', goal);
}
}
});
}
if (params.bounds) {
map.fitBounds(params.bounds);
} else {
map.setView([params.lat, params.lon], params.zoom);
}
var marker = L.marker([0, 0], {icon: getUserIcon()});
if (params.marker) {
marker.setLatLng([params.mlat, params.mlon]).addTo(map);
}
$("#homeanchor").on("click", function(e) {
e.preventDefault();
var data = $(this).data(),
center = L.latLng(data.lat, data.lon);
map.setView(center, data.zoom);
marker.setLatLng(center).addTo(map);
});
$("a[data-editor=remote]").click(function(e) {
var params = OSM.mapParams(this.search);
remoteEditHandler(map.getBounds(), params.object);
e.preventDefault();
});
if (OSM.params().edit_help) {
$('#editanchor')
.removeAttr('title')
.tooltip({
placement: 'bottom',
title: I18n.t('javascripts.edit_help')
})
.tooltip('show');
$('body').one('click', function() {
$('#editanchor').tooltip('hide');
});
}
OSM.Index = function(map) {
var page = {};
page.pushstate = function() {
$("#content").addClass("overlay-sidebar");
map.invalidateSize({pan: false})
.panBy([-350, 0], {animate: false});
document.title = I18n.t('layouts.project_name.title');
};
page.load = function() {
if (!("autofocus" in document.createElement("input"))) {
$(".search_form input[name=query]").focus();
}
return map.getState();
};
page.popstate = function() {
$("#content").addClass("overlay-sidebar");
map.invalidateSize({pan: false});
document.title = I18n.t('layouts.project_name.title');
};
page.unload = function() {
map.panBy([350, 0], {animate: false});
$("#content").removeClass("overlay-sidebar");
map.invalidateSize({pan: false});
};
return page;
};
OSM.Browse = function(map, type) {
var page = {};
page.pushstate = page.popstate = function(path, id) {
OSM.loadSidebarContent(path, function() {
addObject(type, id);
});
};
page.load = function(path, id) {
addObject(type, id, true);
};
function addObject(type, id, center) {
var bounds = map.addObject({type: type, id: parseInt(id)}, function(bounds) {
if (!window.location.hash && bounds.isValid()) {
OSM.router.moveListenerOff();
map.once('moveend', OSM.router.moveListenerOn);
if (center || !map.getBounds().contains(bounds)) map.fitBounds(bounds);
}
});
}
page.unload = function() {
map.removeObject();
};
return page;
};
var history = OSM.History(map);
OSM.router = OSM.Router(map, {
"/": OSM.Index(map),
"/search": OSM.Search(map),
"/export": OSM.Export(map),
"/note/new": OSM.NewNote(map),
"/history/friends": history,
"/history/nearby": history,
"/history": history,
"/user/:display_name/history": history,
"/note/:id": OSM.Note(map),
"/node/:id(/history)": OSM.Browse(map, 'node'),
"/way/:id(/history)": OSM.Browse(map, 'way'),
"/relation/:id(/history)": OSM.Browse(map, 'relation'),
"/changeset/:id": OSM.Browse(map, 'changeset')
});
if (OSM.preferred_editor == "remote" && document.location.pathname == "/edit") {
remoteEditHandler(map.getBounds(), params.object);
OSM.router.setCurrentPath("/");
}
OSM.router.load();
$(document).on("click", "a", function(e) {
if (e.isDefaultPrevented() || e.isPropagationStopped())
return;
// Open links in a new tab as normal.
if (e.which > 1 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)
return;
// Ignore cross-protocol and cross-origin links.
if (location.protocol !== this.protocol || location.host !== this.host)
return;
if (OSM.router.route(this.pathname + this.search + this.hash))
e.preventDefault();
});
$(".search_form").on("submit", function(e) {
e.preventDefault();
$("header").addClass("closed");
var query = $(this).find("input[name=query]").val();
if (query) {
OSM.router.route("/search?query=" + encodeURIComponent(query) + OSM.formatHash(map));
} else {
OSM.router.route("/" + OSM.formatHash(map));
}
});
$(".describe_location").on("click", function(e) {
e.preventDefault();
var precision = zoomPrecision(map.getZoom());
OSM.router.route("/search?query=" + encodeURIComponent(
map.getCenter().lat.toFixed(precision) + "," +
map.getCenter().lng.toFixed(precision)));
});
});