2016-11-22 16:08:02 +00:00
|
|
|
|
/* global mapboxgl, alertify */
|
2016-06-16 23:28:07 +01:00
|
|
|
|
if ('geolocation' in navigator) {
|
|
|
|
|
var button = document.querySelector('#locate');
|
|
|
|
|
if (button.addEventListener) {
|
|
|
|
|
//if we have javascript, event listeners and geolocation, make the locate
|
|
|
|
|
//button clickable and add event
|
|
|
|
|
button.disabled = false;
|
|
|
|
|
button.addEventListener('click', getLocation);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getLocation() {
|
|
|
|
|
navigator.geolocation.getCurrentPosition(function (position) {
|
|
|
|
|
//the locate button has been clicked so add the places/map
|
2016-09-29 11:28:31 +01:00
|
|
|
|
addPlacesMap(position.coords.latitude, position.coords.longitude, position.coords.accuracy);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-29 11:28:31 +01:00
|
|
|
|
function addPlacesMap(latitude, longitude, uncertainty) {
|
2016-06-16 23:28:07 +01:00
|
|
|
|
//get the nearby places
|
2016-10-03 14:46:53 +01:00
|
|
|
|
fetch('/places/near/' + latitude + '/' + longitude + '?u=' + uncertainty, {
|
2016-06-16 23:28:07 +01:00
|
|
|
|
credentials: 'same-origin',
|
|
|
|
|
method: 'get'
|
|
|
|
|
}).then(function (response) {
|
|
|
|
|
return response.json();
|
|
|
|
|
}).then(function (j) {
|
2016-12-10 22:53:36 +00:00
|
|
|
|
if (j.error === true) {
|
2016-09-23 12:24:23 +01:00
|
|
|
|
alertify.reset();
|
|
|
|
|
alertify.error(j.error_description);
|
|
|
|
|
}
|
2016-10-03 16:36:42 +01:00
|
|
|
|
if (j.places.length > 0) {
|
2016-06-16 23:28:07 +01:00
|
|
|
|
var i;
|
|
|
|
|
var places = [];
|
2016-10-03 15:07:46 +01:00
|
|
|
|
for (i = 0; i < j.places.length; ++i) {
|
2016-10-03 16:36:42 +01:00
|
|
|
|
var latlng = parseLocation(j.places[i].location);
|
2016-10-03 15:07:46 +01:00
|
|
|
|
var name = j.places[i].name;
|
2016-10-05 16:10:00 +01:00
|
|
|
|
var uri = j.places[i].uri;
|
|
|
|
|
places.push([name, uri, latlng[0], latlng[1]]);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
}
|
|
|
|
|
//add a map with the nearby places
|
|
|
|
|
addMap(latitude, longitude, places);
|
|
|
|
|
} else {
|
|
|
|
|
//add a map with just current location
|
|
|
|
|
addMap(latitude, longitude);
|
|
|
|
|
}
|
|
|
|
|
}).catch(function (err) {
|
|
|
|
|
console.error(err);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function addMap(latitude, longitude, places) {
|
|
|
|
|
//make places null if not supplied
|
|
|
|
|
if (arguments.length == 2) {
|
|
|
|
|
places = null;
|
|
|
|
|
}
|
2016-11-22 16:08:02 +00:00
|
|
|
|
// the form has a fieldset element that we are actually targetting
|
|
|
|
|
var form = document.querySelector('.note-ui');
|
|
|
|
|
var mapDiv = document.createElement('div');
|
|
|
|
|
mapDiv.classList.add('map');
|
2016-06-16 23:28:07 +01:00
|
|
|
|
//add the map div
|
2016-11-22 16:08:02 +00:00
|
|
|
|
form.appendChild(mapDiv);
|
|
|
|
|
//set up the mapbox gl map
|
|
|
|
|
mapboxgl.accessToken = 'pk.eyJ1Ijoiam9ubnliYXJuZXMiLCJhIjoiY2l2cDhjYW04MDAwcjJ0cG1uZnhqcm82ayJ9.qA2zeVA-nsoMh9IFrd5KQw';
|
|
|
|
|
var map = new mapboxgl.Map({
|
|
|
|
|
container: mapDiv,
|
|
|
|
|
style: 'mapbox://styles/mapbox/streets-v9',
|
|
|
|
|
center: [longitude, latitude],
|
|
|
|
|
zoom: 15
|
2016-06-16 23:28:07 +01:00
|
|
|
|
});
|
2016-11-25 15:59:04 +00:00
|
|
|
|
map.addControl(new mapboxgl.NavigationControl());
|
2016-11-22 16:08:02 +00:00
|
|
|
|
//create the current location marker
|
|
|
|
|
var el = document.createElement('div');
|
|
|
|
|
el.classList.add('marker');
|
|
|
|
|
//create the map style menu
|
|
|
|
|
var mapMenu = document.createElement('div');
|
|
|
|
|
mapMenu.classList.add('map-menu');
|
|
|
|
|
var streetsInput = document.createElement('input');
|
|
|
|
|
streetsInput.setAttribute('id', 'streets');
|
|
|
|
|
streetsInput.setAttribute('type', 'radio');
|
|
|
|
|
streetsInput.setAttribute('name', 'toggle');
|
|
|
|
|
streetsInput.setAttribute('value', 'streets');
|
|
|
|
|
streetsInput.setAttribute('checked', 'checked');
|
|
|
|
|
streetsInput.addEventListener('click', function () {
|
|
|
|
|
map.setStyle('mapbox://styles/mapbox/streets-v9');
|
|
|
|
|
});
|
|
|
|
|
var streetsLabel = document.createElement('label');
|
|
|
|
|
streetsLabel.setAttribute('for', 'streets');
|
|
|
|
|
streetsLabel.appendChild(document.createTextNode('Streets'));
|
|
|
|
|
var satelliteInput = document.createElement('input');
|
|
|
|
|
satelliteInput.setAttribute('id', 'satellite');
|
|
|
|
|
satelliteInput.setAttribute('type', 'radio');
|
|
|
|
|
satelliteInput.setAttribute('name', 'toggle');
|
|
|
|
|
satelliteInput.setAttribute('value', 'streets');
|
|
|
|
|
satelliteInput.addEventListener('click', function () {
|
|
|
|
|
map.setStyle('mapbox://styles/mapbox/satellite-v9');
|
|
|
|
|
});
|
|
|
|
|
var satelliteLabel = document.createElement('label');
|
|
|
|
|
satelliteLabel.setAttribute('for', 'satellite');
|
|
|
|
|
satelliteLabel.appendChild(document.createTextNode('Satellite'));
|
|
|
|
|
mapMenu.appendChild(streetsInput);
|
|
|
|
|
mapMenu.appendChild(streetsLabel);
|
|
|
|
|
mapMenu.appendChild(satelliteInput);
|
|
|
|
|
mapMenu.appendChild(satelliteLabel);
|
|
|
|
|
//add the map menu
|
|
|
|
|
mapDiv.appendChild(mapMenu);
|
|
|
|
|
//add a marker for the current location
|
|
|
|
|
new mapboxgl.Marker(el, {offset: [-10, -20]}).setLngLat([longitude, latitude]).addTo(map);
|
|
|
|
|
//create containing div for flexbox
|
|
|
|
|
var containingDiv = document.createElement('div');
|
2016-06-16 23:28:07 +01:00
|
|
|
|
//create the <select> element and give it a no location default
|
|
|
|
|
var selectEl = document.createElement('select');
|
|
|
|
|
selectEl.setAttribute('name', 'location');
|
|
|
|
|
var noLocation = document.createElement('option');
|
|
|
|
|
noLocation.setAttribute('value', 'no-location');
|
2016-10-07 15:22:21 +01:00
|
|
|
|
noLocation.appendChild(document.createTextNode('Don’t send location'));
|
2016-06-16 23:28:07 +01:00
|
|
|
|
selectEl.appendChild(noLocation);
|
2016-10-07 15:22:21 +01:00
|
|
|
|
var geoLocation = document.createElement('option');
|
|
|
|
|
geoLocation.setAttribute('selected', 'selected');
|
|
|
|
|
geoLocation.setAttribute('id', 'option-coords');
|
|
|
|
|
geoLocation.setAttribute('value', 'geo:' + latitude + ',' + longitude);
|
2016-11-22 16:08:02 +00:00
|
|
|
|
geoLocation.dataset.latitude = latitude;
|
|
|
|
|
geoLocation.dataset.longitude = longitude;
|
2016-10-07 15:22:21 +01:00
|
|
|
|
geoLocation.appendChild(document.createTextNode('Send co-ordinates'));
|
|
|
|
|
selectEl.appendChild(geoLocation);
|
2016-11-22 16:08:02 +00:00
|
|
|
|
containingDiv.appendChild(selectEl);
|
|
|
|
|
form.insertBefore(containingDiv, mapDiv);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
if (places !== null) {
|
|
|
|
|
//add the places both to the map and <select>
|
|
|
|
|
places.forEach(function (item) {
|
|
|
|
|
var option = document.createElement('option');
|
|
|
|
|
option.setAttribute('value', item[1]);
|
|
|
|
|
var text = document.createTextNode(item[0]);
|
|
|
|
|
option.appendChild(text);
|
|
|
|
|
option.dataset.latitude = item[2];
|
|
|
|
|
option.dataset.longitude = item[3];
|
|
|
|
|
selectEl.appendChild(option);
|
2016-11-22 16:08:02 +00:00
|
|
|
|
var placeMarkerIcon = document.createElement('div');
|
|
|
|
|
placeMarkerIcon.classList.add('marker');
|
|
|
|
|
new mapboxgl.Marker(placeMarkerIcon, {offset: [-10, -20]}).setLngLat([item[3], item[2]]).addTo(map);
|
|
|
|
|
placeMarkerIcon.addEventListener('click', function () {
|
|
|
|
|
map.flyTo({
|
|
|
|
|
center: [
|
|
|
|
|
item[3],
|
|
|
|
|
item[2]
|
|
|
|
|
]
|
|
|
|
|
});
|
2016-06-16 23:28:07 +01:00
|
|
|
|
selectPlace(item[1]);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
//add an event listener
|
|
|
|
|
selectEl.addEventListener('change', function () {
|
|
|
|
|
if (selectEl.value !== 'no-location') {
|
|
|
|
|
var placeLat = selectEl[selectEl.selectedIndex].dataset.latitude;
|
|
|
|
|
var placeLon = selectEl[selectEl.selectedIndex].dataset.longitude;
|
2016-11-22 16:08:02 +00:00
|
|
|
|
map.flyTo({
|
|
|
|
|
center: [
|
|
|
|
|
placeLon,
|
|
|
|
|
placeLat
|
|
|
|
|
]
|
|
|
|
|
});
|
2016-06-16 23:28:07 +01:00
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
//add a button to add a new place
|
|
|
|
|
var newLocButton = document.createElement('button');
|
|
|
|
|
newLocButton.setAttribute('type', 'button');
|
|
|
|
|
newLocButton.setAttribute('id', 'create-new-place');
|
|
|
|
|
newLocButton.appendChild(document.createTextNode('Create New Place?'));
|
|
|
|
|
//the event listener
|
|
|
|
|
newLocButton.addEventListener('click', function() {
|
|
|
|
|
//add the form elements
|
2016-11-22 16:08:02 +00:00
|
|
|
|
var nameDiv = document.createElement('div');
|
2016-06-16 23:28:07 +01:00
|
|
|
|
var nameLabel = document.createElement('label');
|
|
|
|
|
nameLabel.setAttribute('for', 'place-name');
|
|
|
|
|
nameLabel.classList.add('place-label');
|
|
|
|
|
nameLabel.appendChild(document.createTextNode('Place Name:'));
|
|
|
|
|
var nameEl = document.createElement('input');
|
|
|
|
|
nameEl.setAttribute('placeholder', 'Name');
|
|
|
|
|
nameEl.setAttribute('name', 'place-name');
|
|
|
|
|
nameEl.setAttribute('id', 'place-name');
|
|
|
|
|
nameEl.setAttribute('type', 'text');
|
2016-11-22 16:08:02 +00:00
|
|
|
|
nameDiv.appendChild(nameLabel);
|
|
|
|
|
nameDiv.appendChild(nameEl);
|
|
|
|
|
var descDiv = document.createElement('div');
|
2016-06-16 23:28:07 +01:00
|
|
|
|
var descLabel = document.createElement('label');
|
|
|
|
|
descLabel.setAttribute('for', 'place-description');
|
|
|
|
|
descLabel.classList.add('place-label');
|
|
|
|
|
descLabel.appendChild(document.createTextNode('Place Description:'));
|
|
|
|
|
var descEl = document.createElement('input');
|
|
|
|
|
descEl.setAttribute('placeholder', 'Description');
|
|
|
|
|
descEl.setAttribute('name', 'place-description');
|
|
|
|
|
descEl.setAttribute('id', 'place-description');
|
|
|
|
|
descEl.setAttribute('type', 'text');
|
2016-11-22 16:08:02 +00:00
|
|
|
|
descDiv.appendChild(descLabel);
|
|
|
|
|
descDiv.appendChild(descEl);
|
|
|
|
|
var latDiv = document.createElement('div');
|
2016-06-16 23:28:07 +01:00
|
|
|
|
var latLabel = document.createElement('label');
|
|
|
|
|
latLabel.setAttribute('for', 'place-latitude');
|
|
|
|
|
latLabel.classList.add('place-label');
|
|
|
|
|
latLabel.appendChild(document.createTextNode('Place Latitude:'));
|
|
|
|
|
var latEl = document.createElement('input');
|
|
|
|
|
latEl.setAttribute('name', 'place-latitude');
|
|
|
|
|
latEl.setAttribute('id', 'place-latitude');
|
|
|
|
|
latEl.setAttribute('type', 'text');
|
2016-11-22 16:08:02 +00:00
|
|
|
|
latEl.value = getLatitudeFromMapbox(map.getCenter());
|
|
|
|
|
latDiv.appendChild(latLabel);
|
|
|
|
|
latDiv.appendChild(latEl);
|
|
|
|
|
var lonDiv = document.createElement('div');
|
2016-06-16 23:28:07 +01:00
|
|
|
|
var lonLabel = document.createElement('label');
|
|
|
|
|
lonLabel.setAttribute('for', 'place-longitude');
|
|
|
|
|
lonLabel.classList.add('place-label');
|
|
|
|
|
lonLabel.appendChild(document.createTextNode('Place Longitude:'));
|
|
|
|
|
var lonEl = document.createElement('input');
|
|
|
|
|
lonEl.setAttribute('name', 'place-longitude');
|
|
|
|
|
lonEl.setAttribute('id', 'place-longitude');
|
|
|
|
|
lonEl.setAttribute('type', 'text');
|
2016-11-22 16:08:02 +00:00
|
|
|
|
lonEl.value = getLongitudeFromMapbox(map.getCenter());
|
|
|
|
|
lonDiv.appendChild(lonLabel);
|
|
|
|
|
lonDiv.appendChild(lonEl);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
var placeSubmit = document.createElement('button');
|
|
|
|
|
placeSubmit.setAttribute('id', 'place-submit');
|
|
|
|
|
placeSubmit.setAttribute('value', 'Submit New Place');
|
|
|
|
|
placeSubmit.setAttribute('name', 'place-submit');
|
|
|
|
|
placeSubmit.setAttribute('type', 'button');
|
|
|
|
|
placeSubmit.appendChild(document.createTextNode('Submit New Place'));
|
2016-11-22 16:08:02 +00:00
|
|
|
|
form.appendChild(nameDiv);
|
|
|
|
|
form.appendChild(descDiv);
|
|
|
|
|
form.appendChild(latDiv);
|
|
|
|
|
form.appendChild(lonDiv);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
form.appendChild(placeSubmit);
|
|
|
|
|
//the event listener for the new place form
|
|
|
|
|
placeSubmit.addEventListener('click', function () {
|
|
|
|
|
//create the form data to send
|
|
|
|
|
var formData = new FormData();
|
|
|
|
|
formData.append('place-name', document.querySelector('#place-name').value);
|
|
|
|
|
formData.append('place-description', document.querySelector('#place-description').value);
|
|
|
|
|
formData.append('place-latitude', document.querySelector('#place-latitude').value);
|
|
|
|
|
formData.append('place-longitude', document.querySelector('#place-longitude').value);
|
|
|
|
|
//post the new place
|
|
|
|
|
fetch('/places/new', {
|
|
|
|
|
//send cookies with the request
|
|
|
|
|
credentials: 'same-origin',
|
|
|
|
|
method: 'post',
|
|
|
|
|
body: formData
|
|
|
|
|
})
|
|
|
|
|
.then(function (response) {
|
|
|
|
|
return response.json();
|
|
|
|
|
})
|
|
|
|
|
.then(function (placeJson) {
|
2016-12-10 22:53:36 +00:00
|
|
|
|
if (placeJson.error === true) {
|
2016-09-23 12:24:23 +01:00
|
|
|
|
throw new Error(placeJson.error_description);
|
|
|
|
|
}
|
2016-06-16 23:28:07 +01:00
|
|
|
|
//remove un-needed form elements
|
2016-11-22 16:08:02 +00:00
|
|
|
|
//iterate through labels and remove parent div elements
|
2016-06-16 23:28:07 +01:00
|
|
|
|
var labels = document.querySelectorAll('.place-label');
|
|
|
|
|
for (var i = 0; i < labels.length; ++i) {
|
2016-11-22 16:08:02 +00:00
|
|
|
|
form.removeChild(labels[i].parentNode);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
}
|
|
|
|
|
form.removeChild(document.querySelector('#place-submit'));
|
2016-11-22 16:08:02 +00:00
|
|
|
|
var newPlaceButton = document.querySelector('#create-new-place');
|
|
|
|
|
//in order to remove a DOM Node, you need to run removeChild on the parent Node
|
|
|
|
|
newPlaceButton.parentNode.removeChild(newPlaceButton);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
//add place marker
|
|
|
|
|
var newOption = document.createElement('option');
|
2016-10-07 11:42:22 +01:00
|
|
|
|
newOption.setAttribute('value', placeJson.uri);
|
|
|
|
|
newOption.appendChild(document.createTextNode(placeJson.name));
|
|
|
|
|
newOption.dataset.latitude = placeJson.latitude;
|
|
|
|
|
newOption.dataset.longitude = placeJson.longitude;
|
2016-06-16 23:28:07 +01:00
|
|
|
|
selectEl.appendChild(newOption);
|
2016-11-22 16:08:02 +00:00
|
|
|
|
var newPlaceMarkerIcon = document.createElement('div');
|
|
|
|
|
newPlaceMarkerIcon.classList.add('marker');
|
2016-12-10 22:53:36 +00:00
|
|
|
|
new mapboxgl.Marker(newPlaceMarkerIcon, {offset: [-10, -20]}).setLngLat([placeJson.longitude, placeJson.latitude]).addTo(map);
|
2016-11-22 16:08:02 +00:00
|
|
|
|
map.flyTo({center: [placeJson.longitude, placeJson.latitude]});
|
|
|
|
|
|
|
|
|
|
newPlaceMarkerIcon.addEventListener('click', function () {
|
|
|
|
|
map.flyTo({center: [placeJson.longitude, placeJson.latitude]});
|
2016-10-07 11:42:22 +01:00
|
|
|
|
selectPlace(placeJson.uri);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
});
|
|
|
|
|
//make selected
|
2016-10-07 11:42:22 +01:00
|
|
|
|
selectPlace(placeJson.uri);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
}).catch(function (placeError) {
|
2016-09-23 12:24:23 +01:00
|
|
|
|
alertify.reset();
|
|
|
|
|
alertify.error(placeError);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
2016-11-22 16:08:02 +00:00
|
|
|
|
containingDiv.appendChild(newLocButton);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function parseLocation(point) {
|
|
|
|
|
var re = /\((.*)\)/;
|
|
|
|
|
var resultArray = re.exec(point);
|
|
|
|
|
var location = resultArray[1].split(' ');
|
|
|
|
|
|
|
|
|
|
return [location[1], location[0]];
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-07 00:01:11 +01:00
|
|
|
|
function selectPlace(uri) {
|
|
|
|
|
document.querySelector('select [value="' + uri + '"]').selected = true;
|
2016-06-16 23:28:07 +01:00
|
|
|
|
}
|
|
|
|
|
|
2016-11-22 16:08:02 +00:00
|
|
|
|
function getLatitudeFromMapbox(lnglat) {
|
|
|
|
|
var resultArray = /\((.*)\)/.exec(lnglat);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
var location = resultArray[1].split(' ');
|
|
|
|
|
|
2016-11-22 16:08:02 +00:00
|
|
|
|
return location[1];
|
2016-06-16 23:28:07 +01:00
|
|
|
|
}
|
|
|
|
|
|
2016-11-22 16:08:02 +00:00
|
|
|
|
function getLongitudeFromMapbox(lnglat) {
|
|
|
|
|
var resultArray = /\((.*)\)/.exec(lnglat);
|
2016-06-16 23:28:07 +01:00
|
|
|
|
var location = resultArray[1].split(' ');
|
|
|
|
|
|
2016-11-22 16:08:02 +00:00
|
|
|
|
return location[0].replace(',', '');
|
2016-06-16 23:28:07 +01:00
|
|
|
|
}
|