WME DOT Advisories

Overlay DOT Advisories on the WME Map Object

当前为 2022-01-31 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name WME DOT Advisories
  3. // @namespace https://greasyfork.org/en/users/668704-phuz
  4. // @require https://greasyfork.org/scripts/24851-wazewrap/code/WazeWrap.js
  5. // @version 1.67
  6. // @description Overlay DOT Advisories on the WME Map Object
  7. // @author phuz
  8. // @include /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor\/?.*$/
  9. // @require http://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js
  10. // @require https://cdnjs.cloudflare.com/ajax/libs/tablesort/5.2.1/tablesort.min.js
  11. // @require https://cdnjs.cloudflare.com/ajax/libs/tablesort/5.2.1/sorts/tablesort.number.min.js
  12. // @require https://cdnjs.cloudflare.com/ajax/libs/tablesort/5.2.1/sorts/tablesort.date.min.js
  13. // @require https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js
  14. // @grant GM_xmlhttpRequest
  15. // @grant GM_info
  16. // @grant GM_fetch
  17. // @grant GM_addStyle
  18. // @connect 511nj.org
  19. // @connect 511ny.org
  20. // @connect 511pa.com
  21. // @connect 511wi.gov
  22. // @connect arcgis.com
  23. // @connect deldot.gov
  24. // @connect essentialintegrations.com
  25. // @connect fl511.com
  26. // @connect md.gov
  27. // @connect mi.us
  28. // @connect ohgo.com
  29. // @connect rehostjson.phuz.repl.co
  30. // @connect tripcheck.com
  31. // @connect iteris-atis.com
  32. // @connect carsprogram.org
  33. // @connect phoenix.gov
  34. // @connect 511virginia.org
  35. // @connect 40.121.218.107
  36. /* global OpenLayers */
  37. /* global W */
  38. /* global WazeWrap */
  39. /* global $ */
  40. /* global I18n */
  41. /* global _ */
  42.  
  43. // ==/UserScript==
  44.  
  45. let AKDOTLayer, AZDOTLayer, CTDOTLayer, DEDOTLayer, FLDOTLayer, GADOTLayer, IADOTLayer, ILDOTLayer, INDOTLayer, LADOTLayer, MDDOTLayer, MIDOTLayer, MNDOTLayer, NCDOTLayer, NJDOTLayer, NVDOTLayer, NYDOTLayer, OHDOTLayer, ORDOTLayer, PADOTLayer, TXDOTLayer, VADOTLayer, WADOTLayer, WIDOTLayer, WVDOTLayer;
  46. let promisesAK, promisesAZ, promisesCT, promisesDE, promisesFL, promisesGA, promisesIA, promisesIL, promisesIN, promisesLA, promisesMD, promisesMI, promisesMN, promisesNC, promisesNJ, promisesNV, promisesNY, promisesOH, promisesOR, promisesPA, promisesTX, promisesVA, promisesWA, promisesWI, promisesWV;
  47. let advisoriesAK, advisoriesAZ, advisoriesCT, advisoriesDE, advisoriesFL, advisoriesGA, advisoriesIA, advisoriesIL, advisoriesIN, advisoriesLA, advisoriesMD, advisoriesMI, advisoriesMN, advisoriesNC, advisoriesNJ, advisoriesNV, advisoriesNY, advisoriesOH, advisoriesOR, advisoriesPA, advisoriesTX, advisoriesVA, advisoriesWA, advisoriesWI, advisoriesWV;
  48. let AKFeed = [], AZFeed = [], CTFeed = [], DEFeed = [], FLFeed = [], GAFeed = [], IAFeed = [], ILFeed = [], INFeed = [], LAFeed = [], MDFeed = [], MIFeed = [], MNFeed = [], NCFeed = [], NJFeed = [], NVFeed = [], NYFeed = [], OHFeed = [], ORFeed = [], PAFeed = [], TXFeed = [], VAFeed = [], WAFeed = [], WIFeed = [], WVFeed = [];
  49. let endpointsLayer;
  50. let settings;
  51. let mapBounds;
  52. let state, stateLength, advisories;
  53. const updateMessage = "► Updated Relay Server";
  54. const DEIconC = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2NTZCOTQ4MEMxM0FFNDExOTJCNzgxMEFBMkM5Q0QzRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRjU0MDFBMUJBMEYxMUU1OERGQ0YxMTRGNzU2OUVFMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRjU0MDFBMEJBMEYxMUU1OERGQ0YxMTRGNzU2OUVFMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgV2luZG93cyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkYwRjVFQTIwMDlCQUU1MTE4NEU2OTRCNTE0QTVGRkIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjY1NkI5NDgwQzEzQUU0MTE5MkI3ODEwQUEyQzlDRDNFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+iRjjNgAABVBJREFUeNqsVwlsVFUUPX+Z+Z1OoaWFSqFaU0hYBSSiCdYQhaRKNdFAUlRcMAFL1ABBESMouEYxwTSxRutWIkbBqKQEwxZoWKKGrcoiAqKsBStLO+1s/8/zvP+nzLTzZzpRX+a00+n999x391GEEOh5xOXTsM7+Amgq0px8ojT++wJxjgi6SsZiUIw8aEPuABTl2se6m6z560Z0rpoNJcdI/ngg8QAxlRhFFBNSIEC0ED8R3xIbiEhCWRjqwBHIW9zMi3gyE9M0+xW3UEovJBZAkIyKhEUvJRxVQNkCxaMNp+JH+fcBYhmxzlGldLtpL8TXDBjEHw3EFEQdT6qDxkAfUgG1ZDQUf6ETltN7YZ7YCfH3GZqpj6MB31F0BbGYOmLOLbInlq7cZLs1FIR243gYdy+FPoqe1rxAOADr1D5o46udvAj8heiPDQhvfovvWwGv7znbG8AcN+Wu2aNoHmnix12knomPwz+/CfqY+x1SntC65xF4ZZJNZj+TNwDeyc/CP2871ME3Mcq2h2YT87Imti4enUXv3GuT3vogfDM/5Q3yEgLBK4juXwtB82zipMpQS0bBX7Meav9yJpadY6/TrGE93Z3iatHW0iey+6OXZT6oxUOQU/1earlZURiVLzo3ZalAmHyTyFil3w3ImfE+OuuqZD35IWJLyTuzuxJam4xwU231lRqIK3MhIjvqxH85HR/cZ+tpW5gXsM4fHpTMk3Jj61hTpSwVtV8x9LHTUuPA7A6ufdpJIJWPR8PQym6BMXVZiqh3wiMwmxshOgJ+83hThXfgiDXurjYjitVyZKx8q8ly6VOcGv/fdyGy/RMnO2TYLL6Ob4O34kkofUu6yWplE1hy+Yi1X4V1cvftqKhZ45pcInTVJzovDXDidL1rjUWPbISSmwu1oAhqPlFYxBDS5mNNqdXh70/ZQrvZiFB7QYbkkhIxJV5TrsRG5RIYUxZ170Yxwfbqd6lL1UHc82mJFU9uWPH6A7YJ7RdSFUU6IIJXaZOW3DIdk9s7oRQMduLe9Rll6UVHty//YvobG3mWet3w/VbLyeGxlkN2d4KRqN/w98sR3vIub5fbs8AgwiHkPrEa+rjpCUecP8gkvGQ7Ryu9eU/GBqKPvKfRfqj1T5hHt8QVHOLE2oTogW/IEeWrsweCLOUIWP8wf9vG/n3KyQfZZEyORZ8vpA+dtCMz8eiqzWqfvq2yG0W2vuPcdP0SdLxdSWNO0HS6OWalgNMJ5uGNCLx5Fw38mo3gDKJ7v4KiK1AKy7aoJSP/yNi51KLyVs/46vrIzvoXzGO7EN70BnKmrYT3zvnJiZJporEiShH8fBZj3OYsE5pe2/NZ1+mklU+sFTvq5yiGURRuXGqXhLeiBtmeYMPDvD3DlOOTiwB9L7aix6ajpllX5Ebxmm2lpiP05VyEeAPb1RmOxfh2rLiNg+MLh5S0xCKpMct5bFtXRzwEVZsAbw4T5zNEDzZyHldBHzYZ6oChHPq5EJ2XETvXDPPQBibWdrJHu0jlWUnscWPItAjImSb9u1NWoVQmQm2I/LDKhqLzUZWJZkWYucIJoYcrmHaN9DCxPJ3y3rJlH/FMQlrnGPTZkCFwTDdY1z65cSQnX8D2FtDxb4kR30Tq3BfCrkmRcqSnmjMpVbNM1AXE1ixlXyJW9yaULbGM94zebsHzIfFqNgpVZH84+bmHAT+n+f/auIvxfxPLw8UZVS7kco9+DCkzK/1xLyc52S3YpZKGXH6NWU+MI+qJp+RMcO8qMae2syGWLVIbPIIj0Uhn8FlCLmTT498Y0t/UjLLZlKd8jflHgAEAjYU+RhKpTDQAAAAASUVORK5CYII=';
  55. const DEIconSchRestriction = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNTdDRTI5RjhFOENFNTExQkIwQkQ3QjFGMjA1NkNGMiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0MzMwRkNCMUJBMDcxMUU1OTE5RjkwMEI5NThDNEVCMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0MzMwRkNCMEJBMDcxMUU1OTE5RjkwMEI5NThDNEVCMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgV2luZG93cyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjI4Q0M2MTJGNEVCOUU1MTE4NEU2OTRCNTE0QTVGRkIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA1N0NFMjlGOEU4Q0U1MTFCQjBCRDdCMUYyMDU2Q0YyIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YotOJgAABWdJREFUeNqcVwlsFFUY/nY7e7S0tPbQSkstUUu01NBWSzQKIjQaUbAxapAEj5g0KtEYRdEIeETjFYRglEDEIBgleIBnrGgjQY5C01SKFmrTi5ZSethjt7vt7o7fmzfb3ens0fqSL7Mz7/3/995/vX8tqqpCG2oA+LcRCPgAC+KNDCJZ/z0MW0o/rLbYEhYrkJgtn+J1gnh8CNhXBLguAFaTmINYSiwjridyiCR9zgXF2QmLcoK/vyd+I8YM0oLCMRO4pwZwZmqfFMOsfxTweScTP0QLrOV0Ifx8ExAWSdBn/UiD6s3hexnxJL/8SbxDfGYgVr3SqvoIIxbarPIhTX0psZ1YAZ+cQnYJMOs2IItPJZFu4S58LqCHJ+n8FehtFLLXcQN7uLqCqCT6pHpSWSyRiA0jj/iBO52nkeYtAkpepoGXTOwK395CUg/N9wdw9WpugtZt+w6ofR3orgfsuJerrtTd0zWZwBqBNIXYr5EKy9z4GnB3NUmXhkhPchOth4FzJ4Fjz+ma7MAcclUcAeY/zpjRvs4nvg6Lh5jEbxPFmi8XbuFJ18MQ5kNNQP37MtycRMM2oL8+NJ9Ajps/ZAg+GyRfQLwRj7iYHJWaQNFjQOFT5m0dfx5wu4HyvTzdMRltR58xr1vwHi1QDs1VwBqiMAqxRTh/DfVYMZNxVfaWWVlnFdC0X/gPSJ8HZJby5PRMC13R8qV5/U2budYholqh7ifCLRci9vYnM5fv0ExcwGBxZBiViOAJ+lOkxxjzfnxYFhyhpWadjPDwkXYtcMWd8tR+7zL43E4z8cDpAnjcsyAKUP4K8+7/+gg4f0rmgQg6Ty/JB6nULb9dbAZObTLLzamQB/W68zDcfJWZ2N2Vq+0skRUmtcAoPNot00QJKwieHoIp6tMrn9hw3bvASKtRNp3V0GYRoWDByLkcM7Ewg9BhI7Et2Shcu4EVuS9UrVT9xN5+efqgplGavuZFo6w9jRu2Sxm/22EmtqeOaCYRvgz4QoK9LMGnd8qAUsPKTgcD7ewu42bEqc9+QZdUG2MjePHY00bMxDNy26lQhYencHeHBEVA+f1m3xU9DZRuCEZtGJGQWctv+uZH2hmElFcsPiTPbjcTp81thsPRDg8FLhyW3/5hnW87FLmw9taxNLJcBgLGa1Ss7aoFGnfoKVgto1qxNSE5v9VM7MgYReo1P2m7b9rNxcJfL0il6iSIb0c3AlWP0hrj5nmhtfZVEbDM733yPb3oG8aOz0ycwNumdP02+iyAjt9Ziw/IPLQ5IyORSIoypxAZxfLUvU2CxY3SV3ZogRvxdkq6vJ7EuxBQH8Hxl4C7fuEKLg54p9KVhNVDEg+dAX5cLoMvgE1IcBjyzEgsAkLFOn4tx2BHLqru56XGpiIlH9MaffT/wVVMtyHBUEfiN0N5F/126iH5aqaGDxfZTHzFy6X586kRBujvhq28VBcy7zsFaT91rRIZPnlptEagmgKVJP8YrvPAzw/yPuZVN/dhdiC3ss2bLe9frfWhzuEW5jXdcuYTZkS91KrAQx0P8NffkQiUGPvfScEU2mSzZpdOcfETTvpvBiuf4xIZwqKCuXg6r35ZyGZzjFMr+TwYTbkSx3hb9PZu68RK0e4MNIfSKohQdyvMKkgPxIy/KXjuA63TDPYTwQ5T0Z9WQ4MyQCyPRzpVYjE+1bvGwRhrOojbo5pX/X/E0LpONjxEm2nGjwbmwBLihFYeI0H1x/CxGpdc/FtYTIg+p0S/FA6hbON9yCzuiSol9GbdECu41Ml5Hmm06H9n9opbmaddiZzFLmQvmlaNCf13kn0Xb5wjUy2PNm2nKg15GYuMM2taxP8JMAC5wMrd7FP1/wAAAABJRU5ErkJggg==';
  56. const DEIconSchClosure = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAoCAYAAADpE0oSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTYxOTU5RkJGMkQ3MTFFNkI5NERERDM2Qzg4NzcwRUYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTYxOTU5RkNGMkQ3MTFFNkI5NERERDM2Qzg4NzcwRUYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFNjE5NTlGOUYyRDcxMUU2Qjk0REREMzZDODg3NzBFRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFNjE5NTlGQUYyRDcxMUU2Qjk0REREMzZDODg3NzBFRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuSU594AAAfTSURBVHja5Fh7cJTV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';
  57. const Incident = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA/ppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjVEMjA4OTI0OTNCRkRCMTE5MTRBODU5MEQzMTUwOEM4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjk4MDFDMjUwNzIzRDExRTNBQTczRjkyOTZEQ0IyOTY0IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk4MDFDMjRGNzIzRDExRTNBQTczRjkyOTZEQ0IyOTY0IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIElsbHVzdHJhdG9yIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ1dWlkOmFiMzczNzVkLWIwYTYtNDRjNC04OTE4LWU4M2ZiOTRhOGY4NSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpjMjUyYWZlMC1mMjU0LWY5NDMtOGZiZi0wMTc3Mzc1ZWEzYzYiLz4gPGRjOnRpdGxlPiA8cmRmOkFsdD4gPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij5JbmNpZGVudHNfb3V0bGluZWQ8L3JkZjpsaT4gPC9yZGY6QWx0PiA8L2RjOnRpdGxlPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmcc3z4AAASdSURBVHja7FdLaFxVGP7OPfc1M5lMJ5M0Gk0nNdE+sogPLNG2KNaFUksqlkAjSGtcCBJUWgouhErAUOhCwb2uXJQupCtF0I102SrEUsFNkRaxJJ3MTGbu+/j/J2lnKp04HdNkY+AnZ875/u9853/ce65QSmEz/wxs8t//AjZdgDkytL1j5whIaRKgvuERCIH9UDjHpsedRqATJwE8Yimcn5LuVv79deztEQJPU0Nf35AILCZq7lXX3jqds8DGY5574Cmgk6OS4PCoJaamcvSjO9HGY57jtQcqwFPot1V85lhByPHptzBw7jttz9H4eK8hnSQ+4xPmfjhlz5YtbQHprChH6vRrTuXQqddfgP3+HGSuANnVDYw9ix3XL+G3X68UfgkduFJ8L9Y7AvUYL+7MipMndig4eQdKNOqXx07exomdCoxh7LqmIFRwbYHP3t1uYHevgXq9CgRNre/X9ByvMYax7LN+EVA4/XKfMTbRJ3GzYiKs+lCh31gOA4Tlul5jDGPZZ10ERAp7C7aYmX7YgvIl6p4Fv+IjCcJGfZAAvxroNcYwln3Y978KkLVEfXK0z0yPmAbKNYEglAjKAZ06bIpAhKASIvBXMIxlH/Zljo4EcBUvRsl7e7vkgYMZC/Ua554E0An98j8iEFAEyh6CwNQYxrIP+zKH6ERATanhHtP46M2sgxydurRMdeeRAM+Ed8tD4gcNAV6g53zf1BjGsg/7Mgdz3ZcAeqbTo158fiRtP/SMsPAnEYYU3sAz6L+EV/IQeY0ijFnAko+I1lYwhvZhX+ZgLuZsW0BVqalRUx6ckA7lVMH3WMCqhSSEU+A3UhBTOgIWEBp3cOzDvszBXMzZlgCiHcwL8ekbho1UYIAKHoqinfirFlIaKAJJEDfVQKTnYlq7jWMf9mUO5mJO5l5TgNKXDDW3H/bAk7GFcqD0hnGTJTGFWatqdiRRVIS8dheWjDmYizmZW60lgACHt0EemVAOkdFJknubYbtY+nn+jl+ZxobltsQzF3MyN+9xV7cNF4f0YahVBkKlLp6UmeI+Kp4qvX5afjEkCjLloO/QK/rnXxe+pU6gqBiiZUt30Vl/UiHOxsvXLCGeJ+4b4nYEeHBLqVMHLKu4zzWROAmodmC2MEP4SA32Izu6W1u62K/nWuGZizmZm/fgvUTzlWw5US8Nm3JmMuMgQzOlVj2jn3pUSl0mRmY/RveecT2X2TWMq++8Te0QQtj39uSSzdKuk5aD+Uoy80cUX8gY4geTaiRPX2ezk92WMZaTWIiTNV9jyo8gM1m4xcZt2t1WRLrgIi6XIdzW10x6gGNMSkwKyzi7EM/S3pdlKpv7YCJvHf/wURvKVrApXKm1LC1h+SU4jgV7eBddk+qof/Mloks/IpNPI+W29nU5fY7CU90GbgRq8Eo9LplpQ4w/QZeaJBVhgaIr2rnKOGlUzn8BZ/7iynXg6mUYhfRqoP/lzU7p7aUs8Z7pJTEuHisOHe1z8FUPvUljhfY+lVkl9VdSXVrp5QyxUWjR5pe2FBCLVC43fRwTj1Mb0kVypBbrLtqQb3XqYkGZhCPw+98CDACt/EZVMWT0ogAAAABJRU5ErkJggg==';
  58. const Roadwork = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA/VpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjVEMjA4OTI0OTNCRkRCMTE5MTRBODU5MEQzMTUwOEM4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkUzRjQ0OTg5NzIzOTExRTM4ODlCRkYwNDVGNDI0RjlEIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkUzRjQ0OTg4NzIzOTExRTM4ODlCRkYwNDVGNDI0RjlEIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIElsbHVzdHJhdG9yIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ1dWlkOmFkOTA4NmJkLTAzMGEtNDA0MS04ZTdiLWJhZGYwNWRmZDMzZiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDplNDcyMTVkOS0xOGEyLWU0NDItYTk4OS03Nzc4ZTYwNDZjNTUiLz4gPGRjOnRpdGxlPiA8cmRmOkFsdD4gPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij5XZWF0aGVyX2FsZXJ0PC9yZGY6bGk+IDwvcmRmOkFsdD4gPC9kYzp0aXRsZT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4zw2obAAAFp0lEQVR42rxX3W8UVRQ/5947M9ud/ej39ydtKe3yKRRoC4VQkAhGlEhMDOHBv0BejPFBH33Ud+OD8Q/wgTff/ANUFGKiMYIJBhEoUHbLzu7Mvf7uzGysQKNdW7e9md3Zuef8zu+c87tn2RhDjdfE6Bht4MVPIrpUN2ZfTvGHkuiO2cDmn2/eiK+KmnytRmbqQFF+3OVy61fL0Upo6H3JG7cjmnEeaCJP0PG3J93WT/e10KDHl1Yi09GMraYAVEKTGc/JC9OdIN4lmsmKEWRyv/k/ANiSYUNTpVZ5rA8ADCzMtUvqdPh8XW/c3oY31AGgw+MX5/uUJEdQoJgWAaTb4VdQkG1bDqAWGa8nK84fHXIoQNGFGUFDeUE7sqJPMh81WwnAGkfAUzNFcaC/XVBodzsA4TId7xLkMV3QZgsBRDCekfz6yQGl6szELrYLJg0WFjoVtSo6hgYpbhkADevtGXFuYdwlbZ1LQcBBBgx0AQR0oQc0vbaVNbAw1y23t+dlnAvGxYLQYEG1MJ3ukgoYtwZAmto3To27GQfRGji1IITLsZ46OUG7C3E7voBUDW86ABSX6vZ4cWe/ItkCAHDKAGDcBEiECuxAN8y3yYGqNmc3HcBqaE4cGVATHRk4Q/TsJFtZJAxYfSgWBC32Sq5GtLTpAII6nT0+4fn5oqLQdgCiJpw+DAuMz8amAyyUoIrDLTyH82Jy0wDAWG4iLxZLPQi1oOAsaT8LwKAIyYHzrIQuMI3i3rF22f+wbpZ4swA8rOqlpVG1a6QD2k9J9EnkFHdCnA78B7jmioLmCvYmnYr+xXH/jwC0zTPR0sEeR7poPytA8S5Oii8GYlNhhwGkgNAhJQCYzorTmBmm/zOASt30ltrk0q5RnLsuGOC08KxDkaZAJe8tiBr27GgTNNsq/MchHfnPAFaq5sBsr5qZ7HNsKyaRykYBJitmIxYldENWkNuraB+KMUN0BpqQaRoAxizyBS3tH3SIQX/YcC6SvMTXNe85BWJnhkPQiu2+OFmOzEjTACo1U5jpVuePWPojSiNPc27SyC0Lti3xZ1LJDLBKYGE6LzLQhFPNAGhbeWIu3/tdfzbsy+HxMTeOPq56ThxSGnj8lk38odERdkYQRUkHkYagFr17oxx+shrpD/DIM2zwc8by/qBuPj+83Tnx6qGI9ghBUz2dpFslhMYWnEjyjvzEe+0Vs1i8qlg1LFAglut073ZEV+su3aoSXblRoW8fBN/5it/Erh/WHctrobm8d8g98dFFnwZnVomuQ4YfWL8J5cxruDOWdpOIEsQIGg1AaFyhqY6W7C4wvdzm4zmH5nMevXP1/p7vHwcXs1K8t24KqqFZeOtwjgahenrZUBCC14wT88uc5p2TBMTsy4aVtBPSvAiwEwDcI7BSxtpd9OhCr0/l0Oxdtwbq2sz2F9TErgEUXQgRQiSyf4VErgzaEZm0JZ56FH8X2liQbEEiTfE3dljJt+A51ITtXwAqZV0a8tROnJZTzwWwWtMvzY20dHX5MgZgvxa9ZfKmbhK334YQPYJhJJTrWDoWpUYrRssh6dWIDAZFgx8LEfmkPT8BCudwSmOeolnfG6rov1gQT535+/OIoJgVcctZkRMakUgMA36ZVO4PUpl7JNQjfF3B5gBUR3hGE1dReEgX1xwSTpZkFnODMIk+cTLQ9ADANqzqegBynrj75U8VunJtFZHodOSiJArLsa1ZWBMiRJpr+KoOIiIsTarfI5l3MKygWxA/MONRjpeDpbCulQP6uhJQTrL73DacHBvrg/h80emLQ9u6JSkX6iPDlB6RVL3l/akVmzBpmOnV6HSOA62sk1PtDn5O/xaE1wHmHNrwl2faEIZu+w6fuV/R87d+jAaNBodGmTWqkZ6PabXbw3ltLab3iNd85pRpTO+O5F99Kb7BrbuNLX8KMABsAtMAoTJBEwAAAABJRU5ErkJggg==';
  59. const endpointMarker = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIZSURBVEhLtZZNSwJRGIVflf6AkGFEHwgJugjbtHDRol/QxpAE921qE0X76GcEQfS1bNXGiKDog6RFbWsRFJjI1K6auZ1zxxGrO5bDdOARHZ1z7tz73vcakc7qBwUwBbKgF1DP4AZUwC54AEb5BdB4FcyCnnhcZGxMJJnkVyJPTyLX1yL1uv74AbbACvANatc0aESjogoFUUdHomxblFJf4bXjY1HFoij+FvdYgE/bUXPATqVEnZz8NPXj7EzU6KgOccA8jUziyO2JCVF4dKNRJxoNUfl8K2SGhu3inDc48iDmHgxJp3XICxiksad1zmM30+LHxYWoWEyHbLrW7ujfuKCmG4JQKukAVtcQAxaArhbTj4NweqoDyBID9lHnxlIMiuOI6uvTAQdRvGS5ibAGoSmC7ZvL6bdZ2vZ6OzRMNT0TetxM/C8xoPb46H4IU+xXUI0Bt2xcWJjQhIWWalW/vWFAhV0Rmyw0XV62nuCQLwPgnV3xe7kFpVzWJWqDEQZQG2wV7IqmG7rh6qrVKrZda1d8Costlw3LdONfsCxRmYw2fwXDNG4XDwuHLTdICM0nJ7U5y6VEQ5N4WDhsueyKJiMTnJbmyGm+SKNO4mFhcR7ZFdm42Fu+m/La+bm7oM0557T8GLnfHuZhsQYYFkskRMbHvx76rPNmKXLUe2AZ3PNCu35rEuznDPH+tiBKqwa8vy074A4YJPIJl9zwywT3hMMAAAAASUVORK5CYII=';
  60. const PLIcon = 'data:image/gif;base64,R0lGODlhFgAUANUAAOHh4t7e34iKj0dLU0VJUUhMVEpOVk1RWU9TW2xvdXF0enx/hZOVmcbHyVJWXVFVXFRYX1dbYl5iaTtASD5DSz1CSj9ETEFGTkNIUEVKUn6BhoSHjFpeZGBkamVpb2RobmpudGltc2ZqcG1xd2tvdaqsr0ZLUklOVU9UW3h8gdHS08nKy////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACwALAAAAAAWABQAAAZrQJZwSCwaj8ikcskkmTpMI2JSmUxSUaFjIhJCJlkhiHjJMD2YUDECVqKsVuJk4OYGSqeDcEJRTkUACgkrKgx8SgsTH0IcExgeh0oFbUICFo5MBpRCDVkbEyNDEw9hbAYSkWEaVQRhrq+wTEEAOw==';
  61. const reportIcon = 'data:image/gif;base64,R0lGODlhFAAUALMAANcsLNgvL9g4OAMBAc5RUcZVVW1tbQAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAgALAAAAAAUABQAAARdEKFDqz0y6zO695S2FUBpAkNliBNxmmnFHu6LXmtG2+iXbjWeiYDRuXw2IhAg+CSLkp1wCG31fB6A0jilLrva6g7r3EaDU7MVEGi72yX1mNwJj8CAgpiOFV/+FhIRADs=';
  62. const NJURLDetail = 'https://511nj.org/API/client/Map/getEventPopupData?EventId=';
  63. const NotNY = ['Pennsylvania Statewide', 'New Jersey Statewide', 'Connecticut Statewide'];
  64. const NJConstruction = ['Construction', 'ScheduledConstruction'];
  65.  
  66. //Begin script function
  67. (function () {
  68. 'use strict';
  69. //Bootstrap
  70. function bootstrap(tries = 1) {
  71. if (W && W.loginManager && W.map && W.loginManager.user && W.model && W.model.states && W.model.states.getObjectArray().length && WazeWrap && WazeWrap.Ready) {
  72. console.log("WME DOT Advisories Loaded!");
  73. init();
  74. addListeners();
  75. if (!OpenLayers.Icon) {
  76. installIcon();
  77. }
  78. } else if (tries < 1000) {
  79. setTimeout(function () { bootstrap(++tries); }, 200);
  80. }
  81. }
  82. // Function.prototype.bind = function (thisObject) {
  83. // var method = this;
  84. // var oldargs = [].slice.call(arguments, 1);
  85. // return function () {
  86. // var newargs = [].slice.call(arguments);
  87. // return method.apply(thisObject, oldargs.concat(newargs));
  88. // };
  89. // }
  90. //Build the Tab and Settings Division
  91. function init() {
  92. var $section = $('<div id="WMEDOTAdvisoriesPanel">');
  93. $section.html([
  94. '<div id="chkAdvisoryEnables">',
  95. '<a href="https://www.waze.com/forum/viewtopic.php?f=819&t=308141" target="_blank">WME DOT Advisories</a> v' + GM_info.script.version + '<br>',
  96. '* The WME Refresh Button will update reports.',
  97. '<table border=1 style="text-align:center;width:100%;padding:10px;">',
  98. '<tr><td style="text-align:center"><b>Enable</b></td><td style="text-align"><b>State</b></td><td width=30><b>Rpt</b></td></tr>',
  99. '<tr><td><input type="checkbox" id="chkAKDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>AK</td><td><div class=DOTreport data-report="report" data-state="Alaska" id="AK"><img src=' + reportIcon + '></div></td></tr>',
  100. '<tr><td><input type="checkbox" id="chkAZDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>AZ</td><td><div class=DOTreport data-report="report" data-state="Arizona" id="AZ"><img src=' + reportIcon + '></div></td></tr>',
  101. '<tr><td><input type="checkbox" id="chkCTDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>CT</td><td><div class=DOTreport data-report="report" data-state="Connecticut" id="CT"><img src=' + reportIcon + '></div></td></tr>',
  102. '<tr><td><input type="checkbox" id="chkDEDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>DE</td><td><div class=DOTreport data-report="report" data-state="Delaware" id="DE"><img src=' + reportIcon + '></div></td></tr>',
  103. '<tr><td><input type="checkbox" id="chkFLDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>FL</td><td><div class=DOTreport data-report="report" data-state="Florida" id="FL"><img src=' + reportIcon + '></div></td></tr>',
  104. '<tr><td><input type="checkbox" id="chkGADOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>GA</td><td><div class=DOTreport data-report="report" data-state="Georgia" id="GA"><img src=' + reportIcon + '></div></td></tr>',
  105. '<tr><td><input type="checkbox" id="chkIADOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>IA</td><td><div class=DOTreport data-report="report" data-state="Iowa" id="IA"><img src=' + reportIcon + '></div></td></tr>',
  106. '<tr><td><input type="checkbox" id="chkILDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>IL</td><td><div class=DOTreport data-report="report" data-state="Illinois" id="IL"><img src=' + reportIcon + '></div></td></tr>',
  107. '<tr><td><input type="checkbox" id="chkINDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>IN</td><td><div class=DOTreport data-report="report" data-state="Indiana" id="IN"><img src=' + reportIcon + '></div></td></tr>',
  108. '<tr><td><input type="checkbox" id="chkLADOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>LA</td><td><div class=DOTreport data-report="report" data-state="Louisiana" id="LA"><img src=' + reportIcon + '></div></td></tr>',
  109. '<tr><td><input type="checkbox" id="chkMDDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>MD</td><td><div class=DOTreport data-report="report" data-state="Maryland" id="MD"><img src=' + reportIcon + '></div></td></tr>',
  110. '<tr><td><input type="checkbox" id="chkMIDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>MI</td><td><div class=DOTreport data-report="report" data-state="Michigan" id="MI"><img src=' + reportIcon + '></div></td></tr>',
  111. '<tr><td><input type="checkbox" id="chkMNDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>MN</td><td><div class=DOTreport data-report="report" data-state="Minnesota" id="MN"><img src=' + reportIcon + '></div></td></tr>',
  112. '<tr><td><input type="checkbox" id="chkNCDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>NC</td><td><div class=DOTreport data-report="report" data-state="North Carolina" id="NC"><img src=' + reportIcon + '></div></td></tr>',
  113. '<tr><td><input type="checkbox" id="chkNJDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>NJ</td><td><div class=DOTreport data-report="report" data-state="New Jersey" id="NJ"><img src=' + reportIcon + '></div></td></tr>',
  114. '<tr><td><input type="checkbox" id="chkNVDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>NV</td><td><div class=DOTreport data-report="report" data-state="Nevada" id="NV"><img src=' + reportIcon + '></div></td></tr>',
  115. '<tr><td><input type="checkbox" id="chkNYDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>NY</td><td><div class=DOTreport data-report="report" data-state="New York" id="NY"><img src=' + reportIcon + '></div></td></tr>',
  116. '<tr><td><input type="checkbox" id="chkOHDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>OH</td><td><div class=DOTreport data-report="report" data-state="Ohio" id="OH"><img src=' + reportIcon + '></div></td></tr>',
  117. '<tr><td><input type="checkbox" id="chkORDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>OR</td><td><div class=DOTreport data-report="report" data-state="Oregon" id="OR"><img src=' + reportIcon + '></div></td></tr>',
  118. '<tr><td><input type="checkbox" id="chkPADOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>PA</td><td><div class=DOTreport data-report="report" data-state="Pennsylvania" id="PA"><img src=' + reportIcon + '></div></td></tr>',
  119. '<tr><td><input type="checkbox" id="chkTXDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>TX (Houston)</td><td><div class=DOTreport data-report="report" data-state="Texas" id="TX"><img src=' + reportIcon + '></div></td></tr>',
  120. '<tr><td><input type="checkbox" id="chkVADOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>VA</td><td><div class=DOTreport data-report="report" data-state="Virginia" id="VA"><img src=' + reportIcon + '></div></td></tr>',
  121. '<tr><td><input type="checkbox" id="chkWADOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>WA</td><td><div class=DOTreport data-report="report" data-state="Washington" id="WA"><img src=' + reportIcon + '></div></td></tr>',
  122. '<tr><td><input type="checkbox" id="chkWIDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>WI</td><td><div class=DOTreport data-report="report" data-state="Wisconsin" id="WI"><img src=' + reportIcon + '></div></td></tr>',
  123. '<tr><td><input type="checkbox" id="chkWVDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td>WV</td><td><div class=DOTreport data-report="report" data-state="West Virginia" id="WV"><img src=' + reportIcon + '></div></td></tr>',
  124. '</table>',
  125. '</div></div>'
  126. ].join(' '));
  127. new WazeWrap.Interface.Tab('DOT Advisories', $section.html(), initializeSettings);
  128. //WazeWrap.Interface.ShowScriptUpdate("WME DOT Advisories", GM_info.script.version, updateMessage, "https://greasyfork.org/en/scripts/412976-wme-dot-advisories", "https://www.waze.com/forum/viewtopic.php?f=819&t=308141");
  129. getBounds();
  130. W.map.events.register("moveend", W.map, function () {
  131. getBounds();
  132. redrawAdvs();
  133. });
  134. }
  135. function getBounds() {
  136. mapBounds = W.map.getExtent();
  137. mapBounds.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
  138. }
  139. getFeed("http://40.121.218.107/CSS", "css", "", function (result) {
  140. GM_addStyle(result);
  141. })
  142. //Build the State Layers
  143. function buildDOTAdvLayers(state) {
  144. eval(state.substring(0, 2) + 'DOTLayer = new OpenLayers.Layer.Markers("' + state.substring(0, 2) + 'DOTLayer")');
  145. W.map.addLayer(eval(state.substring(0, 2) + 'DOTLayer'));
  146. //W.map.getOLMap().setLayerIndex(eval(state.substring(0, 2) + 'DOTLayer'), 10);
  147. }
  148. function redrawAdvs() {
  149. for (const property in settings) {
  150. let state = property.replace("chk", "").replace("DOTEnabled", "");
  151. if (state.length == 2) {
  152. if (document.getElementById('chk' + state + 'DOTEnabled').checked) {
  153. eval('W.map.removeLayer(' + state + 'DOTLayer)');
  154. buildDOTAdvLayers(state);
  155. eval('testAdv(' + state + 'Feed, config.' + state + ')');
  156. }
  157. }
  158. }
  159. }
  160. function testAdv(resultObj, state) {
  161. let i = 0;
  162. while (i < resultObj.length) {
  163. if ((resultObj[i].lon > mapBounds.left) && (resultObj[i].lon < mapBounds.right)) {
  164. if ((resultObj[i].lat > mapBounds.bottom) && (resultObj[i].lat < mapBounds.top)) {
  165. drawMarkers(resultObj[i]);
  166. }
  167. }
  168. i++;
  169. }
  170. }
  171. function getFeed(url, callback) {
  172. GM_xmlhttpRequest({
  173. method: "GET",
  174. url: url,
  175. onload: callback_function1.bind({}, callback)
  176. //onload: function (response) {
  177. // var result = response;
  178. // callback(result);
  179. //}
  180. });
  181. }
  182. function callback_function1(callback, response) {
  183. var result = response;
  184. setTimeout(function () { callback(result) }, 150);
  185. }
  186. const timer = ms => new Promise(res => setTimeout(res, ms))
  187. function getAdvisories(state, stateAbv, type) {
  188. eval('promises' + stateAbv + ' = []');
  189. eval('advisories' + stateAbv + ' = []');
  190. let thesepromises = [];
  191. for (let j = 0; j < state.URL.length; j++) {
  192. let thispromise = new Promise((resolve, reject) => {
  193. getFeed(state.URL[j], function (result) {
  194. let resultObj = [];
  195. resultObj = state.data(JSON.parse(result.responseText), j);
  196. async function innerLoop() {
  197. for (let i = 0; i < resultObj.length; i++) {
  198. if (eval(state.filter(j))) {
  199. state.scheme(resultObj[i], j);
  200. }
  201. if (i == (resultObj.length - 1)) {
  202. resolve();
  203. }
  204. await timer(1);
  205. }
  206. if (resultObj.length == 0) {
  207. resolve();
  208. }
  209. }
  210. innerLoop();
  211. });
  212. })
  213. thesepromises.push(thispromise);
  214. }
  215. Promise.all(thesepromises).then(function () {
  216. setTimeout(function () { promiseWorker(stateAbv, type) }, 1000);
  217. })
  218. }
  219. function promiseWorker(stateAbv, type) {
  220. let thisadvisory = eval("advisories" + stateAbv);
  221. Promise.all(eval('promises' + stateAbv))
  222. .then(function () {
  223. for (let i = 0; i < thisadvisory.length; i++) {
  224. if (type == "report") {
  225. let parms = thisadvisory[i];
  226. let table = document.getElementById("reportTable").getElementsByTagName('tbody')[0];
  227. var row = table.insertRow(-1);
  228. var cell1 = row.insertCell(0);
  229. var cell2 = row.insertCell(1);
  230. var cell3 = row.insertCell(2);
  231. var cell4 = row.insertCell(3);
  232. cell1.innerHTML = '<div class="gotoPL" data-lat="' + parms.lat + '" data-lon="' + parms.lon + '"><img src=' + PLIcon + '></div>'; //PL
  233. cell2.innerHTML = parms.desc; //Description
  234. cell3.innerHTML = parms.title; //Location
  235. cell4.innerHTML = parms.time; //Time
  236. } else {
  237. //drawMarkers(thisadvisory[i]);
  238. eval(thisadvisory[i].state[0] + 'Feed = thisadvisory');
  239. testAdv(thisadvisory, state);
  240. }
  241. }
  242. if ((type == "report")) { //Wait until we loop through all the advisory URLs before sorting the table
  243. reportWorker();
  244. }
  245. });
  246. }
  247. function reportWorker() {
  248. var elements = document.getElementsByClassName("gotoPL");
  249. for (var i = 0; i < elements.length; i++) {
  250. elements[i].addEventListener('click', moveMap, false);
  251. }
  252. refreshReportTable();
  253. }
  254. function refreshReportTable() {
  255. var sort = new Tablesort(document.getElementById('reportTable'), { descending: true });
  256. sort.refresh();
  257. document.getElementById("spinner").style.visibility = "hidden";
  258. }
  259. function getReportData(stateAbv, stateName) {
  260. popupdetails(stateName);
  261. //if (stateAbv != "NJ") {
  262. eval('getAdvisories(config.' + stateAbv + ',"' + stateAbv + '", "report")');
  263. //} else { getNJDOT("report"); }
  264. }
  265.  
  266. //Generate the Advisory markers
  267. function drawMarkers(parms) {
  268. var icontype;
  269. var size = new OpenLayers.Size(20, 20);
  270. var offset = new OpenLayers.Pixel(-(size.w / 2), -size.h);
  271. for (let i = 0; i < parms.keyword.length; i++) { //Check each of the keywords for roadwork/construction
  272. if (parms.type == parms.keyword[i]) {
  273. icontype = Roadwork;
  274. break;
  275. } else {
  276. icontype = Incident;
  277. }
  278. }
  279. var icon = new OpenLayers.Icon(icontype, size);
  280. var epsg4326 = new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection
  281. var projectTo = W.map.getProjectionObject(); //The map projection (Spherical Mercator)
  282. var lonLat = new OpenLayers.LonLat(parms.lon, parms.lat).transform(epsg4326, projectTo);
  283. var newMarker = new OpenLayers.Marker(lonLat, icon);
  284. newMarker.eventId = parms.id;
  285. newMarker.title = parms.title;
  286. newMarker.desc = parms.desc;
  287. newMarker.popupType = parms.popupType;
  288. newMarker.state = parms.state;
  289. newMarker.timestamp = parms.time;
  290. newMarker.startTime = parms.startTime;
  291. newMarker.plannedEndTime = parms.plannedEndTime;
  292. newMarker.events.register('click', newMarker, popup);
  293. newMarker.location = lonLat;
  294. newMarker.recurrence = parms.recurrence;
  295. if (parms.state[0] == "PA") {
  296. newMarker.fromLon = parms.fromLon;
  297. newMarker.toLon = parms.toLon;
  298. newMarker.fromLat = parms.fromLat;
  299. newMarker.toLat = parms.toLat;
  300. }
  301. if (parms.link != '') {
  302. newMarker.link = '<a href="' + parms.link + '" target="_blank">Publication Link</a>';
  303. } else {
  304. newMarker.link = '';
  305. }
  306. eval(parms.state[0] + "DOTLayer.addMarker(newMarker)");
  307. }
  308.  
  309. //Draw the endpoint markers
  310. function drawEndpoints(lon, lat) {
  311. var size = new OpenLayers.Size(24, 24);
  312. var icon = new OpenLayers.Icon(endpointMarker, size);
  313. var epsg4326 = new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection
  314. var projectTo = W.map.getProjectionObject(); //The map projection (Spherical Mercator)
  315. var lonLat = new OpenLayers.LonLat(lon, lat).transform(epsg4326, projectTo);
  316. var endpoint = new OpenLayers.Marker(lonLat, icon);
  317. endpointsLayer.addMarker(endpoint);
  318. }
  319.  
  320. //Generate the Popup
  321. function popup(evt) {
  322. $("#gmPopupContainer").remove();
  323. $("#gmPopupContainer").hide();
  324. endpointsLayer = new OpenLayers.Layer.Markers("endpointsLayer");
  325. W.map.addLayer(endpointsLayer);
  326. if ((this.fromLon != this.toLon) || (this.fromLat != this.toLat)) {
  327. drawEndpoints(this.fromLon, this.fromLat);
  328. drawEndpoints(this.toLon, this.toLat);
  329. }
  330. var popupHTML;
  331. W.map.moveTo(this.location);
  332. let htmlString = '<div id="gmPopupContainer" style="max-width:500px;margin: 1;text-align: center;padding: 5px;z-index: 1100">' +
  333. '<a href="#close" id="gmCloseDlgBtn" title="Close" class="modalclose" style="color:#FF0000;">X</a>' +
  334. '<table border=0><tr><td><div id="mydivheader" style="min-height: 20px;">' + this.title + '</div></div>' +
  335. '<hr class="myhrline"/>Updated: ' + this.timestamp.toLocaleString();
  336. if (this.startTime != null) {
  337. htmlString += '<br/>Start: ' + this.startTime.toLocaleString();
  338. }
  339. if (this.plannedEndTime != null) {
  340. htmlString += '<br/>Planned End: ' + this.plannedEndTime.toLocaleString();
  341. }
  342. if (this.recurrence != null) {
  343. htmlString += '<br/>Recurrence: ' + this.recurrence;
  344. }
  345. htmlString += '<hr class="myhrline"/></td></tr><tr><td>' + this.desc + '</td></tr>' +
  346. '<tr><td>' + this.link + '</td></tr>' +
  347. '</table>' +
  348. '</div>';
  349. popupHTML = ([htmlString]);
  350. $("body").append(popupHTML);
  351. //Position the modal based on the position of the click event
  352. $("#gmPopupContainer").css({ left: document.getElementById("user-tabs").offsetWidth + W.map.getPixelFromLonLat(W.map.getCenter()).x - document.getElementById("gmPopupContainer").clientWidth - 10 });
  353. $("#gmPopupContainer").css({ top: document.getElementById("left-app-head").offsetHeight + W.map.getPixelFromLonLat(W.map.getCenter()).y - (document.getElementById("gmPopupContainer").clientHeight / 2) });
  354. $("#gmPopupContainer").show();
  355. //Add listener for popup's "Close" button
  356. $("#gmCloseDlgBtn").click(function () {
  357. $("#gmPopupContainer").remove();
  358. $("#gmPopupContainer").hide();
  359. W.map.removeLayer(endpointsLayer);
  360. });
  361. dragElement(document.getElementById("gmPopupContainer"));
  362. }
  363. function popupdetails(stateName) {
  364. $("#gmPopupContainer").remove();
  365. $("#gmPopupContainer").hide();
  366. var popupHTML;
  367. popupHTML = (['<div id="gmPopupContainer" style="max-width:750px;max-height:500px;margin:1;text-align:center;padding: 5px;z-index: 1100">' +
  368. '<a href="#close" id="popupdetailsclose" title="Close" class="modalclose" style="color:#FF0000;">X</a>' +
  369. '<table border=0><tr><td><div id="mydivheader" style="float:center">' + stateName + ' Reports <div id="spinner" class="spinner" style="float:left;position:relative;left:70%">' +
  370. '<div class="bounce1" style="float:left;position:relative;left:40%"></div><div class="bounce2" style="float:left;position:relative;left:50%"></div><div class="bounce3" style="float:left;position:relative;left:60%"></div></div></td></tr>' +
  371. '<tr><td>' +
  372. '<div style="width:720px; height:450px; overflow:auto;"><table id="reportTable" border=1>' +
  373. '<thead><tr><td data-sort-method="none" width=30><b>PL</b></td><th width=394>Description</th><th width=100>Misc.</th><th data-sort-default width=210>Time</th></tr></thead>' +
  374. '<tbody></tbody></table></div>' +
  375. '</td></tr></table>' +
  376. '</div>'
  377. ]);
  378. $("body").append(popupHTML);
  379. //Position the modal based on the position of the click event
  380. $("#gmPopupContainer").css({ left: 350 });
  381. $("#gmPopupContainer").css({ top: 100 });
  382. $("#gmPopupContainer").show();
  383. //Add listener for popup's "Close" button
  384. $("#popupdetailsclose").click(function () {
  385. $("#gmPopupContainer").remove();
  386. $("#gmPopupContainer").hide();
  387. });
  388. dragElement(document.getElementById("gmPopupContainer"));
  389. }
  390. // Make the DIV element draggable
  391. function dragElement(elmnt) {
  392. var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
  393. if (document.getElementById("mydivheader")) {
  394. // if present, the header is where you move the DIV from:
  395. document.getElementById("mydivheader").onmousedown = dragMouseDown;
  396. } else {
  397. // otherwise, move the DIV from anywhere inside the DIV:
  398. elmnt.onmousedown = dragMouseDown;
  399. }
  400. function dragMouseDown(e) {
  401. e = e || window.event;
  402. e.preventDefault();
  403. // get the mouse cursor position at startup:
  404. pos3 = e.clientX;
  405. pos4 = e.clientY;
  406. document.onmouseup = closeDragElement;
  407. // call a function whenever the cursor moves:
  408. document.onmousemove = elementDrag;
  409. }
  410.  
  411. function elementDrag(e) {
  412. e = e || window.event;
  413. e.preventDefault();
  414. // calculate the new cursor position:
  415. pos1 = pos3 - e.clientX;
  416. pos2 = pos4 - e.clientY;
  417. pos3 = e.clientX;
  418. pos4 = e.clientY;
  419. // set the element's new position:
  420. elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
  421. elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
  422. }
  423. function closeDragElement() {
  424. // stop moving when mouse button is released:
  425. document.onmouseup = null;
  426. document.onmousemove = null;
  427. }
  428. }
  429. //Move map to coordinates specified
  430. function moveMap() {
  431. var epsg4326 = new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection
  432. var projectTo = W.map.getProjectionObject(); //The map projection (Spherical Mercator)
  433. var lat = this.getAttribute("data-lat");
  434. var lon = this.getAttribute("data-lon");
  435. W.map.moveTo(new OpenLayers.LonLat(lon, lat).transform(epsg4326, projectTo), 6);
  436. }
  437. //Initialize Settings
  438. function initializeSettings() {
  439. stateLength = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox").length;
  440. loadSettings();
  441. //Set the state checkboxes according to saved settings
  442. for (var i = 0; i < stateLength; i++) {
  443. state = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].id.replace("chk", "").replace("DOTEnabled", "");
  444. setChecked('chk' + state + 'DOTEnabled', eval('settings.' + state + 'DOTEnabled'));
  445. }
  446. //Build the layers for the selected states
  447. for (var i = 0; i < stateLength; i++) {
  448. state = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].id.replace("chk", "").replace("DOTEnabled", "");
  449. if (document.getElementById('chk' + state + 'DOTEnabled').checked) { buildDOTAdvLayers(state); eval('getAdvisories(config.' + state + ',"' + state + '")') }
  450. }
  451. }
  452. function addListeners() {
  453. //Add event listener to report icon
  454. for (var i = 0; i < document.getElementsByClassName("DOTreport").length; i++) {
  455. document.getElementsByClassName("DOTreport")[i].addEventListener('click', function (e) { getReportData(this.getAttribute("id"), this.getAttribute("data-state")); }, false);
  456. }
  457. //Refresh selected states when WME's refresh button is clicked
  458. document.getElementsByClassName("reload-button-region")[0].addEventListener('click', function (e) {
  459. for (var i = 0; i < stateLength; i++) {
  460. state = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].id.replace("chk", "").replace("DOTEnabled", "");
  461. if (document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].checked) { eval('W.map.removeLayer(' + state + 'DOTLayer)'); }
  462. }
  463. initializeSettings();
  464. });
  465. //Add Handler for Checkbox Setting Changes
  466. $('.WMEDOTAdvSettingsCheckbox').change(function () {
  467. var settingName = $(this)[0].id.substr(3);
  468. settings[settingName] = this.checked;
  469. saveSettings();
  470. if (this.checked) {
  471. buildDOTAdvLayers(settingName.substring(0, 2));
  472. eval('getAdvisories(config.' + settingName.substring(0, 2) + ',' + "settingName.substring(0, 2)" + ')');
  473. }
  474. else {
  475. eval('W.map.removeLayer(' + settingName.substring(0, 2) + 'DOTLayer)');
  476. }
  477. });
  478. }
  479. //Set Checkbox from Settings
  480. function setChecked(checkboxId, checked) {
  481. $('#' + checkboxId).prop('checked', checked);
  482. }
  483. //Load Saved Settings
  484. function loadSettings() {
  485. var loadedSettings = $.parseJSON(localStorage.getItem("WMEDOT_Settings"));
  486. var defaultSettings = {
  487. Enabled: false,
  488. };
  489. settings = loadedSettings ? loadedSettings : defaultSettings;
  490. for (var prop in defaultSettings) {
  491. if (!settings.hasOwnProperty(prop)) {
  492. settings[prop] = defaultSettings[prop];
  493. }
  494. }
  495. }
  496. //Save Tab Settings
  497. function saveSettings() {
  498. if (localStorage) {
  499. var localsettings = {};
  500. for (var i = 0; i < stateLength; i++) {
  501. state = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].id.replace("chk", "").replace("DOTEnabled", "");
  502. eval('localsettings.' + state + 'DOTEnabled = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].checked');
  503. }
  504. }
  505. localStorage.setItem("WMEDOT_Settings", JSON.stringify(localsettings));
  506. }
  507. //Add the Icon Class to OpenLayers
  508. function installIcon() {
  509. console.log('Installing OpenLayers.Icon');
  510. OpenLayers.Icon = OpenLayers.Class({
  511. url: null,
  512. size: null,
  513. offset: null,
  514. calculateOffset: null,
  515. imageDiv: null,
  516. px: null,
  517. initialize: function (a, b, c, d) {
  518. this.url = a;
  519. this.size = b || { w: 20, h: 20 };
  520. this.offset = c || { x: -(this.size.w / 2), y: -(this.size.h / 2) };
  521. this.calculateOffset = d;
  522. a = OpenLayers.Util.createUniqueID("OL_Icon_");
  523. let div = this.imageDiv = OpenLayers.Util.createAlphaImageDiv(a);
  524. $(div.firstChild).removeClass('olAlphaImg'); // LEAVE THIS LINE TO PREVENT WME-HARDHATS SCRIPT FROM TURNING ALL ICONS INTO HARDHAT WAZERS --MAPOMATIC
  525. },
  526. destroy: function () { this.erase(); OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild); this.imageDiv.innerHTML = ""; this.imageDiv = null; },
  527. clone: function () { return new OpenLayers.Icon(this.url, this.size, this.offset, this.calculateOffset); },
  528. setSize: function (a) { null !== a && (this.size = a); this.draw(); },
  529. setUrl: function (a) { null !== a && (this.url = a); this.draw(); },
  530. draw: function (a) {
  531. OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, this.size, this.url, "absolute");
  532. this.moveTo(a);
  533. return this.imageDiv;
  534. },
  535. erase: function () { null !== this.imageDiv && null !== this.imageDiv.parentNode && OpenLayers.Element.remove(this.imageDiv); },
  536. setOpacity: function (a) { OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, null, null, null, null, null, a); },
  537. moveTo: function (a) {
  538. null !== a && (this.px = a);
  539. null !== this.imageDiv && (null === this.px ? this.display(!1) : (
  540. this.calculateOffset && (this.offset = this.calculateOffset(this.size)),
  541. OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, { x: this.px.x + this.offset.x, y: this.px.y + this.offset.y })
  542. ));
  543. },
  544. display: function (a) { this.imageDiv.style.display = a ? "" : "none"; },
  545. isDrawn: function () { return this.imageDiv && this.imageDiv.parentNode && 11 != this.imageDiv.parentNode.nodeType; },
  546. CLASS_NAME: "OpenLayers.Icon"
  547. });
  548. }
  549. bootstrap();
  550.  
  551. const config = { //Configuration data for each state
  552. AK: {
  553. data(res, index) {
  554. let resultText = [res];
  555. return (resultText[index]);
  556. },
  557. filter(index) {
  558. let filtertext = [true]; //['(resultObj[i].LanesAffected).replace(/ +(?= )/g, "") == ("All Lanes Closed")'];
  559. return (filtertext[index]);
  560. },
  561. scheme(obj, index) {
  562. promisesAK.push(new Promise((resolve, reject) => {
  563. advisoriesAK.push({
  564. state: ['AK', 'Alaska'],
  565. id: obj.ID,
  566. popupType: 0,
  567. title: obj.RoadwayName,
  568. lon: obj.Longitude,
  569. lat: obj.Latitude,
  570. type: obj.EventType,
  571. keyword: ['roadwork'], //keywords for roadwork/construction
  572. desc: obj.Description,
  573. time: moment(new Date(obj.LastUpdated * 1000)).format('LLL'),
  574. link: ''
  575. });
  576. resolve();
  577. }))
  578. },
  579. URL: ['http://40.121.218.107/AK']
  580. },
  581. AZ: {
  582. data(res, index) {
  583. let resultText = [res, res.features, res.features, res.features];
  584. return (resultText[index]);
  585. },
  586. filter(index) {
  587. let filtertext = ['((resultObj[i].LanesAffected).replace(/ +(?= )/g, "") == ("All Lanes Closed")) || ((resultObj[i].RoadwayName).includes("Road Closed"))', true, true, true];
  588. return (filtertext[index]);
  589. },
  590. scheme(obj, index) {
  591.  
  592. promisesAZ.push(new Promise((resolve, reject) => {
  593. advisoriesAZ.push({
  594. state: ['AZ', 'Arizona'],
  595. id: obj.ID,
  596. popupType: 0,
  597. title: obj.RoadwayName,
  598. lon: obj.Longitude,
  599. lat: obj.Latitude,
  600. type: obj.EventType,
  601. keyword: ['roadwork'], //keywords for roadwork/construction
  602. desc: obj.Description,
  603. time: moment(new Date(obj.LastUpdated * 1000)).format('LLL'),
  604. link: ''
  605. });
  606. resolve();
  607. }))
  608. },
  609. URL: ['http://40.121.218.107/AZ', 'https://maps.phoenix.gov/pub/rest/services/Public/STR_PubTraffRes/MapServer/0/query?where=Closure_Type+LIKE+%27FULL%27&text=&objectIds=&time=&geometry=&geometryType=esriGeometryPoint&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Foot&relationParam=&outFields=*&returnGeometry=true&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=4326&havingClause=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&historicMoment=&returnDistinctValues=false&resultOffset=0&resultRecordCount=300&returnExtentOnly=false&datumTransformation=&parameterValues=&rangeValues=&quantizationParameters=&featureEncoding=esriDefault&f=pjson', 'https://maps.phoenix.gov/pub/rest/services/Public/STR_PubTraffRes/MapServer/1/query?where=Closure_Type+LIKE+%27FULL%27&text=&objectIds=&time=&geometry=&geometryType=esriGeometryPoint&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Foot&relationParam=&outFields=*&returnGeometry=true&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=4326&havingClause=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&historicMoment=&returnDistinctValues=false&resultOffset=0&resultRecordCount=200&returnExtentOnly=false&datumTransformation=&parameterValues=&rangeValues=&quantizationParameters=&featureEncoding=esriDefault&f=pjson', 'https://maps.phoenix.gov/pub/rest/services/Public/STR_PubTraffRes/MapServer/2/query?f=json&where=1%3D1&returnGeometry=true&outSR=4326&spatialRel=esriSpatialRelIntersects&outFields=*&resultOffset=0&resultRecordCount=25']
  610. },
  611. CT: {
  612. data(res, index) {
  613. let resultText = [res.data];
  614. return (resultText[index]);
  615. },
  616. filter(index) {
  617. let filtertext = ['resultObj[i].eventSubType != "Queue"'];
  618. return (filtertext[index]);
  619. },
  620. scheme(obj, index) {
  621. promisesCT.push(new Promise((resolve, reject) => {
  622. advisoriesCT.push({
  623. state: ['CT', 'Connecticut'],
  624. id: obj.DT_RowId,
  625. popupType: 0,
  626. title: obj.roadwayName,
  627. lon: obj.location[1],
  628. lat: obj.location[0],
  629. type: obj.eventSubType,
  630. keyword: ['Construction'], //keywords for roadwork/construction
  631. desc: obj.description,
  632. startTime: obj.startTime,
  633. plannedEndTime: obj.endTime,
  634. time: obj.lastUpdated,
  635. link: ''
  636. });
  637. resolve();
  638. }))
  639. },
  640. URL: ['http://40.121.218.107/CT']
  641. },
  642. DE: {
  643. data(res, index) {
  644. let resultText = [res.advisories, res, res.features];
  645. return (resultText[index]);
  646. },
  647. filter(index) {
  648. let filtertext = [true, '(resultObj[i].str.impactType == "Closure") || ((resultObj[i].str.impactType == "Restriction") && ((resultObj[i].str.construction.toUpperCase().includes("AMP CLOS") || (resultObj[i].str.construction.toUpperCase().includes("ROAD CLOS")))))', true];
  649. return (filtertext[index]);
  650. },
  651. scheme(obj, index) {
  652. switch (index) {
  653. case 0:
  654. promisesDE.push(new Promise((resolve, reject) => {
  655. advisoriesDE.push({
  656. state: ['DE', 'Delaware'],
  657. id: obj.id,
  658. popupType: 0,
  659. title: obj.where.county.name,
  660. lon: obj.where.lon,
  661. lat: obj.where.lat,
  662. type: obj.type.name,
  663. keyword: ['Construction'], //keyword for roadwork/construction
  664. desc: obj.where.location,
  665. time: moment(new Date(obj.timestamp)).format('LLL'),
  666. link: obj.published.linkbackUrl
  667. });
  668. resolve();
  669. }))
  670. break;
  671. case 1:
  672. var pubLink;
  673. if (obj.str.releaseId) {
  674. if (obj.str.releaseId.toString() == "-1") {
  675. pubLink = '';
  676. } else {
  677. pubLink = 'https://deldot.gov/About/news/index.shtml?dc=release&id=' + obj.str.releaseId;
  678. }
  679. }
  680. promisesDE.push(new Promise((resolve, reject) => {
  681. advisoriesDE.push({
  682. state: ['DE', 'Delaware'],
  683. id: obj.str.strId,
  684. popupType: 0,
  685. title: obj.str.county,
  686. lon: obj.str.longitude,
  687. lat: obj.str.latitude,
  688. type: obj.str.impactType,
  689. keyword: ['Closure'], //keywords for roadwork/construction
  690. desc: obj.str.title + " - " + obj.str.construction,
  691. time: moment(new Date(obj.str.actualStartDate)).format('LLL'),
  692. link: pubLink
  693. });
  694. resolve();
  695. }))
  696. break;
  697. case 2:
  698. var direction, WorkType;
  699. switch (obj.attributes.direction) {
  700. case 'ONE_DIRECTION':
  701. direction = "One Way from ";
  702. break;
  703. case 'BOTH_DIRECTIONS':
  704. direction = "Both Ways between ";
  705. }
  706. switch (obj.attributes.WorkType) {
  707. case "1":
  708. WorkType = "Gas Work";
  709. break;
  710. case "2":
  711. WorkType = "Street Work (city)";
  712. break;
  713. case "3":
  714. WorkType = "Street Work (DelDOT)";
  715. break;
  716. case "4":
  717. WorkType = "Water Work";
  718. break;
  719. case "5":
  720. WorkType = "Work (other)";
  721. break;
  722. case "6":
  723. WorkType = "Sewer Work";
  724. }
  725. if (obj.attributes.street != null) {
  726. var originShift = 2.0 * Math.PI * 6378137.0 / 2.0;
  727. var lon = (obj.geometry.paths[0][0][0] / originShift) * 180.0;
  728. var lat = (obj.geometry.paths[0][0][1] / originShift) * 180.0;
  729. lat = 180.0 / Math.PI * (2.0 * Math.atan(Math.exp(lat * Math.PI / 180.0)) - Math.PI / 2.0);
  730. promisesDE.push(new Promise((resolve, reject) => {
  731. advisoriesDE.push({
  732. state: ['DE', 'Delaware'],
  733. id: obj.attributes.OBJECTID,
  734. popupType: 0,
  735. title: 'Wilmington Road Closures',
  736. lon: lon,
  737. lat: lat,
  738. type: 'Closure',
  739. keyword: ['Closure'], //keywords for roadwork/construction
  740. desc: WorkType + ' - ' + direction + obj.attributes.StartingFrom + ' to ' + obj.attributes.EndingAt + '<br> from ' + moment(new Date(obj.attributes.starttime)).format('LLL') + ' to ' + moment(new Date(obj.attributes.endtime)).format('LLL'),
  741. time: moment(new Date(obj.attributes.EditDate)).format('LLL'),
  742. link: ''
  743. });
  744. resolve();
  745. }))
  746. }
  747. }
  748. },
  749. URL: ['https://tmc.deldot.gov/json/advisory.json', 'https://deldot.gov/json/str.json', 'https://services.arcgis.com/hQ3wdpbjO3fPf612/ArcGIS/rest/services/RoadClosures_5b3e88c5556242dfa6e058198be7eb52_public/FeatureServer/1/query?where=1%3D1&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&resultType=standard&distance=0.0&units=esriSRUnit_Meter&returnGeodetic=false&outFields=*&returnGeometry=true&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=false&returnDistinctValues=false&cacheHint=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount=&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=none&f=pjson&token=']
  750. },
  751. FL: {
  752. data(res, index) {
  753. let resultText = [res.item2, res.item2, res.item2];
  754. return (resultText[index]);
  755. },
  756. filter(index) {
  757. let filtertext = [true, true, true];
  758. return (filtertext[index]);
  759. },
  760. scheme(obj, index) {
  761. switch (index) {
  762. case 0:
  763. promisesFL.push(new Promise((resolve, reject) => {
  764. //setTimeout(function () { resolve() }, 4000);
  765. getFeed(config.FL.detailURL[0] + obj.itemId.replace("/ /g", "%20"), async function (result) {
  766. var eventObj = JSON.parse(result.responseText);
  767. if (eventObj.details.detailLang1.eventTypeName == "Closures") {
  768. advisoriesFL.push({
  769. state: ['FL', 'Florida'],
  770. id: eventObj.id.id,
  771. popupType: 0,
  772. title: eventObj.areas.area5.areaLang1,
  773. lon: eventObj.coordinates.locationLongitude / 1000000,
  774. lat: eventObj.coordinates.locationLatitude / 1000000,
  775. type: eventObj.details.detailLang1.eventTypeName,
  776. keyword: ['Construction'], //keywords for roadwork/construction
  777. desc: eventObj.details.detailLang1.eventDescription,
  778. time: moment(new Date(eventObj.dates.lastUpdated)).format('LLL'),
  779. link: ''
  780. });
  781. }
  782. resolve();
  783. });
  784. }));
  785. break;
  786. case 1:
  787. promisesFL.push(new Promise((resolve, reject) => {
  788. //setTimeout(function () { resolve() }, 4000);
  789. getFeed(config.FL.detailURL[1] + obj.itemId.replace("/ /g", "%20"), async function (result) {
  790. var eventObj = JSON.parse(result.responseText);
  791. if (eventObj.details.detailLang1.eventTypeName == "Closures") {
  792. advisoriesFL.push({
  793. state: ['FL', 'Florida'],
  794. id: eventObj.id.id,
  795. popupType: 0,
  796. title: eventObj.areas.area5.areaLang1,
  797. lon: eventObj.coordinates.locationLongitude / 1000000,
  798. lat: eventObj.coordinates.locationLatitude / 1000000,
  799. type: eventObj.details.detailLang1.eventTypeName,
  800. keyword: ['Closures'], //keywords for roadwork/construction
  801. desc: eventObj.details.detailLang1.eventDescription,
  802. time: moment(new Date(eventObj.dates.lastUpdated)).format('LLL'),
  803. link: ''
  804. });
  805. }
  806. resolve();
  807. });
  808. }));
  809. break;
  810. case 2:
  811. promisesFL.push(new Promise((resolve, reject) => {
  812. //setTimeout(function () { resolve() }, 4000);
  813. getFeed(config.FL.detailURL[1] + obj.itemId.replace("/ /g", "%20"), async function (result) {
  814. var eventObj = JSON.parse(result.responseText);
  815. if (eventObj.details.detailLang1.eventTypeName == "Closures") {
  816. advisoriesFL.push({
  817. state: ['FL', 'Florida'],
  818. id: eventObj.id.id,
  819. popupType: 0,
  820. title: eventObj.areas.area5.areaLang1,
  821. lon: eventObj.coordinates.locationLongitude / 1000000,
  822. lat: eventObj.coordinates.locationLatitude / 1000000,
  823. type: eventObj.details.detailLang1.eventTypeName,
  824. keyword: ['Constructions'], //keywords for roadwork/construction
  825. desc: eventObj.details.detailLang1.eventDescription,
  826. time: moment(new Date(eventObj.dates.lastUpdated)).format('LLL'),
  827. link: ''
  828. });
  829. }
  830. resolve();
  831. });
  832. }));
  833. }
  834. },
  835. URL: ['https://fl511.com/map/mapIcons/Incidents?_=1604955914474', 'https://fl511.com/map/mapIcons/Construction?_=1604965926997', 'https://fl511.com/map/mapIcons/Closures?_=1604965926997'],
  836. detailURL: ['https://fl511.com/map/data/Incidents/', 'https://fl511.com/map/data/Construction/', 'https://fl511.com/map/data/Closures/']
  837. },
  838. GA: {
  839. data(res, index) {
  840. let resultText = [res.features, res.features];
  841. return (resultText[index]);
  842. },
  843. filter(index) {
  844. let filtertext = [true, true];
  845. return (filtertext[index]);
  846. },
  847. scheme(obj, index) {
  848. switch (index) {
  849. case 0:
  850. promisesGA.push(new Promise((resolve, reject) => {
  851. advisoriesGA.push({
  852. state: ['GA', 'Georgia'],
  853. id: obj.id,
  854. popupType: 0,
  855. title: obj.properties.headline + ' - ' + obj.properties.route,
  856. lon: obj.geometry.coordinates[0],
  857. lat: obj.geometry.coordinates[1],
  858. type: obj.properties.headline,
  859. keyword: ['Construction', 'Emergency Roadwork'], //keyword for roadwork/construction
  860. desc: obj.properties.location_description + '<br>' + obj.properties.lanes,
  861. time: moment(new Date(obj.properties.start * 1000)).format('LLL'),
  862. link: ''
  863. });
  864. resolve();
  865. }))
  866. break;
  867. case 1:
  868. promisesGA.push(new Promise((resolve, reject) => {
  869. advisoriesGA.push({
  870. state: ['GA', 'Georgia'],
  871. id: obj.id,
  872. popupType: 0,
  873. title: obj.properties.headline + ' - ' + obj.properties.route,
  874. lon: obj.geometry.coordinates[0],
  875. lat: obj.geometry.coordinates[1],
  876. type: obj.properties.headline,
  877. keyword: ['Construction', 'Emergency Roadwork'], //keyword for roadwork/construction
  878. desc: obj.properties.location_description + '<br>' + obj.properties.lanes,
  879. time: moment(new Date(obj.properties.start * 1000)).format('LLL'),
  880. link: ''
  881. });
  882. resolve();
  883. }))
  884. }
  885. },
  886. URL: ['https://ga.cdn.iteris-atis.com/geojson/icons/metadata/icons.construction.geojson', 'https://ga.cdn.iteris-atis.com/geojson/icons/metadata/icons.incident.geojson']
  887. },
  888. IA: {
  889. data(res, index) {
  890. let resultText = [res[0].data.mapFeaturesQuery.mapFeatures];
  891. return (resultText[index]);
  892. },
  893. filter(index) {
  894. let filtertext = ['resultObj[i].features[0].properties.icon.url == "/images/tg_closure_critical.svg" || resultObj[i].features[0].properties.icon.url == "/images/tg_closure_routine.svg" || resultObj[i].features[0].properties.icon.url == "/images/tg_crash_routine.svg" || resultObj[i].features[0].properties.icon.url == "/images/tg_warning_urgent.svg" || (resultObj[i].features[0].properties.icon.url == "/images/tg_warning_routine.svg" && resultObj[i].tooltip.toUpperCase().includes("RAMP CLOSE"))'];
  895. return (filtertext[index]);
  896. },
  897. scheme(obj, index) {
  898. let advType = "";
  899. if (obj.tooltip.toUpperCase().includes("CONSTRUCTION")) {
  900. advType = "Construction";
  901. } else { advType = "Incident"; }
  902. promisesIA.push(new Promise((resolve, reject) => {
  903. advisoriesIA.push({
  904. state: ['IA', 'Iowa'],
  905. id: obj.features[0].id,
  906. popupType: 0,
  907. title: "N/A",
  908. lon: obj.features[0].geometry.coordinates[0],
  909. lat: obj.features[0].geometry.coordinates[1],
  910. type: advType,
  911. keyword: ['Construction'], //keywords for roadwork/construction
  912. desc: obj.tooltip,
  913. time: "N/A",
  914. link: ''
  915. });
  916. resolve();
  917. }))
  918. },
  919. URL: ['http://40.121.218.107/IA']
  920. },
  921. IL: {
  922. data(res, index) {
  923. let resultText = [res.features, res.features, res.features];
  924. return (resultText[index]);
  925. },
  926. filter(index) {
  927. let filtertext = [true, true, true];
  928. return (filtertext[index]);
  929. },
  930. scheme(obj, index) {
  931. switch (index) {
  932. case 0:
  933. promisesIL.push(new Promise((resolve, reject) => {
  934. advisoriesIL.push({
  935. state: ['IL', 'Illinois'],
  936. id: obj.attributes.OBJECTID,
  937. popupType: 0,
  938. title: obj.attributes.NearTown,
  939. lon: obj.geometry.x,
  940. lat: obj.geometry.y,
  941. type: "Construction",
  942. keyword: ['Construction'], //keywords for roadwork/construction
  943. desc: 'Closed from ' + obj.attributes.Location + '<br> from ' + moment(new Date(obj.attributes.StartDate)).format('LLL') + ' to ' + moment(new Date(obj.attributes.EndDate)).format('LLL'),
  944. time: moment(new Date(obj.attributes.StartDate)).format('LLL'),
  945. link: obj.attributes.WebAddress
  946. });
  947. resolve();
  948. }))
  949. break;
  950. case 1:
  951. var DateUpdate;
  952. if (obj.attributes.DateUpdate == null) {
  953. DateUpdate = moment(new Date(obj.attributes.DateEntered)).format('LLL');
  954. } else {
  955. DateUpdate = moment(new Date(obj.attributes.DateUpdate)).format('LLL');
  956. }
  957. var originShift = 2.0 * Math.PI * 6378137.0 / 2.0;
  958. var lon = (obj.geometry.paths[0][0][0] / originShift) * 180.0;
  959. var lat = (obj.geometry.paths[0][0][1] / originShift) * 180.0;
  960. lat = 180.0 / Math.PI * (2.0 * Math.atan(Math.exp(lat * Math.PI / 180.0)) - Math.PI / 2.0);
  961. if (obj.attributes.SuggestionToMotorist.includes("Closed")) {
  962. promisesIL.push(new Promise((resolve, reject) => {
  963. advisoriesIL.push({
  964. state: ['IL', 'Illinois'],
  965. id: obj.attributes.OBJECTID,
  966. popupType: 0,
  967. title: obj.attributes.County,
  968. lon: lon,
  969. lat: lat,
  970. type: "Construction",
  971. keyword: ['Construction'], //keywords for roadwork/construction
  972. desc: 'Closed from ' + obj.attributes.Location + '<br> from ' + moment(new Date(obj.attributes.StartDate)).format('LLL') + ' to ' + moment(new Date(obj.attributes.EndDate)).format('LLL'),
  973. time: DateUpdate,
  974. link: obj.attributes.WebAddress
  975. });
  976. resolve();
  977. }))
  978. }
  979. break;
  980. case 2:
  981. promisesIL.push(new Promise((resolve, reject) => {
  982. advisoriesIL.push({
  983. state: ['IL', 'Illinois'],
  984. id: obj.attributes.OBJECTID,
  985. popupType: 0,
  986. title: obj.attributes.NearTown,
  987. lon: obj.geometry.paths[0][0][0],
  988. lat: obj.geometry.paths[0][0][1],
  989. type: "",
  990. keyword: ['Flooding'], //keywords for roadwork/construction
  991. desc: 'Closed from ' + obj.attributes.Location + '<br> from ' + moment(new Date(obj.attributes.StartDate)).format('LLL') + ' to ' + moment(new Date(obj.attributes.EndDate)).format('LLL'),
  992. time: moment(new Date(obj.attributes.StartDate)).format('LLL'),
  993. link: ''
  994. });
  995. resolve();
  996. }))
  997. }
  998. },
  999.  
  1000. URL: ['https://services2.arcgis.com/aIrBD8yn1TDTEXoz/ArcGIS/rest/services/ClosureIncidents/FeatureServer/0/query?where=1%3D1&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&resultType=none&distance=0.0&units=esriSRUnit_Meter&returnGeodetic=false&outFields=*&returnGeometry=true&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=false&returnDistinctValues=false&cacheHint=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount=&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=none&f=pjson&token=', 'https://services2.arcgis.com/aIrBD8yn1TDTEXoz/ArcGIS/rest/services/RoadConstruction_View/FeatureServer/0/query?where=1%3D1&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&resultType=none&distance=0.0&units=esriSRUnit_Meter&returnGeodetic=false&outFields=*&returnGeometry=true&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=false&returnDistinctValues=false&cacheHint=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount=&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=none&f=pjson&token=', 'https://services2.arcgis.com/aIrBD8yn1TDTEXoz/ArcGIS/rest/services/Flooding_Road_Closures/FeatureServer/0/query?where=1%3D1&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&resultType=none&distance=0.0&units=esriSRUnit_Meter&returnGeodetic=false&outFields=*&returnGeometry=true&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=false&returnDistinctValues=false&cacheHint=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount=&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=none&f=pjson&token=']
  1001. },
  1002. IN: {
  1003. data(res, index) {
  1004. let resultText = [res[0].data.mapFeaturesQuery.mapFeatures];
  1005. return (resultText[index]);
  1006. },
  1007. filter(index) {
  1008. let filtertext = [true];
  1009. return (filtertext[index]);
  1010. },
  1011. scheme(obj, index) {
  1012. let advType = "";
  1013. if (obj.tooltip.toUpperCase().includes("CONSTRUCTION")) {
  1014. advType = "Construction";
  1015. } else { advType = "Incident"; }
  1016. if (obj.features[0].properties.icon.url == "/images/tg_closure_urgent.svg" || obj.features[0].properties.icon.url == "/images/tg_closure_critical.svg" || obj.features[0].properties.icon.url == "/images/tg_closure_routine.svg" || obj.features[0].properties.icon.url == "/images/tg_crash_routine.svg" || (obj.features[0].properties.icon.url == "/images/tg_warning_routine.svg" && obj.tooltip.toUpperCase().includes("RAMP CLOSE"))) {
  1017. promisesIN.push(new Promise((resolve, reject) => {
  1018. advisoriesIN.push({
  1019. state: ['IN', 'Indiana'],
  1020. id: obj.features[0].id,
  1021. popupType: 0,
  1022. title: "N/A",
  1023. lon: obj.features[0].geometry.coordinates[0],
  1024. lat: obj.features[0].geometry.coordinates[1],
  1025. type: advType,
  1026. keyword: ['Construction'], //keywords for roadwork/construction
  1027. desc: obj.tooltip,
  1028. time: "N/A",
  1029. link: ''
  1030. });
  1031. resolve();
  1032. }))
  1033. }
  1034. },
  1035. URL: ['http://40.121.218.107/IN']
  1036. },
  1037. LA: {
  1038. data(res, index) {
  1039. let resultText = [res];
  1040. return (resultText[index]);
  1041. },
  1042. filter(index) {
  1043. let filtertext = ['(resultObj[i].LanesAffected).replace(/ +(?= )/g, "") == ("All Lanes Closed")'];
  1044. return (filtertext[index]);
  1045. },
  1046. scheme(obj, index) {
  1047. promisesLA.push(new Promise((resolve, reject) => {
  1048. advisoriesLA.push({
  1049. state: ['LA', 'Louisiana'],
  1050. id: obj.ID,
  1051. popupType: 0,
  1052. title: obj.RoadwayName,
  1053. lon: obj.Longitude,
  1054. lat: obj.Latitude,
  1055. type: obj.EventType,
  1056. keyword: ['roadwork'], //keywords for roadwork/construction
  1057. desc: obj.Description,
  1058. time: moment(new Date(obj.LastUpdated * 1000)).format('LLL'),
  1059. link: ''
  1060. });
  1061. resolve();
  1062. }))
  1063. },
  1064. URL: ['http://40.121.218.107/LA']
  1065. },
  1066. MD: {
  1067. data(res, index) {
  1068. let resultText = [res.features];
  1069. return (resultText[index]);
  1070. },
  1071. filter(index) {
  1072. let filtertext = [true];
  1073. return (filtertext[index]);
  1074. },
  1075. scheme(obj, index) {
  1076. promisesMD.push(new Promise((resolve, reject) => {
  1077. advisoriesMD.push({
  1078. state: ['MD', 'Maryland'],
  1079. id: obj.attributes.OBJECTID,
  1080. popupType: 0,
  1081. title: obj.attributes.Jurisdiction,
  1082. lon: obj.attributes.Longitude,
  1083. lat: obj.attributes.Latitude,
  1084. type: obj.attributes.typeSummary,
  1085. keyword: ['Construction'], //keywords for roadwork/construction
  1086. desc: obj.attributes.ClosureSummary,
  1087. time: moment(new Date(obj.attributes.EditDate)).format('LLL'),
  1088. link: ''
  1089. });
  1090. resolve();
  1091. }))
  1092. },
  1093. URL: ['https://geodata.md.gov/appdata/rest/services/SHA_RoadClosure/RoadClosureActive/MapServer//0/query?where=1%3D1&outFields=*&outSR=4326&f=json']
  1094. },
  1095. MI: {
  1096. data(res, index) {
  1097. let resultText = [res, res];
  1098. return (resultText[index]);
  1099. },
  1100. filter(index) {
  1101. let filtertext = ['(resultObj[i].type == "Total")', true];
  1102. return (filtertext[index]);
  1103. },
  1104. scheme(obj, index) {
  1105. switch (index) {
  1106. case 0:
  1107. promisesMI.push(new Promise((resolve, reject) => {
  1108. advisoriesMI.push({
  1109. state: ['MI', 'Michigan'],
  1110. id: "00",
  1111. popupType: 0,
  1112. title: obj.county,
  1113. lon: obj.description.match(/(?<=lon=)[\s\S]*(?=&zoom)/)[0],
  1114. lat: obj.description.match(/(?<=lat=)[\s\S]*(?=&lon)/)[0],
  1115. type: "Construction",
  1116. keyword: ['Construction'], //keyword for roadwork/construction
  1117. desc: obj.description.match(/(?:(?!<).)*/),
  1118. time: moment(new Date(obj.startDate)).format('LL'),
  1119. link: ''
  1120. });
  1121. resolve();
  1122. }))
  1123. break;
  1124. case 1:
  1125. promisesMI.push(new Promise((resolve, reject) => {
  1126. advisoriesMI.push({
  1127. state: ['MI', 'Michigan'],
  1128. id: "",
  1129. popupType: 0,
  1130. title: obj.county,
  1131. lon: obj.location.match(/(?<=lon=)[\s\S]*(?=&zoom)/)[0],
  1132. lat: obj.location.match(/(?<=lat=)[\s\S]*(?=&lon)/)[0],
  1133. type: "Incident",
  1134. keyword: ['Construction'], //keyword for roadwork/construction
  1135. desc: obj.location.match(/(?:(?!<).)*/),
  1136. time: moment(new Date(obj.reported)).format('LLL'),
  1137. link: ''
  1138. });
  1139. resolve();
  1140. }))
  1141. }
  1142. },
  1143. URL: ['https://mdotjboss.state.mi.us/MiDrive//construction/list/loadConstruction', 'https://mdotjboss.state.mi.us/MiDrive//incident/list/loadIncidents']
  1144. },
  1145. MN: {
  1146. data(res, index) {
  1147. let resultText = [res[0].data.mapFeaturesQuery.mapFeatures];
  1148. return (resultText[index]);
  1149. },
  1150. filter(index) {
  1151. let filtertext = ['resultObj[i].features[0].properties.icon.url == "/images/tg_closure_critical.svg" || resultObj[i].features[0].properties.icon.url == "/images/tg_closure_routine.svg" || resultObj[i].features[0].properties.icon.url == "/images/tg_crash_routine.svg" || (resultObj[i].features[0].properties.icon.url == "/images/tg_warning_routine.svg" && resultObj[i].tooltip.toUpperCase().includes("RAMP CLOSE"))'];
  1152. return (filtertext[index]);
  1153. },
  1154. scheme(obj, index) {
  1155. let advType = "";
  1156. if (obj.tooltip.toUpperCase().includes("CONSTRUCTION")) {
  1157. advType = "Construction";
  1158. } else { advType = "Incident"; }
  1159. promisesMN.push(new Promise((resolve, reject) => {
  1160. advisoriesMN.push({
  1161. state: ['MN', 'Minnesota'],
  1162. id: obj.features[0].id,
  1163. popupType: 0,
  1164. title: "N/A",
  1165. lon: obj.features[0].geometry.coordinates[0],
  1166. lat: obj.features[0].geometry.coordinates[1],
  1167. type: advType,
  1168. keyword: ['Construction'], //keywords for roadwork/construction
  1169. desc: obj.tooltip,
  1170. time: "N/A",
  1171. link: ''
  1172. });
  1173. resolve();
  1174. }))
  1175. },
  1176. URL: ['http://40.121.218.107/MN']
  1177. },
  1178. NC: {
  1179. data(res, index) {
  1180. let resultText = [res.features];
  1181. return (resultText[index]);
  1182. },
  1183. filter(index) {
  1184. let filtertext = [true];
  1185. return (filtertext[index]);
  1186. },
  1187. scheme(obj, index) {
  1188. promisesNC.push(new Promise((resolve, reject) => {
  1189. advisoriesNC.push({
  1190. state: ['NC', 'North Carolina'],
  1191. id: obj.attributes.OBJECTID,
  1192. popupType: 0,
  1193. title: obj.attributes.CountyName,
  1194. lon: obj.attributes.Longitude,
  1195. lat: obj.attributes.Latitude,
  1196. type: obj.attributes.IncidentType,
  1197. keyword: ['Construction', 'Emergency Road Work', 'Night Time Construction', 'Weekend Construction'], //keywords for roadwork/construction
  1198. desc: obj.attributes.Reason,
  1199. time: moment(new Date(obj.attributes.LastUpdateUTC)).format('LLL'),
  1200. link: obj.attributes.DriveNCLink
  1201. });
  1202. resolve();
  1203. }))
  1204. },
  1205. URL: ['https://services.arcgis.com/NuWFvHYDMVmmxMeM/ArcGIS/rest/services/NCDOT_TIMSIncidents/FeatureServer/0/query?where=Condition+%3D+%27Road+Closed%27&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&resultType=none&distance=0.0&units=esriSRUnit_Meter&returnGeodetic=false&outFields=*&returnGeometry=true&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=false&returnDistinctValues=false&cacheHint=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount=&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=none&f=pjson&token=']
  1206. },
  1207. NJ: {
  1208. data(res, index) {
  1209. let resultText = [res.Data.features];
  1210. return (resultText[index]);
  1211. },
  1212. filter(index) {
  1213. let filtertext = [true];
  1214. return (filtertext[index]);
  1215. },
  1216. scheme(obj, index) {
  1217. promisesNJ.push(new Promise((resolve, reject) => {
  1218. //setTimeout(function () { resolve() }, 4000);
  1219. getFeed(config.NJ.detailURL[0] + obj.properties.EventID, function (result) {
  1220. var eventObj = JSON.parse(result.responseText).Data;
  1221. console.log(result.status);
  1222. if (((eventObj[0].FullText.toUpperCase()).includes("ALL LANES CLOSE") || (eventObj[0].FullText.toUpperCase()).includes("RAMP CLOSE")) && ((eventObj[0].FullText).includes("NYSDOT") != true)) {
  1223. advisoriesNJ.push({
  1224. state: ['NJ', 'New Jersey'],
  1225. id: eventObj[0].markerId,
  1226. popupType: 0,
  1227. title: eventObj[0].County,
  1228. lon: eventObj[0].Longitude,
  1229. lat: eventObj[0].Latitude,
  1230. type: eventObj[0].CategoryName,
  1231. keyword: ['Construction', 'ScheduledConstruction'], //keywords for roadwork/construction
  1232. desc: eventObj[0].FullText,
  1233. time: moment(new Date(eventObj[0].LastUpdateDate_String)).format('LLL'),
  1234. link: ''
  1235. });
  1236. }
  1237. resolve(true);
  1238. });
  1239. }));
  1240. },
  1241. URL: ['https://511nj.org/API/client/Map/getEventData'],
  1242. detailURL: ['https://511nj.org/API/client/Map/getEventPopupData?EventId=']
  1243. },
  1244. NV: {
  1245. data(res, index) {
  1246. let resultText = [res.d];
  1247. return (resultText[index]);
  1248. },
  1249. filter(index) {
  1250. let filtertext = [true];
  1251. return (filtertext[index]);
  1252. },
  1253. scheme(obj, index) {
  1254. promisesNV.push(new Promise((resolve, reject) => {
  1255. let unix = obj.LastUpdate.replace(/\\\//g, "").replace("/Date(", "").replace(")/", "");
  1256. advisoriesNV.push({
  1257. state: ['NV', 'Nevada'],
  1258. id: obj.ID,
  1259. popupType: 0,
  1260. title: obj.Facility,
  1261. lon: obj.Lon,
  1262. lat: obj.Lat,
  1263. type: obj.CategoryName,
  1264. keyword: ['Construction'], //keywords for roadwork/construction
  1265. desc: obj.Description,
  1266. time: moment(new Date(parseInt(unix))).format('LLL'),
  1267. link: ''
  1268. });
  1269. resolve();
  1270. }))
  1271. },
  1272. URL: ['http://40.121.218.107/NV']
  1273. },
  1274. NY: {
  1275. data(res, index) {
  1276. let resultText = [res];
  1277. return (resultText[index]);
  1278. },
  1279. filter(index) {
  1280. let filtertext = ['((NotNY.includes(resultObj[i].RegionName) == false && resultObj[i].EventType != "transitMode" && resultObj[i].EventSubType != "Capacity related") && (resultObj[i].EventType == "closures" || (resultObj[i].EventType != "closures" && resultObj[i].LanesAffected == "all lanes" && (resultObj[i].LanesStatus == "closed" || resultObj[i].LanesStatus == "blocked"))))'];
  1281. return (filtertext[index]);
  1282. },
  1283. scheme(obj, index) {
  1284. promisesNY.push(new Promise((resolve, reject) => {
  1285. advisoriesNY.push({
  1286. state: ['NY', 'New York'],
  1287. id: obj.ID,
  1288. popupType: 0,
  1289. title: obj.CountyName,
  1290. lon: obj.Longitude,
  1291. lat: obj.Latitude,
  1292. type: obj.EventType,
  1293. keyword: ['roadwork', 'transitMode', 'closures'], //keywords for roadwork/construction
  1294. desc: obj.Description,
  1295. time: moment(moment(obj.LastUpdated, "DD/MM/YYYY HH:mm:ss")).format('LLL'),
  1296. link: ''
  1297. });
  1298. resolve();
  1299. }))
  1300. },
  1301. URL: ['http://40.121.218.107/NY']
  1302. },
  1303. OH: {
  1304. data(res, index) {
  1305. let resultText = [res.ConstructionMarkers];
  1306. return (resultText[index]);
  1307. },
  1308. filter(index) {
  1309. let filtertext = ['(resultObj[i].Status == "Closed")'];
  1310. return (filtertext[index]);
  1311. },
  1312. scheme(obj, index) {
  1313. promisesOH.push(new Promise((resolve, reject) => {
  1314. advisoriesOH.push({
  1315. state: ['OH', 'Ohio'],
  1316. id: obj.ID,
  1317. popupType: 0,
  1318. title: obj.District,
  1319. lon: obj.Longitude,
  1320. lat: obj.Latitude,
  1321. type: obj.Category,
  1322. keyword: ['Roadwork - Planned', 'Roadwork - Unplanned'], //keywords for roadwork/construction
  1323. desc: obj.Description,
  1324. time: moment(new Date(obj.StartDate)).format('LL'),
  1325. link: ''
  1326. });
  1327. resolve();
  1328. }))
  1329. },
  1330. URL: ['https://api.ohgo.com/roadmarkers/TrafficSpeedAndAlertMarkers']
  1331. },
  1332. OR: {
  1333. data(res, index) {
  1334. let resultText = [res.features, res.features, res.features];
  1335. return (resultText[index]);
  1336. },
  1337. filter(index) {
  1338. let filtertext = [true, 'resultObj[i].attributes.comments.includes("clos")', 'resultObj[i].attributes.tmddOther.includes("clos")'];
  1339. return (filtertext[index]);
  1340. },
  1341. scheme(obj, index) {
  1342. switch (index) {
  1343. case 0:
  1344. let x, y;
  1345. var lonlat = obj.geometry.paths[0][0];
  1346. promisesOR.push(new Promise((resolve, reject) => {
  1347. x = obj.geometry.paths[0][0].toString().split(",")[0];
  1348. y = obj.geometry.paths[0][0].toString().split(",")[1];
  1349. advisoriesOR.push({
  1350. state: ['OR', 'Oregon'],
  1351. id: obj.attributes.OBJECTID,
  1352. popupType: 0,
  1353. title: obj.attributes.FROM_TO,
  1354. lon: x,
  1355. lat: y,
  1356. type: obj.attributes.CLOSURE_EFFECT,
  1357. keyword: ['Street'], //keywords for roadwork/construction
  1358. desc: obj.attributes.FROM_TO + " - " + obj.attributes.REMARKS,
  1359. time: moment(new Date(obj.attributes.LAST_EDITED_DATE)).format('LLL'),
  1360. link: ''
  1361. });
  1362. resolve();
  1363. }))
  1364. break;
  1365. case 1:
  1366. promisesOR.push(new Promise((resolve, reject) => {
  1367. advisoriesOR.push({
  1368. state: ['OR', 'Oregon'],
  1369. id: obj.attributes.incidentId,
  1370. popupType: 0,
  1371. title: obj.attributes.locationName,
  1372. lon: obj.attributes.startLongitude,
  1373. lat: obj.attributes.startLatitude,
  1374. type: obj.attributes.type,
  1375. keyword: ['ROADWORK'], //keywords for roadwork/construction
  1376. desc: obj.attributes.comments + " <br> " + obj.attributes.beginMarker + " to " + obj.attributes.endMarker,
  1377. time: moment(new Date(obj.attributes.lastUpdated)).format('LLL'),
  1378. link: ''
  1379. });
  1380. resolve();
  1381. }))
  1382. break;
  1383. case 2:
  1384. promisesOR.push(new Promise((resolve, reject) => {
  1385. advisoriesOR.push({
  1386. state: ['OR', 'Oregon'],
  1387. id: obj.attributes.incidentId,
  1388. popupType: 0,
  1389. title: obj.attributes.locationName,
  1390. lon: obj.attributes.startLongitude,
  1391. lat: obj.attributes.startLatitude,
  1392. type: obj.attributes.type,
  1393. keyword: ['EVENT'], //keywords for roadwork/construction
  1394. desc: obj.attributes.tmddOther + " <br> " + obj.attributes.beginMarker + " to " + obj.attributes.endMarker,
  1395. time: moment(new Date(obj.attributes.lastUpdated)).format('LLL'),
  1396. link: ''
  1397. });
  1398. resolve();
  1399. }))
  1400. }
  1401. },
  1402. URL: ['https://services.arcgis.com/kIA6yS9KDGqZL7U3/ArcGIS/rest/services/RoadWork/FeatureServer/1/query?where=objectid+like+%27%25%27&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&resultType=none&distance=0.0&units=esriSRUnit_Meter&returnGeodetic=false&outFields=*&returnGeometry=true&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=4326&datumTransformation=&applyVCSProjection=true&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=true&returnDistinctValues=false&cacheHint=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount=&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=none&f=pjson&token=', 'https://tripcheck.com/Scripts/map/data/INCD.js?dt=1607132941398', 'https://tripcheck.com/Scripts/map/data/EVENT.js?dt=1607134261397']
  1403. },
  1404. PA: {
  1405. data(res, index) {
  1406. let resultText = [res, res.features];
  1407. return (resultText[index]);
  1408. },
  1409. filter(index) {
  1410. let filtertext = ['(resultObj[i].LaneStatus == "closed") || (resultObj[i].LaneStatus == "ramp closure")', true];
  1411. return (filtertext[index]);
  1412. },
  1413. scheme(obj, index) {
  1414. switch (index) {
  1415. case 0:
  1416. let status = obj.LaneStatus;
  1417. let x, y;
  1418. if (status != "ramp closure") {
  1419. x = obj.FromLocLatLong.split(",")[1];
  1420. y = obj.FromLocLatLong.split(",")[0];
  1421. } else {
  1422. x = obj.IncidentLocLatLong.split(",")[1];
  1423. y = obj.IncidentLocLatLong.split(",")[0];
  1424. }
  1425. promisesPA.push(new Promise((resolve, reject) => {
  1426. advisoriesPA.push({
  1427. state: ['PA', 'Pennsylvania'],
  1428. id: obj.EventID,
  1429. popupType: 0,
  1430. title: obj.CountyName,
  1431. lon: x,
  1432. lat: y,
  1433. fromLon: obj.FromLocLatLong.split(",")[1],
  1434. fromLat: obj.FromLocLatLong.split(",")[0],
  1435. toLon: obj.ToLocLatLong.split(",")[1],
  1436. toLat: obj.ToLocLatLong.split(",")[0],
  1437. type: obj.EventType,
  1438. keyword: ['roadwork', 'bridge outage'], //keywords for roadwork/construction
  1439. desc: obj.Description,
  1440. time: moment(new Date(obj.LastUpdate)).format('LLL'),
  1441. link: ''
  1442. });
  1443. resolve();
  1444. }))
  1445. break;
  1446. case 1:
  1447. var timing;
  1448. if (obj.attributes.endtime == null) {
  1449. timing = moment(new Date(obj.attributes.starttime)).format('LLL');
  1450. } else {
  1451. timing = moment(new Date(obj.attributes.starttime)).format('LLL') + ' to ' + moment(new Date(obj.attributes.endtime)).format('LLL');
  1452. }
  1453. promisesPA.push(new Promise((resolve, reject) => {
  1454. if (obj.attributes.endtime > Date.now()) {
  1455. advisoriesPA.push({
  1456. state: ['PA', 'Pennsylvania'],
  1457. id: obj.attributes.GlobalID,
  1458. popupType: 0,
  1459. title: 'HARRISBURG',
  1460. lon: obj.geometry.paths[0][0][0],
  1461. lat: obj.geometry.paths[0][0][1],
  1462. fromLon: obj.geometry.paths[0][0][0],
  1463. fromLat: obj.geometry.paths[0][0][1],
  1464. toLon: obj.geometry.paths[0][obj.geometry.paths[0].length - 1][0],
  1465. toLat: obj.geometry.paths[0][obj.geometry.paths[0].length - 1][1],
  1466. type: 'Closure',
  1467. keyword: ['Closure'], //keywords for roadwork/construction
  1468. desc: obj.attributes.street + ': ' + obj.attributes.description + '<br>' + timing,
  1469. time: moment(new Date(obj.attributes.EditDate)).format('LLL'),
  1470. link: ''
  1471. });
  1472. }
  1473. resolve();
  1474. }))
  1475. }
  1476. },
  1477. URL: ['http://40.121.218.107/PA', 'https://services5.arcgis.com/9n3LUAMi3B692MBL/ArcGIS/rest/services/RoadClosures_f0c23ca29f394e03a9ea06a2ffcb317a/FeatureServer/1/query?where=1%3D1&objectIds=&time=&geometry=&geometryType=esriGeometryPoint&inSR=&spatialRel=esriSpatialRelIntersects&resultType=none&distance=0.0&units=esriSRUnit_StatuteMile&returnGeodetic=false&outFields=*&returnGeometry=true&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=4326&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=true&returnDistinctValues=false&cacheHint=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount=&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=none&f=pjson&token=']
  1478. },
  1479. VA: {
  1480. data(res, index) {
  1481. let resultText = [res.features, res.features, res.features];
  1482. return (resultText[index]);
  1483. },
  1484. filter(index) {
  1485. let filtertext = [true, true, true];
  1486. return (filtertext[index]);
  1487. },
  1488. scheme(obj, index) {
  1489. switch (index) {
  1490. case 0:
  1491. promisesVA.push(new Promise((resolve, reject) => {
  1492. let lat = obj.geometry.coordinates[1];
  1493. let lon = obj.geometry.coordinates[0];
  1494. let thisID = obj.id;
  1495. getFeed(config.VA.detailURL + obj.id, async function (result) {
  1496. var eventObj = JSON.parse(result.responseText);
  1497. if (eventObj[thisID].display_text.toLowerCase().includes("all west lanes are closed")) {
  1498. advisoriesVA.push({
  1499. state: ['VA', 'Virginia'],
  1500. id: eventObj[thisID].fid,
  1501. popupType: 0,
  1502. title: "Construction",
  1503. lon: lon,
  1504. lat: lat,
  1505. type: eventObj[thisID].type,
  1506. keyword: ['Constructions'], //keywords for roadwork/construction
  1507. desc: eventObj[thisID].report,
  1508. time: moment(new Date(eventObj[thisID].update * 1000)).format('LLL'),
  1509. link: ''
  1510. });
  1511. }
  1512. resolve();
  1513. });
  1514. }));
  1515. break;
  1516. case 1:
  1517. promisesVA.push(new Promise((resolve, reject) => {
  1518. let lat = obj.geometry.coordinates[1];
  1519. let lon = obj.geometry.coordinates[0];
  1520. let thisID = obj.id;
  1521. getFeed(config.VA.detailURL + obj.id, async function (result) {
  1522. var eventObj = JSON.parse(result.responseText);
  1523. advisoriesVA.push({
  1524. state: ['VA', 'Virginia'],
  1525. id: eventObj[thisID].fid,
  1526. popupType: 0,
  1527. title: "High Impact Incident",
  1528. lon: lon,
  1529. lat: lat,
  1530. type: eventObj[thisID].type,
  1531. keyword: ['Constructions'], //keywords for roadwork/construction
  1532. desc: eventObj[thisID].report,
  1533. time: moment(new Date(eventObj[thisID].update * 1000)).format('LLL'),
  1534. link: ''
  1535. });
  1536. resolve();
  1537. });
  1538. }));
  1539. break;
  1540. case 2:
  1541. promisesVA.push(new Promise((resolve, reject) => {
  1542. let lat = obj.geometry.coordinates[1];
  1543. let lon = obj.geometry.coordinates[0];
  1544. let thisID = obj.id;
  1545. getFeed(config.VA.detailURL + obj.id, async function (result) {
  1546. var eventObj = JSON.parse(result.responseText);
  1547. advisoriesVA.push({
  1548. state: ['VA', 'Virginia'],
  1549. id: eventObj[thisID].fid,
  1550. popupType: 0,
  1551. title: "Weather",
  1552. lon: lon,
  1553. lat: lat,
  1554. type: eventObj[thisID].type,
  1555. keyword: ['Constructions'], //keywords for roadwork/construction
  1556. desc: eventObj[thisID].report,
  1557. time: moment(new Date(eventObj[thisID].update * 1000)).format('LLL'),
  1558. link: ''
  1559. });
  1560. resolve();
  1561. });
  1562. }));
  1563. }
  1564. },
  1565. URL: ['https://www.511virginia.org/data/geojson/icons.construction.geojson', 'https://www.511virginia.org/data/geojson/icons.high_impact_incident.geojson', 'https://www.511virginia.org/data/geojson/icons.weather_closure.geojson'],
  1566. detailURL: ['https://www.511virginia.org/report-json.pl?idents='],
  1567. },
  1568. WA: {
  1569. data(res, index) {
  1570. let resultText = [res];
  1571. return (resultText[index]);
  1572. },
  1573. filter(index) {
  1574. let filtertext = ['(resultObj[i].EventCategory == "Closure" || resultObj[i].EventCategory == "Construction" || resultObj[i].EventCategory == "Bridge")'];
  1575. return (filtertext[index]);
  1576. },
  1577. scheme(obj, index) {
  1578. let county;
  1579. if (obj.County == null) {
  1580. county = obj.Region;
  1581. } else {
  1582. county = obj.County;
  1583. }
  1584. let unixtime = parseInt(obj.LastUpdatedTime.replace("/Date(", "").replace(")/", "").split("-")[0]);
  1585. promisesWA.push(new Promise((resolve, reject) => {
  1586. advisoriesWA.push({
  1587. state: ['WA', 'Washington'],
  1588. id: obj.AlertID,
  1589. popupType: 0,
  1590. title: county,
  1591. lon: obj.StartRoadwayLocation.Longitude,
  1592. lat: obj.StartRoadwayLocation.Latitude,
  1593. type: obj.EventCategory,
  1594. keyword: ['Construction', 'Closures'], //keywords for roadwork/construction
  1595. desc: obj.HeadlineDescription,
  1596. time: moment(new Date(unixtime)).format('LLL'),
  1597. link: ''
  1598. });
  1599. resolve();
  1600. }))
  1601. },
  1602. URL: ['http://40.121.218.107/WA']
  1603. },
  1604. WI: {
  1605. data(res, index) {
  1606. let resultText = [res];
  1607. return (resultText[index]);
  1608. },
  1609. filter(index) {
  1610. let filtertext = ['(resultObj[i].EventType == "roadwork" || resultObj[i].EventType == "closures" || resultObj[i].EventType == "accidentsAndIncidents")'];
  1611. return (filtertext[index]);
  1612. },
  1613. scheme(obj, index) {
  1614. let linkvar = '';
  1615. let eText = '';
  1616.  
  1617. let addObj = function () {
  1618. if (obj.PlannedEndDate == null || obj.PlannedEndDate > moment().unix()) {
  1619. promisesWI.push(new Promise((resolve, reject) => {
  1620. advisoriesWI.push({
  1621. state: ['WI', 'Wisconsin'],
  1622. id: obj.ID,
  1623. popupType: 0,
  1624. title: obj.County,
  1625. lon: obj.Longitude,
  1626. lat: obj.Latitude,
  1627. type: obj.EventType,
  1628. keyword: ['roadwork', 'closure'], //keywords for roadwork/construction
  1629. desc: eText + ': ' + obj.Description,
  1630. startTime: moment.unix(obj.StartDate).format('LLL'),
  1631. plannedEndTime: moment.unix(obj.PlannedEndDate).format('LLL'),
  1632. time: moment.unix(obj.LastUpdated).format('LLL'),
  1633. link: linkvar,
  1634. recurrence: obj.Recurrence
  1635. });
  1636. resolve();
  1637. }))
  1638. }
  1639. };
  1640.  
  1641. if (obj.EventType == 'closures') {
  1642. linkvar = 'https://511wi.gov/map#ConstructionClosures-' + obj.ID.replace(' ', '%20');
  1643. new Promise((resolve, reject) => {
  1644. getFeed('https://511wi.gov/map/data/ConstructionClosures/' + obj.ID.replace(' ', '%20'), function (result) {
  1645. let resultObj = [];
  1646. resultObj = JSON.parse(result.responseText);
  1647. eText = resultObj.details.detailLang1.eventDescription + ' on ' + resultObj.location.linkDesignator + ' at ' + resultObj.location.crossStreetName
  1648. resolve();
  1649. });
  1650. }).then((result) => addObj());
  1651. }
  1652. else if (obj.EventType == 'accidentsAndIncidents') {
  1653. linkvar = 'https://511wi.gov/map#Incidents-' + obj.ID.replace(' ', '%20');
  1654. addObj();
  1655. }
  1656. else {
  1657. addObj();
  1658. }
  1659. },
  1660. URL: ['http://40.121.218.107/WI']
  1661. },
  1662. WV: {
  1663. data(res, index) {
  1664. let resultText = [res.changes["com.orci.opentms.web.public511.components.plannedevent.shared.data.PlannedEventBean"].changes];
  1665. return (resultText[index]);
  1666. },
  1667. filter(index) {
  1668. let filtertext = [true];
  1669. return (filtertext[index]);
  1670. },
  1671. scheme(obj, index) {
  1672. promisesWV.push(new Promise((resolve, reject) => {
  1673. advisoriesWV.push({
  1674. state: ['WV', 'West Virginia'],
  1675. id: obj.entity.dataGatewayId,
  1676. popupType: 0,
  1677. title: obj.entity.routeName,
  1678. lon: obj.entity.x,
  1679. lat: obj.entity.y,
  1680. type: 'Construction',
  1681. keyword: ['Construction'], //keywords for roadwork/construction
  1682. desc: obj.entity.message,
  1683. time: moment(new Date(obj.entity.startTime.millis)).format('LLL'),
  1684. link: ''
  1685. });
  1686. resolve();
  1687. }))
  1688. },
  1689. URL: ['http://40.121.218.107/WV']
  1690. }
  1691. };
  1692. })();