WME DOT Advisories

Overlay DOT Advisories on the WME Map Object

当前为 2020-10-29 提交的版本,查看 最新版本

  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.09
  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. // @require https://cdn.jsdelivr.net/npm/hls.js@latest
  19. // @connect 511pa.com
  20. // @connect deldot.gov
  21. // @connect 511ny.org
  22. // @connect 511nj.org
  23. // @connect rehostjson.phuz.repl.co
  24. /* global OpenLayers */
  25. /* global W */
  26. /* global WazeWrap */
  27. /* global $ */
  28. /* global I18n */
  29. /* global _ */
  30. // ==/UserScript==
  31.  
  32. let DEDOTLayer;
  33. let NJDOTLayer;
  34. let NYDOTLayer;
  35. let PADOTLayer;
  36. let WADOTLayer;
  37. var settings;
  38. var newZIndex;
  39. 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=';
  40. 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==';
  41. const DEIconSchClosure = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAoCAYAAADpE0oSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTYxOTU5RkJGMkQ3MTFFNkI5NERERDM2Qzg4NzcwRUYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTYxOTU5RkNGMkQ3MTFFNkI5NERERDM2Qzg4NzcwRUYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFNjE5NTlGOUYyRDcxMUU2Qjk0REREMzZDODg3NzBFRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFNjE5NTlGQUYyRDcxMUU2Qjk0REREMzZDODg3NzBFRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuSU594AAAfTSURBVHja5Fh7cJTV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';
  42. 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==';
  43. const Roadwork = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA/VpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjVEMjA4OTI0OTNCRkRCMTE5MTRBODU5MEQzMTUwOEM4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkUzRjQ0OTg5NzIzOTExRTM4ODlCRkYwNDVGNDI0RjlEIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkUzRjQ0OTg4NzIzOTExRTM4ODlCRkYwNDVGNDI0RjlEIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIElsbHVzdHJhdG9yIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ1dWlkOmFkOTA4NmJkLTAzMGEtNDA0MS04ZTdiLWJhZGYwNWRmZDMzZiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDplNDcyMTVk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';
  44. const PLIcon = 'data:image/gif;base64,R0lGODlhFgAUANUAAOHh4t7e34iKj0dLU0VJUUhMVEpOVk1RWU9TW2xvdXF0enx/hZOVmcbHyVJWXVFVXFRYX1dbYl5iaTtASD5DSz1CSj9ETEFGTkNIUEVKUn6BhoSHjFpeZGBkamVpb2RobmpudGltc2ZqcG1xd2tvdaqsr0ZLUklOVU9UW3h8gdHS08nKy////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACwALAAAAAAWABQAAAZrQJZwSCwaj8ikcskkmTpMI2JSmUxSUaFjIhJCJlkhiHjJMD2YUDECVqKsVuJk4OYGSqeDcEJRTkUACgkrKgx8SgsTH0IcExgeh0oFbUICFo5MBpRCDVkbEyNDEw9hbAYSkWEaVQRhrq+wTEEAOw==';
  45. const reportIcon = 'data:image/gif;base64,R0lGODlhFAAUALMAANcsLNgvL9g4OAMBAc5RUcZVVW1tbQAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAgALAAAAAAUABQAAARdEKFDqz0y6zO695S2FUBpAkNliBNxmmnFHu6LXmtG2+iXbjWeiYDRuXw2IhAg+CSLkp1wCG31fB6A0jilLrva6g7r3EaDU7MVEGi72yX1mNwJj8CAgpiOFV/+FhIRADs=';
  46. const DEAdvURL = 'https://tmc.deldot.gov/json/advisory.json';
  47. const DESchURL = 'https://deldot.gov/json/str.json';
  48. const NJURLList = 'https://511nj.org/API/client/Map/getEventData';
  49. const NJURLDetail = 'https://511nj.org/API/client/Map/getEventPopupData?EventId=';
  50. const NYURL = 'https://rehostjson.phuz.repl.co/NY';
  51. const PAURL = 'https://rehostjson.phuz.repl.co/PA';
  52. const WAURL = 'https://rehostjson.phuz.repl.co/WA';
  53. const NotNY = ['Pennsylvania Statewide', 'New Jersey Statewide', 'Connecticut Statewide'];
  54. const NJConstruction = ['Construction', 'ScheduledConstruction'];
  55.  
  56. (function() {
  57. 'use strict';
  58. //Bootstrap
  59. function bootstrap(tries = 1) {
  60. if (W && W.loginManager && W.map && W.loginManager.user && W.model
  61. && W.model.states && W.model.states.getObjectArray().length && WazeWrap && WazeWrap.Ready) {
  62. console.log("WME DOT Advisories Loaded!");
  63. init();
  64. if (!OpenLayers.Icon) {
  65. installIcon();
  66. }
  67.  
  68. } else if (tries < 1000) {
  69. setTimeout(function () {bootstrap(++tries);}, 200);
  70. }
  71. }
  72. //Build the Tab and Settings Division
  73. function init()
  74. {
  75. var $section = $("<div>");
  76. $section.html([
  77. '<div id="chkEnables">',
  78. '<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>',
  79. '* The WME Refresh Button will update reports.',
  80. '<table border=1 style="text-align:center;width:100%;padding:10px;">',
  81. '<tr><td colspan=2 style="text-align:center"><b>Enable</b></td><td style="text-align"><b>State</b></td><td width=30><b>Rpt</b></td></tr>',
  82. '<tr><td colspan=2 align=center><input type="checkbox" id="chkDEDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td align=center>DE</td><td><div class=DOTreport data-report="report" id="DOTDEPopup"><img src=' + reportIcon + '></div></td></tr>',
  83. '<tr><td colspan=2 align=center><input type="checkbox" id="chkNJDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td align=center>NJ</td><td><div class=DOTreport data-report="report" id="DOTNJPopup"><img src=' + reportIcon + '></div></td></tr>',
  84. '<tr><td colspan=2 align=center><input type="checkbox" id="chkNYDOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td align=center>NY</td><td><div class=DOTreport data-report="report" id="DOTNYPopup"><img src=' + reportIcon + '></div></td></tr>',
  85. '<tr><td colspan=2 align=center><input type="checkbox" id="chkPADOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td align=center>PA</td><td><div class=DOTreport data-report="report" id="DOTPAPopup"><img src=' + reportIcon + '></div></td></tr>',
  86. '<tr><td colspan=2 align=center><input type="checkbox" id="chkWADOTEnabled" class="WMEDOTAdvSettingsCheckbox"></td><td align=center>WA</td><td><div class=DOTreport data-report="report" id="DOTWAPopup"><img src=' + reportIcon + '></div></td></tr>',
  87. '</table>',
  88. '</div></div>'
  89. ].join(' '));
  90. new WazeWrap.Interface.Tab('DOT Advisories', $section.html(), initializeSettings);
  91. }
  92. getFeed("https://rehostjson.phuz.repl.co/public/CSS", function(result) {
  93. GM_addStyle(result.responseText);
  94. })
  95. //Build the State Layers
  96. function buildDOTAdvLayers(state) {
  97. eval(state.substring(0,2) + 'DOTLayer = new OpenLayers.Layer.Markers(' + state.substring(0,2) + 'DOTLayer)');
  98. eval('W.map.addLayer(' + state.substring(0,2) + 'DOTLayer)');
  99. eval(state.substring(0,2) + "DOTLayer.setZIndex(" + newZIndex + ")");
  100. }
  101. function getFeed(url,callback) {
  102. GM_xmlhttpRequest({
  103. method: "GET",
  104. url: url,
  105. onload: function(response) {
  106. var result = response;
  107. callback(result);
  108. }
  109. });
  110. }
  111. function getDEDOT() {
  112. getDEDOTAdv();
  113. }
  114. //Get the DE Advisory JSON Feed
  115. function getDEDOTAdv(type) {
  116. getFeed(DEAdvURL, function(result) {
  117. var resultObj = JSON.parse(result.responseText).advisories;
  118. var i=0;
  119. while (i<resultObj.length) {
  120. if (type == "report") {
  121. let table = document.getElementById("reportTable").getElementsByTagName('tbody')[0];
  122. var row = table.insertRow(-1);
  123. var cell1 = row.insertCell(0);
  124. var cell2 = row.insertCell(1);
  125. var cell3 = row.insertCell(2);
  126. var cell4 = row.insertCell(3);
  127. cell1.innerHTML = '<div class="gotoPL" data-lat="' + resultObj[i].where.lat + '" data-lon="' + resultObj[i].where.lon + '"><img src=' + PLIcon + '></div>';
  128. cell2.innerHTML = resultObj[i].where.location;
  129. cell3.innerHTML = resultObj[i].where.county.name;
  130. cell4.innerHTML = moment(new Date(resultObj[i].timestamp)).format('YYYY/MM/DD HH:mm');
  131. } else {
  132. drawMarkers("DEAdv",resultObj[i].id,resultObj[i].type.name,resultObj[i].where.lon,resultObj[i].where.lat,"DEIconC",resultObj[i].where.location,resultObj[i].timestamp,resultObj[i].published.linkbackUrl);
  133. }
  134. i++;
  135. }
  136. getDEDOTSch(type);
  137. })
  138. }
  139. //Get the DE Schedule JSON Feed
  140. function getDEDOTSch(type) {
  141. getFeed(DESchURL, function(result) {
  142. var resultObj = JSON.parse(result.responseText);
  143. var i=0;
  144. while (i<resultObj.length) {
  145. if (resultObj[i].str.impactType == "Closure") {
  146. if (type == "report") {
  147. let table = document.getElementById("reportTable").getElementsByTagName('tbody')[0];
  148. var row = table.insertRow();
  149. var cell1 = row.insertCell(0);
  150. var cell2 = row.insertCell(1);
  151. var cell3 = row.insertCell(2);
  152. var cell4 = row.insertCell(3);
  153. cell1.innerHTML = '<div class="gotoPL" data-lat="' + resultObj[i].str.latitude + '" data-lon="' + resultObj[i].str.longitude + '"><img src=' + PLIcon + '></div>';
  154. cell2.innerHTML = resultObj[i].str.title;
  155. cell3.innerHTML = resultObj[i].str.county;
  156. cell4.innerHTML = moment(new Date(resultObj[i].str.actualStartDate)).format('YYYY/MM/DD HH:mm');
  157. } else {
  158. drawMarkers("DESch",resultObj[i].str.strId,resultObj[i].str.title,resultObj[i].str.longitude,resultObj[i].str.latitude,"DEIconSch" + resultObj[i].str.impactType,resultObj[i].str.construction,resultObj[i].str.startDate,resultObj[i].str.releaseId);
  159. }
  160. }
  161. i++;
  162. }
  163. if (type == "report") {
  164. reportWorker();
  165. }
  166. })
  167. }
  168. //Get the NJ Schedule JSON Feed
  169. function getNJDOT(type) {
  170. getFeed(NJURLList, function(result) {
  171. var resultObj = JSON.parse(result.responseText).Data.features;
  172. var length = resultObj.length;
  173. let advisories = [];
  174. var i = 0;
  175. for (let i = 0; i < length; i++) {
  176. if (["Incident", "Construction", "ScheduledConstruction", "Detour"].includes(resultObj[i].properties.CategoryName)) {
  177. advisories.push(resultObj[i].properties.EventID);
  178. }
  179. }
  180. getNJDetails(type,advisories);
  181. })
  182. }
  183. function getNJDetails(type,advisories) {
  184. var promises = [];
  185. for (let i = 0; i < advisories.length; i++) {
  186. promises.push(new Promise((resolve,reject) => {
  187. getFeed(NJURLDetail + advisories[i], function(result2) {
  188. var eventObj = JSON.parse(result2.responseText).Data;
  189. if ((eventObj[0].FullText.toUpperCase()).includes("ALL LANES CLOSE") || (eventObj[0].FullText.toUpperCase()).includes("RAMP CLOSE"))
  190. {
  191. var icon;
  192. switch(eventObj[0].CategoryName) {
  193. case "Incident":
  194. icon = "Incident";
  195. break;
  196. case "Detour":
  197. icon = "Incident";
  198. break;
  199. case "Construction":
  200. icon = "Roadwork";
  201. break;
  202. case "ScheduledConstruction":
  203. icon = "Roadwork";
  204. break;
  205. default:
  206. icon = "Incident";
  207. }
  208. if (type == "report") {
  209. let table = document.getElementById("reportTable").getElementsByTagName('tbody')[0];
  210. var row = table.insertRow(-1);
  211. var cell1 = row.insertCell(0);
  212. var cell2 = row.insertCell(1);
  213. var cell3 = row.insertCell(2);
  214. var cell4 = row.insertCell(3);
  215. cell1.innerHTML = '<div class="gotoPL" data-lat="' + eventObj[0].Latitude + '" data-lon="' + eventObj[0].Longitude + '"><img src=' + PLIcon + '></div>';
  216. cell2.innerHTML = eventObj[0].FullText
  217. cell3.innerHTML = eventObj[0].County
  218. cell4.innerHTML = moment(new Date(eventObj[0].LastUpdateDate_String)).format('YYYY/MM/DD HH:mm');
  219. } else {
  220. drawMarkers("NJ",eventObj[0].markerId,eventObj[0].County + " - " + eventObj[0].CategoryName,eventObj[0].Longitude,eventObj[0].Latitude,icon,eventObj[0].FullText,eventObj[0].LastUpdateDate_String,"");
  221. }
  222. }
  223. resolve(); //Let the Promise.all() know that we finished this dependency
  224. })
  225. }))
  226. }
  227. Promise.all(promises).then(function () {
  228. if (type=="report") { reportWorker(); } //Run the reportWorker after we've resolved all promises (ie, fetched the details of all pertinent report IDs)
  229. });
  230. }
  231. //Get the NY Event JSON Feed
  232. function getNYDOT(type) {
  233. getFeed(NYURL, function(result) {
  234. var resultObj = JSON.parse(result.responseText);
  235. var i=0;
  236. var icon;
  237. while (i<resultObj.length) {
  238. if (NotNY.includes(resultObj[i].RegionName) == false && resultObj[i].EventType != 'transitMode' && resultObj[i].EventSubType != 'Capacity related') { //skip anything not NY & transit notices & parking notices
  239. if (resultObj[i].EventType == 'closures' || (resultObj[i].EventType != 'closures' && resultObj[i].LanesAffected == 'all lanes' && (resultObj[i].LanesStatus == 'closed' || resultObj[i].LanesStatus == "blocked"))) {
  240. switch(resultObj[i].EventType) {
  241. case "accidentsAndIncidents":
  242. icon = "Incident";
  243. break;
  244. case "roadwork":
  245. icon = "Roadwork";
  246. break;
  247. case "specialEvents":
  248. icon = "Incident";
  249. break;
  250. case "closures":
  251. icon = "Roadwork";
  252. break;
  253. case "transitMode":
  254. icon = "Roadwork";
  255. break;
  256. case "generalInfo":
  257. icon = "Roadwork";
  258. break;
  259. case "winterDrivingIndex":
  260. icon = "Roadwork";
  261. break;
  262. default:
  263. icon = "Incident";
  264. }
  265. if (type == "report") {
  266. let table = document.getElementById("reportTable").getElementsByTagName('tbody')[0];
  267. var row = table.insertRow(-1);
  268. var cell1 = row.insertCell(0);
  269. var cell2 = row.insertCell(1);
  270. var cell3 = row.insertCell(2);
  271. var cell4 = row.insertCell(3);
  272. cell1.innerHTML = '<div class="gotoPL" data-lat="' + resultObj[i].Latitude + '" data-lon="' + resultObj[i].Longitude + '"><img src=' + PLIcon + '></div>';
  273. cell2.innerHTML = resultObj[i].Description;
  274. cell3.innerHTML = resultObj[i].CountyName;
  275. cell4.innerHTML = moment(moment(resultObj[i].LastUpdated,"DD/MM/YYYY HH:mm:ss")).format('YYYY/MM/DD HH:mm');
  276. } else {
  277. drawMarkers("NY",resultObj[i].ID,"",resultObj[i].Longitude,resultObj[i].Latitude,icon,resultObj[i].Description,resultObj[i].LastUpdated,"");
  278. }
  279. }
  280. }
  281. i++;
  282. }
  283. if (type == "report") {
  284. reportWorker();
  285. }
  286. })
  287. }
  288. //Get the PA Event JSON Feed
  289. function getPADOT(type) {
  290. getFeed(PAURL, function(result) {
  291. var resultObj = JSON.parse(result.responseText);
  292. var i=0;
  293. var icon;
  294. var x,y;
  295. while (i<resultObj.length) {
  296. if ((resultObj[i].LaneStatus == "closed") || (resultObj[i].LaneStatus == "ramp closure")) {
  297. switch(resultObj[i].EventType) {
  298. case "roadwork":
  299. icon = "Roadwork";
  300. break;
  301. default:
  302. icon = "Incident";
  303. }
  304. if (resultObj[i].LaneStatus != "ramp closure") {
  305. x = resultObj[i].FromLocLatLong.split(",")[1];
  306. y = resultObj[i].FromLocLatLong.split(",")[0];
  307. } else {
  308. x = resultObj[i].IncidentLocLatLong.split(",")[1];
  309. y = resultObj[i].IncidentLocLatLong.split(",")[0];
  310. }
  311. if (type == "report") {
  312. let table = document.getElementById("reportTable").getElementsByTagName('tbody')[0];
  313. var row = table.insertRow(-1);
  314. var cell1 = row.insertCell(0);
  315. var cell2 = row.insertCell(1);
  316. var cell3 = row.insertCell(2);
  317. var cell4 = row.insertCell(3);
  318. cell1.innerHTML = '<div class="gotoPL" data-lat="' + y + '" data-lon="' + x + '"><img src=' + PLIcon + '></div>';
  319. cell2.innerHTML = resultObj[i].Description;
  320. cell3.innerHTML = resultObj[i].CountyName;
  321. cell4.innerHTML = moment(new Date(resultObj[i].DateTimeNotified)).format('YYYY/MM/DD HH:mm');
  322. } else {
  323. drawMarkers("PA",resultObj[i].EventID,resultObj[i].Facility,x,y,icon,resultObj[i].Description,resultObj[i].LastUpdate,"");
  324. }
  325. }
  326. i++;
  327. }
  328. if (type == "report") {
  329. reportWorker();
  330. }
  331. })
  332. }
  333. //Get the WA Event JSON Feed
  334. function getWADOT(type) {
  335. getFeed(WAURL, function(result) {
  336. var resultObj = JSON.parse(result.responseText);
  337. var i=0;
  338. var icon;
  339. var county;
  340. while (i<resultObj.length) {
  341. if (resultObj[i].EventCategory == 'Closure' || resultObj[i].EventCategory == 'Construction' || resultObj[i].EventCategory == 'Bridge') {
  342. switch(resultObj[i].EventCategory) {
  343. case "Construction":
  344. icon = "Roadwork";
  345. break;
  346. case "Closure":
  347. icon = "Roadwork";
  348. break;
  349. case "Collision":
  350. icon = "Incident";
  351. break;
  352. default:
  353. icon = "Incident";
  354. }
  355. var unixtime = parseInt(resultObj[i].LastUpdatedTime.replace("/Date(","").replace(")/","").split("-")[0]);
  356. let datetime = new Date(unixtime).toLocaleString();
  357. if (resultObj[i].County == null) {
  358. county = resultObj[i].Region;
  359. } else {
  360. county = resultObj[i].County;
  361. }
  362. if (type == "report") {
  363. let table = document.getElementById("reportTable").getElementsByTagName('tbody')[0];
  364. var row = table.insertRow(-1);
  365. var cell1 = row.insertCell(0);
  366. var cell2 = row.insertCell(1);
  367. var cell3 = row.insertCell(2);
  368. var cell4 = row.insertCell(3);
  369. cell1.innerHTML = '<div class="gotoPL" data-lat="' + resultObj[i].StartRoadwayLocation.Latitude + '" data-lon="' + resultObj[i].StartRoadwayLocation.Longitude + '"><img src=' + PLIcon + '></div>';
  370. cell2.innerHTML = resultObj[i].HeadlineDescription;
  371. cell3.innerHTML = county;
  372. cell4.innerHTML = moment(new Date(datetime)).format('YYYY/MM/DD HH:mm'); //moment(new Date(resultObj[i].DateTimeNotified)).format('YYYY/MM/DD hh:mm a');
  373. } else {
  374. drawMarkers("WA",resultObj[i].AlertID,"",resultObj[i].StartRoadwayLocation.Longitude,resultObj[i].StartRoadwayLocation.Latitude,icon,resultObj[i].HeadlineDescription,datetime,"");
  375. }
  376. }
  377. i++;
  378. }
  379. if (type == "report") {
  380. reportWorker();
  381. }
  382. })
  383. }
  384. function reportWorker() {
  385. var elements = document.getElementsByClassName("gotoPL");
  386. for (var i = 0; i < elements.length; i++) {
  387. elements[i].addEventListener('click', moveMap, false);
  388. }
  389. refreshReportTable();
  390. }
  391. function refreshReportTable() {
  392. var sort = new Tablesort(document.getElementById('reportTable'),{descending: true});
  393. sort.refresh();
  394. }
  395. function getReportData(id) {
  396. switch(id) {
  397. case "DOTDEPopup":
  398. popupdetails("Delaware");
  399. getDEDOTAdv("report");
  400. break;
  401. case "DOTNJPopup":
  402. popupdetails("New Jersey");
  403. getNJDOT("report");
  404. break;
  405. case "DOTNYPopup":
  406. popupdetails("New York");
  407. getNYDOT("report");
  408. break;
  409. case "DOTPAPopup":
  410. popupdetails("Pennsylvania");
  411. getPADOT("report");
  412. break;
  413. case "DOTWAPopup":
  414. popupdetails("Washington");
  415. getWADOT("report");
  416. break;
  417. }
  418. }
  419. //Generate the Advisory markers
  420. function drawMarkers(state,id,title,x,y,icontype,desc,timestamp,link) {
  421. var size = new OpenLayers.Size(20,20);
  422. var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
  423. var icon = new OpenLayers.Icon(eval(icontype),size);
  424. var epsg4326 = new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection
  425. var projectTo = W.map.getProjectionObject(); //The map projection (Spherical Mercator)
  426. var lonLat = new OpenLayers.LonLat(x,y).transform(epsg4326,projectTo);
  427. var newMarker = new OpenLayers.Marker(lonLat,icon);
  428. newMarker.desc = desc;
  429. newMarker.eventId = id;
  430. newMarker.title = title;
  431. newMarker.state = state;
  432. newMarker.timestamp = timestamp;
  433. newMarker.events.register('click',newMarker,popup);
  434. newMarker.location = lonLat;
  435. if (link != "-1" && state == "DESch") {
  436. newMarker.link = '<a href=https://deldot.gov/About/news/index.shtml?dc=release&id=' + link + ' target="_blank">';
  437. } else if (link == "-1" && state == "DESch") {
  438. newMarker.link = `<a href='javascript:alert("Sorry! No publication available for this closure")'>`;
  439. } else {
  440. newMarker.link = link;
  441. }
  442. eval(state.substring(0,2) + "DOTLayer.addMarker(newMarker)");
  443. }
  444. function popup(evt) {
  445. $("#gmPopupContainer").remove ();
  446. $("#gmPopupContainer").hide ();
  447. var popupHTML;
  448. W.map.moveTo(this.location);
  449. switch(this.state) {
  450. case "DEAdv":
  451. this.timestamp = new Date(this.timestamp);
  452. popupHTML = (['<div id="gmPopupContainer" style="max-width:500px;margin: 1;text-align: center;padding: 5px">' +
  453. '<a href="#close" id="gmCloseDlgBtn" title="Close" class="modalclose" style="color:#FF0000;">X</a>' +
  454. '<table border=0><tr><td><div id="mydivheader" style="min-height: 20px;">' + this.title + '</div><hr class="myhrline"/>' +
  455. 'Updated: ' + this.timestamp.toLocaleString() + '<hr class="myhrline"/></td></tr>' +
  456. '<tr><td>' + this.desc + '</td></tr>' +
  457. '<tr><td><a href="' + this.link + '" target="_blank">DelDot Link</a></td></tr>' +
  458. '</table>' +
  459. '</div>'
  460. ]);
  461. break;
  462. case "DESch":
  463. popupHTML = (['<div id="gmPopupContainer" style="max-width:500px;margin: 1;text-align: center;padding: 5px">' +
  464. '<a href="#close" id="gmCloseDlgBtn" title="Close" class="modalclose" style="color:#FF0000;">X</a>' +
  465. '<table border=0><tr><td><div id="mydivheader" style="min-height: 20px;">Scheduled Closure</div><hr class="myhrline"/>' +
  466. '<tr><td><h4>' + this.title.toString() + '</h4><hr class="myhrline"/></td></tr>' +
  467. '<tr><td>Period: ' + this.timestamp.replace(/ 12:00 AM/g,"") + '<hr class="myhrline"/></td></tr>' +
  468. '<tr><td>' + this.desc + '</td></tr>' +
  469. '<tr><td>' + this.link + 'DelDot Link</a></td></tr>' +
  470. '</table>' +
  471. '</div>'
  472. ]);
  473. break;
  474. case "NJ":
  475. case "NY":
  476. case "PA":
  477. popupHTML = (['<div id="gmPopupContainer" style="max-width:500px;margin: 1;text-align: center;padding: 5px">' +
  478. '<a href="#close" id="gmCloseDlgBtn" title="Close" class="modalclose" style="color:#FF0000;">X</a>' +
  479. '<table border=0><tr><td><div id="mydivheader" style="min-height: 20px;"></div><hr class="myhrline"/>' +
  480. '<tr><td><h4>' + this.title.toString() + '</h4><hr class="myhrline"/></td></tr>' +
  481. '<tr><td>Time: ' + new Date(this.timestamp).toLocaleString() + '<hr class="myhrline"/></td></tr>' +
  482. '<tr><td>' + this.desc + '</td></tr>' +
  483. '</table>' +
  484. '</div>'
  485. ]);
  486. break;
  487. case "WA":
  488. popupHTML = (['<div id="gmPopupContainer" style="max-width:500px;margin: 1;text-align: center;padding: 5px">' +
  489. '<a href="#close" id="gmCloseDlgBtn" title="Close" class="modalclose" style="color:#FF0000;">X</a>' +
  490. '<table border=0><tr><td><div id="mydivheader" style="min-height: 20px;"></div><hr class="myhrline"/>' +
  491. 'Updated: ' + this.timestamp.toLocaleString() + '<hr class="myhrline"/></td></tr>' +
  492. '<tr><td>' + this.desc + '</td></tr>' +
  493. '</table>' +
  494. '</div>'
  495. ]);
  496. }
  497. $("body").append(popupHTML);
  498. //Position the modal based on the position of the click event
  499. $("#gmPopupContainer").css({left: document.getElementById("user-tabs").offsetWidth + W.map.getPixelFromLonLat(W.map.getCenter()).x - document.getElementById("gmPopupContainer").clientWidth - 10 });
  500. $("#gmPopupContainer").css({top: document.getElementById("left-app-head").offsetHeight + W.map.getPixelFromLonLat(W.map.getCenter()).y - (document.getElementById("gmPopupContainer").clientHeight / 2) });
  501. $("#gmPopupContainer").show();
  502. //Add listener for popup's "Close" button
  503. $("#gmCloseDlgBtn").click ( function () {
  504. $("#gmPopupContainer").remove ();
  505. $("#gmPopupContainer").hide ();
  506. });
  507. dragElement(document.getElementById("gmPopupContainer"));
  508. }
  509. function popupdetails(state) {
  510. $("#gmPopupContainer").remove ();
  511. $("#gmPopupContainer").hide ();
  512. var popupHTML;
  513. popupHTML = (['<div id="gmPopupContainer" style="max-width:750px;max-height:500px;margin: 1;text-align: center;padding: 5px;">' +
  514. '<a href="#close" id="popupdetailsclose" title="Close" class="modalclose" style="color:#FF0000;">X</a>' +
  515. '<table border=0><tr><td><div id="mydivheader"">' + state + ' Reports</div></td></tr>' +
  516. '<tr><td>' +
  517. '<div style="width:720px; height:450px; overflow:auto;"><table id="reportTable" border=1>' +
  518. '<thead><tr><td data-sort-method="none" width=30><b>PL</b></td><th width=394>Description</th><th width=100>Location</th><th data-sort-default width=175>Time</th></tr></thead>' +
  519. '<tbody></tbody></table></div>' +
  520. '</td></tr></table>' +
  521. '</div>'
  522. ]);
  523. $("body").append(popupHTML);
  524. //Position the modal based on the position of the click event
  525. $("#gmPopupContainer").css({left: 400});
  526. $("#gmPopupContainer").css({top: 100});
  527. $("#gmPopupContainer").show();
  528. //Add listener for popup's "Close" button
  529. $("#popupdetailsclose").click ( function () {
  530. $("#gmPopupContainer").remove ();
  531. $("#gmPopupContainer").hide ();
  532. });
  533. dragElement(document.getElementById("gmPopupContainer"));
  534. }
  535. // Make the DIV element draggable
  536. function dragElement(elmnt) {
  537. var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
  538. if (document.getElementById("mydivheader")) {
  539. // if present, the header is where you move the DIV from:
  540. document.getElementById("mydivheader").onmousedown = dragMouseDown;
  541. } else {
  542. // otherwise, move the DIV from anywhere inside the DIV:
  543. elmnt.onmousedown = dragMouseDown;
  544. }
  545. function dragMouseDown(e) {
  546. e = e || window.event;
  547. e.preventDefault();
  548. // get the mouse cursor position at startup:
  549. pos3 = e.clientX;
  550. pos4 = e.clientY;
  551. document.onmouseup = closeDragElement;
  552. // call a function whenever the cursor moves:
  553. document.onmousemove = elementDrag;
  554. }
  555.  
  556. function elementDrag(e) {
  557. e = e || window.event;
  558. e.preventDefault();
  559. // calculate the new cursor position:
  560. pos1 = pos3 - e.clientX;
  561. pos2 = pos4 - e.clientY;
  562. pos3 = e.clientX;
  563. pos4 = e.clientY;
  564. // set the element's new position:
  565. elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
  566. elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
  567. }
  568. function closeDragElement() {
  569. // stop moving when mouse button is released:
  570. document.onmouseup = null;
  571. document.onmousemove = null;
  572. }
  573. }
  574. //Move map to coordinates specified
  575. function moveMap() {
  576. var epsg4326 = new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection
  577. var projectTo = W.map.getProjectionObject(); //The map projection (Spherical Mercator)
  578. var lat = this.getAttribute("data-lat");
  579. var lon = this.getAttribute("data-lon");
  580. W.map.moveTo(new OpenLayers.LonLat(lon,lat).transform(epsg4326,projectTo),6);
  581. }
  582. //Initialize Settings
  583. function initializeSettings()
  584. {
  585. for (var i = 0; i < document.getElementsByClassName("DOTreport").length; i++) {
  586. document.getElementsByClassName("DOTreport")[i].addEventListener('click', function(e) {getReportData(this.getAttribute("id"));}, false);
  587. }
  588. loadSettings();
  589. setChecked('chkPADOTEnabled', settings.PADOTEnabled);
  590. setChecked('chkDEDOTEnabled', settings.DEDOTEnabled);
  591. setChecked('chkNYDOTEnabled', settings.NYDOTEnabled);
  592. setChecked('chkNJDOTEnabled', settings.NJDOTEnabled);
  593. setChecked('chkWADOTEnabled', settings.WADOTEnabled);
  594. $(".overlay-button").click(function(){
  595. if (document.getElementById('chkDEDOTEnabled').checked) { eval('W.map.removeLayer(DEDOTLayer)'); }
  596. if (document.getElementById('chkNJDOTEnabled').checked) { eval('W.map.removeLayer(NJDOTLayer)'); }
  597. if (document.getElementById('chkNYDOTEnabled').checked) { eval('W.map.removeLayer(NYDOTLayer)'); }
  598. if (document.getElementById('chkPADOTEnabled').checked) { eval('W.map.removeLayer(PADOTLayer)'); }
  599. if (document.getElementById('chkWADOTEnabled').checked) { eval('W.map.removeLayer(WADOTLayer)'); }
  600. initializeSettings();
  601. });
  602.  
  603. //Add Handler for Checkbox Setting Changes
  604. $('.WMEDOTAdvSettingsCheckbox').change(function() {
  605. var settingName = $(this)[0].id.substr(3);
  606. settings[settingName] = this.checked;
  607. saveSettings();
  608. if(this.checked) {
  609. buildDOTAdvLayers(settingName.substring(0,2));
  610. eval("get" + settingName.substring(0,2) + "DOT()");
  611. }
  612. else
  613. {
  614. //eval(settingName.substring(0,2) + "DOTLayer.destroy()");
  615. eval('W.map.removeLayer(' + settingName.substring(0,2) + 'DOTLayer)');
  616. }
  617. });
  618. if (document.getElementById('WMEFUzoom') != null) {
  619. document.getElementById('WMEFUzoom').style.zIndex = "45000";
  620. }
  621. if (document.getElementById('chkDEDOTEnabled').checked) { buildDOTAdvLayers("DE"); getDEDOT();}
  622. if (document.getElementById('chkNJDOTEnabled').checked) { buildDOTAdvLayers("NJ"); getNJDOT();}
  623. if (document.getElementById('chkNYDOTEnabled').checked) { buildDOTAdvLayers("NY"); getNYDOT();}
  624. if (document.getElementById('chkPADOTEnabled').checked) { buildDOTAdvLayers("PA"); getPADOT();}
  625. if (document.getElementById('chkWADOTEnabled').checked) { buildDOTAdvLayers("WA"); getWADOT();}
  626. }
  627. //Set Checkbox from Settings
  628. function setChecked(checkboxId, checked) {
  629. $('#' + checkboxId).prop('checked', checked);
  630. }
  631. //Load Saved Settings
  632. function loadSettings() {
  633. var loadedSettings = $.parseJSON(localStorage.getItem("WMEDOT_Settings"));
  634. var defaultSettings = {
  635. Enabled: false,
  636. };
  637. settings = loadedSettings ? loadedSettings : defaultSettings;
  638. for (var prop in defaultSettings) {
  639. if (!settings.hasOwnProperty(prop)) {
  640. settings[prop] = defaultSettings[prop];
  641. }
  642. }
  643. }
  644. //Save Tab Settings
  645. function saveSettings() {
  646. if (localStorage) {
  647. var localsettings = {
  648. PADOTEnabled: settings.PADOTEnabled,
  649. DEDOTEnabled: settings.DEDOTEnabled,
  650. NYDOTEnabled: settings.NYDOTEnabled,
  651. NJDOTEnabled: settings.NJDOTEnabled,
  652. WADOTEnabled: settings.WADOTEnabled,
  653. };
  654. localStorage.setItem("WMEDOT_Settings", JSON.stringify(localsettings));
  655. }
  656. }
  657. //Add the Icon Class to OpenLayers
  658. function installIcon() {
  659. console.log('Installing OpenLayers.Icon');
  660. OpenLayers.Icon = OpenLayers.Class({
  661. url: null,
  662. size: null,
  663. offset: null,
  664. calculateOffset: null,
  665. imageDiv: null,
  666. px: null,
  667. initialize: function(a,b,c,d){
  668. this.url=a;
  669. this.size=b||{w: 20,h: 20};
  670. this.offset=c||{x: -(this.size.w/2),y: -(this.size.h/2)};
  671. this.calculateOffset=d;
  672. a=OpenLayers.Util.createUniqueID("OL_Icon_");
  673. let div = this.imageDiv=OpenLayers.Util.createAlphaImageDiv(a);
  674. $(div.firstChild).removeClass('olAlphaImg'); // LEAVE THIS LINE TO PREVENT WME-HARDHATS SCRIPT FROM TURNING ALL ICONS INTO HARDHAT WAZERS --MAPOMATIC
  675. },
  676. destroy: function(){ this.erase();OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild);this.imageDiv.innerHTML="";this.imageDiv=null; },
  677. clone: function(){ return new OpenLayers.Icon(this.url,this.size,this.offset,this.calculateOffset); },
  678. setSize: function(a){ null!==a&&(this.size=a); this.draw(); },
  679. setUrl: function(a){ null!==a&&(this.url=a); this.draw(); },
  680. draw: function(a){
  681. OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,null,this.size,this.url,"absolute");
  682. this.moveTo(a);
  683. return this.imageDiv;
  684. },
  685. erase: function(){ null!==this.imageDiv&&null!==this.imageDiv.parentNode&&OpenLayers.Element.remove(this.imageDiv); },
  686. setOpacity: function(a){ OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,null,null,null,null,null,null,a); },
  687. moveTo: function(a){
  688. null!==a&&(this.px=a);
  689. null!==this.imageDiv&&(null===this.px?this.display(!1): (
  690. this.calculateOffset&&(this.offset=this.calculateOffset(this.size)),
  691. OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,{x: this.px.x+this.offset.x,y: this.px.y+this.offset.y})
  692. ));
  693. },
  694. display: function(a){ this.imageDiv.style.display=a?"": "none"; },
  695. isDrawn: function(){ return this.imageDiv&&this.imageDiv.parentNode&&11!=this.imageDiv.parentNode.nodeType; },
  696. CLASS_NAME: "OpenLayers.Icon"
  697. });
  698. }
  699. bootstrap();
  700. })();