您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds filtering and pop-up infobox for UR, MP and camera markers
当前为
// ==UserScript== // @name UROverview Plus (URO+) // @namespace http://greasemonkey.chizzum.com // @description Adds filtering and pop-up infobox for UR, MP and camera markers // @include https://*.waze.com/*editor* // @include https://editor-beta.waze.com/* // @grant none // @version 3.13 // ==/UserScript== function uroGlobals() { uroVersion = "3.13"; uroCtrlsHidden = false; uroCurrentTab = 1; uroFID = -1; uroShownFID = -1; uroInhibitSave = true; uroPopupTimer = -2; uroPopupShown = false; uroSetupListeners = true; uroRootContainer = null; uroURvroot = null; uroMPvroot = null; uroMaskLayer = null; uroCamLayer = null; uroCustomMarkerFID = null; uroCamvroot = null; uroURLayerIdx = null; uroProblemLayerIdx = null; uroMouseInPopup = false; uroURControlsIdx = null; uroProblemControlsIdx = null; uroMaskActive = false; uroAMLayerIdx = null; uroNullCamLayer = false; uroNullOpenLayers = false; uroNullRootContainer = false; uroNullURLayer = false; uroNullProblemLayer = false; uroNullMapViewport = false; uroUserID = -1; uroURSCurrentCount = 0; uroURSPrevCount = 0; uroBetaEditor = false; uroWazeBitsPresent = 0; uroCamWatchObjects = new Array(); uroCWLGroups = new Array(); uroAMPosX = null; uroAMPosY = null; dteControlsIdx = -1; dteOldestFullDrive = new Date(0); dteEpoch = new Date(0); uroUserTabId = ''; // uroIcons // 0 = group collapse/group expand // 1 = addtogroup active/addtogroup idle // 2 = goto active/goto idle // 3 = normal/selected roadworks UR // 4 = normal/selected closure UR // 5 = normal/selected event UR uroIcons = [ ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB94CAhYRIqo78SIAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAADtJREFUKM9j/P//PwNJgCQN////ZyFeGyMjIwMDAxMDiWAQamDB9Bb+kKTMBmICdxgFK64AxZKiSE3eAAOXFRnJRfN6AAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB94CAhYRDHbt/O0AAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAAE5JREFUKM+9UkEKACAMcmP//7IdgghqMQvytoOKTiMJCRKBZNRpZgbAIcIzsa5XJcgOB8Qaaz3nSt4chlLX3nb9OXRlL7cO2V83I1Dn3QDKfhshMqWScAAAAABJRU5ErkJggg=="], ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB94BGhYVKhKBubQAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAAEZJREFUOMtjYBjygBHB/P8fjzJGIszCZQA+gxkYWIjTABPDdAkL8U7G7hIcYcDISEGYwDQSFyZM5AQckYA4F7CQZ8goQAYAMCsd/TxbqrwAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB94DAw0tDee2t8AAAABPSURBVDjL7ZAxCgAgDAMT6cP6dH+mUwfBaugmeFMpbTgCPA9j6H2M7MidvCZlAadgADDlIXY7E1OVM5NtB+5kuZN4VDtpleIkVAOrhHxWJoJkNv2QAd51AAAAAElFTkSuQmCC"], ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB94BGhYfLAEN9AsAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAAGdJREFUOMutk+EKACEIg7fD93/l3Y+uP5kmeYMgkH0NTUpCRw+acgBynHaCKsgBlpaIhDJQtQchaAtIBuNAlAQSV7OUwPYYGX2kL6Zi37hYYk6NU1ZPui/Y4XWeVsWSDpdkt8bftvEFOy0jJkeygWMAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB94DAw0tFm3TfiwAAABySURBVDjLrZNRDsAgCEPp4r306HKy7sMsMRMckZH4ZfqoYEFSMnVJshYAME7aQRS0AOaR9C5UFe5AoRnsQCbAW4wFAklRlaNd1ipIrxHeRwKGZeuuNcEjK554J5x7lohNS+g+4d39Kyqug2jGyqnwtzTengM2Gxwa0GsAAAAASUVORK5CYII="], ["data:image/png;base64,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","data:image/png;base64,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"], ["data:image/png;base64,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","data:image/png;base64,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"], ["data:image/png;base64,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","data:image/png;base64,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"] ]; } function uroBootstrap() { 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! */ uroInitialise(); } function uroAddLog(logtext) { console.log('URO+: '+logtext); } function uroGatherSettings(container) { var options = ''; var urOptions = document.getElementById(container).getElementsByTagName('input'); for (var optIdx=0;optIdx<urOptions.length;optIdx++) { var id = urOptions[optIdx].id; if((id.indexOf('_cb') == 0)||(id.indexOf('_text') == 0)||(id.indexOf('_input') == 0)) { options += ':' + id; if(urOptions[optIdx].type == 'checkbox') options += ',' + urOptions[optIdx].checked.toString(); else if((urOptions[optIdx].type == 'text')||(urOptions[optIdx].type == 'number')) options += ',' + urOptions[optIdx].value.toString(); } } return options; } function uroGatherCamWatchList() { var liststr = ''; for(var loop=0;loop<uroCamWatchObjects.length;loop++) { camObj = uroCamWatchObjects[loop]; if((camObj.fid != undefined) && (camObj.persistent == true)) { if(loop > 0) liststr += ':'; liststr += camObj.fid+','; liststr += camObj.watchLon+','; liststr += camObj.watchLat+','; liststr += camObj.watchType+','; liststr += camObj.watchAzymuth+','; liststr += camObj.watchSpeed+','; liststr += camObj.watchValidated+','; liststr += camObj.groupID+','; liststr += camObj.server; } } return liststr; } function uroGatherCWLGroups() { var liststr = ''; for(var loop=0;loop<uroCWLGroups.length;loop++) { groupObj = uroCWLGroups[loop]; if(groupObj.groupID != -1) { if(loop > 0) liststr += ':'; liststr += groupObj.groupID+','; liststr += groupObj.groupName+','; liststr += groupObj.groupCollapsed; } } return liststr; } function uroSaveSettings() { if(uroInhibitSave) return; if (localStorage) { localStorage.UROverviewUROptions = uroGatherSettings('uroCtrlURs'); localStorage.UROverviewMPOptions = uroGatherSettings('uroCtrlMPs'); localStorage.UROverviewCameraOptions = uroGatherSettings('uroCtrlCameras'); localStorage.UROverviewMiscOptions = uroGatherSettings('uroCtrlMisc'); localStorage.UROverviewCamWatchList = uroGatherCamWatchList(); localStorage.UROverviewCWLGroups = uroGatherCWLGroups(); } } function uroApplySettings(settings) { var options = settings.split(':'); for(var optIdx=0;optIdx<options.length;optIdx++) { var fields = options[optIdx].split(','); if(fields[0].indexOf('_cb') == 0) { if(document.getElementById(fields[0]) != null) document.getElementById(fields[0]).checked = (fields[1] == 'true'); } else if((fields[0].indexOf('_input') == 0)||(fields[0].indexOf('_text') == 0)) { if(document.getElementById(fields[0]) != null) document.getElementById(fields[0]).value = fields[1]; } } } function uroApplyCamWatchList() { var objects = localStorage.UROverviewCamWatchList.split(':'); uroCamWatchObjects = new Array(); for(var objIdx=0;objIdx<objects.length;objIdx++) { var fields = objects[objIdx].split(','); // following two bits of code add in blank fields if the user has updated their copy of URO+ from an // older version which didn't include support for either of these field types // add default groupID field if(fields.length == 7) { fields.push(0); } // set default groupID value to 0 (no group) if(fields[7] == -1) { fields[7] = 0; } // add default server field if(fields.length == 8) { fields.push('??'); } // set default server value to unknown if(fields[8] == 0) { fields[8] = '??'; } uroCamWatchObjects.push(new uroCamWatchObj(true,fields[0],fields[1],fields[2],fields[3],fields[4],fields[5],fields[6],fields[7],fields[8])); } } function uroApplyCWLGroups() { var objects = localStorage.UROverviewCWLGroups.split(':'); uroCWLGroups = new Array(); for(var objIdx=0;objIdx<objects.length;objIdx++) { var fields = objects[objIdx].split(','); if(fields.length < 2) { fields.push(false); } uroCWLGroups.push(new uroCWLGroupObj(fields[0],fields[1],(fields[2] == 'true'))); } } function uroLoadSettings() { uroAddLog('loadSettings()'); if (localStorage.UROverviewUROptions) { uroAddLog('recover UR tab settings'); uroApplySettings(localStorage.UROverviewUROptions); } if (localStorage.UROverviewCameraOptions) { uroAddLog('recover camera tab settings'); uroApplySettings(localStorage.UROverviewCameraOptions); } if (localStorage.UROverviewMPOptions) { uroAddLog('recover MP tab settings'); uroApplySettings(localStorage.UROverviewMPOptions); } if (localStorage.UROverviewMiscOptions) { uroAddLog('recover misc tab settings'); uroApplySettings(localStorage.UROverviewMiscOptions); } if(localStorage.UROverviewCWLGroups) { uroAddLog('recover CWL groups'); uroApplyCWLGroups(); } else { uroAddLog('set default CWL group'); uroCWLGroups.push(new uroCWLGroupObj(0,'No group',false)); } if(localStorage.UROverviewCamWatchList) { uroAddLog('recover camera watchlist'); uroApplyCamWatchList(); uroGetCurrentCamWatchListObjects(); } uroInhibitSave = false; } function uroSettingsToText() { var txtSettings = ''; uroSaveSettings(); if (localStorage.UROverviewUROptions) { txtSettings += '[UROverviewUROptions][len=' + localStorage.UROverviewUROptions.length + ']' + localStorage.UROverviewUROptions + '[END]'; } if (localStorage.UROverviewCameraOptions) { txtSettings += '[UROverviewCameraOptions][len=' + localStorage.UROverviewCameraOptions.length + ']' + localStorage.UROverviewCameraOptions + '[END]'; } if (localStorage.UROverviewMPOptions) { txtSettings += '[UROverviewMPOptions][len=' + localStorage.UROverviewMPOptions.length + ']' + localStorage.UROverviewMPOptions + '[END]'; } if (localStorage.UROverviewMiscOptions) { txtSettings += '[UROverviewMiscOptions][len=' + localStorage.UROverviewMiscOptions.length + ']' + localStorage.UROverviewMiscOptions + '[END]'; } if (localStorage.UROverviewCamWatchList) { txtSettings += '[UROverviewCamWatchList][len=' + localStorage.UROverviewCamWatchList.length + ']' + localStorage.UROverviewCamWatchList + '[END]'; } if (localStorage.UROverviewCWLGroups) { txtSettings += '[UROverviewCWLGroups][len=' + localStorage.UROverviewCWLGroups.length + ']' + localStorage.UROverviewCWLGroups + '[END]'; } document.getElementById('_txtSettings').value = txtSettings; document.getElementById('_txtSettings').focus(); document.getElementById('_txtSettings').select(); } function uroTextToSettings() { var txtSettings = ''; txtSettings = document.getElementById('_txtSettings').value; if(txtSettings.indexOf('[END]') == -1) return; var subText = txtSettings.split('[END]'); for(var i=0;i<subText.length;i++) { var bPos = subText[i].indexOf(']'); if(bPos != -1) { var settingID = subText[i].substr(1,bPos-1); subText[i] = subText[i].substr(bPos+1); bPos = subText[i].indexOf(']'); if(bPos != -1) { var settingLength = subText[i].substr(5,bPos-5); subText[i] = subText[i].substr(bPos+1); if(subText[i].length == settingLength) { if(settingID == 'UROverviewCamWatchList') localStorage.UROverviewCamWatchList = subText[i]; if(settingID == 'UROverviewCWLGroups') localStorage.UROverviewCWLGroups = subText[i]; if(settingID == 'UROverviewUROptions') localStorage.UROverviewUROptions = subText[i]; if(settingID == 'UROverviewCameraOptions') localStorage.UROverviewCameraOptions = subText[i]; if(settingID == 'UROverviewMPOptions') localStorage.UROverviewMPOptions = subText[i]; if(settingID == 'UROverviewMiscOptions') localStorage.UROverviewMiscOptions = subText[i]; } } } } uroLoadSettings(); } function uroClearSettingsText() { document.getElementById('_txtSettings').value = ''; } function uroDateToDays(dateToConvert, ticksPerDay) { var dateNow = new Date(); return Math.floor((dateNow.getTime() - dateToConvert) / 86400000); } function uroGetURAge(urObj,ageType) { if(ageType == 0) { if((urObj.attributes.driveDate == null)||(urObj.attributes.driveDate == 0)) return -1; return uroDateToDays(urObj.attributes.driveDate, urObj.ONE_DAY); } else { if((urObj.attributes.resolvedOn == null)||(urObj.attributes.resolvedOn == 0)) return -1; return uroDateToDays(urObj.attributes.resolvedOn, 86400000); } } function uroGetCameraAge(camObj, mode) { if(mode == 0) { if(camObj.attributes.updatedOn == null) return -1; return uroDateToDays(camObj.attributes.updatedOn, 86400000); } if(mode == 1) { if(camObj.attributes.createdOn == null) return -1; return uroDateToDays(camObj.attributes.createdOn, 86400000); } } function uroGetCommentAge(commentObj) { if(commentObj.createdOn == null) return -1; return uroDateToDays(commentObj.createdOn, 86400000); } function uroParseDaysAgo(days) { if(days == 0) return 'today'; else if(days == 1) return '1 day ago'; else return days+' days ago'; } function uroIsCameraSpeedValid(camObj) { // returns 1 if the entered speed converts correctly into a multiple of 10MPH // returns -1 if the entered speed does not convert correctly // returns 0 if no speed data is present, or if the entered speed is 0 if(camObj.attributes.speed != null) { var speed = Math.round(camObj.attributes.speed /1.609); if(speed == 0) return 0; else if(speed % 10 == 0) return 1; else return -1; } else return 0; } function uroTypeCast(varin) { if(varin == "null") return null; if(typeof varin == "string") return parseInt(varin); return varin; } function uroCWLGroupObj(groupID, groupName, groupCollapsed) { groupID = uroTypeCast(groupID); this.groupID = groupID; this.groupName = groupName; this.groupCount = 0; this.groupCollapsed = groupCollapsed; } function uroCamWatchObj(persistent, fid, lon, lat, type, azymuth, speed, validated, groupID, server) { fid = uroTypeCast(fid); lon = uroTruncate(uroTypeCast(lon)); lat = uroTruncate(uroTypeCast(lat)); type = uroTypeCast(type); azymuth = uroTruncate(uroTypeCast(azymuth)%360); speed = uroTruncate(uroTypeCast(speed)); groupID = uroTypeCast(groupID); if(typeof validated == "string") validated = (validated == "true"); if(typeof persistent == "string") persistent = (persistent == "true"); this.fid = fid; this.persistent = persistent; this.loaded = false; this.watchType = type; this.watchAzymuth = azymuth; this.watchSpeed = speed; this.watchValidated = validated; this.watchLat = lat; this.watchLon = lon; this.groupID = groupID; this.currentType = null; this.currentAzymuth = null; this.currentSpeed = null; this.currentValidated = null; this.currentLat = null; this.currentLon = null; this.server = server; } function uroCamDataChanged(camidx) { camObj = uroCamWatchObjects[camidx]; if(camObj.loaded == false) return false; if(camObj.currentType != camObj.watchType) return true; if(camObj.currentAzymuth != camObj.watchAzymuth) return true; if(camObj.currentSpeed != camObj.watchSpeed) return true; if(camObj.currentValidated != camObj.watchValidated) return true; if(camObj.currentLat != camObj.watchLat) return true; if(camObj.currentLon != camObj.watchLon) return true; return false; } function uroAddCurrentCamWatchData(idx, lat, lon, type, azymuth, speed, validated, server) { camObj = uroCamWatchObjects[idx]; camObj.loaded = true; camObj.currentType = type; camObj.currentAzymuth = uroTruncate(azymuth%360); camObj.currentSpeed = uroTruncate(speed); camObj.currentValidated = validated; camObj.currentLat = uroTruncate(lat); camObj.currentLon = uroTruncate(lon); camObj.server = server; return(uroCamDataChanged(idx)); } function uroIsCamOnWatchList(fid) { for(var loop=0;loop<uroCamWatchObjects.length;loop++) { if(uroCamWatchObjects[loop].fid == fid) return loop; } return -1; } function uroAddCamToWatchList() { if(uroIsCamOnWatchList(uroShownFID) == -1) { camObj = wazeModel.cameras.objects[uroShownFID]; uroCamWatchObjects.push(new uroCamWatchObj(true, uroShownFID, camObj.geometry.x, camObj.geometry.y, camObj.attributes.type, camObj.attributes.azymuth, camObj.attributes.speed, camObj.attributes.validated, 0, W.location.code)); uroAddCurrentCamWatchData(uroCamWatchObjects.length-1, camObj.geometry.y, camObj.geometry.x, camObj.attributes.type, camObj.attributes.azymuth, camObj.attributes.speed, camObj.attributes.validated, W.location.code); uroAddLog('added camera '+uroShownFID+' to watchlist'); uroCWLUpdateHTML(); } } function uroRemoveCamFromWatchList() { camidx = uroIsCamOnWatchList(uroShownFID); if(camidx != -1) { uroCamWatchObjects.splice(camidx,1); uroAddLog('removed camera '+uroShownFID+' from watchlist'); uroCWLUpdateHTML(); } } function uroUpdateCamWatchList() { var camIdx = uroIsCamOnWatchList(uroShownFID); if(camIdx != -1) { var camObj = wazeModel.cameras.objects[uroShownFID]; uroCamWatchObjects[camIdx].lon = camObj.geometry.x; uroCamWatchObjects[camIdx].lat = camObj.geometry.y; uroCamWatchObjects[camIdx].azymuth = camObj.attributes.azymuth; uroCamWatchObjects[camIdx].speed = camObj.attributes.speed; uroCamWatchObjects[camIdx].validated = camObj.attributes.validated; } } function uroClearCamWatchList() { if(confirm('Removing all cameras from the CWL cannot be undone\nAre you sure you want to do this?') == true) { uroCamWatchObjects = new Array(); uroCWLUpdateHTML(); } } function uroTruncate(val) { if(val == null) return val; if(val < 0) return Math.ceil(val); return Math.floor(val); } function uroRetrieveCameras(lat, lon) { var camPos = new OpenLayers.LonLat(); var camChanged = false; camPos.lon = lon; camPos.lat = lat; camPos.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326")); var camURL = 'https://' + document.location.host; camURL += Waze.Config.api_base; camURL += '/Features?language=en&cameras=true&bbox='; var latl = camPos.lat - 0.25; var latu = camPos.lat + 0.25; var lonl = camPos.lon - 0.25; var lonr = camPos.lon + 0.25; camURL += lonl+','+latl+','+lonr+','+latu; uroAddLog('retrieving camera data around '+camPos.lon+','+camPos.lat); camReq = new XMLHttpRequest(); camReq.open('GET',camURL,false); try { camReq.send(); uroAddLog('response '+camReq.status+' received'); if (camReq.status === 200) { camData = JSON.parse(camReq.responseText); for(var camIdx = 0; camIdx < camData.cameras.objects.length; camIdx++) { camObj = camData.cameras.objects[camIdx]; var listIdx = uroIsCamOnWatchList(camObj.id); if(listIdx != -1) { camPos.lon = camObj.geometry.coordinates[0]; camPos.lat = camObj.geometry.coordinates[1]; camPos.transform(new OpenLayers.Projection("EPSG:4326"),new OpenLayers.Projection("EPSG:900913")); camPos.lon = uroTruncate(camPos.lon); camPos.lat = uroTruncate(camPos.lat); camChanged |= uroAddCurrentCamWatchData(listIdx, camPos.lat, camPos.lon, camObj.type, camObj.azymuth, camObj.speed, camObj.validated, W.location.code); } else if(camObj.validated == false) { } } } else { uroAddLog('request failed (status != 200)'); } } catch(err) { uroAddLog('camera load request failed (exception '+err+' caught)'); } return camChanged; } function uroGetCurrentCamWatchListObjects() { var camChanged = false; var camsChanged = new Array(); var camsDeleted = new Array(); for(var camidx=0;camidx<uroCamWatchObjects.length;camidx++) { camObj = uroCamWatchObjects[camidx]; if((camObj.loaded == false) && ((camObj.server == W.location.code) || (camObj.server == '??'))) { if(typeof wazeModel.cameras.objects[camObj.fid] == 'object') { if(wazeModel.cameras.objects[camObj.fid].state != "Delete") { wazeObj = wazeModel.cameras.objects[camObj.fid]; camChanged |= uroAddCurrentCamWatchData(camidx, wazeObj.geometry.y, wazeObj.geometry.x, wazeObj.attributes.type, wazeObj.attributes.azymuth, wazeObj.attributes.speed, wazeObj.attributes.validated); } else { camChanged |= uroRetrieveCameras(camObj.watchLat, camObj.watchLon); } } else { camChanged |= uroRetrieveCameras(camObj.watchLat, camObj.watchLon); } } } if(camChanged) { for(var camidx=0;camidx<uroCamWatchObjects.length;camidx++) { if(uroCamDataChanged(camidx)) { camsChanged.push(uroCamWatchObjects[camidx]); } } } for(var camidx=0;camidx<uroCamWatchObjects.length;camidx++) { camObj = uroCamWatchObjects[camidx]; if((camObj.loaded == false) && (camObj.server == W.location.code)) { camsDeleted.push(camObj); } } if((camsChanged.length > 0) || (camsDeleted.length > 0)) { var alertStr = 'Camera WatchList Alert!!!\r\n'; for(var camidx=0;camidx<camsChanged.length;camidx++) { alertStr += 'Camera ID '+camsChanged[camidx].fid+' in group "'+uroFindCWLGroupByIdx(camsChanged[camidx].groupID)+'" has been changed\r\n'; } for(var camidx=0;camidx<camsDeleted.length;camidx++) { alertStr += 'Camera ID '+camsDeleted[camidx].fid+' in group "'+uroFindCWLGroupByIdx(camsDeleted[camidx].groupID)+'" has been deleted\r\n'; } alert(alertStr); } } function uroClearDeletedCameras() { for(var camidx=uroCamWatchObjects.length-1;camidx>=0;camidx--) { if(uroCamWatchObjects[camidx].loaded == false) { uroShownFID = uroCamWatchObjects[camidx].fid; uroRemoveCamFromWatchList(); } } } function uroRescanCamWatchList() { for(var camidx=0;camidx<uroCamWatchObjects.length;camidx++) { uroCamWatchObjects[camidx].loaded = false; } uroGetCurrentCamWatchListObjects(); uroCWLUpdateHTML(); } function uroGotoCam() { var camidx = this.id.substr(13); var camPos = new OpenLayers.LonLat(); camPos.lon = uroCamWatchObjects[camidx].watchLon; camPos.lat = uroCamWatchObjects[camidx].watchLat; wazeMap.setCenter(camPos,4); wazeMap.layers[uroCamLayer].setVisibility(true); return false; } function uroSetCamGroup() { var camidx = this.id.substr(13); return false; } function uroHighlightCWLEntry() { this.style.backgroundColor = '#FFFFAA'; return false; } function uroUnhighlightCWLEntry() { var camidx = this.id.substr(8); var changed = uroCamDataChanged(camidx); var deleted = (uroCamWatchObjects[camidx].loaded == false); if(uroCamWatchObjects[camidx].server != W.location.code) this.style.backgroundColor = '#A0A0A0'; else if(changed) this.style.backgroundColor = '#AAAAFF'; else if(deleted) this.style.backgroundColor = '#FFAAAA'; else this.style.backgroundColor = '#FFFFFF'; return false; } function uroCWLIconHighlight() { iconType = this.id.substr(11,1); this.src = uroIcons[iconType][0]; return false; } function uroCWLIconLowlight() { iconType = this.id.substr(11,1); this.src = uroIcons[iconType][1]; return false; } function uroRemoveFromCWL() { uroShownFID = uroCamWatchObjects[this.id.substr(18)].fid; uroRemoveCamFromWatchList(); } function uroSetCamGroups() { for(var camidx=0;camidx<uroCamWatchObjects.length;camidx++) { camObj = uroCamWatchObjects[camidx]; camGroup = parseInt(document.getElementById("_uroGroupSelect-"+camidx).value); camObj.groupID = camGroup; } } function uroPopulateCWLGroupSelect() { selector = document.getElementById('_uroCWLGroupSelect'); while(selector.options.length > 0) { selector.options.remove(0); } for(var loop=0;loop<uroCWLGroups.length;loop++) { groupObj = uroCWLGroups[loop]; if(groupObj.groupID != -1) { selector.options.add(new Option(groupObj.groupName,groupObj.groupID)); } } } function uroGetNextCWLGroupID() { var nextID = 1; for(var loop=0;loop<uroCWLGroups.length;loop++) { if(uroCWLGroups[loop].groupID >= nextID) { nextID = uroCWLGroups[loop].groupID + 1; } } return nextID; } function uroFindCWLGroupByName(groupName) { var groupID = -1; for(var loop=0;loop<uroCWLGroups.length;loop++) { if((uroCWLGroups[loop].groupName == groupName) && (uroCWLGroups[loop].groupID != -1)) { groupID = uroCWLGroups[loop].groupID; break; } } return groupID; } function uroFindCWLGroupByIdx(groupIdx) { var groupName = ''; for(var loop=0;loop<uroCWLGroups.length;loop++) { if(uroCWLGroups[loop].groupID == groupIdx) { groupName = uroCWLGroups[loop].groupName; break; } } return groupName; } function uroAddCWLGroup() { var groupID = uroGetNextCWLGroupID(); var groupName = document.getElementById('_uroCWLGroupEntry').value; if(uroFindCWLGroupByName(groupName) == -1) { uroCWLGroups.push(new uroCWLGroupObj(groupID,groupName,false)); uroPopulateCWLGroupSelect(); } } function uroRemoveCWLGroup() { selector = document.getElementById('_uroCWLGroupSelect'); var groupID = parseInt(selector.selectedOptions[0].value); if(groupID == 0) return false; // prevent deletion of the default group for(var loop=0;loop<uroCamWatchObjects.length;loop++) { cwObj = uroCamWatchObjects[loop]; if(cwObj.groupID == groupID) { cwObj.groupID = 0; } } for(var loop=0;loop<uroCWLGroups.length;loop++) { groupObj = uroCWLGroups[loop]; if(groupObj.groupID == groupID) { groupObj.groupID = -1; } } uroCWLUpdateHTML(); } function uroAssignCameraToGroup() { var camidx = this.id.substr(13); selector = document.getElementById('_uroCWLGroupSelect'); uroCamWatchObjects[camidx].groupID = parseInt(selector.selectedOptions[0].value); uroCWLUpdateHTML(); return false; } function uroAddBtnEvl(btnID, evlType, evlFunction) { btnObj = document.getElementById(btnID); if(btnObj != null) { btnObj.addEventListener(evlType, evlFunction, true); } } function uroCWLGroupCollapseExpand() { var groupidx = this.id.substr(18); if(uroCWLGroups[groupidx].groupCollapsed == true) uroCWLGroups[groupidx].groupCollapsed = false; else uroCWLGroups[groupidx].groupCollapsed = true; uroCWLUpdateHTML(); return false; } function uroCWLUpdateHTML() { var camTypes = new Array("","","Speed", "Dummy", "Red Light"); var selectedGroup = 0; iHTML = ''; if(document.getElementById('_uroCWLGroupSelect') != null) { selectedGroup = document.getElementById('_uroCWLGroupSelect').selectedIndex; } iHTML = '<br><b>Camera Watchlist:</b><br><br>'; iHTML += '<div id="_uroCWLCamList" style="height:65%;overflow:auto;">'; for(var groupidx=0;groupidx<uroCWLGroups.length;groupidx++) { var groupObj = uroCWLGroups[groupidx]; iHTML += '<div id="_uroCWLGroup-'+groupidx+'">'; if(groupObj.groupCollapsed == true) { iHTML += '<img src="'+uroIcons[0][1]+'" id="_uroCWLGroupState-'+groupidx+'">'; } else { iHTML += '<img src="'+uroIcons[0][0]+'" id="_uroCWLGroupState-'+groupidx+'">'; } iHTML += '<b>'+groupObj.groupName+'</b><br>'; groupObj.groupCount = 0; for(var camidx=0;camidx<uroCamWatchObjects.length;camidx++) { camObj = uroCamWatchObjects[camidx]; if(camObj.groupID == groupObj.groupID) { groupObj.groupCount++; var changed = uroCamDataChanged(camidx); var deleted = (camObj.loaded == false); iHTML += '<div id="_uroCWL-'+camidx+'" style="padding:3px;border-width:2px;border-style:solid;border-color:#FFFFFF;background-color:'; if(camObj.server != W.location.code) iHTML += '#A0A0A0;'; else if(changed) iHTML += '#AAAAFF;'; else if(deleted) iHTML += '#FFAAAA;'; else iHTML += '#FFFFFF;'; if(groupObj.groupCollapsed == true) iHTML += 'display:none;">'; else iHTML += 'display:block;">'; iHTML += 'ID: '+camObj.fid; iHTML += ' ('+camObj.server+')'; iHTML += ' Type: '+camTypes[camObj.watchType]; if(camObj.server != W.location.code) { iHTML += '<br><i>Not on this server</i>'; } else if(deleted) { iHTML += '<br>DELETED'; } else if(changed) { if(camObj.currentType != camObj.watchType) { iHTML += '<br> Type changed'; iHTML += ' ('+camObj.watchType+' to '+camObj.currentType+')'; } if(camObj.currentAzymuth != camObj.watchAzymuth) { iHTML += '<br> Azimuth changed'; iHTML += ' ('+camObj.watchAzymuth+' to '+camObj.currentAzymuth+')'; } if(camObj.currentSpeed != camObj.watchSpeed) { iHTML += '<br> Speed changed'; iHTML += ' ('+camObj.watchSpeed+' to '+camObj.currentSpeed+')'; } if(camObj.currentValidated != camObj.watchValidated) { iHTML += '<br> Approval state changed'; iHTML += ' ('+camObj.watchValidated+' to '+camObj.currentValidated+')'; } if(camObj.currentLat != camObj.watchLat) { iHTML += '<br> Latitude changed'; iHTML += ' ('+camObj.watchLat+' to '+camObj.currentLat+')'; } if(camObj.currentLon != camObj.watchLon) { iHTML += '<br> Longitude changed'; iHTML += ' ('+camObj.watchLon+' to '+camObj.currentLon+')'; } } if(camObj.server == W.location.code) { iHTML += ' <img id="_uroCWLIcon1-'+camidx+'" src="'+uroIcons[1][1]+'">'; iHTML += ' <img id="_uroCWLIcon2-'+camidx+'" src="'+uroIcons[2][1]+'">'; } iHTML += '</div>'; } } iHTML += '</div>'; } iHTML += '</div><div id="_uroCWLControls">'; iHTML += '<hr>Group control:<br>'; iHTML += '<select id="_uroCWLGroupSelect" style="width:40%;height:22px;"></select> <input type="button" id="_btnCWLGroupDel" value="Delete group"><br>'; iHTML += '<input type="text" id="_uroCWLGroupEntry" style="width:40%;height:22px;"> <input type="button" id="_btnCWLGroupAdd" value="Add group">'; iHTML += '<hr><input type="button" id="_btnRescanCamWatchList" value="Rescan">'; iHTML += ' | <input type="button" id="_btnRemoveDeletedCameras" value="Remove deleted">'; iHTML += ' | <input type="button" id="_btnClearCamWatchList" value="Remove all">'; iHTML += '</div>'; uroCamWatchlist.innerHTML = iHTML; for(var camidx=0;camidx<uroCamWatchObjects.length;camidx++) { document.getElementById("_uroCWL-"+camidx).onmouseover = uroHighlightCWLEntry; document.getElementById("_uroCWL-"+camidx).onmouseleave = uroUnhighlightCWLEntry; if(camObj.server == W.location.code) { document.getElementById("_uroCWLIcon1-"+camidx).onmouseover = uroCWLIconHighlight; document.getElementById("_uroCWLIcon1-"+camidx).onmouseleave = uroCWLIconLowlight; document.getElementById("_uroCWLIcon1-"+camidx).onclick = uroAssignCameraToGroup; document.getElementById("_uroCWLIcon2-"+camidx).onmouseover = uroCWLIconHighlight; document.getElementById("_uroCWLIcon2-"+camidx).onmouseleave = uroCWLIconLowlight; document.getElementById("_uroCWLIcon2-"+camidx).onclick = uroGotoCam; } } uroAddBtnEvl('_btnClearCamWatchList', 'click', uroClearCamWatchList); uroAddBtnEvl('_btnRemoveDeletedCameras', 'click', uroClearDeletedCameras); uroAddBtnEvl('_btnRescanCamWatchList', 'click', uroRescanCamWatchList); uroAddBtnEvl('_btnCWLGroupDel', 'click', uroRemoveCWLGroup); uroAddBtnEvl('_btnCWLGroupAdd', 'click', uroAddCWLGroup); if(document.getElementById('_uroCWLGroupSelect') != null) { uroAddLog('populating CWL group list'); uroPopulateCWLGroupSelect(); selector = document.getElementById('_uroCWLGroupSelect'); if(selectedGroup >= selector.length) { selectedGroup = 0; } selector.selectedIndex = selectedGroup; } for(var groupidx=0;groupidx<uroCWLGroups.length;groupidx++) { if(uroCWLGroups[groupidx].groupCount == 0) { document.getElementById('_uroCWLGroup-'+groupidx).style.display = 'none'; } else { document.getElementById('_uroCWLGroupState-'+groupidx).onclick = uroCWLGroupCollapseExpand; } } } function uroIsOnIgnoreList(fid) { if(sessionStorage.UROverview_FID_IgnoreList.indexOf('fid:'+fid) == -1) return false; else return true; } function uroEnableIgnoreListControls() { var btnState = false; if(sessionStorage.UROverview_FID_IgnoreList == '') { btnState = true; } document.getElementById('_btnUndoLastHide').disabled = btnState; document.getElementById('_btnClearSessionHides').disabled = btnState; uroFilterURMarkers(); } function uroAddToIgnoreList() { if(!uroIsOnIgnoreList(uroShownFID)) { sessionStorage.UROverview_FID_IgnoreList += 'fid:'+uroShownFID; uroAddLog('added fid '+uroShownFID+' to ignore list'); uroAddLog(sessionStorage.UROverview_FID_IgnoreList); document.getElementById('_btnUndoLastHide').disabled = false; document.getElementById('_btnClearSessionHides').disabled = false; uroDiv.style.visibility = 'hidden'; uroEnableIgnoreListControls(); wazeMap.events.register("mousemove", null, uroFilterURMarkers5); } return false; } function uroRemoveFromIgnoreList(fid) { var ignorelist = sessionStorage.UROverview_FID_IgnoreList; var fidpos = ignorelist.indexOf('fid:'+fid); if(fidpos != -1) { var preFID = ignorelist.slice(0,fidpos); ignorelist = ignorelist.slice(fidpos+1); fidpos = ignorelist.indexOf('fid:'); if(fidpos == -1) ignorelist = ''; else ignorelist = ignorelist.slice(fidpos); sessionStorage.UROverview_FID_IgnoreList = preFID + ignorelist; uroAddLog('removed fid '+fid+' from ignore list'); uroAddLog(sessionStorage.UROverview_FID_IgnoreList); uroEnableIgnoreListControls(); } } function uroRemoveLastAddedIgnore() { var ignorelist = sessionStorage.UROverview_FID_IgnoreList; var fidpos = ignorelist.lastIndexOf('fid:'); if(fidpos != -1) { ignorelist = ignorelist.slice(0,fidpos); sessionStorage.UROverview_FID_IgnoreList = ignorelist; uroAddLog('removed last fid from ignore list'); uroAddLog(sessionStorage.UROverview_FID_IgnoreList); uroEnableIgnoreListControls(); } } function uroRemoveAllIgnores() { sessionStorage.UROverview_FID_IgnoreList = ''; uroEnableIgnoreListControls(); } function uroKeywordPresent(desc, keyword) { if(document.getElementById('_cbCaseInsensitive').checked == true) re = RegExp(keyword,'i'); else re = RegExp(keyword); if(desc.search(re) == -1) return false; else return true; } function uroMaskTest() { if(wazeMap.layers[uroMaskLayer].div == null) { if(uroMaskActive == false) { uroAddLog('mask layer not found'); uroMaskActive = true; } return true; } if(wazeMap.layers[uroMaskLayer].div.innerHTML.indexOf('fill="black"') != -1) { if(uroMaskActive == false) { uroAddLog('mask layer active'); uroMaskActive = true; } return true; } uroMaskActive = false; return false; } function uroRefreshUpdateRequestSessions() { var idList = []; for (var urID in wazeModel.mapUpdateRequests.objects) { if(wazeModel.updateRequestSessions.objects[urID] == null) idList.push(urID); } if(idList.length > 0) { uroAddLog('grabbing updateRequestSessions with IDs '+idList); wazeModel.updateRequestSessions.get(idList); } } function uroURHasMyComments(fid) { var nComments = wazeModel.updateRequestSessions.objects[fid].comments.length; if(nComments == 0) return false; for(var cidx=0; cidx<nComments; cidx++) { if(wazeModel.updateRequestSessions.objects[fid].comments[cidx].userID == uroUserID) return true; } return false; } function uroAddCommentMarkers(urID, hasMyComments, nComments) { var useDefaultMarker = false; if((document.getElementById('_cbNativeConvoMarkers').checked) && (uroBetaEditor == false)) useDefaultMarker = true; if((document.getElementById('_cbNativeBetaConvoMarkers').checked) && (uroBetaEditor == true)) useDefaultMarker = true; var divElem = document.getElementById(wazeMap.layers[uroURLayerIdx].id); if(divElem.childNodes.length > 0) { for(var nodeIdx = 0; nodeIdx < divElem.childNodes.length; nodeIdx++) { if(divElem.childNodes[nodeIdx].getAttribute("data-id") == urID) { var divHTML = divElem.childNodes[nodeIdx].innerHTML; if(divHTML.indexOf('customMarker_') == -1) { divHTML = ''; } if(document.getElementById('_cbCommentCount').checked) { divHTML += '<div style="position:absolute;top:-9px;left:-11px;pointer-events:none;">'; divHTML += '<img src="https://www.chizzum.com/greasemonkey/images/ur_comment_count.png">'; divHTML += '</div>'; divHTML += '<div style="position:absolute;top:-6px;left:-'; if(nComments < 10) divHTML += '0'; else if(nComments < 100) divHTML += '3'; else divHTML += '6'; divHTML += 'px;font-size:11px;;pointer-events:none;">'+nComments+'</div>'; } if(useDefaultMarker == false) { divHTML += '<div style="position:absolute;top:-9px;left:18px;pointer-events:none;">'; if(hasMyComments) divHTML += '<img src="https://www.chizzum.com/greasemonkey/images/ur_own_comment_marker.png">'; else divHTML += '<img src="https://www.chizzum.com/greasemonkey/images/ur_comment_marker.png">'; divHTML += '</div>'; wazeMap.layers[uroURLayerIdx].markers[urID].icon.imageDiv.classList.remove("has-comments") } else { wazeMap.layers[uroURLayerIdx].markers[urID].icon.imageDiv.classList.add("has-comments") } divElem.childNodes[nodeIdx].innerHTML = divHTML; return; } } } } function uroAddCustomMarkers(urID,customType) { var useCustomMarkers = false; if(customType == 0) useCustomMarkers = (document.getElementById('_cbCustomRoadworksMarkers').checked); if(customType == 1) useCustomMarkers = (document.getElementById('_cbCustomConstructionMarkers').checked); if(customType == 2) useCustomMarkers = (document.getElementById('_cbCustomClosuresMarkers').checked); if(customType == 3) useCustomMarkers = (document.getElementById('_cbCustomEventsMarkers').checked); var divElem = document.getElementById(wazeMap.layers[uroURLayerIdx].id); if(divElem.childNodes.length > 0) { for(var nodeIdx = 0; nodeIdx < divElem.childNodes.length; nodeIdx++) { if(divElem.childNodes[nodeIdx].getAttribute("data-id") == urID) { var divHTML = ''; if(useCustomMarkers == true) { divHTML += '<div id="customMarker_'+urID+'" style="position:absolute;pointer-events:none;">'; divHTML += '<img src="'+uroIcons[uroGetCustomMarkerIdx(customType)][0]+'">'; divHTML += '</div>'; } divElem.childNodes[nodeIdx].innerHTML = divHTML; return; } } } } function uroChangeCustomMarkers(urID,isHighlighted,customType) { if(document.getElementById('customMarker_'+urID) != null) { if(isHighlighted == true) { document.getElementById('customMarker_'+urID).innerHTML = '<img src="'+uroIcons[customType][1]+'">'; } else { document.getElementById('customMarker_'+urID).innerHTML = '<img src="'+uroIcons[customType][0]+'">'; } } } function uroFilterURMarkers() { var mapviewport = document.getElementsByClassName("olMapViewport")[0]; if(mapviewport == null) { if(uroNullMapViewport == false) { uroAddLog('caught null mapviewport'); uroNullMapViewport = true; } return; } uroNullMapViewport = false; if(document.getElementById('_cbWhiteBackground').checked) { mapviewport.style.backgroundColor = "#FFFFFF"; } else { mapviewport.style.backgroundColor = "#555555"; } if(document.getElementById('_cbHideAMLayer').checked) { wazeMap.layers[uroAMLayerIdx].setOpacity(0); } else { wazeMap.layers[uroAMLayerIdx].setOpacity(1); } if(uroMaskTest() == true) return; var camLayer = document.getElementById(uroRootContainer+'_svgRoot'); if(camLayer == null) { if(uroNullCamLayer == false) { uroAddLog('caught null camLayer'); uroNullCamLayer = true; } return; } uroNullCamLayer = false; uroRefreshUpdateRequestSessions(); for (var uroCamObj in wazeModel.cameras.objects) { var uroCam = wazeModel.cameras.objects[uroCamObj]; var uroCamStyle = 'visible'; if(wazeModel.users.objects[uroCam.attributes.createdBy] != null) { var uroCamCreator = wazeModel.users.objects[uroCam.attributes.createdBy].userName; var uroCamCreatorRank = wazeModel.users.objects[uroCam.attributes.createdBy].rank; } else { var uroCamCreator = ''; var uroCamCreatorRank = -1; } if(wazeModel.users.objects[uroCam.attributes.updatedBy] != null) { var uroCamUpdater = wazeModel.users.objects[uroCam.attributes.updatedBy].userName; var uroCamUpdaterRank = wazeModel.users.objects[uroCam.attributes.updatedBy].rank; } else { var uroCamUpdater = ''; var uroCamUpdaterRank = -1; } var uroCamApproved = uroCam.attributes.validated; var uroCamType = uroCam.attributes.type; if(document.getElementById('_cbShowOnlyMyCams').checked == true) { if((uroUserID != uroCam.attributes.createdBy)&&(uroUserID != uroCam.attributes.updatedBy)) uroCamStyle = 'hidden'; } if((document.getElementById('_cbShowWorldCams').checked == false) || (document.getElementById('_cbShowUSACams').checked == false) || (document.getElementById('_cbShowNonWorldCams').checked == false)) { var posWorld = uroCamCreator.indexOf('world_'); var posUSA = uroCamCreator.indexOf('usa_'); if((document.getElementById('_cbShowWorldCams').checked == false) && (posWorld == 0)) uroCamStyle = 'hidden'; if((document.getElementById('_cbShowUSACams').checked == false) && (posUSA == 0)) uroCamStyle = 'hidden'; if((document.getElementById('_cbShowNonWorldCams').checked == false) && (posWorld != 0) && (posUSA != 0)) uroCamStyle = 'hidden'; } if((document.getElementById('_cbShowApprovedCams').checked == false) || (document.getElementById('_cbShowNonApprovedCams').checked == false)) { if((document.getElementById('_cbShowApprovedCams').checked == false) && (uroCamApproved == true)) uroCamStyle = 'hidden'; if((document.getElementById('_cbShowNonApprovedCams').checked == false) && (uroCamApproved == false)) uroCamStyle = 'hidden'; } if((document.getElementById('_cbShowNonApprovedCams').checked == true) && (uroCamApproved == false)) { if(((document.getElementById('_cbShowOlderCreatedNonApproved').checked == true)) && (uroGetCameraAge(uroCam,1) <= document.getElementById('_inputCameraMinCreatedDays').value)) uroCamStyle = 'hidden'; if(((document.getElementById('_cbShowOlderUpdatedNonApproved').checked == true)) && (uroGetCameraAge(uroCam,0) <= document.getElementById('_inputCameraMinUpdatedDays').value)) uroCamStyle = 'hidden'; } if((document.getElementById('_cbShowSpeedCams').checked == false) || (document.getElementById('_cbShowRedLightCams').checked == false) || (document.getElementById('_cbShowDummyCams').checked == false)) { if((document.getElementById('_cbShowSpeedCams').checked == false) && (uroCamType == 2)) uroCamStyle = 'hidden'; if((document.getElementById('_cbShowRedLightCams').checked == false) && (uroCamType == 4)) uroCamStyle = 'hidden'; if((document.getElementById('_cbShowDummyCams').checked == false) && (uroCamType == 3)) uroCamStyle = 'hidden'; } if(document.getElementById('_cbShowSpeedCams').checked == true) { if((document.getElementById('_cbShowIfMPHSpeedSet').checked == false) && (uroIsCameraSpeedValid(uroCam) == 1)) uroCamStyle = 'hidden'; if((document.getElementById('_cbShowIfNoSpeedSet').checked == false) && (uroIsCameraSpeedValid(uroCam) == 0)) uroCamStyle = 'hidden'; if((document.getElementById('_cbShowIfKPHSpeedSet').checked == false) && (uroIsCameraSpeedValid(uroCam) == -1)) uroCamStyle = 'hidden'; } if(document.getElementById('_cbHideCreatedByMe').checked == true) { if(uroUserID == uroCam.attributes.createdBy) uroCamStyle = 'hidden'; } if((document.getElementById('_cbHideCreatedByRank0').checked == true) && (uroCamCreatorRank == 0)) uroCamStyle = 'hidden'; if((document.getElementById('_cbHideCreatedByRank1').checked == true) && (uroCamCreatorRank == 1)) uroCamStyle = 'hidden'; if((document.getElementById('_cbHideCreatedByRank2').checked == true) && (uroCamCreatorRank == 2)) uroCamStyle = 'hidden'; if((document.getElementById('_cbHideCreatedByRank3').checked == true) && (uroCamCreatorRank == 3)) uroCamStyle = 'hidden'; if((document.getElementById('_cbHideCreatedByRank4').checked == true) && (uroCamCreatorRank == 4)) uroCamStyle = 'hidden'; if((document.getElementById('_cbHideCreatedByRank5').checked == true) && (uroCamCreatorRank == 5)) uroCamStyle = 'hidden'; if(document.getElementById('_cbHideUpdatedByMe').checked == true) { if(uroUserID == uroCam.attributes.updatedBy) uroCamStyle = 'hidden'; } if((document.getElementById('_cbHideUpdatedByRank0').checked == true) && (uroCamUpdaterRank == 0)) uroCamStyle = 'hidden'; if((document.getElementById('_cbHideUpdatedByRank1').checked == true) && (uroCamUpdaterRank == 1)) uroCamStyle = 'hidden'; if((document.getElementById('_cbHideUpdatedByRank2').checked == true) && (uroCamUpdaterRank == 2)) uroCamStyle = 'hidden'; if((document.getElementById('_cbHideUpdatedByRank3').checked == true) && (uroCamUpdaterRank == 3)) uroCamStyle = 'hidden'; if((document.getElementById('_cbHideUpdatedByRank4').checked == true) && (uroCamUpdaterRank == 4)) uroCamStyle = 'hidden'; if((document.getElementById('_cbHideUpdatedByRank5').checked == true) && (uroCamUpdaterRank == 5)) uroCamStyle = 'hidden'; if((document.getElementById('_cbHideCWLCams').checked == true) && (uroIsCamOnWatchList(uroCam.fid) != -1)) uroCamStyle = 'hidden'; var uroCamGeometryID = uroCam.geometry.id; if(camLayer.getElementById(uroCamGeometryID) != null) { camLayer.getElementById(uroCamGeometryID).style.visibility = uroCamStyle; } } for (var urobj in wazeModel.mapUpdateRequests.objects) { var ureq = wazeModel.mapUpdateRequests.objects[urobj]; var urStyle = 'visible'; var cryosphere_link = false; var wazeauto_ur = false; var ukroadworks_ur = false; var construction_ur = false; var closure_ur = false; var event_ur = false; var hasMyComments = false; var nComments = 0; var commentDaysOld = -1; var desc = ''; if(ureq.attributes.description != null) desc = ureq.attributes.description; // check UR against current session ignore list... if(uroIsOnIgnoreList(ureq.fid)) urStyle = 'hidden'; // check against closed/not identified filtering if enabled... if(document.getElementById('_cbFilterSolved').checked == true) { if(ureq.attributes.resolution == 0) urStyle = 'hidden'; } if(document.getElementById('_cbFilterUnidentified').checked == true) { if(ureq.attributes.resolution == 1) urStyle = 'hidden'; } if((ureq.attributes.resolvedOn != null) && (document.getElementById('_cbFilterClosedUR').checked == true)) { urStyle = 'hidden'; } if(urStyle == 'visible') { // check UR against keyword filtering if enabled... if(document.getElementById('_cbURDescriptionMustBePresent').checked == true) { if(desc == '') urStyle = 'hidden'; } if(document.getElementById('_cbURDescriptionMustBeAbsent').checked == true) { if(desc != '') urStyle = 'hidden'; } if(document.getElementById('_cbEnableKeywordMustBePresent').checked == true) { if(!uroKeywordPresent(desc,document.getElementById('_textKeywordPresent').value)) urStyle = 'hidden'; } if(document.getElementById('_cbEnableKeywordMustBeAbsent').checked == true) { if(uroKeywordPresent(desc,document.getElementById('_textKeywordAbsent').value)) urStyle = 'hidden'; } } if(urStyle == 'visible') { // do age-based filtering if enabled if(document.getElementById('_cbEnableMinAgeFilter').checked == true) { if(uroGetURAge(ureq,0) < document.getElementById('_inputFilterMinDays').value) urStyle = 'hidden'; } if(document.getElementById('_cbEnableMaxAgeFilter').checked == true) { if(uroGetURAge(ureq,0) > document.getElementById('_inputFilterMaxDays').value) urStyle = 'hidden'; } } if(urStyle == 'visible') { // do comments/following filtering if(wazeModel.updateRequestSessions.objects[ureq.fid] != null) { nComments = wazeModel.updateRequestSessions.objects[ureq.fid].comments.length; var commentDaysOld = -1; if(document.getElementById('_cbEnableMinCommentsFilter').checked == true) { if(nComments < document.getElementById('_inputFilterMinComments').value) urStyle = 'hidden'; } if(document.getElementById('_cbEnableMaxCommentsFilter').checked == true) { if(nComments > document.getElementById('_inputFilterMaxComments').value) urStyle = 'hidden'; } if(nComments > 0) { var reporterIsLastCommenter = false; if(wazeModel.updateRequestSessions.objects[ureq.fid].comments[nComments-1].userID == -1) reporterIsLastCommenter = true; if(document.getElementById('_cbHideIfReporterLastCommenter').checked == true) { if(reporterIsLastCommenter == true) urStyle = 'hidden'; } else if(document.getElementById('_cbHideIfReporterNotLastCommenter').checked == true) { if(reporterIsLastCommenter == false) urStyle = 'hidden'; } hasMyComments = uroURHasMyComments(ureq.fid); if(hasMyComments == false) { if(document.getElementById('_cbHideAnyComments').checked == true) urStyle = 'hidden'; if(document.getElementById('_cbHideIfNotLastCommenter').checked == true) urStyle = 'hidden'; } else { if(document.getElementById('_cbHideMyComments').checked == true) urStyle = 'hidden'; var userIsLastCommenter = false; if(wazeModel.updateRequestSessions.objects[ureq.fid].comments[nComments-1].userID == uroUserID) userIsLastCommenter = true; if(document.getElementById('_cbHideIfLastCommenter').checked == true) { if(userIsLastCommenter == true) urStyle = 'hidden'; } else if(document.getElementById('_cbHideIfNotLastCommenter').checked == true) { if(userIsLastCommenter == false) urStyle = 'hidden'; } } commentDaysOld = uroGetCommentAge(wazeModel.updateRequestSessions.objects[ureq.fid].comments[nComments-1]); if((document.getElementById('_cbEnableCommentAgeFilter').checked == true) && (commentDaysOld != -1)) { if(document.getElementById('_inputFilterCommentDays').value < commentDaysOld) urStyle = 'hidden'; } if((document.getElementById('_cbEnableCommentAgeFilter2').checked == true) && (commentDaysOld != -1)) { if(document.getElementById('_inputFilterCommentDays2').value > commentDaysOld) urStyle = 'hidden'; } } if(wazeModel.updateRequestSessions.objects[ureq.fid].isFollowing == true) { if(document.getElementById('_cbHideMyFollowed').checked == true) urStyle = 'hidden'; } else { if(document.getElementById('_cbHideMyUnfollowed').checked == true) urStyle = 'hidden'; } } } if(urStyle == 'visible') { // for type-based filtering, we need to handle Petrol Station Checker URs first - these (currently) // appear as URs of either general error or undefined type, and so can't be detected just by type alone. if(desc.indexOf('cryosphere') != -1) { cryosphere_link = true; } // Waze automatic URs are next - these always (?) get inserted as General Error URs, so we can't filter // them by type either. else if(desc.indexOf('Waze Automatic:') != -1) { wazeauto_ur = true; } var customType = uroGetCustomType(ureq.fid); if(customType == 0) ukroadworks_ur = true; else if(customType == 1) construction_ur = true; else if(customType == 2) closure_ur = true; else if(customType == 3) event_ur = true; if(cryosphere_link == true) { if(document.getElementById('_cbFilterCryosphere').checked == true) urStyle = 'hidden'; } else if(wazeauto_ur == true) { if(document.getElementById('_cbFilterWazeAuto').checked == true) urStyle = 'hidden'; } else if(ukroadworks_ur == true) { if(document.getElementById('_cbFilterRoadworks').checked == true) urStyle = 'hidden'; } else if(construction_ur == true) { if(document.getElementById('_cbFilterConstruction').checked == true) urStyle = 'hidden'; } else if(closure_ur == true) { if(document.getElementById('_cbFilterClosure').checked == true) urStyle = 'hidden'; } else if(event_ur == true) { if(document.getElementById('_cbFilterEvent').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 6) { if(document.getElementById('_cbFilterIncorrectTurn').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 7) { if (document.getElementById('_cbFilterIncorrectAddress').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 8) { if(document.getElementById('_cbFilterIncorrectRoute').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 9) { if(document.getElementById('_cbFilterMissingRoundabout').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 10) { if(document.getElementById('_cbFilterGeneralError').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 11) { if(document.getElementById('_cbFilterTurnNotAllowed').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 12) { if(document.getElementById('_cbFilterIncorrectJunction').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 13) { if(document.getElementById('_cbFilterMissingBridgeOverpass').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 14) { if(document.getElementById('_cbFilterWrongDrivingDirection').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 15) { if(document.getElementById('_cbFilterMissingExit').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 16) { if(document.getElementById('_cbFilterMissingRoad').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 18) { if(document.getElementById('_cbFilterMissingLandmark').checked == true) urStyle = 'hidden'; } else if(ureq.attributes.type == 19) { if(document.getElementById('_cbFilterBlockedRoad').checked == true) urStyle = 'hidden'; } else if(document.getElementById('_cbFilterUndefined').checked == true) urStyle = 'hidden'; if(document.getElementById('_cbInvertURFilter').checked == true) { if(urStyle == 'hidden') urStyle = 'visible'; else urStyle = 'hidden'; } } wazeMap.layers[uroURLayerIdx].markers[urobj].icon.imageDiv.style.visibility = urStyle; if(urStyle != 'hidden') { if(ukroadworks_ur == true) uroAddCustomMarkers(ureq.fid,0); if(construction_ur == true) uroAddCustomMarkers(ureq.fid,1); if(closure_ur == true) uroAddCustomMarkers(ureq.fid,2); if(event_ur == true) uroAddCustomMarkers(ureq.fid,3); if(nComments > 0) { uroAddCommentMarkers(ureq.fid, hasMyComments, nComments); } } } for (var urobj in wazeModel.problems.objects) { var problem = wazeModel.problems.objects[urobj]; var problemStyle = 'visible'; // check problem against current session ignore list... if(uroIsOnIgnoreList(problem.fid)) problemStyle = 'hidden'; // check against closed/not identified filtering if enabled... var problem_marker_img = ''; if(problem.geometry.id != null) { if(document.getElementById(problem.geometry.id) != null) { problem_marker_img = document.getElementById(problem.geometry.id).href.baseVal; if(document.getElementById('_cbMPFilterSolved').checked == true) { if(problem_marker_img.indexOf('_solved') != -1) problemStyle = 'hidden'; } if(document.getElementById('_cbMPFilterUnidentified').checked == true) { if(problem_marker_img.indexOf('_rejected') != -1) problemStyle = 'hidden'; } } } if((problem.attributes.resolvedOn != null) && (document.getElementById('_cbMPFilterClosed').checked == true)) { problemStyle = 'hidden'; } if(problemStyle == 'visible') { if(problem.attributes.problemType == 101) { if(document.getElementById('_cbMPFilterDrivingDirectionMismatch').checked == true) problemStyle = 'hidden'; } else if(problem.attributes.problemType == 102) { if(document.getElementById('_cbMPFilterMissingJunction').checked == true) problemStyle = 'hidden'; } else if(problem.attributes.problemType == 103) { if(document.getElementById('_cbMPFilterMissingRoad').checked == true) problemStyle = 'hidden'; } else if(problem.attributes.problemType == 104) { if(document.getElementById('_cbMPFilterCrossroadsJunctionMissing').checked == true) problemStyle = 'hidden'; } else if(problem.attributes.problemType == 105) { if(document.getElementById('_cbMPFilterRoadTypeMismatch').checked == true) problemStyle = 'hidden'; } else if(problem.attributes.problemType == 106) { if(document.getElementById('_cbMPFilterRestrictedTurn').checked == true) problemStyle = 'hidden'; } else if(document.getElementById('_cbMPFilterUnknownProblem').checked == true) problemStyle = 'hidden'; if(document.getElementById('_cbInvertMPFilter').checked == true) { if(problemStyle == 'hidden') problemStyle = 'visible'; else problemStyle = 'hidden'; } if(problem.attributes.weight <= 3) { if(document.getElementById('_cbMPFilterLowSeverity').checked == true) problemStyle = 'hidden'; } else if(problem.attributes.weight <= 7) { if(document.getElementById('_cbMPFilterMediumSeverity').checked == true) problemStyle = 'hidden'; } else if(document.getElementById('_cbMPFilterHighSeverity').checked == true) problemStyle = 'hidden'; } wazeMap.layers[uroProblemLayerIdx].markers[urobj].icon.imageDiv.style.visibility = problemStyle; } for (var urobj in wazeModel.turnProblems.objects) { var problem = wazeModel.turnProblems.objects[urobj]; var problemStyle = 'visible'; // check problem against current session ignore list... if(uroIsOnIgnoreList(problem.fid)) problemStyle = 'hidden'; // check against closed/not identified filtering if enabled... var problem_marker_img = ''; if(problem.geometry.id != null) { if(document.getElementById(problem.geometry.id) != null) { problem_marker_img = document.getElementById(problem.geometry.id).href.baseVal; if(document.getElementById('_cbMPFilterSolved').checked == true) { if(problem_marker_img.indexOf('_solved') != -1) problemStyle = 'hidden'; } if(document.getElementById('_cbMPFilterUnidentified').checked == true) { if(problem_marker_img.indexOf('_rejected') != -1) problemStyle = 'hidden'; } } } if((problem.attributes.resolvedOn != null) && (document.getElementById('_cbMPFilterClosed').checked == true)) { problemStyle = 'hidden'; } if(document.getElementById('_cbMPFilterTurnProblem').checked == true) problemStyle = 'hidden'; if(document.getElementById('_cbInvertMPFilter').checked == true) { if(problemStyle == 'hidden') problemStyle = 'visible'; else problemStyle = 'hidden'; } wazeMap.layers[uroProblemLayerIdx].markers[urobj].icon.imageDiv.style.visibility = problemStyle; } } function uroFilterURMarkers2a() { uroAddLog('catch UR layer change'); uroFilterURMarkers(); } function uroFilterURMarkers2b() { uroAddLog('catch UR layer add'); uroFilterURMarkers(); } function uroFilterURMarkers2c() { uroAddLog('catch UR layer remove'); uroFilterURMarkers(); } function uroFilterURMarkers3a() { uroAddLog('catch camera layer change'); uroFilterURMarkers(); } function uroFilterURMarkers3b() { uroAddLog('catch camera layer add'); uroFilterURMarkers(); } function uroFilterURMarkers3c() { uroAddLog('catch camera layer remove'); uroFilterURMarkers(); } function uroFilterURMarkers4a() { uroAddLog('catch problems layer change'); uroFilterURMarkers(); } function uroFilterURMarkers4b() { uroAddLog('catch problems layer add'); uroFilterURMarkers(); } function uroFilterURMarkers4c() { uroAddLog('catch problems layer remove'); uroFilterURMarkers(); } function uroFilterURMarkers5() { uroAddLog('catch mouse move'); wazeMap.events.unregister('mousemove',null,uroFilterURMarkers5); uroFilterURMarkers(); } function uroDeleteObject() { uroAddLog('delete camera ID '+uroShownFID); if(wazeModel.cameras.objects[uroShownFID] == null) { uroAddLog('camera object not found...'); return false; } uroRemoveCamFromWatchList(); deleteAction = new Waze.Action.DeleteObject(wazeModel.cameras.objects[uroShownFID], null); wazeModel.actionManager.add(deleteAction); uroExitPopup(); return false; } function uroGetUserNameAndRank(userID) { var userName; var userLevel; if(wazeModel.users.objects[userID] != undefined) { userName = wazeModel.users.objects[userID].userName; userLevel = wazeModel.users.objects[userID].rank + 1; } else { userName = userID; userLevel = '?'; } return userName + ' (' + userLevel + ')'; } function uroGetCustomMarkerIdx(customType) { if(customType == 0) return 3; if(customType == 1) return 3; if(customType == 2) return 4; if(customType == 3) return 5; return -1; } function uroGetCustomType(idSrc) { var ureq = wazeModel.mapUpdateRequests.objects[idSrc]; var desc = ''; if(ureq.attributes.description != null) { desc = ureq.attributes.description; if(desc.indexOf('[ROADWORKS]') != -1) return 0; if(desc.indexOf('[CONSTRUCTION]') != -1) return 1; if(desc.indexOf('[CLOSURE]') != -1) return 2; if(desc.indexOf('[EVENT]') != -1) return 3; } return -1; } function uroFormatRestriction(restObj) { var retval = '<tr>'; retval += '<td style="text-align:center;">'; if((restObj.days & 1) == 1) retval += 'S'; else retval += '-'; retval += '</td><td style="text-align:center;">'; if((restObj.days & 2) == 2) retval += 'M'; else retval += '-'; retval += '</td><td style="text-align:center;">'; if((restObj.days & 4) == 4) retval += 'T'; else retval += '-'; retval += '</td><td style="text-align:center;">'; if((restObj.days & 8) == 8) retval += 'W'; else retval += '-'; retval += '</td><td style="text-align:center;">'; if((restObj.days & 16) == 16) retval += 'T'; else retval += '-'; retval += '</td><td style="text-align:center;">'; if((restObj.days & 32) == 32) retval += 'F'; else retval += '-'; retval += '</td><td style="text-align:center;">'; if((restObj.days & 64) == 64) retval += 'S'; else retval += '-'; retval += '</td><td>'; if(restObj.fromDate == null) retval += 'All dates'; else retval += restObj.fromDate+' to '+restObj.toDate; retval += '</td><td>'; if(restObj.allDay == true) retval += 'All day'; else retval += restObj.fromTime+' to '+restObj.toTime; retval += '</td><td>'; if(restObj.allVehicleTypes == restObj.vehicleTypes) retval += 'All vehicles'; else retval += 'Some vehicles'; retval += '</td></tr>'; return retval; } function uroNewLookHighlightedItemsCheck(e) { if(uroMaskTest() == true) return; if(OpenLayers == null) { if(uroNullOpenLayers == false) { uroAddLog('caught null OpenLayers'); uroNullOpenLayers = true; } return; } uroNullOpenLayers = false; var rc = document.getElementById(uroRootContainer); if(rc == null) { if(uroNullRootContainer == false) { uroAddLog('caught null rootContainer'); uroNullRootContainer = true } return; } uroNullRootContainer = false; if(wazeMap.layers[uroURLayerIdx] == null) { if(uroNullURLayer == false) { uroAddLog('caught null UR layer'); uroNullURLayer = true; } return; } uroNullURLayer = false; if(wazeMap.layers[uroProblemLayerIdx] == null) { if(uroNullProblemLayer == false) { uroAddLog('caught null problem layer'); uroNullProblemLayer = true; } return; } uroNullProblemLayer = false; var mouseX = e.pageX - document.getElementById('map').getBoundingClientRect().left; var mouseY = e.pageY - document.getElementById('map').getBoundingClientRect().top; var currentItems = rc.getElementsByTagName('g'); var result = ''; var rw; var rh; var doPopUp = false; var popup_loc = new OpenLayers.LonLat(0,0); var objHasIgnoreLink = false; var objHasDeleteLink = false; var markerx = null; var markery = null; var offsetx = rc.getBoundingClientRect().left - rc.offsetLeft; var offsety = rc.getBoundingClientRect().top - rc.offsetTop; var objHasIgnoreLink = false; var objHasDeleteLink = false; var objHasAddWatchLink = false; var objHasRemoveWatchLink = false; var objHasUpdateWatchLink = false; // popup for segment restrictions if(document.getElementById('_cbInhibitSegPopup').checked == false) { for(var segs in wazeModel.segments.objects) { if(wazeModel.segments.objects[segs].renderIntent == 'highlight') { markerx = mouseX - offsetx + 100; markery = mouseY - offsety + 50; segObj = wazeModel.segments.objects[segs]; result += '<table cellpadding=4 border=1>'; if(segObj.attributes.fwdRestrictions.length > 0) { doPopUp = true; result += '<tr><td colspan=10><b>A-B restrictions:</b></td></tr>'; for(var idx = 0; idx < segObj.attributes.fwdRestrictions.length; idx++) { restObj = segObj.attributes.fwdRestrictions[idx]; result += uroFormatRestriction(restObj); } } if (segObj.attributes.revRestrictions.length > 0) { doPopUp = true; result += '<tr><td colspan=10><b>B-A restrictions:</b></td></tr>'; for(var idx = 0; idx < segObj.attributes.revRestrictions.length; idx++) { restObj = segObj.attributes.revRestrictions[idx]; result += uroFormatRestriction(restObj); } } result += '</table>'; } } } // look for URs and problems var idSrc = null; var divIdx = -1; var isUR = false; var isProblem = false; var isTurnProb = false; if(document.getElementById('_cbInhibitURPopup').checked == false) { for(var marker in wazeMap.layers[uroURLayerIdx].markers) { markerObj = wazeMap.layers[uroURLayerIdx].markers[marker]; markerImg = window.getComputedStyle(markerObj.icon.imageDiv).getPropertyValue("background-image"); markerPos = window.getComputedStyle(markerObj.icon.imageDiv).getPropertyValue("background-position"); markerPos = markerPos.split(' '); markerPos = parseInt(markerPos[1].substr(0,markerPos[1].length-2)); var hovered = false; // fix for new WME - what possessed the Waze programmers to place the highlighted icon imagery at // seemingly random offsets within the iconstrip, rather than having them all grouped neatly together // as in previous versions of WME, is yet another design decision that seems to have been made purely // for the sake of changing stuff around, rather than for any obviously good reason... if(markerImg.indexOf('problems-se224ab677e.png') != -1) { if((markerPos == -40) || (markerPos == -160) || (markerPos == -200) || (markerPos == -240)) hovered = true; } else { if(markerPos > -200) hovered = true; } if(hovered == true) { idSrc = markerObj.model.fid; markerx = markerObj.icon.imageDiv.offsetLeft; markery = markerObj.icon.imageDiv.offsetTop; isUR = true; uroAddLog('hover over UR ID '+idSrc); if(idSrc != uroCustomMarkerFID) { if(uroCustomMarkerFID != null) { var customIdx = uroGetCustomMarkerIdx(uroGetCustomType(uroCustomMarkerFID)); uroChangeCustomMarkers(uroCustomMarkerFID,false,customIdx); uroCustomMarkerFID = null; } var customIdx = uroGetCustomMarkerIdx(uroGetCustomType(idSrc)); if(customIdx != -1) { uroCustomMarkerFID = idSrc; uroChangeCustomMarkers(idSrc,hovered,customIdx); } } break; } } if((idSrc == null) && (uroCustomMarkerFID != null)) { var customIdx = uroGetCustomMarkerIdx(uroGetCustomType(uroCustomMarkerFID)); uroChangeCustomMarkers(uroCustomMarkerFID,false, customIdx); uroCustomMarkerFID = null; } } if((isUR == false) && (document.getElementById('_cbInhibitMPPopup').checked == false)) { var hovered = false; for(var marker in wazeMap.layers[uroProblemLayerIdx].markers) { markerObj = wazeMap.layers[uroProblemLayerIdx].markers[marker]; markerImg = window.getComputedStyle(markerObj.icon.imageDiv).getPropertyValue("background-image"); markerPos = window.getComputedStyle(markerObj.icon.imageDiv).getPropertyValue("background-position"); markerPos = markerPos.split(' '); markerPos = parseInt(markerPos[1].substr(0,markerPos[1].length-2)); if(markerImg.indexOf('problems-se224ab677e.png') != -1) { if((markerPos == -320) || (markerPos == -560) || (markerPos == -520) || (markerPos == -440)) hovered = true; } else { if(markerPos > -200) hovered = true; } if(hovered == true) { idSrc = markerObj.model.fid; markerx = markerObj.icon.imageDiv.offsetLeft; markery = markerObj.icon.imageDiv.offsetTop; isProblem = true; uroAddLog('hover over problem ID '+idSrc); break; } } } if (idSrc != null) { if(isUR) var ureq = wazeModel.mapUpdateRequests.objects[idSrc]; else if(isProblem) { var ureq = wazeModel.problems.objects[idSrc]; if(ureq == undefined) { var ureq = wazeModel.turnProblems.objects[idSrc]; if(ureq != undefined) isTurnProb = true; } } uroFID = ureq.fid; doPopUp = true; } else { uroFID = -1; } if((uroFID != uroShownFID) && (uroFID != -1)) { if(isUR) { uroAddLog('building popup for UR '+idSrc); result = '<b>Update Request ('+idSrc+'): ' + I18n.translations[I18n.locale].update_requests.types[ureq.attributes.type] + '</b><br>'; if(ureq.attributes.description != null) { var desc = ureq.attributes.description; if(desc != "null") { var linkStartPos = desc.indexOf('http://'); if(linkStartPos == -1) linkStartPos = desc.indexOf('https://'); if(linkStartPos != -1) { var descPreLink = desc.slice(0,linkStartPos); var descURL = desc.slice(linkStartPos); var linkEndPos = descURL.indexOf(' '); var descPostLink = ''; if(linkEndPos != -1) { descPostLink = descURL.slice(linkEndPos); descURL = descURL.slice(0,linkEndPos); } var linkTarget = ''; if(descURL.indexOf('cryosphere') != -1) linkTarget = '_cryosphere'; else if(descURL.indexOf('waze.com') != -1) linkTarget = '_wazeUR'; desc = descPreLink + '<a target="'+linkTarget+'" href="'+descURL+'">here</a>' + descPostLink; } result += desc + '<br>'; } } var uroDaysOld = uroGetURAge(ureq,0); if(uroDaysOld != -1) { result += '<i>Submitted ' + uroParseDaysAgo(uroDaysOld) + ' '; if(ureq.attributes.guestUserName != null) { result += 'via Livemap'; if(ureq.attributes.guestUserName != '') { result += ' by '+ureq.attributes.guestUserName; } } result += '</i>'; } if(ureq.attributes.resolvedOn != null) { var uroDaysResolved = uroGetURAge(ureq,1); if(uroDaysResolved != -1) { result += '<br><i>Closed ' + uroParseDaysAgo(uroDaysResolved) + ' '; if(ureq.attributes.resolvedBy != null) { result += ' by '+uroGetUserNameAndRank(ureq.attributes.resolvedBy); } result += '</i>'; } } if(wazeModel.updateRequestSessions.objects[ureq.fid] != null) { var hasMyComments = uroURHasMyComments(ureq.fid); var nComments = wazeModel.updateRequestSessions.objects[ureq.fid].comments.length; result += '<br>' + nComments + ' comment'; if(nComments != 1) result += 's'; if((hasMyComments == false) && (nComments > 0)) result += ' (none by me)'; if(nComments > 0) { var commentDaysOld = uroGetCommentAge(wazeModel.updateRequestSessions.objects[ureq.fid].comments[nComments-1]); if(commentDaysOld != -1) { result += ', last update '+uroParseDaysAgo(commentDaysOld); } } } } else if(isProblem) { uroAddLog('building popup for problem '+idSrc); if(isTurnProb) result = '<b>Turn Problem ('+idSrc+'): ' + I18n.translations[I18n.locale].problems.types["turn"].title; else { result = '<b>Map Problem ('+idSrc+'): '; if(I18n.translations[I18n.locale].problems.types[ureq.attributes.problemType] == undefined) result += 'Unknown problem type ('+ureq.attributes.problemType+')'; else result += I18n.translations[I18n.locale].problems.types[ureq.attributes.problemType].title; } result += '</b><br>'; if(ureq.attributes.resolvedOn != null) { var uroDaysResolved = uroGetURAge(ureq,1); if(uroDaysResolved != -1) { result += '<br><i>Closed ' + uroParseDaysAgo(uroDaysResolved) + ' '; if(ureq.attributes.resolvedBy != null) { result += ' by '+uroGetUserNameAndRank(ureq.attributes.resolvedBy); } result += '</i>'; } } } // add "open new WME tab" link var urPos=new OpenLayers.LonLat(ureq.geometry.x,ureq.geometry.y); urPos.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326")); var urLink = document.location.href; if(urLink.indexOf('&layers') != -1) { var urLayers = urLink.substr(urLink.indexOf('&layers')); if(urLayers.indexOf('&show') != -1) urLayers = urLayers.substr(0,urLayers.indexOf('&show')); } else var urLayers = ''; urLink = urLink.substr(0,urLink.indexOf('?zoom')); if(isUR) urLink += '?zoom=5&lat='+urPos.lat+'&lon='+urPos.lon+urLayers+'&showur='+idSrc+'&endshow'; else if(isTurnProb) urLink += '?zoom=5&lat='+urPos.lat+'&lon='+urPos.lon+urLayers+'&showturn='+idSrc+'&endshow'; else if(isProblem) urLink += '?zoom=5&lat='+urPos.lat+'&lon='+urPos.lon+urLayers+'&showproblem='+idSrc+'&endshow'; result += '<hr><ul><li><a href="'+urLink+'" target="_urTab">Open in new WME tab</a>'; // add "open new livemap tab" link var lmLink = null; if(document.getElementsByClassName("waze-header-menu").length == 0) { uroAddLog('Livemap link in livemap element'); lmLink = document.getElementById('livemap').href; } else { uroAddLog('Livemap link in header menu, locating...'); var menuItems = document.getElementsByClassName("waze-header-menu")[0]; for(var miloop = 0; miloop<menuItems.childElementCount; miloop++) { if(menuItems.children[miloop].innerHTML.indexOf('livemap') != -1) { uroAddLog('found link in menu entry '+miloop); lmLink = menuItems.children[miloop].getElementsByTagName('a')[0].href; uroAddLog(lmLink); } } } if(lmLink != null) { var zpos = lmLink.indexOf('?'); if(zpos > -1) lmLink = lmLink.substr(0,zpos); lmLink += '?zoom=17&lat='+urPos.lat+'&lon='+urPos.lon+'&layers=BTTTT'; result += '<li><a href="'+lmLink+'" target="_lmTab">Open in new livemap tab</a>'; } // add "ignore for this session" link result += '<li><a href="#" id="_addtoignore">Hide for this session</a></ul>'; objHasIgnoreLink = true; //uroFID = ureq.fid; } // look for cameras var vroot = uroCamvroot; if((currentItems[vroot] != null) && (doPopUp == false) && (document.getElementById('_cbInhibitCamPopup').checked == false)) { // check for a highlighted camera... var currentCameras = currentItems[vroot].getElementsByTagName('image'); var camIndex = -1; for(var loop=0;loop<currentCameras.length;loop++) { if(currentCameras[loop].getAttribute('width') == 44) camIndex = loop; } if(camIndex != -1) { var idSrc = currentCameras[camIndex].id; markerx = Math.round(currentCameras[camIndex].getBoundingClientRect().left - offsetx); markery = Math.round(currentCameras[camIndex].getBoundingClientRect().bottom - offsety - 25); for (var urobj in wazeModel.cameras.objects) { var ureq = wazeModel.cameras.objects[urobj]; // test isSelected() so that we only do overview data on cameras that are being hovered over if((idSrc == ureq.geometry.id)&&(ureq.isSelected() == false)) { doPopUp = true; //if(uroPopupShown == false) { uroFID = ureq.fid; uroAddLog('generating popup for camera '+uroFID); result += '<b>Camera: ' + ureq.TYPES[ureq.attributes.type] + '</b><br>'; result += 'ID: '+uroFID+'<br>'; result += 'Created by '; if(wazeModel.users.get(ureq.attributes.createdBy) != null) { userID = ureq.attributes.createdBy; result += uroGetUserNameAndRank(userID); } else result += 'unknown'; result += ', '; var camAge = uroGetCameraAge(ureq,1); if(camAge != -1) { result += uroParseDaysAgo(camAge); } else result += 'unknown days ago'; result += '<br>Updated by '; if(wazeModel.users.get(ureq.attributes.updatedBy) != null) { userID = ureq.attributes.updatedBy; userName = wazeModel.users.objects[userID].userName; userLevel = wazeModel.users.objects[userID].rank + 1; result += userName + ' (' + userLevel + ')'; } else result += 'unknown'; result += ', '; var camAge = uroGetCameraAge(ureq,0); if(camAge != -1) { result += uroParseDaysAgo(camAge); } else result += 'unknown days ago'; result += '<br>Speed data: '; if(ureq.attributes.speed != null) { result += ureq.attributes.speed + 'km/h'; var speedInMPH = Math.round(ureq.attributes.speed / 1.609); result += ' (' + speedInMPH + 'mph'; if((speedInMPH % 10) != 0) result += ' - not valid?'; result += ')</i>'; } else result += 'unknown'; var uid = wazeModel.loginManager.getLoggedInUser().id; result += '<hr><ul>'; if(uroIsCamOnWatchList(uroFID) != -1) { result += '<li><a href="#" id="_updatewatchlist">Update watchlist entry</a>'; result += '<li><a href="#" id="_removefromwatchlist">Remove from watchlist</a>'; objHasUpdateWatchLink = true; objHasRemoveWatchLink = true; } else { result += '<li><a href="#" id="_addtowatchlist">Add to watchlist</a>'; objHasAddWatchLink = true; } if(ureq.attributes.permissions != 0) { result += '<li><a href="#" id="_deleteobject">Delete Camera</a>'; objHasDeleteLink = true; } result += '</ul>'; } } } } } if(doPopUp == true) { uroPopupX = markerx + offsetx + 15; uroPopupY = markery + offsety + 25; if(uroFID != uroShownFID) { uroAddLog('FID mismatch, show popup: '+uroFID+'/'+uroShownFID); uroShownFID = uroFID; uroPopupShown = false; } if(uroPopupShown == false) { uroAddLog('display popup at '+uroPopupX+','+uroPopupY); uroPopupShown = true; uroDiv.innerHTML = result; if((uroFID != -1) && (objHasIgnoreLink == true)) { document.getElementById('_addtoignore').addEventListener('click', uroAddToIgnoreList, true); } if(objHasDeleteLink == true) { document.getElementById('_deleteobject').addEventListener('click', uroDeleteObject, true); } if(objHasRemoveWatchLink == true) { document.getElementById('_removefromwatchlist').addEventListener('click', uroRemoveCamFromWatchList, true); } if(objHasAddWatchLink == true) { document.getElementById('_addtowatchlist').addEventListener('click', uroAddCamToWatchList, true); } if(objHasUpdateWatchLink == true) { document.getElementById('_updatewatchlist').addEventListener('click', uroUpdateCamWatchList, true); } rw = parseInt(uroDiv.clientWidth); rh = parseInt(uroDiv.clientHeight); if(rw > (window.innerWidth / 2)) rw = (window.innerWidth / 2); if(rh > (window.innerHeight / 2)) rh = (window.innerHeight / 2); if((uroPopupX + rw) > window.innerWidth) { uroPopupX = window.innerWidth - (rw + 50); if(uroPopupX < 0) uroPopupX = 0; } if((uroPopupY + rh) > window.innerHeight) { uroPopupY = window.innerHeight - (rh + 50); if(uroPopupY < 0) uroPopupY = 0; } var popupX1 = (uroPopupX - offsetx); var popupX2 = (popupX1 + rw); var popupY1 = (uroPopupY - offsety); var popupY2 = (popupY1 + rh); if((popupX1 < markerx) && (popupX2 > markerx) && (popupY1 < markery) && (popupY2 > markery)) { uroPopupY = (markery + offsety - rh); } uroDiv.style.top = uroPopupY+'px'; uroDiv.style.left = uroPopupX+'px'; uroDiv.clientWidth = rw+'px'; uroDiv.clientHeight = rh+'px'; uroDiv.style.visibility = 'visible'; } uroPopupTimer = -1; } else { if(uroPopupTimer == -1) { uroPopupTimer = 2; } } if(uroPopupTimer > 0) { if(uroMouseInPopup == false) uroPopupTimer--; } if(uroPopupTimer == 0) { uroDiv.style.visibility = 'hidden'; uroPopupShown = false; uroPopupTimer = -2; uroShownFID = -1; } } function uroRestyleWMETabs() { var navTabs = document.getElementById(uroUserTabId).children[1].children; for(var loop = 0; loop<navTabs.length; loop++) { navTabs[loop].children[0].style.padding = "4px"; } setTimeout(uroRestyleWMETabs,1000); } function uroExclusiveCB() { cbChecked = document.getElementById(this.id).checked; if(cbChecked == true) { if(this.id == '_cbHideMyComments') document.getElementById('_cbHideAnyComments').checked = false; if(this.id == '_cbHideAnyComments') document.getElementById('_cbHideMyComments').checked = false; if(this.id == '_cbHideIfLastCommenter') document.getElementById('_cbHideIfNotLastCommenter').checked = false; if(this.id == '_cbHideIfNotLastCommenter') document.getElementById('_cbHideIfLastCommenter').checked = false; if(this.id == '_cbHideIfReporterLastCommenter') document.getElementById('_cbHideIfReporterNotLastCommenter').checked = false; if(this.id == '_cbHideIfReporterNotLastCommenter') document.getElementById('_cbHideIfReporterLastCommenter').checked = false; } } function uroGetAMs(e) { var amList = ''; if(wazeMap.layers[uroAMLayerIdx].getVisibility() == true) { var mouseX = e.pageX - document.getElementById('map').getBoundingClientRect().left; var mouseY = e.pageY - document.getElementById('map').getBoundingClientRect().top - document.getElementById('toolbar').clientHeight; var mousePixel = new OL.Pixel(mouseX, mouseY); var mousePoint = W.map.getLonLatFromPixel(mousePixel).toPoint(); for(var amObj in W.model.managedAreas.objects) { if(W.model.managedAreas.objects[amObj].geometry.containsPoint(mousePoint)) { if(amList != '') amList += ', '; amList += uroGetUserNameAndRank(W.model.managedAreas.objects[amObj].userID); } } if(amList == '') { amList = 'none'; } amList = "<b>Area Managers:</b> "+amList; } document.getElementById("uroAMList").innerHTML = amList; } function uroTenthSecondTick() { if(uroSetupListeners) { if(loginManager.isLoggedIn()) { uroSetupListeners = false; // filter markers when the marker objects are modified (this happens whenever WME needs to load fresh marker data // due to having panned/zoomed the map beyond the extents of the previously loaded data) wazeModel.mapUpdateRequests.events.register("objectschanged", null, uroFilterURMarkers2a); wazeModel.mapUpdateRequests.events.register("objectsadded", null, uroFilterURMarkers2b); wazeModel.mapUpdateRequests.events.register("objectsremoved", null, uroFilterURMarkers2c); wazeModel.cameras.events.register("objectschanged", null, uroFilterURMarkers3a); wazeModel.cameras.events.register("objectsadded", null, uroFilterURMarkers3b); wazeModel.cameras.events.register("objectsremoved", null, uroFilterURMarkers3c); wazeModel.problems.events.register("objectschanged", null, uroFilterURMarkers4a); wazeModel.problems.events.register("objectsadded", null, uroFilterURMarkers4b); wazeModel.problems.events.register("objectsremoved", null, uroFilterURMarkers4c); var userTabs = document.getElementById(uroUserTabId); var navTabs = uroTimbonesGetElementsByClassName('nav-tabs', userTabs)[0]; var tabContent = uroTimbonesGetElementsByClassName('tab-content', userTabs)[0]; newtabUR = document.createElement('li'); newtabUR.innerHTML = '<a href="#sidepanel-uroverview" data-toggle="tab">URO+</a>'; navTabs.appendChild(newtabUR); uroControls.id = "sidepanel-uroverview"; uroControls.className = "tab-pane"; tabContent.appendChild(uroControls); document.getElementById('_btnUndoLastHide').addEventListener("click", uroRemoveLastAddedIgnore, true); document.getElementById('_btnClearSessionHides').addEventListener("click", uroRemoveAllIgnores, true); uroEnableIgnoreListControls(); document.getElementById('_btnClearCamWatchList').addEventListener("click", uroClearCamWatchList, true); document.getElementById('_btnSettingsToText').addEventListener("click", uroSettingsToText, true); document.getElementById('_btnTextToSettings').addEventListener("click", uroTextToSettings, true); document.getElementById('_btnClearSettingsText').addEventListener("click", uroClearSettingsText, true); document.getElementById("_linkSelectUserRequests").onclick = uroShowURTab; document.getElementById("_linkSelectMapProblems").onclick = uroShowMPTab; document.getElementById("_linkSelectCameras").onclick = uroShowCameraTab; document.getElementById("_linkSelectMisc").onclick = uroShowMiscTab; document.getElementById("_linkSelectCWL").onclick = uroShowCamWatchlistTab; document.getElementById('_cbHideMyComments').onclick = uroExclusiveCB; document.getElementById('_cbHideAnyComments').onclick = uroExclusiveCB; document.getElementById('_cbHideIfLastCommenter').onclick = uroExclusiveCB; document.getElementById('_cbHideIfNotLastCommenter').onclick = uroExclusiveCB; document.getElementById('_cbHideIfReporterLastCommenter').onclick = uroExclusiveCB; document.getElementById('_cbHideIfReporterNotLastCommenter').onclick = uroExclusiveCB; uroAddLog('finalise onload'); uroLoadSettings(); uroNewLookCheckDetailsRequest(); if(document.getElementById('_cbEnableDTE').checked) { if(dteControlsIdx != -1) dteSetNewTabLength(); else { uroAddLog('ERROR - archive panel not found!'); document.getElementById(uroUserTabId).style.display = ''; } } if(document.getElementById('_cbEnableSRS').checked) { selectionManager.events.register("selectionchanged", null, srsCheckSidePanel); uroAddLog('added SRS event handler'); } // filter markers as and when the map is moved wazeMap.events.register("move", null, uroFilterURMarkers); wazeMap.events.register("mousemove", null, uroGetAMs); wazeMap.events.register("mousemove", null, uroNewLookHighlightedItemsCheck); uroSetStyles(uroCtrlURs); uroSetStyles(uroCtrlMPs); uroSetStyles(uroCtrlCameras); uroSetStyles(uroCtrlMisc); uroSetStyles(uroCamWatchlist); uroShowURTab(); uroRestyleWMETabs(); uroUserID = loginManager.getLoggedInUser().id; uroFilterURMarkers(); uroInitiateRefreshAMObjects(); } } else { uroURSCurrentCount = Object.keys(wazeModel.updateRequestSessions.objects).length; if(uroURSCurrentCount != uroURSPrevCount) { uroFilterURMarkers(); uroURSPrevCount = uroURSCurrentCount; } } } function uroToggleURCtrls() { uroCtrlsHidden = !uroCtrlsHidden; if (!uroCtrlsHidden) { document.getElementById('_hideUCCtrl').innerHTML = "hide"; if(uroCurrentTab == 1) uroShowURTab(); else if(uroCurrentTab == 2) uroShowMPTab(); else if(uroCurrentTab == 3) uroShowCameraTab(); else if(uroCurrentTab == 4) uroShowCamWatchlistTab(); else if(uroCurrentTab == 5) uroShowMiscTab(); } else { document.getElementById('_hideUCCtrl').innerHTML = "show"; document.getElementById('uroCtrlURs').style.display = 'none'; document.getElementById('uroCtrlMPs').style.display = 'none'; document.getElementById('uroCtrlCameras').style.display = 'none'; document.getElementById('uroCtrlMisc').style.display = 'none'; document.getElementById('uroCamWatchlist').style.display = 'none'; } return false; } function uroActiveTab(_id) { var e = document.getElementById(_id); e.style.backgroundColor = "aliceblue"; e.style.borderTop = "1px solid"; e.style.borderLeft = "1px solid"; e.style.borderRight = "1px solid"; e.style.borderBottom = "0px solid"; } function uroInactiveTab(_id) { var e = document.getElementById(_id); e.style.backgroundColor = "white"; e.style.borderTop = "0px solid"; e.style.borderLeft = "0px solid"; e.style.borderRight = "0px solid"; e.style.borderBottom = "1px solid"; } function uroInactiveAllTabs() { uroInactiveTab("_tabSelectCameras"); uroInactiveTab("_tabSelectMapProblems"); uroInactiveTab("_tabSelectMisc"); uroInactiveTab("_tabSelectUserRequests"); uroInactiveTab("_tabSelectCWL"); if(!uroCtrlsHidden) { document.getElementById('uroCtrlURs').style.display = 'none'; document.getElementById('uroCtrlMPs').style.display = 'none'; document.getElementById('uroCtrlCameras').style.display = 'none'; document.getElementById('uroCtrlMisc').style.display = 'none'; document.getElementById('uroCamWatchlist').style.display = 'none'; } } function uroShowURTab() { uroInactiveAllTabs(); uroActiveTab("_tabSelectUserRequests"); uroCurrentTab = 1; if(!uroCtrlsHidden) document.getElementById('uroCtrlURs').style.display = 'block'; return false; } function uroShowMPTab() { uroInactiveAllTabs(); uroActiveTab("_tabSelectMapProblems"); uroCurrentTab = 2; if(!uroCtrlsHidden) document.getElementById('uroCtrlMPs').style.display = 'block'; return false; } function uroShowCameraTab() { uroInactiveAllTabs(); uroActiveTab("_tabSelectCameras"); uroCurrentTab = 3; if(!uroCtrlsHidden) document.getElementById('uroCtrlCameras').style.display = 'block'; return false; } function uroShowCamWatchlistTab() { uroInactiveAllTabs(); uroActiveTab("_tabSelectCWL"); uroCurrentTab = 4; if(!uroCtrlsHidden) document.getElementById('uroCamWatchlist').style.display = 'block'; uroCWLUpdateHTML(); return false; } function uroShowMiscTab() { uroInactiveAllTabs(); uroActiveTab("_tabSelectMisc"); uroCurrentTab = 5; if(!uroCtrlsHidden) document.getElementById('uroCtrlMisc').style.display = 'block'; return false; } function uroTimbonesGetElementsByClassName(classname, node) { if(!node) node = document.getElementsByTagName("body")[0]; var a = []; var re = new RegExp('\\b' + classname + '\\b'); var els = node.getElementsByTagName("*"); for (var i=0,j=els.length; i<j; i++) if (re.test(els[i].className)) a.push(els[i]); return a; } function uroNewLookCheckDetailsRequest() { var thisurl = document.location.href; var doRetry = true; showurpos = thisurl.indexOf('&showur='); showproblempos = thisurl.indexOf('&showproblem='); showturnpos = thisurl.indexOf('&showturn='); endmarkerpos = thisurl.indexOf('&endshow'); if(endmarkerpos != -1) { if(showurpos != -1) { showurpos += 8; uroAddLog('showur tab opened'); var urID = thisurl.substr(showurpos,endmarkerpos-showurpos); uroAddLog(' UR ID = '+urID); if(wazeMap.layers[uroURLayerIdx].markers == null) { uroAddLog('wazeMap.layers not loaded, retrying...'); } else { for(var marker in wazeMap.layers[uroURLayerIdx].markers) { markerObj = wazeMap.layers[uroURLayerIdx].markers[marker]; if (urID == markerObj.model.fid) { doRetry = false; markerObj.icon.imageDiv.click(); } } } } else if((showproblempos != -1) || (showturnpos != -1)) { if(showproblempos != -1) { showproblempos += 13; uroAddLog('showproblem tab opened'); var urID = thisurl.substr(showproblempos,endmarkerpos-showproblempos); uroAddLog(' problem ID = '+urID); } else { showturnpos += 10; uroAddLog('showturn tab opened'); var urID = thisurl.substr(showturnpos,endmarkerpos-showturnpos); uroAddLog(' turn problem ID = '+urID); } if(wazeMap.layers[uroProblemLayerIdx].markers == null) { uroAddLog('wazeMap.layers not loaded, retrying...'); } else { for(var marker in wazeMap.layers[uroProblemLayerIdx].markers) { markerObj = wazeMap.layers[uroProblemLayerIdx].markers[marker]; if (urID == markerObj.model.fid) { doRetry = false; markerObj.icon.imageDiv.click(); } } } } } if(doRetry) setTimeout(uroNewLookCheckDetailsRequest,500); } function uroSetStyles(obj) { obj.style.fontSize = '12px'; obj.style.lineHeight = '100%'; obj.style.overflow = 'auto'; obj.style.height = (window.innerHeight * 0.55) + 'px'; } function uroWazeBits() { uroAddLog('adding WazeBits...'); if((uroWazeBitsPresent & 0x01) == 0) { if(typeof unsafeWindow.wazeMap != "undefined") { uroAddLog(' wazeMap OK'); wazeMap = unsafeWindow.wazeMap; uroWazeBitsPresent |= 0x01; } else if(typeof unsafeWindow.W != "undefined") { if(typeof unsafeWindow.W.controller != "undefined") { if(typeof unsafeWindow.W.controller.map != "undefined") { uroAddLog(' wazeMap OK'); wazeMap = unsafeWindow.W.controller.map; uroWazeBitsPresent |= 0x01; } } } } if((uroWazeBitsPresent & 0x02) == 0) { if(typeof unsafeWindow.wazeModel != "undefined") { uroAddLog(' wazeModel OK'); wazeModel = unsafeWindow.wazeModel; uroWazeBitsPresent |= 0x02; } else if(typeof unsafeWindow.W != "undefined") { if(typeof unsafeWindow.W.controller != "undefined") { if(typeof unsafeWindow.W.controller.model != "undefined") { uroAddLog(' wazeModel OK'); wazeModel = unsafeWindow.W.controller.model; uroWazeBitsPresent |= 0x02; } } } } if((uroWazeBitsPresent & 0x04) == 0) { if(typeof unsafeWindow.loginManager != "undefined") { uroAddLog(' loginManager OK'); loginManager = unsafeWindow.loginManager; uroWazeBitsPresent |= 0x04; } else if(typeof unsafeWindow.W != "undefined") { if(typeof unsafeWindow.W.app != "undefined") { if(typeof unsafeWindow.W.app.loginManager != "undefined") { uroAddLog(' loginManager OK'); loginManager = unsafeWindow.W.app.loginManager; uroWazeBitsPresent |= 0x04; } } } } if((uroWazeBitsPresent & 0x08) == 0) { if(typeof unsafeWindow.selectionManager != "undefined") { uroAddLog(' selectionManager OK'); selectionManager = unsafeWindow.selectionManager; uroWazeBitsPresent |= 0x08; } else if(typeof unsafeWindow.W != "undefined") { if(typeof unsafeWindow.W.geometryEditing != "undefined") { if(typeof unsafeWindow.W.geometryEditing.selectionManager != "undefined") { uroAddLog(' selectionManager OK'); selectionManager = unsafeWindow.W.geometryEditing.selectionManager; uroWazeBitsPresent |= 0x08; } } } } if((uroWazeBitsPresent & 0x10) == 0) { if(typeof unsafeWindow.OpenLayers != "undefined") { uroAddLog(' OpenLayers OK'); OpenLayers = unsafeWindow.OpenLayers; uroWazeBitsPresent |= 0x10; } } if((uroWazeBitsPresent & 0x20) == 0) { if(typeof unsafeWindow.Waze != "undefined") { uroAddLog(' Waze OK'); Waze = unsafeWindow.Waze; uroWazeBitsPresent |= 0x20; } } if((uroWazeBitsPresent & 0x40) == 0) { if(document.getElementById('user-tabs') != null) { uroUserTabId = 'user-tabs'; uroAddLog(' user-tabs OK'); uroWazeBitsPresent |= 0x40; } else if(document.getElementById('user-info') != null) { uroUserTabId = 'user-info'; uroAddLog(' user-info OK'); uroWazeBitsPresent |= 0x40; } } if((uroWazeBitsPresent & 0x80) == 0) { if(document.getElementById('sidepanel-drives') != null) { uroAddLog(' sidepanel-drives OK'); uroWazeBitsPresent |= 0x80; } } if(uroWazeBitsPresent != 0xFF) setTimeout(uroWazeBits,250); else if(loginManager.isLoggedIn() == false) { uroAddLog('Waiting for user log-in...'); setTimeout(uroWazeBits,1000); } else { uroAddLog('All WazeBits present and correct...'); uroControls.appendChild(uroCtrlURs); uroControls.appendChild(uroCtrlMPs); uroControls.appendChild(uroCtrlCameras); uroControls.appendChild(uroCamWatchlist); uroControls.appendChild(uroCtrlMisc); uroControls.appendChild(uroCtrlHides); uroControls.appendChild(uroAMList); uroCtrlURs.onclick = uroFilterURMarkers; uroCtrlMPs.onclick = uroFilterURMarkers; uroCtrlCameras.onclick = uroFilterURMarkers; uroCtrlMisc.onclick = uroFilterURMarkers; for(i=0;i<wazeMap.layers.length;i++) { if(wazeMap.layers[i].uniqueName == 'update_requests') uroURLayerIdx = i; if(wazeMap.layers[i].uniqueName == 'problems') uroProblemLayerIdx = i; if(wazeMap.layers[i].name == 'Spotlight') uroMaskLayer = i; if(wazeMap.layers[i].uniqueName == 'speed_cameras') { uroCamvroot = wazeMap.layers[i].div.id + '_vroot'; uroCamLayer = i; } if(wazeMap.layers[i].name.indexOf('Waze.Control.SelectHighlightFeature') != -1) uroRootContainer = wazeMap.layers[i].div.id; if(wazeMap.layers[i].uniqueName == 'area_managers') uroAMLayerIdx = i; } for(i=0;i<wazeMap.controls.length;i++) { if(wazeMap.controls[i].CLASS_NAME == 'Waze.View.ArchivePanel') dteControlsIdx = i; else if(wazeMap.controls[i].CLASS_NAME == 'Waze.Control.Archive') dteControlsIdx = i; if(wazeMap.controls[i].id != null) { if(wazeMap.controls[i].id.indexOf('UpdateRequests') != -1) uroURControlsIdx = i; if(wazeMap.controls[i].id.indexOf('MapProblems') != -1) uroProblemControlsIdx = i; } } uroAddLog('UR layer at idx '+uroURLayerIdx); uroAddLog('Problem layer at idx '+uroProblemLayerIdx); uroAddLog('uroMaskLayer at idx '+uroMaskLayer); uroAddLog('Camera layer at idx '+uroCamLayer); uroAddLog('AM layer at idx '+uroAMLayerIdx); uroAddLog('uroCamvroot = '+uroCamvroot); uroAddLog('uroRootContainer = '+uroRootContainer); uroDiv.addEventListener("mouseover", uroEnterPopup, false); uroDiv.addEventListener("mouseout", uroExitPopup, false); if(sessionStorage.UROverview_FID_IgnoreList == null) sessionStorage.UROverview_FID_IgnoreList = ''; if(sessionStorage.UROverview_FID_WatchList == null) sessionStorage.UROverview_FID_WatchList = ''; setInterval(uroTenthSecondTick,100); } } function uroEnterPopup() { uroMouseInPopup = true; } function uroExitPopup() { uroMouseInPopup = false; } function uroInitialise() { uroGlobals(); if(document.URL.indexOf('editor-beta') != -1) uroBetaEditor = true; // create a new div to display the UR details floaty-box uroDiv = document.createElement('div'); uroDiv.id = "uroDiv"; uroDiv.style.position = 'absolute'; uroDiv.style.visibility = 'hidden'; uroDiv.style.top = '0'; uroDiv.style.left = '0'; uroDiv.style.zIndex = 100; uroDiv.style.backgroundColor = 'aliceblue'; uroDiv.style.borderWidth = '3px'; uroDiv.style.borderStyle = 'ridge'; uroDiv.style.borderRadius = '10px'; uroDiv.style.boxShadow = '5px 5px 10px Silver'; uroDiv.style.padding = '4px'; document.body.appendChild(uroDiv); uroControls = document.createElement('section'); uroControls.style.fontSize = '12px'; uroControls.id = 'uroControls'; if(navigator.userAgent.indexOf('Chrome') == -1) { var updateURL = 'https://greasyfork.org/scripts/1952-uroverview-plus-uro'; } else { var updateURL = 'https://chrome.google.com/webstore/detail/uroverview/amdamgkgchnbaopmphhjapmjcdghdphi'; } tabbyHTML = '<b><a href="'+updateURL+'" target="_blank">UROverview Plus</a></b> '+uroVersion; tabbyHTML += '<p><table border=0 width="100%"><tr>'; tabbyHTML += '<td valign="center" align="center" id="_tabSelectUserRequests"><a href="#" id="_linkSelectUserRequests" style="text-decoration:none;font-size:12px">URs</a></td>'; tabbyHTML += '<td valign="center" align="center" id="_tabSelectMapProblems"><a href="#" id="_linkSelectMapProblems" style="text-decoration:none;font-size:12px">MPs</a></td>'; tabbyHTML += '<td valign="center" align="center" id="_tabSelectCameras"><a href="#" id="_linkSelectCameras" style="text-decoration:none;font-size:12px">Cams</a></td>'; tabbyHTML += '<td valign="center" align="center" id="_tabSelectCWL"><a href="#" id="_linkSelectCWL" style="text-decoration:none;font-size:12px">CWL</a></td>'; tabbyHTML += '<td valign="center" align="center" id="_tabSelectMisc"><a href="#" id="_linkSelectMisc" style="text-decoration:none;font-size:12px">Misc</a></td>'; tabbyHTML += '</tr></table>'; uroControls.innerHTML = tabbyHTML; uroCtrlURs = document.createElement('p'); uroCtrlMPs = document.createElement('p'); uroCtrlCameras = document.createElement('p'); uroCamWatchlist = document.createElement('p'); uroCtrlMisc = document.createElement('p'); uroAMList = document.createElement('div'); uroCtrlHides = document.createElement('div'); // UR controls tab uroCtrlURs.id = "uroCtrlURs"; uroCtrlURs.innerHTML = '<br>'; uroCtrlURs.innerHTML += '<b>Hide URs by type:</b><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterWazeAuto">Waze Automatic</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterIncorrectTurn">Incorrect turn</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterIncorrectAddress">Incorrect address</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterIncorrectRoute">Incorrect route</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterMissingRoundabout">Missing roundabout</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterGeneralError">General error</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterTurnNotAllowed">Turn not allowed</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterIncorrectJunction">Incorrect junction</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterMissingBridgeOverpass">Missing bridge overpass</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterWrongDrivingDirection">Wrong driving direction</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterMissingExit">Missing exit</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterMissingRoad">Missing road</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterBlockedRoad">Blocked road</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterMissingLandmark">Missing Landmark</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterUndefined">Undefined</input><br>'; uroCtrlURs.innerHTML += ' <i>Specially tagged types</i><br>'; uroCtrlURs.innerHTML += ' <input type="checkbox" id="_cbFilterCryosphere">Petrol Station Checker</input><br>'; uroCtrlURs.innerHTML += ' <input type="checkbox" id="_cbFilterRoadworks">[ROADWORKS]</input><br>'; uroCtrlURs.innerHTML += ' <input type="checkbox" id="_cbFilterConstruction">[CONSTRUCTION]</input><br>'; uroCtrlURs.innerHTML += ' <input type="checkbox" id="_cbFilterClosure">[CLOSURE]</input><br>'; uroCtrlURs.innerHTML += ' <input type="checkbox" id="_cbFilterEvent">[EVENT]</input><br><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbInvertURFilter">Invert operation of type filters?</input><br>'; uroCtrlURs.innerHTML += '<br><b>Hide closed/solved/unidentified URs:</b><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterClosedUR">Closed</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterSolved">Solved</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbFilterUnidentified">Not identified</input><br><br>'; uroCtrlURs.innerHTML += '<br><b>Filter URs by age of submission:</b><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbEnableMinAgeFilter">Hide URs less than </input>'; uroCtrlURs.innerHTML += '<input type="number" min="1" size="3" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;" id="_inputFilterMinDays"> days old<br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbEnableMaxAgeFilter">Hide URs more than </input>'; uroCtrlURs.innerHTML += '<input type="number" min="1" size="3" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;" id="_inputFilterMaxDays"> days old<br>'; uroCtrlURs.innerHTML += '<br><b>Filter URs by description text:</b><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbURDescriptionMustBePresent">Hide</input> or '; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbURDescriptionMustBeAbsent">show</input> URs with no description<br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbEnableKeywordMustBePresent">Hide URs not including </input>'; uroCtrlURs.innerHTML += '<input type="text" style="font-size:14px; line-height:16px; height:22px; margin-bottom:4px;" id="_textKeywordPresent"><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbEnableKeywordMustBeAbsent">Hide URs including </input>'; uroCtrlURs.innerHTML += '<input type="text" style="font-size:14px; line-height:16px; height:22px; margin-bottom:4px;" id="_textKeywordAbsent"><br>'; uroCtrlURs.innerHTML += ' <input type="checkbox" id="_cbCaseInsensitive">Case-insensitive matches?</input><br>'; uroCtrlURs.innerHTML += '<br><b>Hide URs by comments/following:</b><br>'; uroCtrlURs.innerHTML += '<i>With comments from me?</i><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbHideMyComments">Yes </input>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbHideAnyComments">No</input><br>'; uroCtrlURs.innerHTML += '<i>If last comment made by me?</i><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbHideIfLastCommenter">Yes </input>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbHideIfNotLastCommenter">No </input><br>'; uroCtrlURs.innerHTML += '<i>If last comment made by UR reporter?</i><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbHideIfReporterLastCommenter">Yes </input>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbHideIfReporterNotLastCommenter">No</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbEnableMinCommentsFilter">With less than </input>'; uroCtrlURs.innerHTML += '<input type="number" min="1" size="3" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;" id="_inputFilterMinComments"> comments<br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbEnableMaxCommentsFilter">With more than </input>'; uroCtrlURs.innerHTML += '<input type="number" min="0" size="3" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;" id="_inputFilterMaxComments"> comments<br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbHideMyFollowed">Ones I am or </input>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbHideMyUnfollowed">am not following</input><br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbEnableCommentAgeFilter2">Last comment less than </input>'; uroCtrlURs.innerHTML += '<input type="number" min="1" size="3" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;" id="_inputFilterCommentDays2"> days ago<br>'; uroCtrlURs.innerHTML += '<input type="checkbox" id="_cbEnableCommentAgeFilter">Last comment more than </input>'; uroCtrlURs.innerHTML += '<input type="number" min="1" size="3" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;" id="_inputFilterCommentDays"> days ago<br>'; // Map problems controls tab uroCtrlMPs.id = "uroCtrlMPs"; uroCtrlMPs.innerHTML = '<br>'; uroCtrlMPs.innerHTML += '<b>Filter MPs by type:</b><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterMissingJunction">Missing junction</input><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterMissingRoad">Missing road</input><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterCrossroadsJunctionMissing">Missing crossroads</input><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterDrivingDirectionMismatch">Driving direction mismatch</input><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterRoadTypeMismatch">Road type mismatch</input><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterRestrictedTurn">Restricted turn might be allowed</input><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterUnknownProblem">Unknown problem type</input><br><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterTurnProblem">Turn Problems</input><br><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbInvertMPFilter">Invert operation of type filters?</input><br>'; uroCtrlMPs.innerHTML += '<br><b>Hide closed/solved/unidentified Problems:</b><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterClosed">Closed</input><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterSolved">Solved</input><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterUnidentified">Not identified</input><br><br>'; uroCtrlMPs.innerHTML += '<br><b>Hide problems (not turn) by severity:</b><br>'; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterLowSeverity">Low</input> '; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterMediumSeverity">Medium</input> '; uroCtrlMPs.innerHTML += '<input type="checkbox" id="_cbMPFilterHighSeverity">High</input><br>'; // Camera controls tab uroCtrlCameras.id = "uroCtrlCameras"; uroCtrlCameras.innerHTML = '<br><b>Show Cameras by creator:</b><br>'; uroCtrlCameras.innerHTML += '<input type="checkbox" id="_cbShowWorldCams" checked>world_* users</input><br>'; uroCtrlCameras.innerHTML += '<input type="checkbox" id="_cbShowUSACams" checked>usa_* users</input><br>'; uroCtrlCameras.innerHTML += '<input type="checkbox" id="_cbShowNonWorldCams" checked>other users</input><br>'; uroCtrlCameras.innerHTML += '<br><input type="checkbox" id="_cbShowOnlyMyCams">Show ONLY cameras created/edited by me</input><br>'; uroCtrlCameras.innerHTML += '<br><b>Show Cameras by approval status:</b><br>'; uroCtrlCameras.innerHTML += '<input type="checkbox" id="_cbShowApprovedCams" checked>approved</input><br>'; uroCtrlCameras.innerHTML += '<input type="checkbox" id="_cbShowNonApprovedCams" checked>non-approved</input><br>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbShowOlderCreatedNonApproved"> if created more than </input>'; uroCtrlCameras.innerHTML += '<input type="number" min="1" size="3" style="width:50px;;line-height:14px;height:22px;margin-bottom:4px;" id="_inputCameraMinCreatedDays"> days ago<br>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbShowOlderUpdatedNonApproved"> if updated more than </input>'; uroCtrlCameras.innerHTML += '<input type="number" min="1" size="3" style="width:50px;;line-height:14px;height:22px;margin-bottom:4px;" id="_inputCameraMinUpdatedDays"> days ago<br>'; uroCtrlCameras.innerHTML += '<br><b>Show Cameras by type:</b><br>'; uroCtrlCameras.innerHTML += '<input type="checkbox" id="_cbShowSpeedCams" checked>Speed</input><br>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbShowIfMPHSpeedSet" checked> with MPH speeds</input><br>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbShowIfKPHSpeedSet" checked> with KM/H speeds</input><br>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbShowIfNoSpeedSet" checked> with no speed</input><br>'; uroCtrlCameras.innerHTML += '<input type="checkbox" id="_cbShowRedLightCams" checked>Red Light</input><br>'; uroCtrlCameras.innerHTML += '<input type="checkbox" id="_cbShowDummyCams" checked>Dummy</input><br>'; uroCtrlCameras.innerHTML += '<br><b>Hide Cameras by creator:</b><br>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideCreatedByMe">me</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideCreatedByRank0">L1</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideCreatedByRank1">L2</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideCreatedByRank2">L3</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideCreatedByRank3">L4</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideCreatedByRank4">L5</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideCreatedByRank5">L6</input>'; uroCtrlCameras.innerHTML += '<br><b>Hide Cameras by updater:</b><br>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideUpdatedByMe">me</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideUpdatedByRank0">L1</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideUpdatedByRank1">L2</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideUpdatedByRank2">L3</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideUpdatedByRank3">L4</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideUpdatedByRank4">L5</input>'; uroCtrlCameras.innerHTML += ' <input type="checkbox" id="_cbHideUpdatedByRank5">L6</input>'; uroCtrlCameras.innerHTML += '<br><br><b><input type="checkbox" id="_cbHideCWLCams">Hide cameras on CWL</input></b><br>'; // Camera watchlist tab uroCamWatchlist.id = "uroCamWatchlist"; uroCWLUpdateHTML(); // Misc controls tab uroCtrlMisc.id = "uroCtrlMisc"; uroCtrlMisc.innerHTML = '<br><b>Use default conversation markers:</b><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbNativeConvoMarkers" checked>in public WME</input><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbNativeBetaConvoMarkers" checked>in beta WME</input><br>'; uroCtrlMisc.innerHTML += '<br><br><b><input type="checkbox" id="_cbCommentCount">Show comment count on UR markers</input></b><br>'; uroCtrlMisc.innerHTML += '<br><br><b>Use custom marker for URs tagged as:</b><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbCustomRoadworksMarkers">[ROADWORKS]</input><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbCustomConstructionMarkers">[CONSTRUCTION]</input><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbCustomClosuresMarkers">[CLOSURE]</input><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbCustomEventsMarkers">[EVENT]</input><br>'; uroCtrlMisc.innerHTML += '<br><br><b>Disable popup for:</b><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbInhibitURPopup">URs</input><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbInhibitMPPopup">MPs</input><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbInhibitCamPopup">Cameras</input><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbInhibitSegPopup">Segments</input><br>'; uroCtrlMisc.innerHTML += '<br><br><b><input type="checkbox" id="_cbWhiteBackground">Use white background</input></b><br>'; uroCtrlMisc.innerHTML += '<br><br><b><input type="checkbox" id="_cbHideAMLayer">Hide Area Manager polygons</input></b><br>'; uroCtrlMisc.innerHTML += '<br><b>Enable integrated scripts:</b><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbEnableDTE">Drive Tab Enhancement</input><br>'; uroCtrlMisc.innerHTML += '<input type="checkbox" id="_cbEnableSRS">Select Roundabout Segments</input><br>'; uroCtrlMisc.innerHTML += '<br><br><b>Settings backup/restore:</b><br>'; uroCtrlMisc.innerHTML += '<input type="button" id="_btnSettingsToText" value="Backup"> '; uroCtrlMisc.innerHTML += '<input type="button" id="_btnTextToSettings" value="Restore"> | '; uroCtrlMisc.innerHTML += '<input type="button" id="_btnClearSettingsText" value="Clear"><br>'; uroCtrlMisc.innerHTML += '<textarea id="_txtSettings" value="">'; // footer for tabs container uroCtrlHides.id = 'uroCtrlHides'; uroCtrlHides.innerHTML = '<input type="button" id="_btnUndoLastHide" value="Undo last hide"> '; uroCtrlHides.innerHTML += '<input type="button" id="_btnClearSessionHides" value="Undo all hides"><p>'; // footer for AM list uroAMList.id = 'uroAMList'; window.addEventListener("beforeunload", uroSaveSettings, false); uroWazeBits(); } function dteAddHeader() { rlcObj = document.getElementsByClassName("result-list-container"); if(typeof rlcObj == "undefined") return; if(typeof rlcObj[0].children[0] == "undefined") return; if(typeof rlcObj[0].children[0].innerHTML == "undefined") return; var thtml = rlcObj[0].children[0].innerHTML; if(thtml.indexOf('Full drive history') == -1) { thtml += '<br><br><i><small>Full drive history goes back to '+dteOldestFullDrive.toDateString()+'</small></i>'; rlcObj[0].children[0].innerHTML = thtml; } } function dteSetNewTabLength() { uroAddLog('altering ResultsPerPage parameter...'); var t = document.getElementById('sidepanel-drives'); t.style.overflow = 'auto'; t.style.height = (window.innerHeight * 0.6) + 'px'; baseloc = 'https://'+window.location.hostname+Waze.Config.api_base+'/Archive/MyList?minDistance=1000'; var a = new XMLHttpRequest(); var idxCheckFullDrive = 0; var fullDrives = 0; var foundMissingDrive = false; while(!foundMissingDrive) { document.getElementById(uroUserTabId).style.display = 'none'; var loc = baseloc+'&offset='+fullDrives+'&count=5'; uroAddLog('requesting '+loc); a.open('GET',loc,false); a.send(); var b = JSON.parse(a.responseText); var loadedDrives = b.archives.objects.length; uroAddLog('received '+loadedDrives+' drives'); if(loadedDrives != 5) foundMissingDrive = true; for(var loop=0; loop < loadedDrives; loop++) { if(b.archives.objects[loop].hasFullSession == false) foundMissingDrive = true; else { fullDrives++; dteOldestFullDrive = new Date(b.archives.objects[loop].startTime); } } } uroAddLog(fullDrives+' full drives in history'); uroAddLog('oldest drives are on '+dteOldestFullDrive.toDateString()); if(fullDrives < 5) { fullDrives = 5; uroAddLog('insufficient full drives, using standard drives tab'); } else if(fullDrives > 50) { uroAddLog('too many full drives for a single tab page, splitting over multiple pages...'); fullDrives = Math.ceil(fullDrives/Math.ceil(fullDrives/50)); } document.getElementById(uroUserTabId).style.display = ''; if((dteOldestFullDrive - dteEpoch) > 0) { uroAddLog('updating drives tab...'); wazeMap.controls[dteControlsIdx].sidePanelView.ResultsPerPage = fullDrives; setInterval(dteAddHeader,250); } } function srsSelect() { rbtID = selectionManager.selectedItems[0].attributes.junctionID; uroAddLog('selecting roundabout ID '+rbtID); selectionManager.selectControl.unselectAll(); for(var seg in wazeModel.segments.objects) { if(wazeModel.segments.objects[seg].attributes.junctionID == rbtID) { uroAddLog('...adding segment '+seg); selectionManager.selectControl.select(wazeModel.segments.objects[seg]); } } } function srsCheckSidePanel() { if(selectionManager.selectedItems.length == 0) return; if(document.getElementById('srsCtrl') != null) return; if(selectionManager.selectedItems[0].attributes.junctionID == null) return; srsCtrl = document.createElement('section'); srsCtrl.id = 'srsCtrl'; srsCtrl.innerHTML = '<button id="srsButton" class="btn">Select roundabout</button>'; document.getElementById('segment-edit-general').appendChild(srsCtrl); document.getElementById('srsButton').onclick = srsSelect; } uroBootstrap();