jQuery(document).ready(function($) {
// only render the map if an api-key is present
if( typeof leaflet_field.api_key != 'undefined' ) {
render_leaflet_map();
}
function render_leaflet_map() {
var field = $('#' + leaflet_field.id);
var map_settings = null;
// check if we have a saved value
if( field.val().length > 0 ) {
map_settings = JSON.parse(field.val());
}
else {
map_settings = {
zoom_level:null,
center:{
lat:null,
lng:null
},
markers:{}
};
}
if( map_settings.center.lat == null ) {
map_settings.center.lat = leaflet_field.lat;
}
if( map_settings.center.lng == null ) {
map_settings.center.lng = leaflet_field.lng;
}
// check if the zoom level is set and within 1-18
if( map_settings.zoom_level == null || map_settings.zoom_level > 18 || map_settings.zoom_level < 1 ) {
if( leaflet_field.zoom_level > 0 && leaflet_field.zoom_level < 19 ) {
map_settings.zoom_level = leaflet_field.zoom_level;
}
else {
map_settings.zoom_level = 13;
}
}
var map = L.map( leaflet_field.id + '_map', {
center: new L.LatLng( map_settings.center.lat, map_settings.center.lng ),
zoom: map_settings.zoom_level,
doubleClickZoom: false
});
L.tileLayer('http://{s}.tile.cloudmade.com/' + leaflet_field.api_key + '/997/256/{z}/{x}/{y}.png', {
attribution: 'Map data © OpenStreetMap contributors, CC-BY-SA, Imagery © CloudMade',
maxZoom: 18
}).addTo(map);
// render existing markers if we have any
if( Object.keys(map_settings.markers).length > 0 ) {
var newMarkers = {};
$.each(map_settings.markers, function(index, marker) {
var newMarker = L.marker([marker.coords.lat, marker.coords.lng], {draggable: true});
index = add_marker(newMarker);
marker.id = index;
newMarkers['m_' + index] = marker;
});
map_settings.markers = newMarkers;
update_field();
}
map.on('click', function(e){
active_tool = $('.tools .tool.active');
if( active_tool.hasClass('tool-marker') ) {
// the marker-tool is currently being used
var marker = L.marker(e.latlng, {draggable: true});
index = add_marker( marker );
map_settings.markers['m_' + index] = {coords:e.latlng};
map_settings.markers['m_' + index].id = index;
}
update_field();
}).on('zoomend', function(e){
// the map was zoomed
update_field();
}).on('dragend', function(e){
// the map was dragged
update_field();
});
function add_marker( marker ) {
map.addLayer(marker);
marker.on('click', function(e) {
active_tool = $('.tools .tool.active');
if( active_tool.hasClass('tool-remove') ) {
delete map_settings.markers['m_' + e.target._leaflet_id];
map.removeLayer(marker);
}
else if( active_tool.hasClass('tool-tag') ) {
if( typeof map_settings.markers['m_' + marker._leaflet_id].popup_content == 'undefined' ) {
content = '';
}
else {
content = map_settings.markers['m_' + marker._leaflet_id].popup_content;
}
popup_html = '';
if( typeof marker._popup == 'undefined' ) {
// bind a popup to the marker
marker.bindPopup(popup_html, {maxWidth:300, maxHeight:200}).openPopup();
}
else {
// open this markers popup
marker._popup.setContent(popup_html);
marker.openPopup();
}
}
update_field();
}).on('dragend', function(e) {
newLatLng = e.target.getLatLng();
map_settings.markers['m_' + e.target._leaflet_id].coords.lat = newLatLng.lat;
map_settings.markers['m_' + e.target._leaflet_id].coords.lng = newLatLng.lng;
update_field();
});
// return the id of this marker
return marker._leaflet_id;
}
function update_field() {
// update center and zoom-level
var center = map.getCenter();
map_settings.center.lat = center.lat;
map_settings.center.lng = center.lng;
map_settings.zoom_level = map.getZoom();
field.val(JSON.stringify(map_settings));
}
$(document).on('keyup', '.leaflet-map .acf-leaflet-field-popup-textarea', function(e){
var textarea = $(this);
var marker_id = 'm_' + textarea.data('marker-id')
map_settings.markers[marker_id].popup_content = textarea.val();
if( textarea.val().length == 0 ) {
delete map_settings.markers[marker_id].popup_content;
}
update_field();
});
}
$(document).on('click', '.leaflet-map .tools .tool', function(e){
if( $(this).hasClass('tool-reset') ) {
// TODO: Clear map and the field-value
}
else {
$('.leaflet-map .tools .active').removeClass('active');
$(this).addClass('active');
}
});
});