// ==UserScript==
// @name LiveMap UR Overlay
// @namespace http://greasemonkey.chizzum.com
// @description Overlays UR, MP and PU markers onto Livemap
// @include https://*.waze.com/*livemap*
// @include http://*.waze.com/*livemap*
// @grant none
// @version 2.16
// ==/UserScript==
/*
To-do list:
- WME links in popup
- display UR comments
*/
function lmurGlobals()
{
lmurVersion = '2.16';
lmurData = null;
lmurDoOnload = true;
lmurDiv = document.createElement('div');
lmurPopup = document.createElement('div');
lmurUI = document.createElement('div');
lmurUserID = undefined;
lmurIsLoggedIn = undefined;
lmurPrevCentre = null;
lmurInhibitNudgeDetection = true;
lmurControlsHidden = true;
lmurControlsEnabled = false;
lmurPlayModeEnabled = false;
lmurInhibitSave = true;
lmurInnerHeight = -1;
lmurUIHeight = 0;
lmurCacheExpiryPeriod = 300;
lmurInhibitCacheRefresh = false;
lmurNoForcedRefreshThisCycle = true;
lmurEnabled = false;
lmurShowDebugOutput = false;
lmurURControlsMinimised = false;
lmurMPControlsMinimised = false;
lmurPURControlsMinimised = false;
lmurOptionsMinimised = false;
lmurSquareSize = 0.2;
lmurMaxGrabWidth = 1.0;
lmurMaxGrabHeight = 1.0;
lmurDebugCount = 0;
if(navigator.userAgent.indexOf('Chrome') == -1)
{
lmurUpdateURL = 'https://greasyfork.org/en/scripts/1948-livemap-ur-overlay';
}
else
{
lmurUpdateURL = 'https://chrome.google.com/webstore/detail/lmur/ofjdjffkbglgpdikoofpkeniefljookp';
}
lmurIcons =
[
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wMBAsgGGkHX7cAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAUUlEQVQoz63SQQqAQAxD0R/xXoIXH/RicaUgtIOdscuE8DaVbaq3ZIWaXB6VJTWZE7TH2j/SrQCwxdq89FLItTkpVBJtXOoqgbY+4fFd0sjDXtyHHG22yaK0AAAAAElFTkSuQmCC',
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wMBAshHpl/y8MAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAXUlEQVQoz63SQQqAMAxE0T/Fe0k9uNKTjQtBpLZSowOBQBjeJrLN20wA2jTcdLZkGy0y80CjgFcrwbFQxgoAiUDO0qN2Ub5LXa1S/pFuWkMJS9huDhn3biFJkYfdAYUjUx2jRgIlAAAAAElFTkSuQmCC'
]
}
function lmurBootstrap()
{
var bGreasemonkeyServiceDefined = false;
try {
bGreasemonkeyServiceDefined = (typeof Components.interfaces.gmIGreasemonkeyService === "object");
}
catch (err) { /* Ignore */ }
if (typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) {
unsafeWindow = ( function () {
var dummyElem = document.createElement('p');
dummyElem.setAttribute('onclick', 'return window;');
return dummyElem.onclick();
}) ();
}
/* begin running the code! */
lmurInitialise();
}
function lmurSaveSettings()
{
if(lmurInhibitSave) return;
if(!lmurIsLoggedIn) return;
if (localStorage)
{
var options = '';
var lmurOptions = document.getElementById('lmurUI').getElementsByTagName('input');
for (var optIdx=0;optIdx<lmurOptions.length;optIdx++)
{
var id = lmurOptions[optIdx].id;
if((id.indexOf('_cb') == 0)||(id.indexOf('_text') == 0)||(id.indexOf('_input') == 0)||(id.indexOf('_radio') == 0))
{
options += ':' + id;
if((lmurOptions[optIdx].type == 'checkbox')||(lmurOptions[optIdx].type == 'radio')) options += ',' + lmurOptions[optIdx].checked.toString();
else if((lmurOptions[optIdx].type == 'text')||(lmurOptions[optIdx].type == 'number')) options += ',' + lmurOptions[optIdx].value.toString();
}
}
var lmurOptions = document.getElementById('lmurUI').getElementsByTagName('select');
for (var optIdx=0;optIdx<lmurOptions.length;optIdx++)
{
var id = lmurOptions[optIdx].id;
if(id.indexOf('_select') == 0)
{
options += ':' + id;
options += ',' + lmurOptions[optIdx].selectedIndex.toString();
}
}
localStorage.LMUROverviewOptions = options;
}
}
function lmurLoadSettings()
{
lmurAddLog('loadSettings()');
if (localStorage.LMUROverviewOptions)
{
var options = localStorage.LMUROverviewOptions.split(':');
for(var optIdx=0;optIdx<options.length;optIdx++)
{
var fields = options[optIdx].split(',');
if(document.getElementById(fields[0]) != undefined)
{
if((fields[0].indexOf('_cb') == 0)||(fields[0].indexOf('_radio') == 0)) document.getElementById(fields[0]).checked = (fields[1] == 'true');
else if(fields[0].indexOf('_select') == 0) document.getElementById(fields[0]).selectedIndex = fields[1];
else if((fields[0].indexOf('_input') == 0)||(fields[0].indexOf('_text') == 0)) document.getElementById(fields[0]).value = fields[1];
}
}
var userDecayValue = document.getElementById('_inputCacheDecayPeriod').value
if(userDecayValue == "")
{
document.getElementById('_inputCacheDecayPeriod').value = (lmurCacheExpiryPeriod / 60);
}
else
{
lmurCacheExpiryPeriod = (parseInt(userDecayValue) * 60);
}
}
lmurInhibitSave = false;
}
function lmurAddLog(logtext)
{
if(lmurShowDebugOutput)
{
console.log('LMUR: '+logtext);
}
}
function lmurMarker(pos, obj, type, lon, lat, nComments, userLastComment, ageLastComment, loggedInUserComments, isFollowing)
{
this.pos = pos;
this.obj = obj;
this.type = type;
this.lon = lon;
this.lat = lat;
this.markerHidden = false;
this.px = -1;
this.py = -1;
this.nComments = nComments;
this.userLastComment = userLastComment;
this.ageLastComment = ageLastComment;
this.loggedInUserComments = loggedInUserComments;
this.isFollowing = isFollowing;
}
function lmurCacheObj(lon, lat, getTime)
{
lon = +lon.toFixed(2);
lat = +lat.toFixed(2);
this.lon = lon;
this.lat = lat;
this.getTime = getTime;
}
function lmurDlReqObj(lon, lat, getURs, getMPs, getPURs)
{
lon = +lon.toFixed(2);
lat = +lat.toFixed(2);
this.lon = lon;
this.lat = lat;
this.getURs = getURs;
this.getMPs = getMPs;
this.getPURs = getPURs;
}
function lmurUpdateMarkerObj(markerID, nComments, userLastComment, ageLastComment, loggedInUserComments, isFollowing)
{
for(var objID=0; objID < lmurMarkers.length; objID++)
{
if(lmurMarkers[objID].obj.id == markerID)
{
lmurMarkers[objID].nComments = nComments;
lmurMarkers[objID].userLastComment = userLastComment;
lmurMarkers[objID].ageLastComment = ageLastComment;
lmurMarkers[objID].loggedInUserComments = loggedInUserComments;
lmurMarkers[objID].isFollowing = isFollowing;
break;
}
}
}
function lmurGetCacheIdx(lon, lat, type)
{
lon = +lon.toFixed(2);
lat = +lat.toFixed(2);
if(type == 1) lmurCached = lmurCachedURs;
else if((type == 2)||(type == 3)) lmurCached = lmurCachedMPs;
else if(type == 4) lmurCached = lmurCachedPURs;
else if(type == -1) lmurCached = lmurCachesToRender;
else return null;
for(var idx=0; idx<lmurCached.length; idx++)
{
if((lmurCached[idx].lon == lon) && (lmurCached[idx].lat == lat))
{
return idx;
}
}
return null;
}
function lmurSquareIsCached(lon, lat, cachedURs, cachedMPs, cachedPURs)
{
lon = +lon.toFixed(2);
lat = +lat.toFixed(2);
var idx;
if((cachedURs == false) && (cachedMPs == false) && (cachedPURs == false)) return false;
if(cachedURs)
{
idx = lmurGetCacheIdx(lon, lat, 1);
if(idx == null) return false;
if(lmurCachedURs[idx].getTime == null) return false;
}
if(cachedMPs)
{
idx = lmurGetCacheIdx(lon, lat, 2);
if(idx == null) return false;
if(lmurCachedMPs[idx].getTime == null) return false;
}
if(cachedPURs)
{
idx = lmurGetCacheIdx(lon, lat, 4);
if(idx == null) return false;
if(lmurCachedPURs[idx].getTime == null) return false;
}
return true;
}
function lmurGetSquareAge(lon, lat, type)
{
lon = +lon.toFixed(2);
lat = +lat.toFixed(2);
var idx = lmurGetCacheIdx(lon, lat, type);
if(idx != null)
{
timeNow = Math.floor(new Date().getTime() / 1000);
cacheTime = null;
if(type == 1) cacheTime = lmurCachedURs[idx].getTime;
else if((type == 2)||(type == 3)) cacheTime = lmurCachedMPs[idx].getTime;
else if(type == 4) cacheTime = lmurCachedPURs[idx].getTime;
else if(type == -1) cacheTime = lmurCachesToRender[idx].getTime;
if(cacheTime != null)
{
return (timeNow - cacheTime);
}
}
return null;
}
function lmurRemoveMarkersFromCache()
{
lmurAddLog('removing expired markers from cache');
var idx=0;
while(idx < lmurMarkers.length)
{
var markerAge = lmurGetMarkerAge(lmurMarkers[idx]);
if((markerAge > lmurCacheExpiryPeriod) || (markerAge == null))
{
lmurMarkers.splice(idx,1);
}
else
{
idx++;
}
}
}
function lmurRemoveSquareFromCacheList(lon, lat, type)
{
lon = +lon.toFixed(2);
lat = +lat.toFixed(2);
if(type != null)
{
lmurAddLog('removing square '+lon+','+lat+':'+type+' from cache');
var idx = lmurGetCacheIdx(lon, lat, type);
if(idx != null)
{
if(type == 1) lmurCachedURs.splice(idx,1);
else if((type == 2)||(type == 3)) lmurCachedMPs.splice(idx,1);
else if(type == 4) lmurCachedPURs.splice(idx,1);
else if(type == -1) lmurCachesToRender.splice(idx,1);
}
}
}
function lmurResetCaches()
{
lmurMarkers = new Array();
lmurCachedURs = new Array();
lmurCachedMPs = new Array();
lmurCachedPURs = new Array();
lmurCachesToRender = new Array();
lmurDownloadRequests = new Array();
}
function lmurChangeServer()
{
lmurResetCaches();
lmurUpdateRequestQueue();
}
function lmurGetMarkerAge(ureq)
{
return lmurGetSquareAge(ureq.lon, ureq.lat, ureq.type);
}
function lmurGetCommentsData(idList, urlPrefix)
{
var lmurRequest = new XMLHttpRequest();
var timeNow = new Date().getTime();
lmurFetchURL = 'https://www.waze.com/' + urlPrefix + 'Descartes-live/app/MapProblems/UpdateRequests?ids='+idList;
lmurAddLog('requesting '+lmurFetchURL);
lmurRequest.open('GET', lmurFetchURL, false);
try
{
lmurRequest.send();
lmurAddLog('response '+lmurRequest.status+' received');
if (lmurRequest.status === 200)
{
var lmurData = JSON.parse(lmurRequest.responseText);
for(var ursObj in lmurData.updateRequestSessions.objects)
{
urSesh = lmurData.updateRequestSessions.objects[ursObj];
var nComments = urSesh.comments.length;
if(nComments > 0)
{
var userLastComment = urSesh.comments[nComments-1].userID;
var ageLastComment = Math.floor((timeNow - urSesh.comments[nComments-1].createdOn) / 86400000);
var loggedInUserComments = false;
for(var loop=0;loop<nComments;loop++)
{
if(urSesh.comments[loop].userID == lmurUserID)
{
loggedInUserComments = true;
break;
}
}
}
var isFollowing = urSesh.isFollowing;
lmurUpdateMarkerObj(urSesh.id,nComments,userLastComment,ageLastComment,loggedInUserComments,isFollowing);
}
}
else
{
lmurAddLog('request failed (status != 200)');
alert('Unable to access comments data on server');
}
}
catch(err)
{
lmurAddLog('request failed (exception '+err+' caught)');
}
}
function lmurUpdateRequestQueue()
{
// don't visualise anything if the user isn't logged-in or hasn't asked for anything to be visualised...
if
(
(lmurIsLoggedIn == false) ||
(
(document.getElementById('_cbShowURs').checked == false) &&
(document.getElementById('_cbShowProblems').checked == false) &&
(document.getElementById('_cbShowPlaceUpdates').checked == false)
) ||
(lmurEnabled == false)
)
{
lmurAddLog('inhibit visualisation');
lmurDiv.innerHTML = '';
return;
}
var boundsNE = W.controller._mapView.map.getBounds().getNorthEast();
var boundsSW = W.controller._mapView.map.getBounds().getSouthWest();
if((boundsNE.lng - boundsSW.lng) > lmurMaxGrabWidth)
{
midpoint = (boundsNE.lng + boundsSW.lng) / 2;
boundsNE.lng = midpoint + (lmurMaxGrabWidth / 2);
boundsSW.lng = midpoint - (lmurMaxGrabWidth / 2);
}
if((boundsNE.lat - boundsSW.lat) > lmurMaxGrabHeight)
{
midpoint = (boundsNE.lat + boundsSW.lat) / 2;
boundsNE.lat = midpoint + (lmurMaxGrabHeight / 2);
boundsSW.lat = midpoint - (lmurMaxGrabHeight / 2);
}
var startLon = (boundsSW.lng / lmurSquareSize);
if(startLon < 0) startLon = Math.floor(startLon) * lmurSquareSize;
else startLon = Math.ceil(startLon) * lmurSquareSize;
var endLon = (boundsNE.lng / lmurSquareSize);
if(endLon < 0) endLon = Math.ceil(endLon) * lmurSquareSize;
else endLon = Math.floor(endLon) * lmurSquareSize;
var startLat = (boundsSW.lat / lmurSquareSize);
if(startLat < 0) startLat = Math.ceil(startLat) * lmurSquareSize;
else startLat = Math.floor(startLat) * lmurSquareSize;
var endLat = (boundsNE.lat / lmurSquareSize);
if(endLat < 0) endLat = Math.floor(endLat) * lmurSquareSize;
else endLat = Math.ceil(endLat) * lmurSquareSize;
var getURs = document.getElementById('_cbShowURs').checked;
var getMPs = document.getElementById('_cbShowProblems').checked;
var getPURs = document.getElementById('_cbShowPlaceUpdates').checked;
for(var sqLon = startLon; sqLon <= endLon; sqLon += lmurSquareSize)
{
for(var sqLat = startLat; sqLat <= endLat; sqLat += lmurSquareSize)
{
sqLon = +sqLon.toFixed(2);
sqLat = +sqLat.toFixed(2);
if(lmurSquareIsCached(sqLon, sqLat, getURs, getMPs, getPURs) == false)
{
lmurDownloadRequests.push(new lmurDlReqObj(sqLon, sqLat, getURs, getMPs, getPURs));
}
}
}
}
function lmurGetMarkers()
{
if(lmurDownloadRequests.length == 0)
{
setTimeout(lmurGetMarkers,100);
return;
}
var withCommentsCount = 0;
var withCommentsIDs = '';
var timeNow = Math.floor(new Date().getTime() / 1000);
var dlReq = lmurDownloadRequests.pop();
var idx = lmurGetCacheIdx(dlReq.lon, dlReq.lat, dlReq.type);
if(idx == null)
{
lmurAddLog('cache miss at '+dlReq.lon+' '+dlReq.lat);
var lmurRequest = new XMLHttpRequest();
var getURs = ((dlReq.getURs) && (!lmurSquareIsCached(dlReq.lon, dlReq.lat, true, false, false)));
var getMPs = ((dlReq.getMPs) && (!lmurSquareIsCached(dlReq.lon, dlReq.lat, false, true, false)));
var getPURs = ((dlReq.getPURs) && (!lmurSquareIsCached(dlReq.lon, dlReq.lat, false, false, true)));
var urlPrefix = W.location.getUrlPrefix();
if(document.getElementById('_radioROWServer').checked) urlPrefix = 'row-';
else if(document.getElementById('_radioUSAServer').checked) urlPrefix = '';
else if(document.getElementById('_radioIsraelServer').checked) urlPrefix = 'il-';
lmurFetchURL = 'https://www.waze.com/' + urlPrefix + 'Descartes-live/app/Features?language=en';
if(getURs) lmurFetchURL += '&mapUpdateRequestFilter=0';
if(getMPs) lmurFetchURL += '&problemFilter=0&turnProblemFilter=0';
if(getPURs) lmurFetchURL += '&venueLevel=0&venueUpdateRequests=true';
if(document.getElementById('_cbEnablePlayMode').checked == true) lmurFetchURL += '&sandbox=true';
lmurFetchURL += '&bbox=';
lmurFetchURL += dlReq.lon + ',' + dlReq.lat + ',' + (dlReq.lon + lmurSquareSize) + ',' + (dlReq.lat + lmurSquareSize);
lmurRequest.open('GET', lmurFetchURL, false);
try
{
lmurAddLog('requesting '+lmurFetchURL);
lmurRequest.send();
lmurAddLog('response '+lmurRequest.status+' received');
if (lmurRequest.status === 200)
{
var lmurData = JSON.parse(lmurRequest.responseText);
cacheObj = new lmurCacheObj(dlReq.lon, dlReq.lat, timeNow);
lmurAddLog('This area contains:');
if(lmurData.mapUpdateRequests != null)
{
lmurAddLog(' '+lmurData.mapUpdateRequests.objects.length+' URs');
// store URs
for(var urobj in lmurData.mapUpdateRequests.objects)
{
var ureq = lmurData.mapUpdateRequests.objects[urobj];
var urpos = new L.LatLng(ureq.geometry.coordinates[1],ureq.geometry.coordinates[0]);
lmurMarkers.push(new lmurMarker(urpos, ureq, 1, dlReq.lon, dlReq.lat, 0, -1, -1, false, false));
if(lmurUserID != undefined)
{
//if(ureq.hasComments == true)
{
if(++withCommentsCount > 1)
{
withCommentsIDs += ',';
}
withCommentsIDs += ureq.id;
if(withCommentsCount == 50)
{
lmurAddLog('Getting a block of comments data...');
lmurGetCommentsData(withCommentsIDs, urlPrefix);
withCommentsCount = 0;
withCommentsIDs = '';
}
}
}
}
if(lmurUserID != undefined)
{
if(withCommentsCount > 0)
{
lmurAddLog('Getting a block of comments data...');
lmurGetCommentsData(withCommentsIDs, urlPrefix);
}
}
}
if(lmurData.problems != null)
{
lmurAddLog(' '+lmurData.problems.objects.length+' MPs');
// store map problems
for(var urobj in lmurData.problems.objects)
{
var ureq = lmurData.problems.objects[urobj];
var urpos = new L.LatLng(ureq.geometry.coordinates[1],ureq.geometry.coordinates[0]);
lmurMarkers.push(new lmurMarker(urpos, ureq, 2, dlReq.lon, dlReq.lat, 0, -1, -1, false, false));
}
}
if(lmurData.turnProblems != null)
{
lmurAddLog(' '+lmurData.turnProblems.objects.length+' turn problems');
// store turn problems
for(var urobj in lmurData.turnProblems.objects)
{
var ureq = lmurData.turnProblems.objects[urobj];
var urpos = new L.LatLng(ureq.geometry.coordinates[1],ureq.geometry.coordinates[0]);
lmurMarkers.push(new lmurMarker(urpos, ureq, 3, dlReq.lon, dlReq.lat, 0, -1, -1, false, false));
}
}
if(lmurData.venues != null)
{
lmurAddLog(' '+lmurData.venues.objects.length+' PURs');
// store PURs
for(var puobj in lmurData.venues.objects)
{
var pupd = lmurData.venues.objects[puobj];
if(pupd.venueUpdateRequests == null) continue;
if(pupd.geometry.type == 'Point')
{
var pupos = new L.LatLng(pupd.geometry.coordinates[1],pupd.geometry.coordinates[0]);
lmurMarkers.push(new lmurMarker(pupos, pupd, 4, dlReq.lon, dlReq.lat, 0, -1, -1, false, false));
}
else if(pupd.geometry.type == 'Polygon')
{
var pupos = new L.LatLng(pupd.geometry.coordinates[0][0][1],pupd.geometry.coordinates[0][0][0]);
lmurMarkers.push(new lmurMarker(pupos, pupd, 4, dlReq.lon, dlReq.lat, 0, -1, -1, false, false));
}
}
}
if(getURs) lmurCachedURs.push(cacheObj);
if(getMPs) lmurCachedMPs.push(cacheObj);
if(getPURs) lmurCachedPURs.push(cacheObj);
lmurVisualiseMarkers();
setTimeout(lmurGetMarkers,1);
}
else
{
lmurAddLog('request failed (status != 200)');
}
}
catch(err)
{
lmurAddLog('request failed (exception '+err+' caught)');
}
}
else
{
lmurAddLog('cache hit at '+dlReq.lon+' '+dlReq.lat);
lmurGetMarkers();
}
}
function lmurKeywordPresent(desc, keyword)
{
if(document.getElementById('_cbURCaseInsensitive').checked == true) re = RegExp(keyword,'i');
else re = RegExp(keyword);
if(desc.search(re) == -1) return false;
else return true;
}
function lmurFilterMarkers(ureq)
{
// URs
if(ureq.type == 1)
{
if (document.getElementById('_cbShowURs').checked == false) return true;
// resolved filtering
if(document.getElementById('_cbUREnableResolvedFilter').checked == true)
{
if(ureq.obj.resolvedOn != null) return true;
}
// age-based filtering
var daysOld = lmurGetURAge(ureq.obj,0);
if(daysOld != 999999)
{
if(document.getElementById('_cbUREnableMinAgeFilter').checked == true)
{
if(daysOld < document.getElementById('_inputURFilterMinDays').value) return true;
}
if(document.getElementById('_cbUREnableMaxAgeFilter').checked == true)
{
if(daysOld > document.getElementById('_inputURFilterMaxDays').value) return true;
}
}
// comment based filtering
if(lmurIsLoggedIn)
{
if(document.getElementById('_cbURHideWithMyComments').checked == true)
{
if(ureq.loggedInUserComments) return true;
}
if(document.getElementById('_cbURShowWithMyComments').checked == true)
{
if(!ureq.loggedInUserComments) return true;
}
if(document.getElementById('_cbURHideLastCommentByMe').checked == true)
{
if(ureq.userLastComment == lmurUserID) return true;
}
if(document.getElementById('_cbURShowLastCommentByMe').checked == true)
{
if(ureq.userLastComment != lmurUserID) return true;
}
if(document.getElementById('_cbURHideLastCommentByReporter').checked == true)
{
if(ureq.userLastComment == -1) return true;
}
if(document.getElementById('_cbURShowLastCommentByReporter').checked == true)
{
if(ureq.userLastComment != -1) return true;
}
if(document.getElementById('_cbURHideWithLessThanComments').checked == true)
{
if(ureq.nComments < document.getElementById('_inputFilterMinComments').value) return true;
}
if(document.getElementById('_cbURShowWithLessThanComments').checked == true)
{
if(ureq.nComments >= document.getElementById('_inputFilterMinComments').value) return true;
}
if(document.getElementById('_cbURHideFollowedURs').checked == true)
{
if(ureq.isFollowing) return true;
}
if(document.getElementById('_cbURShowFollowedURs').checked == true)
{
if(!ureq.isFollowing) return true;
}
if(document.getElementById('_cbURHideLastCommentAge').checked == true)
{
if(ureq.nComments > 0)
{
if(ureq.ageLastComment < document.getElementById('_inputFilterCommentAge').value) return true;
}
}
if(document.getElementById('_cbURShowLastCommentAge').checked == true)
{
if(ureq.ageLastComment >= document.getElementById('_inputFilterCommentAge').value) return true;
}
}
// keyword and type-specific filtering
var desc = '';
var urFilter = false;
if(ureq.obj.description != null) desc = ureq.obj.description;
if(document.getElementById('_cbUREnableKeywordMustBePresent').checked == 1)
{
if(!lmurKeywordPresent(desc,document.getElementById('_textURKeywordPresent').value)) return true;
}
if(document.getElementById('_cbUREnableKeywordMustBeAbsent').checked == 1)
{
if(lmurKeywordPresent(desc,document.getElementById('_textURKeywordAbsent').value)) return true;
}
if(document.getElementById('_cbURHideWithNoDescription').checked == 1)
{
if(desc == "") return true;
}
if(document.getElementById('_cbURShowWithNoDescription').checked == 1)
{
if(desc != "") return true;
}
// type-based filtering...
// Need to check for Waze automatic URs first - these always (?) get inserted as General Error URs,
// so although they're treated as a "type" UR for filtering purposes, we have to filter them out
// via description keyword matching before we can do any real type filtering
if(desc.indexOf('Waze Automatic:') != -1)
{
if(document.getElementById('_cbURFilterWazeAuto').checked == 1) urFilter = true;
}
// Finally tagged URs
else if(desc.indexOf('[ROADWORKS]') != -1)
{
if(document.getElementById('_cbURFilterRoadworks').checked == 1) urFilter = true
}
else if(desc.indexOf('[CONSTRUCTION]') != -1)
{
if(document.getElementById('_cbURFilterConstruction').checked == 1) urFilter = true
}
else if(desc.indexOf('[CLOSURE]') != -1)
{
if(document.getElementById('_cbURFilterClosure').checked == 1) urFilter = true
}
else if(desc.indexOf('[EVENT]') != -1)
{
if(document.getElementById('_cbURFilterEvent').checked == 1) urFilter = true
}
else if(desc.indexOf('[NOTE]') != -1)
{
if(document.getElementById('_cbURFilterNote').checked == 1) urFilter = true
}
if(ureq.obj.type == 6)
{
if(document.getElementById('_cbURFilterIncorrectTurn').checked == 1) urFilter = true;
}
else if(ureq.obj.type == 7)
{
if (document.getElementById('_cbURFilterIncorrectAddress').checked == 1) urFilter = true;
}
else if(ureq.obj.type == 8)
{
if(document.getElementById('_cbURFilterIncorrectRoute').checked == 1) urFilter = true;
}
else if(ureq.obj.type == 9)
{
if(document.getElementById('_cbURFilterMissingRoundabout').checked == 1) urFilter = true;
}
else if(ureq.obj.type == 10)
{
if(document.getElementById('_cbURFilterGeneralError').checked == 1) urFilter = true;
}
else if(ureq.obj.type == 11)
{
if(document.getElementById('_cbURFilterTurnNotAllowed').checked == 1) urFilter = true;
}
else if(ureq.obj.type == 12)
{
if(document.getElementById('_cbURFilterIncorrectJunction').checked == 1) urFilter = true;
}
else if(ureq.obj.type == 13)
{
if(document.getElementById('_cbURFilterMissingBridgeOverpass').checked == 1) urFilter = true;
}
else if(ureq.obj.type == 14)
{
if(document.getElementById('_cbURFilterWrongDrivingDirection').checked == 1) urFilter = true;
}
else if(ureq.obj.type == 15)
{
if(document.getElementById('_cbURFilterMissingExit').checked == 1) urFilter = true;
}
else if(ureq.obj.type == 16)
{
if(document.getElementById('_cbURFilterMissingRoad').checked == 1) urFilter = true;
}
else if(ureq.obj.type == 18)
{
if(document.getElementById('_cbURFilterMissingLandmark').checked == 1) urFilter = 'hidden';
}
else if(ureq.obj.type == 19)
{
if(document.getElementById('_cbURFilterBlockedRoad').checked == 1) urFilter = true;
}
else if(document.getElementById('_cbURFilterUndefined').checked == 1) urFilter = true;
if(document.getElementsByName('lmurShowURs')[0].checked)
{
if(urFilter == true) urFilter = false;
else urFilter = true;
}
return urFilter;
}
// MPs
else if(ureq.type == 2)
{
if (document.getElementById('_cbShowProblems').checked == false) return true;
// resolved filter
// resolved filtering
if(document.getElementById('_cbMPEnableResolvedFilter').checked == true)
{
if(ureq.obj.resolvedOn != null) return true;
}
// filter by severity
if(ureq.obj.weight <= 3)
{
if (document.getElementById('_cbMPFilterLowSeverity').checked == 1) return true;
}
else if(ureq.obj.weight <= 7)
{
if (document.getElementById('_cbMPFilterMediumSeverity').checked == 1) return true;
}
else if(ureq.obj.weight > 7)
{
if (document.getElementById('_cbMPFilterHighSeverity').checked == 1) return true;
}
var problemFilter = false;
if(ureq.obj.problemType == 101)
{
if(document.getElementById('_cbMPFilterDrivingDirectionMismatch').checked == 1) problemFilter = true;
}
else if(ureq.obj.problemType == 102)
{
if(document.getElementById('_cbMPFilterMissingJunction').checked == 1) problemFilter = true;
}
else if(ureq.obj.problemType == 103)
{
if(document.getElementById('_cbMPFilterMissingRoad').checked == 1) problemFilter = true;
}
else if(ureq.obj.problemType == 104)
{
if(document.getElementById('_cbMPFilterCrossroadsJunctionMissing').checked == 1) problemFilter = true;
}
else if(ureq.obj.problemType == 105)
{
if(document.getElementById('_cbMPFilterRoadTypeMismatch').checked == 1) problemFilter = true;
}
else if(ureq.obj.problemType == 106)
{
if(document.getElementById('_cbMPFilterRestrictedTurn').checked == 1) problemFilter = true;
}
else if(document.getElementById('_cbMPFilterUnknownProblem').checked == 1) problemFilter = true;
if(document.getElementsByName('lmurShowProblems')[0].checked)
{
if(problemFilter == true) problemFilter = false;
else problemFilter = true;
}
return problemFilter;
}
// Turn problems
else if(ureq.type == 3)
{
// resolved filtering
if(document.getElementById('_cbTPEnableResolvedFilter').checked == true)
{
if(ureq.obj.resolvedOn != null) return true;
}
if (document.getElementById('_cbShowTurnProbs').checked == false) return true;
else return false;
}
// PURs
else if(ureq.type == 4)
{
if (document.getElementById('_cbShowPlaceUpdates').checked == false) return true;
var purFilter = false;
var purUpdateDetails = false;
var purNewPhoto = false;
var purNewPlace = false;
var purFlagged = false;
var purNonZeroLR = false;
if(ureq.obj.lockRank != null)
{
purNonZeroLR = (ureq.obj.lockRank > 0);
}
for(vurIdx=0; vurIdx < ureq.obj.venueUpdateRequests.length; vurIdx++)
{
vurObj = ureq.obj.venueUpdateRequests[vurIdx];
if(vurObj.type != null)
{
purNewPhoto |= (vurObj.type == 'IMAGE');
purNewPlace |= (vurObj.type == 'VENUE');
}
if(vurObj.subType != null)
{
purUpdateDetails |= (vurObj.subType == 'UPDATE');
purFlagged |= (vurObj.subType == 'FLAG');
}
}
purFilter |= ((document.getElementById('_cbPURFilterNewPlace').checked == true) && (purNewPlace));
purFilter |= ((document.getElementById('_cbPURFilterUpdateDetails').checked == true) && (purUpdateDetails));
purFilter |= ((document.getElementById('_cbPURFilterNewPhoto').checked == true) && (purNewPhoto));
purFilter |= ((document.getElementById('_cbPURFilterFlagged').checked == true) && (purFlagged));
purFilter |= ((document.getElementById('_cbPURNonZeroLockRank').checked == true) && (purNonZeroLR));
if(document.getElementsByName('lmurShowPURs')[0].checked)
{
if(purFilter == true) purFilter = false;
else purFilter = true;
}
return purFilter;
}
}
function lmurVisualiseMarkers()
{
// don't visualise anything if the user isn't logged-in or hasn't asked for anything to be visualised...
if
(
(lmurIsLoggedIn == false) ||
(
(document.getElementById('_cbShowURs').checked == false) &&
(document.getElementById('_cbShowProblems').checked == false) &&
(document.getElementById('_cbShowPlaceUpdates').checked == false)
) ||
(lmurEnabled == false)
)
{
lmurAddLog('inhibit visualisation');
lmurDiv.innerHTML = '';
return;
}
lmurAddLog('enabling nudge detection');
lmurPrevCentre = W.controller._mapView.map.getCenter();
lmurInhibitNudgeDetection = false;
lmurAddLog('visualise markers');
var currentlat = W.controller._mapView.map.getCenter().lat;
var currentlon = W.controller._mapView.map.getCenter().lng;
mapObj = document.getElementById("map");
var currentwidth = mapObj.offsetWidth;
var currentheight = mapObj.offsetHeight;
lmurDiv.style.width = currentwidth;
lmurDiv.style.height = currentheight;
var svgSrc = '<svg xmlns="http://www.w3.org/2000/svg" width="'+currentwidth+'px" height="'+currentheight+'px" version="1.1">';
// visualise cached data areas
var corner1 = new L.LatLng(0,0);
var corner2 = new L.LatLng(0,0);
var boundsNE = W.controller._mapView.map.getBounds().getNorthEast();
var boundsSW = W.controller._mapView.map.getBounds().getSouthWest();
lmurCachesToRender = new Array();
for(sq=0;sq<lmurCachedURs.length;sq++)
{
corner1.lat = lmurCachedURs[sq].lat;
corner1.lng = lmurCachedURs[sq].lon;
var sqAge = lmurGetSquareAge(corner1.lng, corner1.lat, 1);
if(sqAge != null)
{
if((sqAge > lmurCacheExpiryPeriod)&&(lmurCacheExpiryPeriod != 0)) lmurRemoveSquareFromCacheList(corner1.lng, corner1.lat, 1);
else if(sqAge != -1) lmurCachesToRender.push(new lmurCacheObj(lmurCachedURs[sq].lon, lmurCachedURs[sq].lat, lmurCachedURs[sq].getTime));
}
}
for(sq=0;sq<lmurCachedMPs.length;sq++)
{
corner1.lat = lmurCachedMPs[sq].lat;
corner1.lng = lmurCachedMPs[sq].lon;
var sqAge = lmurGetSquareAge(corner1.lng, corner1.lat, 2);
if(sqAge != null)
{
if((sqAge > lmurCacheExpiryPeriod)&&(lmurCacheExpiryPeriod != 0)) lmurRemoveSquareFromCacheList(corner1.lng, corner1.lat, 2);
else if(sqAge != -1)
{
var idx = lmurGetCacheIdx(corner1.lng, corner1.lat, -1);
if(idx == null) lmurCachesToRender.push(new lmurCacheObj(lmurCachedMPs[sq].lon, lmurCachedMPs[sq].lat, lmurCachedMPs[sq].getTime));
else if(sqAge < lmurGetSquareAge(corner1.lng, corner1.lat, -1)) lmurCachesToRender[idx].getTime = lmurCachedMPs[sq].getTime;
}
}
}
for(sq=0;sq<lmurCachedPURs.length;sq++)
{
corner1.lat = lmurCachedPURs[sq].lat;
corner1.lng = lmurCachedPURs[sq].lon;
var sqAge = lmurGetSquareAge(corner1.lng, corner1.lat, 4);
if(sqAge != null)
{
if((sqAge > lmurCacheExpiryPeriod)&&(lmurCacheExpiryPeriod != 0)) lmurRemoveSquareFromCacheList(corner1.lng, corner1.lat, 4);
else if(sqAge != -1)
{
var idx = lmurGetCacheIdx(corner1.lng, corner1.lat, -1);
if(idx == null) lmurCachesToRender.push(new lmurCacheObj(lmurCachedPURs[sq].lon, lmurCachedPURs[sq].lat, lmurCachedPURs[sq].getTime));
else if(sqAge < lmurGetSquareAge(corner1.lng, corner1.lat, -1)) lmurCachesToRender[idx].getTime = lmurCachedPURs[sq].getTime;
}
}
}
for(sq=0;sq<lmurCachesToRender.length;sq++)
{
corner1.lat = lmurCachesToRender[sq].lat;
corner1.lng = lmurCachesToRender[sq].lon;
if
(
(corner1.lng <= boundsNE.lng) &&
((corner1.lng + lmurSquareSize) >= boundsSW.lng) &&
(corner1.lat <= boundsNE.lat) &&
((corner1.lat + lmurSquareSize) >= boundsSW.lat)
)
{
var sqAge = lmurGetSquareAge(corner1.lng, corner1.lat, -1);
if(sqAge > lmurCacheExpiryPeriod)
{
sqAge = lmurCacheExpiryPeriod;
}
if((sqAge != -1) && (sqAge <= lmurCacheExpiryPeriod))
{
if(lmurCacheExpiryPeriod == 0)
{
fillOpacity = 0.2;
}
else
{
fillOpacity = 0.2 - ((sqAge * 0.15) / lmurCacheExpiryPeriod);
}
corner2.lat = parseFloat(corner1.lat)+lmurSquareSize;
corner2.lng = parseFloat(corner1.lng)+lmurSquareSize;
pix1 = W.controller._mapView.map.latLngToContainerPoint(corner1);
pix2 = W.controller._mapView.map.latLngToContainerPoint(corner2);
svgSrc += '<rect x="'+pix1.x+'" y="'+pix2.y+'" width="'+(pix2.x-pix1.x)+'" height="'+(pix1.y-pix2.y)+'" style="fill:yellow;stroke:none;fill-opacity:'+fillOpacity+'"/>';
}
}
}
if(lmurCacheExpiryPeriod > 0)
{
lmurRemoveMarkersFromCache();
}
var urpos = new L.LatLng(0,0);
var hideMarker;
for(i=0;i<lmurMarkers.length;i++)
{
var ureq = lmurMarkers[i];
hideMarker = lmurFilterMarkers(ureq);
if(hideMarker == false)
{
urpos.lng = ureq.pos.lng;
urpos.lat = ureq.pos.lat;
var urpix = W.controller._mapView.map.latLngToContainerPoint(urpos);
lmurMarkers[i].px = urpix.x;
lmurMarkers[i].py = urpix.y;
if((urpix.x < 0)||(urpix.x >= W.controller._mapView.map._size.x)||(urpix.y < 0)||(urpix.y >= W.controller._mapView.map._size.y)) hideMarker = true;
}
else
{
lmurMarkers[i].px = -1;
lmurMarkers[i].py = -1;
}
lmurMarkers[i].markerHidden = hideMarker;
}
if(W.controller._mapView.map._zoom < 11)
{
var clusterDist = Math.min(Math.floor(W.controller._mapView.map._size.y / 20),Math.floor(W.controller._mapView.map._size.x / 20));
var marker_rad = clusterDist / 3;
if(marker_rad < 10) marker_rad = 10;
var threshold = 1;
if(lmurMarkers.length > 1)
{
for(var i=0;i<lmurMarkers.length-1;i++)
{
if(lmurMarkers[i].markerHidden == false)
{
if(lmurCacheExpiryPeriod == 0)
{
fillOpacity = 1;
}
else
{
fillOpacity = 1 - ((lmurGetMarkerAge(lmurMarkers[i]) * .9) / lmurCacheExpiryPeriod);
}
if(fillOpacity < 0.1) fillOpacity = 0.1;
var clusterSize = 1;
var clusterX = lmurMarkers[i].px;
var clusterY = lmurMarkers[i].py;
var xmin = lmurMarkers[i].px-clusterDist;
var xmax = lmurMarkers[i].px+clusterDist;
var ymin = lmurMarkers[i].py-clusterDist;
var ymax = lmurMarkers[i].py+clusterDist;
for(var j=i+1;j<lmurMarkers.length;j++)
{
if(lmurMarkers[j].markerHidden == false)
{
if((lmurMarkers[j].px > xmin)&&(lmurMarkers[j].px < xmax)&&(lmurMarkers[j].py > ymin)&&(lmurMarkers[j].py < ymax))
{
clusterSize++;
clusterX += lmurMarkers[j].px;
clusterY += lmurMarkers[j].py;
lmurMarkers[j].markerHidden = true;
}
}
}
if(clusterSize > threshold)
{
lmurMarkers[i].markerHidden = true;
cx = clusterX / clusterSize;
cy = clusterY / clusterSize;
svgSrc += '<circle cx="'+cx+'" cy="'+cy+'" r="'+marker_rad+'" style="fill:black;stroke:white;fill-opacity:'+fillOpacity+';stroke-opacity:1"/>';
svgSrc += '<text x="'+cx+'" y="'+cy+'" font-size="12" fill="white" style="text-anchor: middle" dy="5">'+clusterSize+'</text>';
}
}
}
}
}
for(var i=0;i<lmurMarkers.length;i++)
{
if(lmurMarkers[i].markerHidden == false)
{
var ureq = lmurMarkers[i];
if(lmurCacheExpiryPeriod == 0)
{
fillOpacity = 1;
}
else
{
fillOpacity = 1 - ((lmurGetMarkerAge(ureq) * .9) / lmurCacheExpiryPeriod);
}
if(fillOpacity < 0.1) fillOpacity = 0.1;
if(ureq.type == 1)
{
if(ureq.obj.resolvedOn != null)
{
svgSrc += '<circle cx="'+ureq.px+'" cy="'+(ureq.py+7)+'" r="9" style="fill:white;stroke:black;fill-opacity:'+fillOpacity+';stroke-opacity:1"/>';
}
svgSrc += '<rect x="'+ureq.px+'" y="'+ureq.py+'" transform="rotate(45,'+ureq.px+','+ureq.py+')" width="10" height="10" style="fill:red;stroke:blue;fill-opacity:'+fillOpacity+';stroke-opacity:1"/>';
}
else if(ureq.type == 2)
{
if(ureq.obj.resolvedOn != null)
{
svgSrc += '<circle cx="'+ureq.px+'" cy="'+(ureq.py)+'" r="9" style="fill:white;stroke:black;fill-opacity:'+fillOpacity+';stroke-opacity:1"/>';
}
svgSrc += '<rect x="'+(ureq.px-5)+'" y="'+(ureq.py-5)+'" width="10" height="10" style="fill:green;stroke:red;fill-opacity:'+fillOpacity+';stroke-opacity:1"/>';
}
else if(ureq.type == 3)
{
if(ureq.obj.resolvedOn != null)
{
svgSrc += '<circle cx="'+ureq.px+'" cy="'+(ureq.py)+'" r="9" style="fill:white;stroke:black;fill-opacity:'+fillOpacity+';stroke-opacity:1"/>';
}
svgSrc += '<circle cx="'+ureq.px+'" cy="'+ureq.py+'" r="5" style="fill:blue;stroke:red;fill-opacity:'+fillOpacity+';stroke-opacity:1"/>';
}
else if(ureq.type == 4)
{
svgSrc += '<polygon points="'+(ureq.px+0)+','+(ureq.py+5)+' '+(ureq.px+5)+','+(ureq.py+1)+' '+(ureq.px+3)+','+(ureq.py-5)+' '+(ureq.px-3)+','+(ureq.py-5)+' '+(ureq.px-5)+','+(ureq.py+1)+'" style="fill:yellow;stroke:black;fill-opacity:'+fillOpacity+';stroke-opacity:1"/>';
}
}
}
svgSrc += '</svg>';
lmurDiv.innerHTML = svgSrc;
lmurDiv.style.visibility = '';
}
function lmurInitDrag()
{
lmurAddLog('inhibiting nudge detection');
lmurInhibitNudgeDetection = true;
lmurDiv.style.visibility = 'hidden';
}
function lmurEndDrag()
{
lmurAddLog('re-enabling nudge detection');
lmurInhibitNudgeDetection = false;
lmurDiv.style.visibility = '';
}
function lmurMouseInUI()
{
lmurInhibitCacheRefresh = true;
}
function lmurMouseOutUI()
{
lmurInhibitCacheRefresh = false;
}
function lmurChangeDecayPeriod()
{
var userDecayValue = document.getElementById('_inputCacheDecayPeriod').value
lmurCacheExpiryPeriod = (parseInt(userDecayValue) * 60);
}
function lmurCheckActivation()
{
lmurEnabled = document.getElementById('_cbEnableLMUR').checked;
mapObj = document.getElementById("map");
mapObj.onmouseup = null;
mapObj.onmousedown = null;
if
(
(
(document.getElementById('_cbEnablePlayMode').checked == true) &&
(lmurPlayModeEnabled == false)
) ||
(
(document.getElementById('_cbEnablePlayMode').checked == false) &&
(lmurPlayModeEnabled == true)
)
)
{
lmurInhibitCacheRefresh = false;
lmurResetCaches();
}
lmurPlayModeEnabled = document.getElementById('_cbEnablePlayMode').checked;
lsp = document.getElementsByClassName('leaflet-shadow-pane');
lop = document.getElementsByClassName('leaflet-overlay-pane');
lmp = document.getElementsByClassName('leaflet-marker-pane');
if(document.getElementById('_cbHideNativeMarkers').checked)
{
if(lsp.length > 0) lsp[0].style.visibility = 'hidden';
//if(lop.length > 0) lop[0].style.visibility = 'hidden';
if(lmp.length > 0) lmp[0].style.visibility = 'hidden';
}
else
{
if(lsp.length > 0) lsp[0].style.visibility = '';
//if(lop.length > 0) lop[0].style.visibility = '';
if(lmp.length > 0) lmp[0].style.visibility = '';
}
if
(
(document.getElementById('_cbShowURs').checked == false) &&
(document.getElementById('_cbShowProblems').checked == false) &&
(document.getElementById('_cbShowTurnProbs').checked == false) &&
(document.getElementById('_cbShowPlaceUpdates').checked == false)
)
{
lmurDiv.innerHTML = '';
return;
}
lmurControlsEnabled = true;
lmurNoForcedRefreshThisCycle = false;
lmurAddLog('re-visualising after CheckActivation call');
lmurUpdateRequestQueue();
if(lmurDownloadRequests.length == 0) lmurVisualiseMarkers();
mapObj.onmouseup = lmurEndDrag;
mapObj.onmousedown = lmurInitDrag;
}
function lmurGetURAge(urObj,whichAgeToGet)
{
var uroDate = -1;
if(whichAgeToGet == 0)
{
if(urObj.driveDate != null)
{
uroDate = urObj.driveDate;
if(uroDate != 0)
{
var dateNow = new Date();
return Math.floor((dateNow.getTime() - uroDate) / 86400000);
}
else return 999999;
}
else return 999999;
}
else if(whichAgeToGet == 1)
{
if(urObj.updatedOn != null)
{
uroDate = urObj.updatedOn;
if(uroDate != 0)
{
var dateNow = new Date();
return Math.floor((dateNow.getTime() - uroDate) / 86400000);
}
else return 999999;
}
else return 999999;
}
else if(whichAgeToGet == 2)
{
if(urObj.resolvedOn != null)
{
uroDate = urObj.resolvedOn;
if(uroDate != 0)
{
var dateNow = new Date();
return Math.floor((dateNow.getTime() - uroDate) / 86400000);
}
else return 999999;
}
else return 999999;
}
else if(whichAgeToGet == 3)
{
if(urObj.venueUpdateRequests[0].dateAdded != null)
{
uroDate = urObj.venueUpdateRequests[0].dateAdded;
if(uroDate != 0)
{
var dateNow = new Date();
return Math.floor((dateNow.getTime() - uroDate) / 86400000);
}
else return 999999;
}
else return 999999;
}
else return 999999;
}
function lmurParseDaysAgo(days)
{
if(days == 0) return 'today';
else if(days == 1) return '1 day ago';
else return days+' days ago';
}
function lmurCheckOverMarker(e)
{
if(!lmurEnabled)
{
return;
}
mouseX = e.pageX;
mouseY = e.pageY;
mouseY -= document.getElementsByClassName('waze-header')[0].clientHeight + 5;
result = '';
var urpos = new L.LatLng(0,0);
for(i=0;i<lmurMarkers.length;i++)
{
if(!lmurMarkers[i].markerHidden)
{
var ureq = lmurMarkers[i];
urpos.lng = ureq.pos.lng;
urpos.lat = ureq.pos.lat;
var urpix = W.controller._mapView.map.latLngToContainerPoint(urpos);
if(lmurMarkers[i].type == 1)
{
if((mouseX >= urpix.x - 5) && (mouseX < urpix.x + 10) && (mouseY >= urpix.y - 5) && (mouseY < urpix.y + 10))
{
ureq = lmurMarkers[i].obj;
urAge = lmurGetMarkerAge(lmurMarkers[i]);
if(urAge == null) urAge = '>'+lmurCacheExpiryPeriod;
if(ureq.type == 6) ureqTypeText = "Incorrect turn";
else if(ureq.type == 7) ureqTypeText = "Incorrect address"
else if(ureq.type == 8) ureqTypeText = "Incorrect route"
else if(ureq.type == 9) ureqTypeText = "Missing roundabout"
else if(ureq.type == 10) ureqTypeText = "General error"
else if(ureq.type == 11) ureqTypeText = "Turn not allowed"
else if(ureq.type == 12) ureqTypeText = "Incorrect junction"
else if(ureq.type == 13) ureqTypeText = "Missing bridge overpass"
else if(ureq.type == 14) ureqTypeText = "Wrong driving direction"
else if(ureq.type == 15) ureqTypeText = "Missing exit"
else if(ureq.type == 16) ureqTypeText = "Missing road"
else if(ureq.type == 19) ureqTypeText = "Blocked road"
else ureqTypeText = "Unknown"
result = '<b>Update Request: ' + ureqTypeText + '</b>';
if(ureq.description != null)
{
result += '<br>' + ureq.description.replace(/<\/?[^>]+(>|$)/g, "");
}
var daysOld = lmurGetURAge(ureq,0);
if(daysOld != 999999)
{
result += '<br><i>Submitted ' + lmurParseDaysAgo(daysOld) + '</i>';
}
daysOld = lmurGetURAge(ureq,2);
if(daysOld != 999999)
{
result += '<br><i>Resolved ' + lmurParseDaysAgo(daysOld) + '</i>';
}
var nComments = lmurMarkers[i].nComments;
result += '<br><i>UR has ' + nComments + ' comment';
if(nComments != 1) result += 's';
result += '</i>';
result += '<br><small>(Data refreshed '+urAge+'s ago)</small>';
break;
}
}
else
{
if((mouseX >= urpix.x - 5) && (mouseX < urpix.x + 5) && (mouseY >= urpix.y - 10) && (mouseY < urpix.y + 5))
{
urAge = lmurGetMarkerAge(lmurMarkers[i]);
if(urAge == null) urAge = '>'+lmurCacheExpiryPeriod;
if(lmurMarkers[i].type == 2)
{
ureq = lmurMarkers[i].obj;
result = '<b>Map Problem: ';
if(ureq.problemType == 101) result += 'Driving direction mismatch';
else if(ureq.problemType == 102) result += 'Missing junction';
else if(ureq.problemType == 103) result += 'Missing road';
else if(ureq.problemType == 104) result += 'Cross roads junction missing';
else if(ureq.problemType == 105) result += 'Road type mismatch';
else if(ureq.problemType == 106) result += 'Restricted turn might be allowed';
else result += 'Unknown problem type ('+ureq.problemType+')';
result += '</b><br>';
if(ureq.weight <= 3) result += 'Severity: Low';
else if(ureq.weight <= 7) result += 'Severity: Medium';
else result += 'Severity: High';
}
else if(lmurMarkers[i].type == 3)
{
ureq = lmurMarkers[i].obj;
result = '<b>Turn Problem: The displayed route is frequently not taken by users</b>';
}
else if(lmurMarkers[i].type == 4)
{
ureq = lmurMarkers[i].obj;
var putype = ureq.venueUpdateRequests[0].type;
result = '<b>Place Update</b><br>';
result += 'Type: ';
if(putype == 'VENUE') result += 'New place';
else if(putype == 'IMAGE') result += 'New Photo';
else if(putype == 'REQUEST') result += 'Change Details';
else result += putype;
if(ureq.venueUpdateRequests.length > 1)
{
result += '<br>Awaiting updates: ' + ureq.venueUpdateRequests.length;
}
var daysOld = lmurGetURAge(ureq,3);
if(daysOld != 999999)
{
result += '<br><i>Received ' + lmurParseDaysAgo(daysOld) + '</i>';
}
}
var daysOld = lmurGetURAge(ureq,2);
if(daysOld != 999999)
{
result += '<br><i>Resolved ' + lmurParseDaysAgo(daysOld) + '</i>';
}
result += '<br><small>(Data refreshed '+urAge+'s ago)</small>';
break;
}
}
}
}
if(result == '')
{
lmurPopup.style.visibility = 'hidden';
}
else if(lmurPopup.style.visibility == 'hidden')
{
lmurPopup.innerHTML = result;
var posX = mouseX;
var posY = mouseY;
var mapWidth = W.controller._mapView.map._size.x;
var mapHeight = W.controller._mapView.map._size.y;
if((posX + lmurPopup.clientWidth) > mapWidth) posX = mapWidth - lmurPopup.clientWidth;
if((posY + lmurPopup.clientHeight + 10) > mapHeight) posY = mapHeight - lmurPopup.clientHeight - 10;
else posY += 10;
lmurPopup.style.left = posX + 'px';
lmurPopup.style.top = posY + 'px';
lmurPopup.style.visibility = 'visible';
}
}
function lmurToggleDebug()
{
lmurShowDebugOutput = !lmurShowDebugOutput;
var dbgMode = "none";
if(lmurShowDebugOutput)
{
dbgMode = "inline";
}
document.getElementById('_lmurDebugMode').style.display = dbgMode;
}
function lmurUpdateHeader()
{
tHTML = '<img id="_minimax" align=left valign=middle src="';
if(lmurControlsHidden == false)
{
tHTML += lmurIcons[0];
}
else
{
tHTML += lmurIcons[1];
}
tHTML += '"/>';
tHTML += '<b><a href="'+lmurUpdateURL+'" target="_blank">LMUR</a></b> <label id="_lmurVersion">v'+lmurVersion+'</label>';
tHTML += '<label id="_lmurDebugMode">(dbg)</label>';
tHTML += ' <input type="checkbox" id="_cbEnableLMUR"';
if(lmurEnabled) tHTML += ' checked';
tHTML += '>Enabled</a>';
lmurHeader.innerHTML = tHTML;
var dbgMode = "none";
if(lmurShowDebugOutput)
{
dbgMode = "inline";
}
document.getElementById('_lmurDebugMode').style.display = dbgMode;
document.getElementById('_cbEnableLMUR').addEventListener("click", lmurCheckActivation, true);
document.getElementById('_lmurVersion').addEventListener("click", lmurToggleDebug, true);
}
function lmurShowHideURCtrls()
{
if(lmurURControlsMinimised == true)
{
lmurURControlsMinimised = false;
document.getElementById('lmurURCtrls').style.height = '100%';
document.getElementById('lmurURCtrls').style.overflow = 'visible';
document.getElementById('_minimaxURCtrls').src = lmurIcons[0];
}
else
{
lmurURControlsMinimised = true;
document.getElementById('lmurURCtrls').style.height = '0px';
document.getElementById('lmurURCtrls').style.overflow = 'hidden';
document.getElementById('_minimaxURCtrls').src = lmurIcons[1];
}
lmurInnerHeight = -1;
lmurShowControls();
}
function lmurShowHideMPCtrls()
{
if(lmurMPControlsMinimised == true)
{
lmurMPControlsMinimised = false;
document.getElementById('lmurMPCtrls').style.height = '100%';
document.getElementById('lmurMPCtrls').style.overflow = 'visible';
document.getElementById('_minimaxMPCtrls').src = lmurIcons[0];
}
else
{
lmurMPControlsMinimised = true;
document.getElementById('lmurMPCtrls').style.height = '0px';
document.getElementById('lmurMPCtrls').style.overflow = 'hidden';
document.getElementById('_minimaxMPCtrls').src = lmurIcons[1];
}
lmurInnerHeight = -1;
lmurShowControls();
}
function lmurShowHidePURCtrls()
{
if(lmurPURControlsMinimised == true)
{
lmurPURControlsMinimised = false;
document.getElementById('lmurPURCtrls').style.height = '100%';
document.getElementById('lmurPURCtrls').style.overflow = 'visible';
document.getElementById('_minimaxPURCtrls').src = lmurIcons[0];
}
else
{
lmurPURControlsMinimised = true;
document.getElementById('lmurPURCtrls').style.height = '0px';
document.getElementById('lmurPURCtrls').style.overflow = 'hidden';
document.getElementById('_minimaxPURCtrls').src = lmurIcons[1];
}
lmurInnerHeight = -1;
lmurShowControls();
}
function lmurShowHideOptions()
{
if(lmurOptionsMinimised == true)
{
lmurOptionsMinimised = false;
document.getElementById('lmurOptions').style.height = '100%';
document.getElementById('lmurOptions').style.overflow = 'visible';
document.getElementById('_minimaxLMURCtrls').src = lmurIcons[0];
}
else
{
lmurOptionsMinimised = true;
document.getElementById('lmurOptions').style.height = '0px';
document.getElementById('lmurOptions').style.overflow = 'hidden';
document.getElementById('_minimaxLMURCtrls').src = lmurIcons[1];
}
lmurInnerHeight = -1;
lmurShowControls();
}
function lmurShowControls()
{
lmurControlsHidden = false;
lmurUpdateHeader();
document.getElementById('_minimax').addEventListener('click', lmurHideControls, false);
if(window.innerHeight != lmurInnerHeight)
{
lmurInnerHeight = window.innerHeight;
var htop = document.getElementsByClassName('leaflet-top')[0].offsetTop + document.getElementById('lmurHeader').offsetTop + 10;
var hmax = window.innerHeight - htop - 100;
document.getElementById('lmurCtrls').style.height = 'auto';
document.getElementById('lmurCtrls').style.height = document.getElementById('lmurCtrls').clientHeight + 1 + 'px';
if(document.getElementById('lmurCtrls').clientHeight > hmax)
{
document.getElementById('lmurCtrls').style.height = hmax+'px';
}
lmurUIHeight = document.getElementById('lmurCtrls').style.height;
document.getElementById('lmurCtrls').scrollTop = 0;
}
else
{
document.getElementById('lmurCtrls').style.height = lmurUIHeight;
}
document.getElementById('lmurCtrls').style.overflow = 'auto';
}
function lmurHideControls()
{
lmurControlsHidden = true;
lmurUpdateHeader();
document.getElementById('_minimax').addEventListener('click', lmurShowControls, false);
document.getElementById('lmurCtrls').style.height = '0px';
document.getElementById('lmurCtrls').style.overflow = 'hidden';
}
function lmurFakeOnload()
{
if(document.getElementsByClassName("map-controls").length < 1) return;
lmurAddLog('onload');
if(document.getElementById('lmurUI') == undefined)
{
uiObj = document.getElementsByClassName("map-controls")[0];
uiObj.appendChild(lmurUI);
lmurUI.id = "lmurUI";
lmurUI.style.lineHeight = '16px';
lmurUI.style.overflow = 'hidden';
document.getElementById('lmurUI').addEventListener('mouseover', lmurMouseInUI, false);
document.getElementById('lmurUI').addEventListener('mouseout', lmurMouseOutUI, false);
}
if(lmurIsLoggedIn == false)
{
tHTML = '<b><a href="'+lmurUpdateURL+'" target="_blank">LMUR</a></b> v'+lmurVersion;
tHTML += ' - Please log-in to the Livemap server to enable LMUR operation.';
lmurUI.innerHTML = tHTML;
lmurUI.style.backgroundColor = '#FFAAAA';
}
else if(document.location.protocol == 'https:')
{
gmapObj = document.getElementById('map');
lmurWazeBits();
window.addEventListener("mousemove", lmurCheckOverMarker, false);
gmapObj.appendChild(lmurDiv);
gmapObj.appendChild(lmurPopup);
tHTML = '<div id="lmurHeader">';
tHTML += '</div>';
tHTML += '<div id="lmurCtrls">';
tHTML += '<div style="background-color: #DDFFDD; padding: 10px">';
tHTML += '<img id="_minimaxURCtrls" align=left valign=middle src="' + lmurIcons[0] + '"/><b>UR Filtering</b> <input type="checkbox" id="_cbShowURs" /><br>';
tHTML += '<div id="lmurURCtrls">';
tHTML += '<input type="radio" name="lmurShowURs" id="_radioShowURs"/>Show or ';
tHTML += '<input type="radio" name="lmurShowURs" id="_radioHideURs" checked/>hide';
tHTML += ' URs by type:<br>';
tHTML += '<div style="float: left; padding-left: 10px; padding-right: 10px;">';
tHTML += '<input type="checkbox" id="_cbURFilterIncorrectTurn">Incorrect turn</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterIncorrectAddress">Incorrect address</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterIncorrectRoute">Incorrect route</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterIncorrectJunction">Incorrect junction</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterWazeAuto">Waze Automatic</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterGeneralError">General error</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterTurnNotAllowed">Turn not allowed</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterUndefined">Undefined</input><br>';
tHTML += '</div>';
tHTML += '<div style="float: left; padding-left: 10px; padding-right: 10px;">';
tHTML += '<input type="checkbox" id="_cbURFilterMissingRoundabout">Missing roundabout</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterMissingBridgeOverpass">Missing bridge overpass</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterMissingExit">Missing exit</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterMissingRoad">Missing road</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterMissingLandmark">Missing landmark</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterWrongDrivingDirection">Wrong driving direction</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterBlockedRoad">Blocked Road</input><br>';
tHTML += '<br>';
tHTML += '</div>';
tHTML += '<div style="clear: both;"></div>';
tHTML += '<div style="float: left; padding-left: 10px; padding-right: 10px; background-color: #CCEECC">';
tHTML += '<i>Tagged URs</i><br>';
tHTML += '<input type="checkbox" id="_cbURFilterRoadworks">[ROADWORKS]</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterConstruction">[CONSTRUCTION]</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterNote">[NOTE]</input><br>';
tHTML += '</div>';
tHTML += '<div style="float: left; padding-left: 10px; padding-right: 10px; background-color: #CCEECC">';
tHTML += '<br>';
tHTML += '<input type="checkbox" id="_cbURFilterClosure">[CLOSURE]</input><br>';
tHTML += '<input type="checkbox" id="_cbURFilterEvent">[EVENT]</input><br>';
tHTML += ' ';
tHTML += '</div>';
tHTML += '<div style="clear: both;"></div>';
tHTML += '<br>';
tHTML += '<input type="checkbox" id="_cbUREnableResolvedFilter">Hide resolved URs</input><br>';
tHTML += '<input type="checkbox" id="_cbUREnableMinAgeFilter">Hide URs less than </input>';
tHTML += '<input type="number" min="1" size="3" style="width:50px;height:100%;" id="_inputURFilterMinDays"> days old<br>';
tHTML += '<input type="checkbox" id="_cbUREnableMaxAgeFilter">Hide URs more than </input>';
tHTML += '<input type="number" min="1" size="3" style="width:50px;height:100%;" id="_inputURFilterMaxDays"> days old<br>';
tHTML += '<br>';
tHTML += '<input type="checkbox" id="_cbURHideWithNoDescription">Hide or <input type="checkbox" id="_cbURShowWithNoDescription">show URs with no description<br>';
tHTML += '<input type="checkbox" id="_cbUREnableKeywordMustBePresent">Hide URs not including </input>';
tHTML += '<input type="text" style="line-height:14px;height:100%;margin-bottom:4px;" id="_textURKeywordPresent"> in their description<br>';
tHTML += '<input type="checkbox" id="_cbUREnableKeywordMustBeAbsent">Hide URs including </input>';
tHTML += '<input type="text" style="line-height:14px;height:100%;margin-bottom:4px;" id="_textURKeywordAbsent"> in their description<br>';
tHTML += '<input type="checkbox" id="_cbURCaseInsensitive">Case-insensitive matching</input>';
tHTML += '<br><br>Filter URs by comments:<br>';
tHTML += '<input type="checkbox" id="_cbURHideWithMyComments">Hide or <input type="checkbox" id="_cbURShowWithMyComments">show URs with comments from me<br>';
tHTML += '<input type="checkbox" id="_cbURHideLastCommentByMe">Hide or <input type="checkbox" id="_cbURShowLastCommentByMe">show URs last commented on by me<br>';
tHTML += '<input type="checkbox" id="_cbURHideLastCommentByReporter">Hide or <input type="checkbox" id="_cbURShowLastCommentByReporter">show URs last commented on by reporter<br>';
tHTML += '<input type="checkbox" id="_cbURHideWithLessThanComments">Hide or <input type="checkbox" id="_cbURShowWithLessThanComments">show with less than <input type="number" min="0" size="3" style="width:50px;height:100%;" id="_inputFilterMinComments"> comments<br>';
tHTML += '<input type="checkbox" id="_cbURHideFollowedURs">Hide or <input type="checkbox" id="_cbURShowFollowedURs">show URs I\'m following<br>';
tHTML += '<input type="checkbox" id="_cbURHideLastCommentAge">Hide or <input type="checkbox" id="_cbURShowLastCommentAge">show if last comment made less than <input type="number" min="0" size="3" style="width:50px;height:100%;" id="_inputFilterCommentAge"> days ago<br>';
tHTML += '<br><input type="checkbox" id="_cbEnablePlayMode">Show UR markers outside my editable area</input><br>';
tHTML += '</div>';
tHTML += '</div>';
tHTML += '<div style="background-color: #DDDDFF; padding: 10px">';
tHTML += '<img id="_minimaxMPCtrls" align=left valign=middle src="' + lmurIcons[0] + '"/><b>MP Filtering</b> <input type="checkbox" id="_cbShowProblems" /><br>';
tHTML += '<div id="lmurMPCtrls">';
tHTML += '<input type="radio" name="lmurShowProblems" id="_radioShowProblems"/>Show or ';
tHTML += '<input type="radio" name="lmurShowProblems" id="_radioHideProblems" checked/>hide';
tHTML += ' map problems by type:<br>';
tHTML += '<div style="float: left; padding-left: 10px; padding-right: 10px;">';
tHTML += '<input type="checkbox" id="_cbMPFilterMissingJunction">Missing junction</input><br>';
tHTML += '<input type="checkbox" id="_cbMPFilterMissingRoad">Missing road</input><br>';
tHTML += '<input type="checkbox" id="_cbMPFilterCrossroadsJunctionMissing">Missing crossroads</input><br>';
tHTML += '</div>';
tHTML += '<div style="float: left; padding-left: 10px; padding-right: 10px;">';
tHTML += '<input type="checkbox" id="_cbMPFilterDrivingDirectionMismatch">Driving direction mismatch</input><br>';
tHTML += '<input type="checkbox" id="_cbMPFilterRoadTypeMismatch">Road type mismatch</input><br>';
tHTML += '</div>';
tHTML += '<div style="float: left; padding-left: 10px; padding-right: 10px;">';
tHTML += '<input type="checkbox" id="_cbMPFilterRestrictedTurn">Restricted turn might be allowed</input><br>';
tHTML += '<input type="checkbox" id="_cbMPFilterUnknownProblem">Unknown problem type</input><br>';
tHTML += '</div>';
tHTML += '<div style="clear: both;"></div>';
tHTML += '<br>';
tHTML += '<input type="checkbox" id="_cbMPEnableResolvedFilter">Hide resolved Problems</input><br>';
tHTML += '<br>';
tHTML += 'Hide problems by severity:<br>';
tHTML += '<input type="checkbox" id="_cbMPFilterLowSeverity">Low</input> ';
tHTML += '<input type="checkbox" id="_cbMPFilterMediumSeverity">Medium</input> ';
tHTML += '<input type="checkbox" id="_cbMPFilterHighSeverity">High</input><br>';
tHTML += '<br>';
tHTML += '<input type="checkbox" id="_cbShowTurnProbs">Show Turn Problems</input><br>';
tHTML += '<input type="checkbox" id="_cbTPEnableResolvedFilter">Hide resolved Turn Problems</input>';
tHTML += '</div>';
tHTML += '</div>';
tHTML += '<div style="background-color: #FFDDDD; padding: 10px">';
tHTML += '<img id="_minimaxPURCtrls" align=left valign=middle src="' + lmurIcons[0] + '"/><b>PUR Filtering</b> <input type="checkbox" id="_cbShowPlaceUpdates" /><br>';
tHTML += '<div id="lmurPURCtrls">';
tHTML += '<input type="radio" name="lmurShowPURs" id="_radioShowPURs"/>Show or ';
tHTML += '<input type="radio" name="lmurShowPURs" id="_radioHidePURs" checked/>hide';
tHTML += ' PURs by type:<br>';
tHTML += '<div style="float: left; padding-left: 10px; padding-right: 10px;">';
tHTML += '<input type="checkbox" id="_cbPURFilterNewPlace">New place</input><br>';
tHTML += '<input type="checkbox" id="_cbPURFilterUpdateDetails">Updated details</input><br>';
tHTML += '<input type="checkbox" id="_cbPURFilterNewPhoto">New photo</input><br>';
tHTML += '<input type="checkbox" id="_cbPURFilterFlagged">Flagged for attention</input><br>';
tHTML += '<input type="checkbox" id="_cbPURNonZeroLockRank">Non-zero lockRank</input><br>';
tHTML += '</div>';
tHTML += '<div style="clear: both;"></div>';
tHTML += '</div>';
tHTML += '</div>';
tHTML += '<div style="background-color: #EEEEEE; padding: 10px">';
tHTML += '<img id="_minimaxLMURCtrls" align=left valign=middle src="' + lmurIcons[0] + '"/><b>Options</b><br>';
tHTML += '<div id="lmurOptions">';
tHTML += 'Select Server: <input type="radio" name="lmurSelectServer" id="_radioAutoServer" checked/>Auto ';
tHTML += '<input type="radio" name="lmurSelectServer" id="_radioROWServer"/>RoW ';
tHTML += '<input type="radio" name="lmurSelectServer" id="_radioUSAServer"/>USA ';
tHTML += '<input type="radio" name="lmurSelectServer" id="_radioIsraelServer"/>Israel<br>';
tHTML += '<input type="checkbox" id="_cbHideNativeMarkers">Hide Livemap markers</input><br>';
tHTML += 'Removed cached blocks after <input type="number" min="0" size="1440" style="width:50px;height:100%;" id="_inputCacheDecayPeriod"> minutes<br>';
tHTML += '<i>(Range is 0-1440 minutes, 0 = never remove)</i>';
tHTML += '</div>';
tHTML += '<div style="clear: both;"></div>';
tHTML += '</div>';
tHTML += '</div>';
tHTML += '</div>';
lmurUI.innerHTML = tHTML;
lmurUI.style.backgroundColor = '#FFFFFF';
lmurHideControls();
lmurShowHideURCtrls();
lmurShowHideMPCtrls();
lmurShowHidePURCtrls();
lmurShowHideOptions();
document.getElementById('lmurUI').addEventListener("click", lmurCheckActivation, true);
document.getElementById('_inputCacheDecayPeriod').addEventListener("change", lmurChangeDecayPeriod, true);
document.getElementById('_radioAutoServer').addEventListener("click", lmurChangeServer, true);
document.getElementById('_radioROWServer').addEventListener("click", lmurChangeServer, true);
document.getElementById('_radioUSAServer').addEventListener("click", lmurChangeServer, true);
document.getElementById('_radioIsraelServer').addEventListener("click", lmurChangeServer, true);
document.getElementById('_minimaxURCtrls').addEventListener("click", lmurShowHideURCtrls, true);
document.getElementById('_minimaxMPCtrls').addEventListener("click", lmurShowHideMPCtrls, true);
document.getElementById('_minimaxPURCtrls').addEventListener("click", lmurShowHidePURCtrls, true);
document.getElementById('_minimaxLMURCtrls').addEventListener("click", lmurShowHideOptions, true);
lmurPrevCentre = W.controller._mapView.map.getCenter();
lmurPopup.style.visibility = 'hidden';
lmurLoadSettings();
lmurCheckActivation();
}
else
{
tHTML = '<b><a href="'+lmurUpdateURL+'" target="_blank">LMUR</a></b> v'+lmurVersion;
tHTML += ' - requires a HTTPS connection, please click ';
tHTML += '<a href="https://' + document.location.host + document.location.pathname + '">here</a> to switch';
lmurUI.innerHTML = tHTML;
lmurUI.style.backgroundColor = '#FFAAAA';
}
lmurDoOnload = false;
lmurAddLog('onload complete');
}
function lmurHeartbeat()
{
var oldLoginState = lmurIsLoggedIn;
var revisualise = false;
lmurIsLoggedIn = (document.getElementsByClassName('logged-in-user')[0].innerHTML != '');
if(oldLoginState != lmurIsLoggedIn)
{
if(!lmurIsLoggedIn)
{
// temporarily reinstate lmurIsLoggedIn so that lmurSaveSettings() won't just return as soon as it's called...
lmurIsLoggedIn = true;
lmurSaveSettings();
lmurIsLoggedIn = false;
}
lmurDoOnload = true;
revisualise = true;
}
if(lmurIsLoggedIn)
{
if(lmurUserID == undefined)
{
lmurUserID = W.userService.getCurrent().id;
if(lmurUserID != undefined)
{
lmurAddLog('user has logged-in, ID: '+lmurUserID);
}
}
}
else
{
if(lmurUserID != undefined)
{
lmurAddLog('user has logged-out');
lmurUserID = undefined;
}
}
// reload UI if it gets nuked by Livemap when the user closes the route options window
if(document.getElementById("lmurUI") == null)
{
lmurDoOnload = true;
}
if(lmurDoOnload == true)
{
lmurFakeOnload();
if(revisualise == true)
{
lmurAddLog('re-visualising after login state change');
lmurNoForcedRefreshThisCycle = false;
lmurVisualiseMarkers();
}
}
else
{
if(lmurInhibitNudgeDetection == false)
{
nowCentre = W.controller._mapView.map.getCenter();
var nowLat = Math.floor(nowCentre.lat / lmurSquareSize);
var nowLng = Math.floor(nowCentre.lng / lmurSquareSize);
var prevLat = Math.floor(lmurPrevCentre.lat / lmurSquareSize);
var prevLng = Math.floor(lmurPrevCentre.lng / lmurSquareSize);
if((nowCentre.lat != lmurPrevCentre.lat) || (nowCentre.lng != lmurPrevCentre.lng))
{
lmurAddLog('re-visualising after map nudge');
lmurPrevCentre = nowCentre;
lmurNoForcedRefreshThisCycle = false;
lmurUpdateRequestQueue();
lmurVisualiseMarkers();
}
}
}
setTimeout(lmurHeartbeat,100);
}
function lmurDecayCache()
{
if(lmurInhibitNudgeDetection) return;
if(lmurNoForcedRefreshThisCycle == true)
{
lmurVisualiseMarkers();
}
else
{
lmurAddLog('auto cache decay blocked by manual cache reload');
}
lmurNoForcedRefreshThisCycle = true;
}
function lmurWazeBits()
{
W = unsafeWindow.W;
L = unsafeWindow.L;
}
function lmurInitialise()
{
lmurGlobals();
lmurResetCaches();
lmurAddLog('initialisation');
lmurDiv.id = 'lmurDiv';
lmurDiv.style.position = 'absolute';
lmurDiv.style.top = '0';
lmurDiv.style.left = '0';
lmurDiv.style.zIndex = 6;
lmurDiv.style.pointerEvents = 'none';
lmurPopup.id = 'lmurPopup';
lmurPopup.style.position = 'absolute';
lmurPopup.style.top = '0';
lmurPopup.style.left = '0';
lmurPopup.style.zIndex = 6;
lmurPopup.style.pointerEvents = 'none';
lmurPopup.style.backgroundColor = 'aliceblue';
lmurPopup.style.border = '1px solid blue';
lmurPopup.style.boxShadow = '5px 5px 10px Silver';
lmurPopup.style.padding = '4px';
window.addEventListener("beforeunload", lmurSaveSettings, false);
setTimeout(lmurHeartbeat,2000);
setTimeout(lmurGetMarkers,2500);
setInterval(lmurDecayCache,30000);
}
lmurBootstrap();