113 lines
3.6 KiB
JavaScript
113 lines
3.6 KiB
JavaScript
// geo-location shim
|
|
// Source: https://gist.github.com/paulirish/366184
|
|
|
|
// Currently only serves lat/long
|
|
// depends on jQuery
|
|
|
|
(function (geolocation, $) {
|
|
if (geolocation) return;
|
|
|
|
let cache;
|
|
|
|
geolocation = window.navigator.geolocation = {};
|
|
geolocation.getCurrentPosition = function (callback) {
|
|
if (cache) callback(cache);
|
|
|
|
$.getScript('//www.google.com/jsapi', function () {
|
|
cache = {
|
|
coords: {
|
|
latitude: google.loader.ClientLocation.latitude,
|
|
longitude: google.loader.ClientLocation.longitude,
|
|
},
|
|
};
|
|
|
|
callback(cache);
|
|
});
|
|
};
|
|
|
|
geolocation.watchPosition = geolocation.getCurrentPosition;
|
|
})(navigator.geolocation, jQuery);
|
|
|
|
(function ($) {
|
|
Drupal.behaviors.geofieldGeolocation = {
|
|
attach: function (context, settings) {
|
|
let fields = $(context);
|
|
|
|
// Callback for getCurrentPosition on geofield widget html5 geocode button
|
|
function updateLocation(position) {
|
|
fields
|
|
.find('.auto-geocode .geofield-lat')
|
|
.val(position.coords.latitude);
|
|
fields
|
|
.find('.auto-geocode .geofield-lon')
|
|
.val(position.coords.longitude);
|
|
}
|
|
|
|
// Callback for getCurrentPosition on geofield proximity client position.
|
|
function getClientOrigin(position) {
|
|
const lat = position.coords.latitude.toFixed(6);
|
|
const lon = position.coords.longitude.toFixed(6);
|
|
latitudeInput.val(lat);
|
|
longitudeInput.val(lon);
|
|
latitudeSpan.text(lat);
|
|
longitudeSpan.text(lon);
|
|
return false;
|
|
}
|
|
|
|
// don't do anything if we're on field configuration
|
|
if (!$(context).find('#edit-instance').length) {
|
|
let fields = $(context);
|
|
// check that we have something to fill up
|
|
// on multi values check only that the first one is em pty
|
|
if (
|
|
fields.find('.auto-geocode .geofield-lat').val() === '' &&
|
|
fields.find('.auto-geocode .geofield-lon').val() === ''
|
|
) {
|
|
// Check to see if we have geolocation support, either natively or through Google.
|
|
if (navigator.geolocation) {
|
|
navigator.geolocation.getCurrentPosition(updateLocation);
|
|
} else {
|
|
console.log('Geolocation is not supported by this browser.');
|
|
}
|
|
}
|
|
}
|
|
|
|
// React on the geofield widget html5 geocode button click.
|
|
once(
|
|
'geofield_geolocation',
|
|
'[name="geofield-html5-geocode-button"]',
|
|
).forEach(function (e) {
|
|
$(e).click(function (e) {
|
|
e.preventDefault();
|
|
fields = $(this).parents('.auto-geocode').parent();
|
|
if (navigator.geolocation) {
|
|
navigator.geolocation.getCurrentPosition(updateLocation);
|
|
} else {
|
|
console.log('Geolocation is not supported by this browser.');
|
|
}
|
|
});
|
|
});
|
|
|
|
let latitudeInput,
|
|
longitudeInput,
|
|
latitudeSpan,
|
|
longitudeSpan = '';
|
|
|
|
// React on the geofield proximity client location source.
|
|
once('geofield_geolocation', '.proximity-origin-client').forEach(
|
|
function (e) {
|
|
latitudeInput = $(e).find('.geofield-lat').first();
|
|
longitudeInput = $(e).find('.geofield-lon').first();
|
|
latitudeSpan = $(e).find('.geofield-lat-summary').first();
|
|
longitudeSpan = $(e).find('.geofield-lon-summary').first();
|
|
if (navigator.geolocation) {
|
|
navigator.geolocation.getCurrentPosition(getClientOrigin);
|
|
} else {
|
|
console.log('Geolocation is not supported by this browser.');
|
|
}
|
|
},
|
|
);
|
|
},
|
|
};
|
|
})(jQuery);
|