WME DOT Advisories

Overlay DOT Advisories on the WME Map Object

当前为 2021-06-06 提交的版本,查看 最新版本

  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.35
  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 511nj.org
  20. // @connect 511ny.org
  21. // @connect 511pa.com
  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. /* global OpenLayers */
  34. /* global W */
  35. /* global WazeWrap */
  36. /* global $ */
  37. /* global I18n */
  38. /* global _ */
  39. // ==/UserScript==
  40.  
  41. let AKDOTLayer, DEDOTLayer, FLDOTLayer, GADOTLayer, ILDOTLayer, INDOTLayer, LADOTLayer, MDDOTLayer, MIDOTLayer, NCDOTLayer, NJDOTLayer, NVDOTLayer, NYDOTLayer, OHDOTLayer, ORDOTLayer, PADOTLayer, TXDOTLayer, WADOTLayer, WVDOTLayer;
  42. let promisesAK, promisesDE, promisesFL, promisesGA, promisesIL, promisesIN, promisesLA, promisesMD, promisesMI, promisesNC, promisesNJ, promisesNV, promisesNY, promisesOH, promisesOR, promisesPA, promisesTX, promisesWA, promisesWV;
  43. let advisoriesAK, advisoriesDE, advisoriesFL, advisoriesGA, advisoriesIL, advisoriesIN, advisoriesLA, advisoriesMD, advisoriesMI, advisoriesNC, advisoriesNJ, advisoriesNV, advisoriesNY, advisoriesOH, advisoriesOR, advisoriesPA, advisoriesTX, advisoriesWA, advisoriesWV;
  44. var settings;
  45. var state, stateLength, advisories;
  46. const updateMessage = "► Added WV";
  47. 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=';
  48. 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==';
  49. const DEIconSchClosure = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAoCAYAAADpE0oSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTYxOTU5RkJGMkQ3MTFFNkI5NERERDM2Qzg4NzcwRUYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTYxOTU5RkNGMkQ3MTFFNkI5NERERDM2Qzg4NzcwRUYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFNjE5NTlGOUYyRDcxMUU2Qjk0REREMzZDODg3NzBFRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFNjE5NTlGQUYyRDcxMUU2Qjk0REREMzZDODg3NzBFRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuSU594AAAfTSURBVHja5Fh7cJTV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';
  50. 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==';
  51. const Roadwork = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA/VpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjVEMjA4OTI0OTNCRkRCMTE5MTRBODU5MEQzMTUwOEM4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkUzRjQ0OTg5NzIzOTExRTM4ODlCRkYwNDVGNDI0RjlEIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkUzRjQ0OTg4NzIzOTExRTM4ODlCRkYwNDVGNDI0RjlEIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIElsbHVzdHJhdG9yIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ1dWlkOmFkOTA4NmJkLTAzMGEtNDA0MS04ZTdiLWJhZGYwNWRmZDMzZiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDplNDcyMTVk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';
  52. const PLIcon = 'data:image/gif;base64,R0lGODlhFgAUANUAAOHh4t7e34iKj0dLU0VJUUhMVEpOVk1RWU9TW2xvdXF0enx/hZOVmcbHyVJWXVFVXFRYX1dbYl5iaTtASD5DSz1CSj9ETEFGTkNIUEVKUn6BhoSHjFpeZGBkamVpb2RobmpudGltc2ZqcG1xd2tvdaqsr0ZLUklOVU9UW3h8gdHS08nKy////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACwALAAAAAAWABQAAAZrQJZwSCwaj8ikcskkmTpMI2JSmUxSUaFjIhJCJlkhiHjJMD2YUDECVqKsVuJk4OYGSqeDcEJRTkUACgkrKgx8SgsTH0IcExgeh0oFbUICFo5MBpRCDVkbEyNDEw9hbAYSkWEaVQRhrq+wTEEAOw==';
  53. const reportIcon = 'data:image/gif;base64,R0lGODlhFAAUALMAANcsLNgvL9g4OAMBAc5RUcZVVW1tbQAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAgALAAAAAAUABQAAARdEKFDqz0y6zO695S2FUBpAkNliBNxmmnFHu6LXmtG2+iXbjWeiYDRuXw2IhAg+CSLkp1wCG31fB6A0jilLrva6g7r3EaDU7MVEGi72yX1mNwJj8CAgpiOFV/+FhIRADs=';
  54. const NJURLDetail = 'https://511nj.org/API/client/Map/getEventPopupData?EventId=';
  55. const NotNY = ['Pennsylvania Statewide', 'New Jersey Statewide', 'Connecticut Statewide'];
  56. const NJConstruction = ['Construction', 'ScheduledConstruction'];
  57.  
  58. //Begin script function
  59. (function () {
  60. 'use strict';
  61. //Bootstrap
  62. window["text123"] = 123;
  63. function bootstrap(tries = 1) {
  64. if (W && W.loginManager && W.map && W.loginManager.user && W.model
  65. && W.model.states && W.model.states.getObjectArray().length && WazeWrap && WazeWrap.Ready) {
  66. console.log("WME DOT Advisories Loaded!");
  67. init();
  68. addListeners();
  69. if (!OpenLayers.Icon) {
  70. installIcon();
  71. }
  72. } else if (tries < 1000) {
  73. setTimeout(function () { bootstrap(++tries); }, 200);
  74. }
  75. }
  76. Function.prototype.bind = function (thisObject) {
  77. var method = this;
  78. var oldargs = [].slice.call(arguments, 1);
  79. return function () {
  80. var newargs = [].slice.call(arguments);
  81. return method.apply(thisObject, oldargs.concat(newargs));
  82. };
  83. }
  84. //Build the Tab and Settings Division
  85. function init() {
  86. var $section = $("<div>");
  87. $section.html([
  88. '<div id="chkEnables">',
  89. '<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>',
  90. '* The WME Refresh Button will update reports.',
  91. '<table border=1 style="text-align:center;width:100%;padding:10px;">',
  92. '<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>',
  93. '<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>',
  94. '<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>',
  95. '<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>',
  96. '<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>',
  97. '<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>',
  98. '<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>',
  99. '<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>',
  100. '<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>',
  101. '<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>',
  102. '<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>',
  103. '<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>',
  104. '<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>',
  105. '<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>',
  106. '<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>',
  107. '<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>',
  108. '<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>',
  109. '<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>',
  110. '<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>',
  111. '<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>',
  112. '</table>',
  113. '</div></div>'
  114. ].join(' '));
  115. new WazeWrap.Interface.Tab('DOT Advisories', $section.html(), initializeSettings);
  116. 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");
  117. }
  118. getFeed("http://scripts.essentialintegrations.com/CSS", function (result) {
  119. GM_addStyle(result.responseText);
  120. })
  121. //Build the State Layers
  122. function buildDOTAdvLayers(state) {
  123. eval(state.substring(0, 2) + 'DOTLayer = new OpenLayers.Layer.Markers(' + state.substring(0, 2) + 'DOTLayer)');
  124. W.map.addLayer(eval(state.substring(0, 2) + 'DOTLayer'));
  125. W.map.getOLMap().setLayerIndex(eval(state.substring(0, 2) + 'DOTLayer'), 0);
  126. }
  127. function getFeed(url, callback) {
  128. GM_xmlhttpRequest({
  129. method: "GET",
  130. url: url,
  131. onload: callback_function1.bind({}, callback)
  132. //onload: function (response) {
  133. // var result = response;
  134. // callback(result);
  135. //}
  136. });
  137. }
  138. function callback_function1(callback, response) {
  139. var result = response;
  140. setTimeout(function () { callback(result) }, 150);
  141. }
  142. function getAdvisories(state, stateAbv, type) {
  143. eval('promises' + stateAbv + ' = []');
  144. eval('advisories' + stateAbv + ' = []');
  145. let thesepromises = [];
  146. for (let j = 0; j < state.URL.length; j++) {
  147. let thispromise = new Promise((resolve, reject) => {
  148. getFeed(state.URL[j], function (result) {
  149. let resultObj = [];
  150. resultObj = state.data(JSON.parse(result.responseText), j);
  151. for (let i = 0; i < resultObj.length; i++) {
  152. if (eval(state.filter(j))) {
  153. state.scheme(resultObj[i], j);
  154. }
  155. //console.log(i + " - " + resultObj.length);
  156. if (i == (resultObj.length - 1)) {
  157. resolve();
  158. }
  159. }
  160. });
  161. })
  162. //eval('promises' + stateAbv + '.push(thispromise)');
  163. thesepromises.push(thispromise);
  164. }
  165. Promise.all(thesepromises).then(function () {
  166. //console.log("got promises..." + type);
  167. setTimeout(function () { promiseWorker(stateAbv, type) }, 1000);
  168. })
  169. }
  170. function promiseWorker(stateAbv, type) {
  171. let thisadvisory = eval("advisories" + stateAbv);
  172. //console.log(eval('promises' + stateAbv + '.length') + " promises");
  173. Promise.all(eval('promises' + stateAbv))
  174. .then(function () {
  175. //console.log(thisadvisory.length + " thisadvisory");
  176. for (let i = 0; i < thisadvisory.length; i++) {
  177. if (type == "report") {
  178. let parms = thisadvisory[i];
  179. let table = document.getElementById("reportTable").getElementsByTagName('tbody')[0];
  180. var row = table.insertRow(-1);
  181. var cell1 = row.insertCell(0);
  182. var cell2 = row.insertCell(1);
  183. var cell3 = row.insertCell(2);
  184. var cell4 = row.insertCell(3);
  185. cell1.innerHTML = '<div class="gotoPL" data-lat="' + parms.lat + '" data-lon="' + parms.lon + '"><img src=' + PLIcon + '></div>'; //PL
  186. cell2.innerHTML = parms.desc; //Description
  187. cell3.innerHTML = parms.title; //Location
  188. cell4.innerHTML = parms.time; //Time
  189. } else {
  190. drawMarkers(thisadvisory[i]);
  191. }
  192. }
  193. if ((type == "report")) { //Wait until we loop through all the advisory URLs before sorting the table
  194. reportWorker();
  195. }
  196. });
  197. }
  198. function reportWorker() {
  199. var elements = document.getElementsByClassName("gotoPL");
  200. for (var i = 0; i < elements.length; i++) {
  201. elements[i].addEventListener('click', moveMap, false);
  202. }
  203. refreshReportTable();
  204. }
  205. function refreshReportTable() {
  206. var sort = new Tablesort(document.getElementById('reportTable'), { descending: true });
  207. sort.refresh();
  208. document.getElementById("spinner").style.visibility = "hidden";
  209. }
  210. function getReportData(stateAbv, stateName) {
  211. popupdetails(stateName);
  212. //if (stateAbv != "NJ") {
  213. eval('getAdvisories(config.' + stateAbv + ',"' + stateAbv + '", "report")');
  214. //} else { getNJDOT("report"); }
  215. }
  216. //Generate the Advisory markers
  217. function drawMarkers(parms) {
  218. var icontype;
  219. var size = new OpenLayers.Size(20, 20);
  220. var offset = new OpenLayers.Pixel(-(size.w / 2), -size.h);
  221. for (let i = 0; i < parms.keyword.length; i++) { //Check each of the keywords for roadwork/construction
  222. if (parms.type == parms.keyword[i]) {
  223. icontype = Roadwork;
  224. break;
  225. } else {
  226. icontype = Incident;
  227. }
  228. }
  229. var icon = new OpenLayers.Icon(icontype, size);
  230. var epsg4326 = new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection
  231. var projectTo = W.map.getProjectionObject(); //The map projection (Spherical Mercator)
  232. var lonLat = new OpenLayers.LonLat(parms.lon, parms.lat).transform(epsg4326, projectTo);
  233. var newMarker = new OpenLayers.Marker(lonLat, icon);
  234. newMarker.eventId = parms.id;
  235. newMarker.title = parms.title;
  236. newMarker.desc = parms.desc;
  237. newMarker.popupType = parms.popupType;
  238. newMarker.state = parms.state;
  239. newMarker.timestamp = parms.time;
  240. newMarker.events.register('click', newMarker, popup);
  241. newMarker.location = lonLat;
  242. if (parms.link != '') {
  243. newMarker.link = '<a href="' + parms.link + '" target="_blank">Publication Link</a>';
  244. } else {
  245. newMarker.link = '';
  246. }
  247. eval(parms.state[0] + "DOTLayer.addMarker(newMarker)");
  248. }
  249. function popup(evt) {
  250. $("#gmPopupContainer").remove();
  251. $("#gmPopupContainer").hide();
  252. var popupHTML;
  253. W.map.moveTo(this.location);
  254. popupHTML = (['<div id="gmPopupContainer" style="max-width:500px;margin: 1;text-align: center;padding: 5px;z-index: 1100">' +
  255. '<a href="#close" id="gmCloseDlgBtn" title="Close" class="modalclose" style="color:#FF0000;">X</a>' +
  256. '<table border=0><tr><td><div id="mydivheader" style="min-height: 20px;">' + this.title + '</div></div><hr class="myhrline"/>' +
  257. 'Updated: ' + this.timestamp.toLocaleString() + '<hr class="myhrline"/></td></tr>' +
  258. '<tr><td>' + this.desc + '</td></tr>' +
  259. '<tr><td>' + this.link + '</td></tr>' +
  260. '</table>' +
  261. '</div>'
  262. ]);
  263. $("body").append(popupHTML);
  264. //Position the modal based on the position of the click event
  265. $("#gmPopupContainer").css({ left: document.getElementById("user-tabs").offsetWidth + W.map.getPixelFromLonLat(W.map.getCenter()).x - document.getElementById("gmPopupContainer").clientWidth - 10 });
  266. $("#gmPopupContainer").css({ top: document.getElementById("left-app-head").offsetHeight + W.map.getPixelFromLonLat(W.map.getCenter()).y - (document.getElementById("gmPopupContainer").clientHeight / 2) });
  267. $("#gmPopupContainer").show();
  268. //Add listener for popup's "Close" button
  269. $("#gmCloseDlgBtn").click(function () {
  270. $("#gmPopupContainer").remove();
  271. $("#gmPopupContainer").hide();
  272. });
  273. dragElement(document.getElementById("gmPopupContainer"));
  274. }
  275. function popupdetails(stateName) {
  276. $("#gmPopupContainer").remove();
  277. $("#gmPopupContainer").hide();
  278. var popupHTML;
  279. popupHTML = (['<div id="gmPopupContainer" style="max-width:750px;max-height:500px;margin:1;text-align:center;padding: 5px;z-index: 1100">' +
  280. '<a href="#close" id="popupdetailsclose" title="Close" class="modalclose" style="color:#FF0000;">X</a>' +
  281. '<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%">' +
  282. '<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>' +
  283. '<tr><td>' +
  284. '<div style="width:720px; height:450px; overflow:auto;"><table id="reportTable" border=1>' +
  285. '<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=210>Time</th></tr></thead>' +
  286. '<tbody></tbody></table></div>' +
  287. '</td></tr></table>' +
  288. '</div>'
  289. ]);
  290. $("body").append(popupHTML);
  291. //Position the modal based on the position of the click event
  292. $("#gmPopupContainer").css({ left: 350 });
  293. $("#gmPopupContainer").css({ top: 100 });
  294. $("#gmPopupContainer").show();
  295. //Add listener for popup's "Close" button
  296. $("#popupdetailsclose").click(function () {
  297. $("#gmPopupContainer").remove();
  298. $("#gmPopupContainer").hide();
  299. });
  300. dragElement(document.getElementById("gmPopupContainer"));
  301. }
  302. // Make the DIV element draggable
  303. function dragElement(elmnt) {
  304. var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
  305. if (document.getElementById("mydivheader")) {
  306. // if present, the header is where you move the DIV from:
  307. document.getElementById("mydivheader").onmousedown = dragMouseDown;
  308. } else {
  309. // otherwise, move the DIV from anywhere inside the DIV:
  310. elmnt.onmousedown = dragMouseDown;
  311. }
  312. function dragMouseDown(e) {
  313. e = e || window.event;
  314. e.preventDefault();
  315. // get the mouse cursor position at startup:
  316. pos3 = e.clientX;
  317. pos4 = e.clientY;
  318. document.onmouseup = closeDragElement;
  319. // call a function whenever the cursor moves:
  320. document.onmousemove = elementDrag;
  321. }
  322.  
  323. function elementDrag(e) {
  324. e = e || window.event;
  325. e.preventDefault();
  326. // calculate the new cursor position:
  327. pos1 = pos3 - e.clientX;
  328. pos2 = pos4 - e.clientY;
  329. pos3 = e.clientX;
  330. pos4 = e.clientY;
  331. // set the element's new position:
  332. elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
  333. elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
  334. }
  335. function closeDragElement() {
  336. // stop moving when mouse button is released:
  337. document.onmouseup = null;
  338. document.onmousemove = null;
  339. }
  340. }
  341. //Move map to coordinates specified
  342. function moveMap() {
  343. var epsg4326 = new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection
  344. var projectTo = W.map.getProjectionObject(); //The map projection (Spherical Mercator)
  345. var lat = this.getAttribute("data-lat");
  346. var lon = this.getAttribute("data-lon");
  347. W.map.moveTo(new OpenLayers.LonLat(lon, lat).transform(epsg4326, projectTo), 6);
  348. }
  349. //Initialize Settings
  350. function initializeSettings() {
  351. stateLength = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox").length;
  352. loadSettings();
  353. //Set the state checkboxes according to saved settings
  354. for (var i = 0; i < stateLength; i++) {
  355. state = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].id.replace("chk", "").replace("DOTEnabled", "");
  356. setChecked('chk' + state + 'DOTEnabled', eval('settings.' + state + 'DOTEnabled'));
  357. }
  358. //Build the layers for the selected states
  359. for (var i = 0; i < stateLength; i++) {
  360. state = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].id.replace("chk", "").replace("DOTEnabled", "");
  361. if (document.getElementById('chk' + state + 'DOTEnabled').checked) { buildDOTAdvLayers(state); eval('getAdvisories(config.' + state + ',"' + state + '")') }
  362. }
  363. }
  364. function addListeners() {
  365. //Add event listener to report icon
  366. for (var i = 0; i < document.getElementsByClassName("DOTreport").length; i++) {
  367. document.getElementsByClassName("DOTreport")[i].addEventListener('click', function (e) { getReportData(this.getAttribute("id"), this.getAttribute("data-state")); }, false);
  368. }
  369. //Refresh selected states when WME's refresh button is clicked
  370. document.getElementsByClassName("reload-button-region")[0].addEventListener('click', function (e) {
  371. for (var i = 0; i < stateLength; i++) {
  372. state = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].id.replace("chk", "").replace("DOTEnabled", "");
  373. if (document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].checked) { eval('W.map.removeLayer(' + state + 'DOTLayer)'); }
  374. }
  375. initializeSettings();
  376. });
  377. //Add Handler for Checkbox Setting Changes
  378. $('.WMEDOTAdvSettingsCheckbox').change(function () {
  379. var settingName = $(this)[0].id.substr(3);
  380. settings[settingName] = this.checked;
  381. saveSettings();
  382. if (this.checked) {
  383. buildDOTAdvLayers(settingName.substring(0, 2));
  384. eval('getAdvisories(config.' + settingName.substring(0, 2) + ',' + "settingName.substring(0, 2)" + ')');
  385. }
  386. else {
  387. //eval(settingName.substring(0,2) + "DOTLayer.destroy()");
  388. eval('W.map.removeLayer(' + settingName.substring(0, 2) + 'DOTLayer)');
  389. }
  390. });
  391. }
  392. //Set Checkbox from Settings
  393. function setChecked(checkboxId, checked) {
  394. $('#' + checkboxId).prop('checked', checked);
  395. }
  396. //Load Saved Settings
  397. function loadSettings() {
  398. var loadedSettings = $.parseJSON(localStorage.getItem("WMEDOT_Settings"));
  399. var defaultSettings = {
  400. Enabled: false,
  401. };
  402. settings = loadedSettings ? loadedSettings : defaultSettings;
  403. for (var prop in defaultSettings) {
  404. if (!settings.hasOwnProperty(prop)) {
  405. settings[prop] = defaultSettings[prop];
  406. }
  407. }
  408. }
  409. //Save Tab Settings
  410. function saveSettings() {
  411. if (localStorage) {
  412. var localsettings = {};
  413. for (var i = 0; i < stateLength; i++) {
  414. state = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].id.replace("chk", "").replace("DOTEnabled", "");
  415. eval('localsettings.' + state + 'DOTEnabled = document.getElementsByClassName("WMEDOTAdvSettingsCheckbox")[i].checked');
  416. }
  417. }
  418. localStorage.setItem("WMEDOT_Settings", JSON.stringify(localsettings));
  419. }
  420. //Add the Icon Class to OpenLayers
  421. function installIcon() {
  422. console.log('Installing OpenLayers.Icon');
  423. OpenLayers.Icon = OpenLayers.Class({
  424. url: null,
  425. size: null,
  426. offset: null,
  427. calculateOffset: null,
  428. imageDiv: null,
  429. px: null,
  430. initialize: function (a, b, c, d) {
  431. this.url = a;
  432. this.size = b || { w: 20, h: 20 };
  433. this.offset = c || { x: -(this.size.w / 2), y: -(this.size.h / 2) };
  434. this.calculateOffset = d;
  435. a = OpenLayers.Util.createUniqueID("OL_Icon_");
  436. let div = this.imageDiv = OpenLayers.Util.createAlphaImageDiv(a);
  437. $(div.firstChild).removeClass('olAlphaImg'); // LEAVE THIS LINE TO PREVENT WME-HARDHATS SCRIPT FROM TURNING ALL ICONS INTO HARDHAT WAZERS --MAPOMATIC
  438. },
  439. destroy: function () { this.erase(); OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild); this.imageDiv.innerHTML = ""; this.imageDiv = null; },
  440. clone: function () { return new OpenLayers.Icon(this.url, this.size, this.offset, this.calculateOffset); },
  441. setSize: function (a) { null !== a && (this.size = a); this.draw(); },
  442. setUrl: function (a) { null !== a && (this.url = a); this.draw(); },
  443. draw: function (a) {
  444. OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, this.size, this.url, "absolute");
  445. this.moveTo(a);
  446. return this.imageDiv;
  447. },
  448. erase: function () { null !== this.imageDiv && null !== this.imageDiv.parentNode && OpenLayers.Element.remove(this.imageDiv); },
  449. setOpacity: function (a) { OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, null, null, null, null, null, a); },
  450. moveTo: function (a) {
  451. null !== a && (this.px = a);
  452. null !== this.imageDiv && (null === this.px ? this.display(!1) : (
  453. this.calculateOffset && (this.offset = this.calculateOffset(this.size)),
  454. OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, { x: this.px.x + this.offset.x, y: this.px.y + this.offset.y })
  455. ));
  456. },
  457. display: function (a) { this.imageDiv.style.display = a ? "" : "none"; },
  458. isDrawn: function () { return this.imageDiv && this.imageDiv.parentNode && 11 != this.imageDiv.parentNode.nodeType; },
  459. CLASS_NAME: "OpenLayers.Icon"
  460. });
  461. }
  462. bootstrap();
  463. const config = { //Configuration data for each state
  464. AK: {
  465. data(res, index) {
  466. let resultText = [res];
  467. return (resultText[index]);
  468. },
  469. filter(index) {
  470. let filtertext = ['(resultObj[i].LanesAffected).replace(/ +(?= )/g, "") == ("All Lanes Closed")'];
  471. return (filtertext[index]);
  472. },
  473. scheme(obj, index) {
  474. promisesAK.push(new Promise((resolve, reject) => {
  475. advisoriesAK.push({
  476. state: ['AK', 'Alaska'],
  477. id: obj.ID,
  478. popupType: 0,
  479. title: obj.RoadwayName,
  480. lon: obj.Longitude,
  481. lat: obj.Latitude,
  482. type: obj.EventType,
  483. keyword: ['roadwork'], //keywords for roadwork/construction
  484. desc: obj.Description,
  485. time: moment(new Date(obj.LastUpdated * 1000)).format('LLL'),
  486. link: ''
  487. });
  488. resolve();
  489. }))
  490. },
  491. URL: ['http://scripts.essentialintegrations.com/AK']
  492. },
  493. DE: {
  494. data(res, index) {
  495. let resultText = [res.advisories, res, res.features];
  496. return (resultText[index]);
  497. },
  498. filter(index) {
  499. 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];
  500. return (filtertext[index]);
  501. },
  502. scheme(obj, index) {
  503. switch (index) {
  504. case 0:
  505. promisesDE.push(new Promise((resolve, reject) => {
  506. advisoriesDE.push({
  507. state: ['DE', 'Delaware'],
  508. id: obj.id,
  509. popupType: 0,
  510. title: obj.where.county.name,
  511. lon: obj.where.lon,
  512. lat: obj.where.lat,
  513. type: obj.type.name,
  514. keyword: ['Construction'], //keyword for roadwork/construction
  515. desc: obj.where.location,
  516. time: moment(new Date(obj.timestamp)).format('LLL'),
  517. link: obj.published.linkbackUrl
  518. });
  519. resolve();
  520. }))
  521. break;
  522. case 1:
  523. var pubLink;
  524. if (obj.str.releaseId) {
  525. if (obj.str.releaseId.toString() == "-1") {
  526. pubLink = '';
  527. } else {
  528. pubLink = 'https://deldot.gov/About/news/index.shtml?dc=release&id=' + obj.str.releaseId;
  529. }
  530. }
  531. promisesDE.push(new Promise((resolve, reject) => {
  532. advisoriesDE.push({
  533. state: ['DE', 'Delaware'],
  534. id: obj.str.strId,
  535. popupType: 0,
  536. title: obj.str.county,
  537. lon: obj.str.longitude,
  538. lat: obj.str.latitude,
  539. type: obj.str.impactType,
  540. keyword: ['Closure'], //keywords for roadwork/construction
  541. desc: obj.str.title + " - " + obj.str.construction,
  542. time: moment(new Date(obj.str.actualStartDate)).format('LLL'),
  543. link: pubLink
  544. });
  545. resolve();
  546. }))
  547. break;
  548. case 2:
  549. var direction, WorkType;
  550. switch (obj.attributes.direction) {
  551. case 'ONE_DIRECTION':
  552. direction = "One Way from ";
  553. break;
  554. case 'BOTH_DIRECTIONS':
  555. direction = "Both Ways between ";
  556. }
  557. switch (obj.attributes.WorkType) {
  558. case "1":
  559. WorkType = "Gas Work";
  560. break;
  561. case "2":
  562. WorkType = "Street Work (city)";
  563. break;
  564. case "3":
  565. WorkType = "Street Work (DelDOT)";
  566. break;
  567. case "4":
  568. WorkType = "Water Work";
  569. break;
  570. case "5":
  571. WorkType = "Work (other)";
  572. break;
  573. case "6":
  574. WorkType = "Sewer Work";
  575. }
  576. if (obj.attributes.street != null) {
  577. var originShift = 2.0 * Math.PI * 6378137.0 / 2.0;
  578. var lon = (obj.geometry.paths[0][0][0] / originShift) * 180.0;
  579. var lat = (obj.geometry.paths[0][0][1] / originShift) * 180.0;
  580. lat = 180.0 / Math.PI * (2.0 * Math.atan(Math.exp(lat * Math.PI / 180.0)) - Math.PI / 2.0);
  581. promisesDE.push(new Promise((resolve, reject) => {
  582. advisoriesDE.push({
  583. state: ['DE', 'Delaware'],
  584. id: obj.attributes.OBJECTID,
  585. popupType: 0,
  586. title: 'Wilmington Road Closures',
  587. lon: lon,
  588. lat: lat,
  589. type: 'Closure',
  590. keyword: ['Closure'], //keywords for roadwork/construction
  591. 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'),
  592. time: moment(new Date(obj.attributes.EditDate)).format('LLL'),
  593. link: ''
  594. });
  595. resolve();
  596. }))
  597. }
  598. }
  599. },
  600. 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=']
  601. },
  602. FL: {
  603. data(res, index) {
  604. let resultText = [res.item2, res.item2];
  605. return (resultText[index]);
  606. },
  607. filter(index) {
  608. let filtertext = [true, true];
  609. return (filtertext[index]);
  610. },
  611. scheme(obj, index) {
  612. switch (index) {
  613. case 0:
  614. promisesFL.push(new Promise((resolve, reject) => {
  615. getFeed(config.FL.detailURL[0] + obj.itemId.replace("/ /g", "%20"), async function (result) {
  616. var eventObj = JSON.parse(result.responseText);
  617. if (eventObj.lanes) {
  618. if (['Alllanesblocked', 'On-rampclosed', 'Off-rampclosed'].includes(eventObj.lanes.lanesAffected.replace(/ /g, ""))) {
  619. advisoriesFL.push({
  620. state: ['FL', 'Florida'],
  621. id: eventObj.id.id,
  622. popupType: 0,
  623. title: eventObj.areas.area5.areaLang1,
  624. lon: eventObj.coordinates.locationLongitude / 1000000,
  625. lat: eventObj.coordinates.locationLatitude / 1000000,
  626. type: eventObj.details.detailLang1.eventTypeName,
  627. keyword: ['Construction'], //keywords for roadwork/construction
  628. desc: eventObj.details.detailLang1.eventDescription,
  629. time: moment(new Date(eventObj.dates.lastUpdated)).format('LLL'),
  630. link: ''
  631. });
  632. }
  633. }
  634. resolve();
  635. });
  636. }));
  637. break;
  638. case 1:
  639. promisesFL.push(new Promise((resolve, reject) => {
  640. getFeed(config.FL.detailURL[1] + obj.itemId.replace("/ /g", "%20"), async function (result) {
  641. var eventObj = JSON.parse(result.responseText);
  642. if (eventObj.lanes) {
  643. if (['Alllanesblocked', 'On-rampclosed', 'Off-rampclosed'].includes(eventObj.lanes.lanesAffected.replace(/ /g, ""))) {
  644. advisoriesFL.push({
  645. state: ['FL', 'Florida'],
  646. id: eventObj.id.id,
  647. popupType: 0,
  648. title: eventObj.areas.area5.areaLang1,
  649. lon: eventObj.coordinates.locationLongitude / 1000000,
  650. lat: eventObj.coordinates.locationLatitude / 1000000,
  651. type: eventObj.details.detailLang1.eventTypeName,
  652. keyword: ['Constructions'], //keywords for roadwork/construction
  653. desc: eventObj.details.detailLang1.eventDescription,
  654. time: moment(new Date(eventObj.dates.lastUpdated)).format('LLL'),
  655. link: ''
  656. });
  657. }
  658. }
  659. resolve();
  660. });
  661. }));
  662. }
  663. },
  664. URL: ['https://fl511.com/map/mapIcons/Incidents?_=1604955914474', 'https://fl511.com/map/mapIcons/Construction?_=1604965926997'],
  665. detailURL: ['https://fl511.com/map/data/Incidents/', 'https://fl511.com/map/data/Construction/']
  666. },
  667. GA: {
  668. data(res, index) {
  669. let resultText = [res.features, res.features];
  670. return (resultText[index]);
  671. },
  672. filter(index) {
  673. let filtertext = [true, true];
  674. return (filtertext[index]);
  675. },
  676. scheme(obj, index) {
  677. switch (index) {
  678. case 0:
  679. promisesGA.push(new Promise((resolve, reject) => {
  680. advisoriesGA.push({
  681. state: ['GA', 'Georgia'],
  682. id: obj.id,
  683. popupType: 0,
  684. title: obj.properties.headline + ' - ' + obj.properties.route,
  685. lon: obj.geometry.coordinates[0],
  686. lat: obj.geometry.coordinates[1],
  687. type: obj.properties.headline,
  688. keyword: ['Construction', 'Emergency Roadwork'], //keyword for roadwork/construction
  689. desc: obj.properties.location_description + '<br>' + obj.properties.lanes,
  690. time: moment(new Date(obj.properties.start * 1000)).format('LLL'),
  691. link: ''
  692. });
  693. resolve();
  694. }))
  695. break;
  696. case 1:
  697. promisesGA.push(new Promise((resolve, reject) => {
  698. advisoriesGA.push({
  699. state: ['GA', 'Georgia'],
  700. id: obj.id,
  701. popupType: 0,
  702. title: obj.properties.headline + ' - ' + obj.properties.route,
  703. lon: obj.geometry.coordinates[0],
  704. lat: obj.geometry.coordinates[1],
  705. type: obj.properties.headline,
  706. keyword: ['Construction', 'Emergency Roadwork'], //keyword for roadwork/construction
  707. desc: obj.properties.location_description + '<br>' + obj.properties.lanes,
  708. time: moment(new Date(obj.properties.start * 1000)).format('LLL'),
  709. link: ''
  710. });
  711. resolve();
  712. }))
  713. }
  714. },
  715. 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']
  716. },
  717. IL: {
  718. data(res, index) {
  719. let resultText = [res.features, res.features, res.features];
  720. return (resultText[index]);
  721. },
  722. filter(index) {
  723. let filtertext = [true, true, true];
  724. return (filtertext[index]);
  725. },
  726. scheme(obj, index) {
  727. switch (index) {
  728. case 0:
  729. promisesIL.push(new Promise((resolve, reject) => {
  730. advisoriesIL.push({
  731. state: ['IL', 'Illinois'],
  732. id: obj.attributes.OBJECTID,
  733. popupType: 0,
  734. title: obj.attributes.NearTown,
  735. lon: obj.geometry.x,
  736. lat: obj.geometry.y,
  737. type: "Construction",
  738. keyword: ['Construction'], //keywords for roadwork/construction
  739. 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'),
  740. time: moment(new Date(obj.attributes.StartDate)).format('LLL'),
  741. link: obj.attributes.WebAddress
  742. });
  743. resolve();
  744. }))
  745. break;
  746. case 1:
  747. var DateUpdate;
  748. if (obj.attributes.DateUpdate == null) {
  749. DateUpdate = moment(new Date(obj.attributes.DateEntered)).format('LLL');
  750. } else {
  751. DateUpdate = moment(new Date(obj.attributes.DateUpdate)).format('LLL');
  752. }
  753. var originShift = 2.0 * Math.PI * 6378137.0 / 2.0;
  754. var lon = (obj.geometry.paths[0][0][0] / originShift) * 180.0;
  755. var lat = (obj.geometry.paths[0][0][1] / originShift) * 180.0;
  756. lat = 180.0 / Math.PI * (2.0 * Math.atan(Math.exp(lat * Math.PI / 180.0)) - Math.PI / 2.0);
  757. if (obj.attributes.SuggestionToMotorist.includes("Closed")) {
  758. promisesIL.push(new Promise((resolve, reject) => {
  759. advisoriesIL.push({
  760. state: ['IL', 'Illinois'],
  761. id: obj.attributes.OBJECTID,
  762. popupType: 0,
  763. title: obj.attributes.County,
  764. lon: lon,
  765. lat: lat,
  766. type: "Construction",
  767. keyword: ['Construction'], //keywords for roadwork/construction
  768. 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'),
  769. time: DateUpdate,
  770. link: obj.attributes.WebAddress
  771. });
  772. resolve();
  773. }))
  774. }
  775. break;
  776. case 2:
  777. promisesIL.push(new Promise((resolve, reject) => {
  778. advisoriesIL.push({
  779. state: ['IL', 'Illinois'],
  780. id: obj.attributes.OBJECTID,
  781. popupType: 0,
  782. title: obj.attributes.NearTown,
  783. lon: obj.geometry.paths[0][0][0],
  784. lat: obj.geometry.paths[0][0][1],
  785. type: "",
  786. keyword: ['Flooding'], //keywords for roadwork/construction
  787. 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'),
  788. time: moment(new Date(obj.attributes.StartDate)).format('LLL'),
  789. link: ''
  790. });
  791. resolve();
  792. }))
  793. }
  794. },
  795.  
  796. 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=']
  797. },
  798. IN: {
  799. data(res, index) {
  800. let resultText = [res];
  801. return (resultText[index]);
  802. },
  803. filter(index) {
  804. let filtertext = [true];
  805. return (filtertext[index]);
  806. },
  807. scheme(obj, index) {
  808. promisesIN.push(new Promise((resolve, reject) => {
  809. advisoriesIN.push({
  810. state: ['IN', 'Indiana'],
  811. id: obj.id,
  812. popupType: 0,
  813. title: obj.location.routeDesignator,
  814. lon: obj.location.primaryPoint.lon,
  815. lat: obj.location.primaryPoint.lat,
  816. type: 'Construction',
  817. keyword: ['Construction'], //keywords for roadwork/construction
  818. desc: obj.eventDescription.tooltip,
  819. time: moment(new Date(obj.updateTime.time)).format('LLL'),
  820. link: ''
  821. });
  822. resolve();
  823. }))
  824. },
  825. URL: ['https://indot.carsprogram.org/tgevents/api/eventReports?maxPriority=2&maxBeginDateOffset=7200000&minEndDateOffset=0&eventClassifications%5B%5D=roadReports&eventClassifications%5B%5D=winterDriving&eventClassifications%5B%5D=flooding&_=' + Date.now()]
  826. },
  827. LA: {
  828. data(res, index) {
  829. let resultText = [res];
  830. return (resultText[index]);
  831. },
  832. filter(index) {
  833. let filtertext = ['(resultObj[i].LanesAffected).replace(/ +(?= )/g, "") == ("All Lanes Closed")'];
  834. return (filtertext[index]);
  835. },
  836. scheme(obj, index) {
  837. promisesLA.push(new Promise((resolve, reject) => {
  838. advisoriesLA.push({
  839. state: ['LA', 'Louisiana'],
  840. id: obj.ID,
  841. popupType: 0,
  842. title: obj.RoadwayName,
  843. lon: obj.Longitude,
  844. lat: obj.Latitude,
  845. type: obj.EventType,
  846. keyword: ['roadwork'], //keywords for roadwork/construction
  847. desc: obj.Description,
  848. time: moment(new Date(obj.LastUpdated * 1000)).format('LLL'),
  849. link: ''
  850. });
  851. resolve();
  852. }))
  853. },
  854. URL: ['http://scripts.essentialintegrations.com/LA']
  855. },
  856. MD: {
  857. data(res, index) {
  858. let resultText = [res.features];
  859. return (resultText[index]);
  860. },
  861. filter(index) {
  862. let filtertext = [true];
  863. return (filtertext[index]);
  864. },
  865. scheme(obj, index) {
  866. promisesMD.push(new Promise((resolve, reject) => {
  867. advisoriesMD.push({
  868. state: ['MD', 'Maryland'],
  869. id: obj.attributes.OBJECTID,
  870. popupType: 0,
  871. title: obj.attributes.Jurisdiction,
  872. lon: obj.attributes.Longitude,
  873. lat: obj.attributes.Latitude,
  874. type: obj.attributes.typeSummary,
  875. keyword: ['Construction'], //keywords for roadwork/construction
  876. desc: obj.attributes.ClosureSummary,
  877. time: moment(new Date(obj.attributes.EditDate)).format('LLL'),
  878. link: ''
  879. });
  880. resolve();
  881. }))
  882. },
  883. URL: ['https://geodata.md.gov/appdata/rest/services/SHA_RoadClosure/RoadClosureActive/MapServer//0/query?where=1%3D1&outFields=*&outSR=4326&f=json']
  884. },
  885. MI: {
  886. data(res, index) {
  887. let resultText = [res, res];
  888. return (resultText[index]);
  889. },
  890. filter(index) {
  891. let filtertext = ['(resultObj[i].type == "Total")', true];
  892. return (filtertext[index]);
  893. },
  894. scheme(obj, index) {
  895. switch (index) {
  896. case 0:
  897. promisesMI.push(new Promise((resolve, reject) => {
  898. advisoriesMI.push({
  899. state: ['MI', 'Michigan'],
  900. id: "00",
  901. popupType: 0,
  902. title: obj.county,
  903. lon: obj.description.match(/(?<=lon=)[\s\S]*(?=&zoom)/)[0],
  904. lat: obj.description.match(/(?<=lat=)[\s\S]*(?=&lon)/)[0],
  905. type: "Construction",
  906. keyword: ['Construction'], //keyword for roadwork/construction
  907. desc: obj.description.match(/(?:(?!<).)*/),
  908. time: moment(new Date(obj.startDate)).format('LL'),
  909. link: ''
  910. });
  911. resolve();
  912. }))
  913. break;
  914. case 1:
  915. promisesMI.push(new Promise((resolve, reject) => {
  916. advisoriesMI.push({
  917. state: ['MI', 'Michigan'],
  918. id: "",
  919. popupType: 0,
  920. title: obj.county,
  921. lon: obj.location.match(/(?<=lon=)[\s\S]*(?=&zoom)/)[0],
  922. lat: obj.location.match(/(?<=lat=)[\s\S]*(?=&lon)/)[0],
  923. type: "Incident",
  924. keyword: ['Construction'], //keyword for roadwork/construction
  925. desc: obj.location.match(/(?:(?!<).)*/),
  926. time: moment(new Date(obj.reported)).format('LLL'),
  927. link: ''
  928. });
  929. resolve();
  930. }))
  931. }
  932. },
  933. URL: ['https://mdotjboss.state.mi.us/MiDrive//construction/list/loadConstruction', 'https://mdotjboss.state.mi.us/MiDrive//incident/list/loadIncidents']
  934. },
  935. NC: {
  936. data(res, index) {
  937. let resultText = [res.features];
  938. return (resultText[index]);
  939. },
  940. filter(index) {
  941. let filtertext = [true];
  942. return (filtertext[index]);
  943. },
  944. scheme(obj, index) {
  945. promisesNC.push(new Promise((resolve, reject) => {
  946. advisoriesNC.push({
  947. state: ['NC', 'North Carolina'],
  948. id: obj.attributes.OBJECTID,
  949. popupType: 0,
  950. title: obj.attributes.CountyName,
  951. lon: obj.attributes.Longitude,
  952. lat: obj.attributes.Latitude,
  953. type: obj.attributes.IncidentType,
  954. keyword: ['Construction', 'Emergency Road Work', 'Night Time Construction', 'Weekend Construction'], //keywords for roadwork/construction
  955. desc: obj.attributes.Reason,
  956. time: moment(new Date(obj.attributes.LastUpdateUTC)).format('LLL'),
  957. link: obj.attributes.DriveNCLink
  958. });
  959. resolve();
  960. }))
  961. },
  962. 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=']
  963. },
  964. NJ: {
  965. data(res, index) {
  966. let resultText = [res.Data.features];
  967. return (resultText[index]);
  968. },
  969. filter(index) {
  970. let filtertext = [true];
  971. return (filtertext[index]);
  972. },
  973. scheme(obj, index) {
  974. promisesNJ.push(new Promise((resolve, reject) => {
  975. //setTimeout(function() { resolve() } , 4000);
  976. getFeed(config.NJ.detailURL[0] + obj.properties.EventID, async function (result) {
  977. var eventObj = JSON.parse(result.responseText).Data;
  978. if (((eventObj[0].FullText.toUpperCase()).includes("ALL LANES CLOSE") || (eventObj[0].FullText.toUpperCase()).includes("RAMP CLOSE")) && ((eventObj[0].FullText).includes("NYSDOT") != true)) {
  979. advisoriesNJ.push({
  980. state: ['NJ', 'New Jersey'],
  981. id: eventObj[0].markerId,
  982. popupType: 0,
  983. title: eventObj[0].County,
  984. lon: eventObj[0].Longitude,
  985. lat: eventObj[0].Latitude,
  986. type: eventObj[0].CategoryName,
  987. keyword: ['Construction', 'ScheduledConstruction'], //keywords for roadwork/construction
  988. desc: eventObj[0].FullText,
  989. time: moment(new Date(eventObj[0].LastUpdateDate_String)).format('LLL'),
  990. link: ''
  991. });
  992. }
  993. resolve();
  994. });
  995. }));
  996. },
  997. URL: ['https://511nj.org/API/client/Map/getEventData'],
  998. detailURL: ['https://511nj.org/API/client/Map/getEventPopupData?EventId=']
  999. },
  1000. NV: {
  1001. data(res, index) {
  1002. let resultText = [res.d];
  1003. return (resultText[index]);
  1004. },
  1005. filter(index) {
  1006. let filtertext = [true];
  1007. return (filtertext[index]);
  1008. },
  1009. scheme(obj, index) {
  1010. promisesNV.push(new Promise((resolve, reject) => {
  1011. let unix = obj.LastUpdate.replace(/\\\//g, "").replace("/Date(", "").replace(")/", "");
  1012. advisoriesNV.push({
  1013. state: ['NV', 'Nevada'],
  1014. id: obj.ID,
  1015. popupType: 0,
  1016. title: obj.Facility,
  1017. lon: obj.Lon,
  1018. lat: obj.Lat,
  1019. type: obj.CategoryName,
  1020. keyword: ['Construction'], //keywords for roadwork/construction
  1021. desc: obj.Description,
  1022. time: moment(new Date(parseInt(unix))).format('LLL'),
  1023. link: ''
  1024. });
  1025. resolve();
  1026. }))
  1027. },
  1028. URL: ['http://scripts.essentialintegrations.com/NV']
  1029. },
  1030. NY: {
  1031. data(res, index) {
  1032. let resultText = [res];
  1033. return (resultText[index]);
  1034. },
  1035. filter(index) {
  1036. 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"))))'];
  1037. return (filtertext[index]);
  1038. },
  1039. scheme(obj, index) {
  1040. promisesNY.push(new Promise((resolve, reject) => {
  1041. advisoriesNY.push({
  1042. state: ['NY', 'New York'],
  1043. id: obj.ID,
  1044. popupType: 0,
  1045. title: obj.CountyName,
  1046. lon: obj.Longitude,
  1047. lat: obj.Latitude,
  1048. type: obj.EventType,
  1049. keyword: ['roadwork', 'transitMode', 'closures'], //keywords for roadwork/construction
  1050. desc: obj.Description,
  1051. time: moment(moment(obj.LastUpdated, "DD/MM/YYYY HH:mm:ss")).format('LLL'),
  1052. link: ''
  1053. });
  1054. resolve();
  1055. }))
  1056. },
  1057. URL: ['http://scripts.essentialintegrations.com/NY']
  1058. },
  1059. OH: {
  1060. data(res, index) {
  1061. let resultText = [res.ConstructionMarkers];
  1062. return (resultText[index]);
  1063. },
  1064. filter(index) {
  1065. let filtertext = ['(resultObj[i].Status == "Closed")'];
  1066. return (filtertext[index]);
  1067. },
  1068. scheme(obj, index) {
  1069. promisesOH.push(new Promise((resolve, reject) => {
  1070. advisoriesOH.push({
  1071. state: ['OH', 'Ohio'],
  1072. id: obj.ID,
  1073. popupType: 0,
  1074. title: obj.District,
  1075. lon: obj.Longitude,
  1076. lat: obj.Latitude,
  1077. type: obj.Category,
  1078. keyword: ['Roadwork - Planned', 'Roadwork - Unplanned'], //keywords for roadwork/construction
  1079. desc: obj.Description,
  1080. time: moment(new Date(obj.StartDate)).format('LL'),
  1081. link: ''
  1082. });
  1083. resolve();
  1084. }))
  1085. },
  1086. URL: ['https://api.ohgo.com/roadmarkers/TrafficSpeedAndAlertMarkers']
  1087. },
  1088. OR: {
  1089. data(res, index) {
  1090. let resultText = [res.features, res.features, res.features];
  1091. return (resultText[index]);
  1092. },
  1093. filter(index) {
  1094. let filtertext = [true, 'resultObj[i].attributes.comments.includes("clos")', 'resultObj[i].attributes.tmddOther.includes("clos")'];
  1095. return (filtertext[index]);
  1096. },
  1097. scheme(obj, index) {
  1098. switch (index) {
  1099. case 0:
  1100. let x, y;
  1101. var lonlat = obj.geometry.paths[0][0];
  1102. promisesOR.push(new Promise((resolve, reject) => {
  1103. x = obj.geometry.paths[0][0].toString().split(",")[0];
  1104. y = obj.geometry.paths[0][0].toString().split(",")[1];
  1105. advisoriesOR.push({
  1106. state: ['OR', 'Oregon'],
  1107. id: obj.attributes.OBJECTID,
  1108. popupType: 0,
  1109. title: obj.attributes.FROM_TO,
  1110. lon: x,
  1111. lat: y,
  1112. type: obj.attributes.CLOSURE_EFFECT,
  1113. keyword: ['Street'], //keywords for roadwork/construction
  1114. desc: obj.attributes.FROM_TO + " - " + obj.attributes.REMARKS,
  1115. time: moment(new Date(obj.attributes.LAST_EDITED_DATE)).format('LLL'),
  1116. link: ''
  1117. });
  1118. resolve();
  1119. }))
  1120. break;
  1121. case 1:
  1122. promisesOR.push(new Promise((resolve, reject) => {
  1123. advisoriesOR.push({
  1124. state: ['OR', 'Oregon'],
  1125. id: obj.attributes.incidentId,
  1126. popupType: 0,
  1127. title: obj.attributes.locationName,
  1128. lon: obj.attributes.startLongitude,
  1129. lat: obj.attributes.startLatitude,
  1130. type: obj.attributes.type,
  1131. keyword: ['ROADWORK'], //keywords for roadwork/construction
  1132. desc: obj.attributes.comments + " <br> " + obj.attributes.beginMarker + " to " + obj.attributes.endMarker,
  1133. time: moment(new Date(obj.attributes.lastUpdated)).format('LLL'),
  1134. link: ''
  1135. });
  1136. resolve();
  1137. }))
  1138. break;
  1139. case 2:
  1140. promisesOR.push(new Promise((resolve, reject) => {
  1141. advisoriesOR.push({
  1142. state: ['OR', 'Oregon'],
  1143. id: obj.attributes.incidentId,
  1144. popupType: 0,
  1145. title: obj.attributes.locationName,
  1146. lon: obj.attributes.startLongitude,
  1147. lat: obj.attributes.startLatitude,
  1148. type: obj.attributes.type,
  1149. keyword: ['EVENT'], //keywords for roadwork/construction
  1150. desc: obj.attributes.tmddOther + " <br> " + obj.attributes.beginMarker + " to " + obj.attributes.endMarker,
  1151. time: moment(new Date(obj.attributes.lastUpdated)).format('LLL'),
  1152. link: ''
  1153. });
  1154. resolve();
  1155. }))
  1156. }
  1157. },
  1158. 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']
  1159. },
  1160. PA: {
  1161. data(res, index) {
  1162. let resultText = [res, res.features];
  1163. return (resultText[index]);
  1164. },
  1165. filter(index) {
  1166. let filtertext = ['(resultObj[i].LaneStatus == "closed") || (resultObj[i].LaneStatus == "ramp closure")', true];
  1167. return (filtertext[index]);
  1168. },
  1169. scheme(obj, index) {
  1170. switch (index) {
  1171. case 0:
  1172. let status = obj.LaneStatus;
  1173. let x, y;
  1174. if (status != "ramp closure") {
  1175. x = obj.FromLocLatLong.split(",")[1];
  1176. y = obj.FromLocLatLong.split(",")[0];
  1177. } else {
  1178. x = obj.IncidentLocLatLong.split(",")[1];
  1179. y = obj.IncidentLocLatLong.split(",")[0];
  1180. }
  1181. promisesPA.push(new Promise((resolve, reject) => {
  1182. advisoriesPA.push({
  1183. state: ['PA', 'Pennsylvania'],
  1184. id: obj.EventID,
  1185. popupType: 0,
  1186. title: obj.CountyName,
  1187. lon: x,
  1188. lat: y,
  1189. type: obj.EventType,
  1190. keyword: ['roadwork', 'bridge outage'], //keywords for roadwork/construction
  1191. desc: obj.Description,
  1192. time: moment(new Date(obj.LastUpdate)).format('LLL'),
  1193. link: ''
  1194. });
  1195. resolve();
  1196. }))
  1197. break;
  1198. case 1:
  1199. var originShift = 2.0 * Math.PI * 6378137.0 / 2.0;
  1200. var lon = (obj.geometry.x / originShift) * 180.0;
  1201. var lat = (obj.geometry.y / originShift) * 180.0;
  1202. lat = 180.0 / Math.PI * (2.0 * Math.atan(Math.exp(lat * Math.PI / 180.0)) - Math.PI / 2.0);
  1203. var timing;
  1204. if (obj.attributes.END_DATE == null) {
  1205. timing = moment(new Date(obj.attributes.START_DATE)).format('LL');
  1206. } else {
  1207. timing = moment(new Date(obj.attributes.START_DATE)).format('LL') + ' to ' + moment(new Date(obj.attributes.END_DATE)).format('LL');
  1208. }
  1209. if (obj.attributes.START_TIME != null) {
  1210. timing = timing + '<br>' + obj.attributes.START_TIME + ' to ' + obj.attributes.END_TIME;
  1211. }
  1212. promisesPA.push(new Promise((resolve, reject) => {
  1213. advisoriesPA.push({
  1214. state: ['PA', 'Pennsylvania'],
  1215. id: obj.attributes.GlobalID,
  1216. popupType: 0,
  1217. title: 'HARRISBURG',
  1218. lon: lon,
  1219. lat: lat,
  1220. type: 'Closure',
  1221. keyword: ['Closure'], //keywords for roadwork/construction
  1222. desc: obj.attributes.STREET_NAME + ' between ' + obj.attributes.STREET_FROM + ' and ' + obj.attributes.STREET_TO + '<br>' + obj.attributes.REASON_FOR_CLOSURE + '<br>' + timing,
  1223. time: moment(new Date(obj.attributes.EditDate)).format('LLL'),
  1224. link: ''
  1225. });
  1226. resolve();
  1227. }))
  1228. }
  1229. },
  1230. URL: ['http://scripts.essentialintegrations.com/PA', 'https://services5.arcgis.com/9n3LUAMi3B692MBL/arcgis/rest/services/Street_Closures_for_GIS_2017/FeatureServer/0/query?f=json&where=1%3D1&returnGeometry=true&spatialRel=esriSpatialRelIntersects&outFields=*&outSR=102100&resultOffset=0&resultRecordCount=2000']
  1231. },
  1232. WA: {
  1233. data(res, index) {
  1234. let resultText = [res];
  1235. return (resultText[index]);
  1236. },
  1237. filter(index) {
  1238. let filtertext = ['(resultObj[i].EventCategory == "Closure" || resultObj[i].EventCategory == "Construction" || resultObj[i].EventCategory == "Bridge")'];
  1239. return (filtertext[index]);
  1240. },
  1241. scheme(obj, index) {
  1242. let county;
  1243. if (obj.County == null) {
  1244. county = obj.Region;
  1245. } else {
  1246. county = obj.County;
  1247. }
  1248. let unixtime = parseInt(obj.LastUpdatedTime.replace("/Date(", "").replace(")/", "").split("-")[0]);
  1249. promisesWA.push(new Promise((resolve, reject) => {
  1250. advisoriesWA.push({
  1251. state: ['WA', 'Washington'],
  1252. id: obj.AlertID,
  1253. popupType: 0,
  1254. title: county,
  1255. lon: obj.StartRoadwayLocation.Longitude,
  1256. lat: obj.StartRoadwayLocation.Latitude,
  1257. type: obj.EventCategory,
  1258. keyword: ['Construction', 'Closures'], //keywords for roadwork/construction
  1259. desc: obj.HeadlineDescription,
  1260. time: moment(new Date(unixtime)).format('LLL'),
  1261. link: ''
  1262. });
  1263. resolve();
  1264. }))
  1265. },
  1266. URL: ['http://scripts.essentialintegrations.com/WA']
  1267. },
  1268. WV: {
  1269. data(res, index) {
  1270. let resultText = [res.changes["com.orci.opentms.web.public511.components.plannedevent.shared.data.PlannedEventBean"].changes];
  1271. return (resultText[index]);
  1272. },
  1273. filter(index) {
  1274. let filtertext = [true];
  1275. return (filtertext[index]);
  1276. },
  1277. scheme(obj, index) {
  1278. promisesWV.push(new Promise((resolve, reject) => {
  1279. advisoriesWV.push({
  1280. state: ['WV', 'West Virginia'],
  1281. id: obj.entity.dataGatewayId,
  1282. popupType: 0,
  1283. title: obj.entity.routeName,
  1284. lon: obj.entity.x,
  1285. lat: obj.entity.y,
  1286. type: 'Construction',
  1287. keyword: ['Construction'], //keywords for roadwork/construction
  1288. desc: obj.entity.message,
  1289. time: moment(new Date(obj.entity.startTime.millis)).format('LLL'),
  1290. link: ''
  1291. });
  1292. resolve();
  1293. }))
  1294. },
  1295. URL: ['http://scripts.essentialintegrations.com/WV']
  1296. }
  1297. };
  1298. })();