: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
form: document.querySelector('form#post'),
iMapsBuilder.editControls = function () {
let addMarker = document.createElement('div');
addMarker.setAttribute('id', 'map_click_add_marker');
'<span class="dashicons dashicons-plus-alt"></span><span class="map_action_label">Add Marker There</span>';
let coordinatesBox = document.getElementById('map_clicked_coordinates_box');
coordinatesBox.appendChild(addMarker);
coordinatesBox.style.display = 'block';
if (!iMapsBuilder.advanced) {
let setCenter = document.createElement('div');
setCenter.setAttribute('id', 'map_set_center');
setCenter.setAttribute('title', 'Set as initial zoom and center');
'<span class="dashicons dashicons-admin-post"></span><span class="map_action_label"></span>';
setCenter.addEventListener('click', function (ev) {
let centerData = document.getElementById('map_visual_info').dataset.visual;
centerData = JSON.parse(centerData);
iMapsBuilder.setInitialCenter(centerData);
icon.classList.remove('dashicons-admin-post');
icon.classList.add('dashicons-yes-alt');
icon.classList.remove('dashicons-yes-alt');
icon.classList.add('dashicons-admin-post');
let visualBox = document.getElementById('map_visual_info_box');
visualBox.appendChild(setCenter);
visualBox.style.display = 'block';
iMapsBuilder.setInitialCenter = function (centerData) {
let zoomField = document.getElementsByName('map_info[viewport][zoomLevel]')[0];
let latitudeField = document.getElementsByName('map_info[viewport][homeGeoPoint][latitude]')[0];
let longitudeField = document.getElementsByName('map_info[viewport][homeGeoPoint][longitude]')[0];
zoomField.value = centerData.zoom;
latitudeField.value = centerData.lat;
longitudeField.value = centerData.long;
const event = new Event('change');
longitudeField.dispatchEvent(event);
iMapsBuilder.listenToClicks = function (mapID) {
console.log(iMapsData.data[0].container);
.getElementById(iMapsData.data[0].container)
.addEventListener('mapEntryClicked', function (ev) {
let data = iMapsManager.maps[mapID].map.lastClickedEntry.dataItem.dataContext;
iMapsBuilder.populateClickInfo(data);
iMapsBuilder.populateClickInfo = function (data) {
var container = document.getElementById('map_click_events_info'),
info += 'ID: ' + data.id + '<br>';
info += 'Name: ' + data.name + '<br>';
if (data.madeFromGeoData) {
controls = iMapsBuilder.addRegionButton(data.id, data.name);
controls.addEventListener('click', function (ev) {
ev.target.classList.remove('dashicons-plus-alt');
ev.target.classList.add('dashicons-yes-alt');
ev.target.style.pointerEvents = 'none';
info += 'LAT: ' + Number(data.latitude).toFixed(6) + '<br>';
info += 'LONG: ' + Number(data.longitude).toFixed(6) + '<br>';
info += 'Action: ' + data.action.replace('igm_', '') + '<br>';
container.parentElement.style.display = 'block';
container.innerHTML = info;
container.appendChild(controls);
iMapsBuilder.checkMaxInputVars = function () {
var numNormInputs = document.getElementsByTagName('input').length;
var numTextarea = document.getElementsByTagName('textarea').length;
var numInputs = numNormInputs + numTextarea;
var firstBox = document.getElementById('titlediv');
var reqBox = document.getElementById('map_min_req');
var icon = '<span class="dashicons dashicons-yes-alt"></span>';
console.log('Number of inputs: ', numInputs + numTextarea);
console.log('Max Input Vars: ', iMapsOptions.max_input_vars);
if (parseInt(numInputs) > parseInt(iMapsOptions.max_input_vars * 0.75)) {
warning = document.createElement('div');
warning.setAttribute('class', 'notice notice-error is-dismissible');
warning.innerHTML = '<h1>' + iMapsOptions.messages.maxInputError + '</h1>';
icon = firstBox.insertBefore(warning, firstBox.childNodes[0]);
icon = '<span class="dashicons dashicons-warning"></span>';
'max_input_vars: ' + numInputs + '/' + iMapsOptions.max_input_vars + ' ' + icon;
iMapsBuilder.init = function () {
var saveBtn = document.getElementById('publish'),
mapID = document.getElementById('post_ID').value;
// add listener to accordions and clone buttons for maxInputVars
iMapsBuilder.addRepeatFieldsListener();
if (document.body.classList.contains('igm-pro')) {
iMapsBuilder.advanced = true;
iMapsBuilder.clickActionWarnings();
if (typeof iMapsData !== 'undefined') {
iMapsBuilder.buildPreview();
iMapsBuilder.initAvailableRegions();
iMapsBuilder.addPreviewImage();
iMapsBuilder.listenToClicks(mapID);
saveBtn.addEventListener('click', function (ev) {
var mapImageField = document.getElementsByName('map_image[mapImage]')[0],
mapId = document.getElementById('post_ID').value;
if (typeof mapImageField === 'undefined') {
if (!iMapsBuilder.imageSaved) {
if (iMaps.maps && iMaps.maps[mapId] && iMaps.maps[mapId].map) {
var zoomLevel = iMaps.maps[mapId].map.zoomLevel;
iMaps.maps[mapId].map.goHome(0);
iMaps.maps[mapId].map.exporting.getImage('svg').then(function (imgData) {
mapImageField.value = imgData;
iMapsBuilder.imageSaved = true;
// check for overlay and make sortable
iMapsBuilder.sortableOverlay();
// check for auto labels clear link
iMapsBuilder.autoLabelsReset();
if (iMapsOptions.googleApiKey && iMapsOptions.googleApiKey !== '') {
var geocodingFields = document.getElementsByClassName('geocoding');
for (var i = 0; i < geocodingFields.length; i++) {
geocodingFields.item(i).classList.remove('geocoding-hide');
// enable google autocomplete
if (iMapsOptions.googleAutocomplete && iMapsOptions.googleAutocomplete === '1') {
iMapsBuilder.initGoogleAutocomplete();
iMapsBuilder.initGeocoding();
iMapsBuilder.editControls();
iMapsBuilder.prepareAddMarkerActions();
// check number of inputs
iMapsBuilder.checkMaxInputVars();
iMapsBuilder.addRepeatFieldsListener = function () {
var cloneBts = document.getElementsByClassName('csf-cloneable-add');
for (var i = 0; i < cloneBts.length; i++) {
cloneBts[i].addEventListener('click', iMapsBuilder.checkMaxInputVars, false);
iMapsBuilder.clickActionWarnings = function () {
var clickActionBts = document.getElementsByName('map_info[regionDefaults][action]')[0];
var clickActionMarkerBts = document.getElementsByName('map_info[markerDefaults][action]')[0];
var mainContainer = document.getElementById('map_info');
clickActionBts.addEventListener('change', function (ev) {
if (this.value !== 'none') {
mainContainer.classList.add('igm_region_click_check');
mainContainer.classList.remove('igm_region_click_check');
clickActionMarkerBts.addEventListener('change', function (ev) {
if (this.value !== 'none') {
mainContainer.classList.add('igm_marker_click_check');
mainContainer.classList.remove('igm_marker_click_check');
// on initial load, check them
if (clickActionBts && clickActionBts.value !== 'none') {
mainContainer.classList.add('igm_region_click_check');
if (clickActionMarkerBts && clickActionMarkerBts.value !== 'none') {
mainContainer.classList.add('igm_marker_click_check');
* Set up click event to reset auto labels custom coordinates
iMapsBuilder.autoLabelsReset = function () {
var clearLink = document.getElementById('igm-reset-auto-labels');
clearLink.addEventListener('click', function (ev) {
if (confirm(iMapsOptions.messages.resetAutoLabels)) {
var regionLabelsCustomCoordinates = document.getElementsByName(
'map_info[regionLabels][regionLabelCustomCoordinates]'
regionLabelsCustomCoordinates.value = '';
regionLabelsCustomCoordinates.dispatchEvent(new Event('change'));
iMapsBuilder.sortableOverlay = function () {
// Using jQuery since we'll use jquery-ui for sortable anyway
var overlayParent = jQuery('[data-depend-id=overlay]');
overlaySortable = overlayParent.first().closest('ul');
// take advantage of this function to also set the title attribute for the li with the map id
overlaySortable.find('li').each(function () {
jQuery(this).attr('title', 'Map ID: ' + jQuery(this).find('input').attr('value'));
// update order when we select a new overlay
overlayParent.on('change', function () {
iMapsBuilder.updateOrderOverlay();
var overlayOrder = document.querySelector('[data-depend-id=overlayOrder]');
if (overlayOrder && overlayOrder.value !== '' && overlaySortable) {
var orderValues = JSON.parse(overlayOrder.value);
if (Array.isArray(orderValues)) {
orderValues.forEach(function (val) {
var thisOrder = overlaySortable.find('input[value=' + val + ']').closest('li');
overlaySortable.prepend(thisOrder);
// set sortable behaviour
overlaySortable.sortable({
placeholder: 'ui-state-highlight',
stop: function (event, ui) {
iMapsBuilder.previewBlocked = true;
iMapsBuilder.blockPreview();
iMapsBuilder.updateOrderOverlay();
overlayParent.disableSelection();
iMapsBuilder.updateOrderOverlay = function () {
var overlayOrder = document.querySelector('[data-depend-id=overlayOrder]');
var overlaySelected = document.querySelectorAll('input[data-depend-id=overlay]:checked');
overlaySelected.forEach(function (el) {
order = JSON.stringify(order);
overlayOrder.value = order;
iMapsBuilder.prepareAddMarkerActions = function () {
var addMarkerButton = document.getElementById('map_click_add_marker');
var addMarkerButtonIcon = addMarkerButton.querySelector('.dashicons');
var addMarkerButtonLabel = addMarkerButton.querySelector('.map_action_label');
// listen to clicked point event
document.addEventListener('mapPointClicked', function (e) {
// set coordinates in button
addMarkerButton.setAttribute('data-latitude', e.detail.latitude);
addMarkerButton.setAttribute('data-longitude', e.detail.longitude);
addMarkerButtonIcon.classList.remove('dashicons-yes-alt');
addMarkerButtonIcon.classList.add('dashicons-plus-alt');
addMarkerButtonLabel.innerHTML = 'Add Marker Here';
addMarkerButton.addEventListener(
var lat = addMarkerButton.getAttribute('data-latitude');
var long = addMarkerButton.getAttribute('data-longitude');
iMapsBuilder.addMarker(lat, long);
addMarkerButtonIcon.classList.remove('dashicons-plus-alt');
addMarkerButtonIcon.classList.add('dashicons-yes-alt');
addMarkerButtonLabel.innerHTML = 'Marker Added';
iMapsBuilder.updateRegionsUsed = function () {
var regionFields = document.querySelectorAll('.region-code-autocomplete');
var result = [].map.call(regionFields, function (e) {
iMapsBuilder.regionsUsed = result;
iMapsBuilder.addPreviewImage = function () {
var mapImage = document.getElementById('map_image_preview'),
mapImageField = document.getElementsByName('map_image[mapImage]')[0];
if (mapImageField && mapImageField.value !== '') {
mapImage.innerHTML = '<img class="igm_map_image_preview" src="' + mapImageField.value + '">';
iMapsBuilder.initAvailableRegions = function () {
var data = iMapsData.data[0],
if (data.map === 'custom' || data.map.startsWith('http')) {
res.json().then(function (out) {
regionCodes = iMapsBuilder.extractGeojson(out);
iMapsBuilder.updateRegionsUsed();
iMapsBuilder.populateAvailableRegions(regionCodes);
mapVar = iMapsRouter.getVarByName(data.map);
if (typeof window[mapVar] !== 'undefined') {
regionCodes = iMapsBuilder.extractGeojson(window[mapVar]);
iMapsBuilder.updateRegionsUsed();
iMapsBuilder.populateAvailableRegions(regionCodes);
iMapsBuilder.populateAvailableRegions = function (regionCodes) {
var data = iMapsData.data[0],
regionDataContainer = document.getElementsByName('map_regions_info[regionData]')[0],
container = document.getElementById('map_region_data'),
currentMap = document.getElementsByName('map_info[map]')[0].selectedOptions[0].text,
mainContainer = document.getElementById('map_info'),
html = document.createElement('div'),
used = iMapsBuilder.regionsUsed;
if (typeof regionCodes === 'undefined') {
regionCodes = iMapsBuilder.regionCodes;
iMapsBuilder.regionCodes = regionCodes;
var currentMapEl = document.createElement('p');
currentMapEl.innerHTML = currentMap;
html.appendChild(currentMapEl);
// add button to autopopulate map
populateButton = document.createElement("button");
populateButton.innerHTML = "Populate Map with all regions";
populateButton.setAttribute("class", "button button-secondary");
populateButton.onclick = function (e) {
Object.keys(regionCodes).forEach(function (region) {
// trigger form change event
.getElementsByName("map_info[map]")[0]
.dispatchEvent(new Event("change"));
html.appendChild(populateButton);
var regionCodeEl = document.createElement('code');
regionCodeEl.innerHTML = iMapsOptions.messages.regionCode;
html.appendChild(regionCodeEl);
var regionNameEl = document.createElement('span');
iMapsOptions.messages.regionName +
iMapsOptions.messages.regionCodeInfo +
html.appendChild(regionNameEl);
html.appendChild(document.createElement('br'));
html.appendChild(document.createElement('br'));
.forEach(function (region) {
regionData[regionCodes[region].name] = region;
label: regionCodes[region].name + ' ' + '(' + region + ')',
// if there's no name property, try NAME or id
if (typeof regionCodes[region].name === 'undefined') {
if (typeof regionCodes[region].NAME !== 'undefined') {
regionCodes[region].name = regionCodes[region].NAME;