WME RTC Improvements

Adds several helpful features to RTC handling in the Waze Map Editor

目前為 2016-04-21 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name WME RTC Improvements
  3. // @description Adds several helpful features to RTC handling in the Waze Map Editor
  4. // @namespace vaindil
  5. // @version 1.1.2
  6. // @grant none
  7. // @include https://www.waze.com/editor/*
  8. // @include https://www.waze.com/*/editor/*
  9. // @include https://editor-beta.waze.com/editor/*
  10. // @include https://editor-beta.waze.com/*/editor/*
  11. // @exclude https://www.waze.com/user/*
  12. // @exclude https://www.waze.com/*/user/*
  13. // @author vaindil
  14. // ==/UserScript==
  15.  
  16. var firstrun = true;
  17. var ls = [];
  18.  
  19. switch (I18n.locale) {
  20. case 'es':
  21. ls.locale = 'es';
  22. ls.name = 'RTC Mejoras';
  23. ls.prefs = 'Defecto choque duración (minutos)';
  24. ls.xdays = 'Expirará en X días';
  25. ls.crash = 'Choque';
  26. ls.invalidstart = 'Fecha de inicio no es válida';
  27. ls.notint = 'No es untero válido';
  28. ls.neg = 'No puede ser negativo';
  29. ls.prefdefault = 'Defecto: 2 hrs';
  30. ls.preffuture = 'No se puede establecer más de 180 días en el futuro';
  31. ls.daysing = 'día';
  32. ls.daypl = 'días';
  33. ls.hoursing = 'hr';
  34. ls.hourpl = 'hrs';
  35. ls.minsing = 'min';
  36. ls.minpl = 'mins';
  37. break;
  38. case 'fr':
  39. ls.locale = 'fr';
  40. ls.name = 'RTC Améliorations';
  41. ls.prefs = 'Défaut crash durée (minutes)';
  42. ls.xdays = 'Expirer en X jours';
  43. ls.crash = 'Crash';
  44. ls.invalidstart = 'Date de début est invalide';
  45. ls.notint = 'Pas un entier valide';
  46. ls.neg = 'Vous ne pouvez pas être négatif';
  47. ls.prefdefault = 'Défaut: 2 heures';
  48. ls.preffuture = 'Ne peut pas être réglé plus de 180 jours dans le futur';
  49. ls.daysing = 'journée';
  50. ls.daypl = 'journées';
  51. ls.hoursing = 'heure';
  52. ls.hourpl = 'heures';
  53. ls.minsing = 'min';
  54. ls.minpl = 'mins';
  55. break;
  56. case 'de':
  57. ls.locale = 'de';
  58. ls.name = 'RTC Verbesserungen';
  59. ls.prefs = 'Standard Absturz Dauer (minuten)';
  60. ls.xdays = 'in X Tagen verfallen';
  61. ls.crash = 'Absturz';
  62. ls.invalidstart = 'Startdatum ist ungültig';
  63. ls.notint = 'Keine gültige ganze Zahl';
  64. ls.neg = 'Kann nicht negativ sein';
  65. ls.prefdefault = 'Default: 2 std';
  66. ls.preffuture = 'Es können nicht mehr als 180 Tage in der Zukunft festgelegt werden';
  67. ls.daysing = 'Tag';
  68. ls.daypl = 'Tagen';
  69. ls.hoursing = 'std';
  70. ls.hourpl = 'std';
  71. ls.minsing = 'min';
  72. ls.minpl = 'min';
  73. break;
  74. case 'it':
  75. ls.locale = 'it';
  76. ls.name = 'RTC Miglioramenti';
  77. ls.prefs = 'Predefinito schianto durata (minuti)';
  78. ls.xdays = 'Scade in X giorni';
  79. ls.crash = 'Schianto';
  80. ls.invalidstart = 'Data di inizio non è valida';
  81. ls.notint = 'Non un intero valido';
  82. ls.neg = 'Non può essere negativo';
  83. ls.prefdefault = 'Predefinito: 2 ore';
  84. ls.preffuture = 'Non può essere impostato più di 180 giorni per il futuro';
  85. ls.daysing = 'day';
  86. ls.daypl = 'days';
  87. ls.hoursing = 'ora';
  88. ls.hourpl = 'ore';
  89. ls.minsing = 'min';
  90. ls.minpl = 'min';
  91. break;
  92. default:
  93. ls.locale = 'en';
  94. ls.name = 'RTC Improvements';
  95. ls.prefs = 'Default crash length (minutes)';
  96. ls.xdays = 'Expire in X days';
  97. ls.crash = 'Crash';
  98. ls.invalidstart = 'Start date is invalid';
  99. ls.notint = 'Not a valid integer';
  100. ls.neg = 'Cannot be negative';
  101. ls.prefdefault = 'Default: 2 hrs';
  102. ls.preffuture = 'Can\'t be set more than 180 days in the future';
  103. ls.daysing = 'day';
  104. ls.daypl = 'days';
  105. ls.hoursing = 'hr';
  106. ls.hourpl = 'hrs';
  107. ls.minsing = 'min';
  108. ls.minpl = 'mins';
  109. }
  110.  
  111. function welcomeToTheJungle() {
  112. try {
  113. var element = $('#sidepanel-prefs');
  114. if ($(element).length) {
  115. letsAGo();
  116. } else {
  117. setTimeout(welcomeToTheJungle, 1000);
  118. }
  119. } catch (err) {
  120. console.log("RTCENH - " + err);
  121. setTimeout(welcomeToTheJungle, 1000);
  122. }
  123. }
  124.  
  125. welcomeToTheJungle();
  126.  
  127. function letsAGo() {
  128. $(document).on('mouseover', 'div.add-closure-button.btn.btn-primary', function() {
  129. $(document).off('mouseover.RTCXdays');
  130. $(document).on('mouseover.RTCXdays', 'div.edit-closure.new', function() {
  131. justDewIt();
  132. $(document).off('mouseover.RTCXdays');
  133. });
  134. });
  135.  
  136. $(document).on('input.RTCXdaysfield', 'input#expireinXdays', timeAndRelativeDimensionInSpace);
  137. $(document).on('click.RTCXdayscrash', 'div#RTCXdayscrash', ohNoes);
  138.  
  139. $('#sidepanel-prefs').append('<hr />' +
  140. '<h4 style="font-size:13px">' + ls.name + '<br />' + ls.prefs + '</h4>' +
  141. '<input type="number" class="form-control" id="RTCimprovcrashdays" />' +
  142. '<span style="font-weight:bold" id="RTCimprovprefsmsg"></span>' +
  143. '<hr />');
  144. thisIsWhatYouWanted();
  145. $(document).on('input.RTCXdaysprefs', 'input#RTCimprovcrashdays', thisIsWhatYouWanted);
  146. }
  147.  
  148. function justDewIt() {
  149. $('div.edit-closure.new > form.form > div.checkbox').before(
  150. '<div class="form-group">' +
  151. '<label class="control-label">' + ls.xdays + '</label>' +
  152. '<div class="controls">' +
  153. '<input type="number" length="3" maxlength="4" class="form-control" id="expireinXdays" />' +
  154. '</div>' +
  155. '</div>' +
  156. '<span id="RTCimprovXdaysmsg" style="color:red;font-weight:bold"></span>'
  157. );
  158.  
  159. $('div.action-buttons').append(
  160. '<div class="btn btn-danger" id="RTCXdayscrash" style="float:right"><i class="fa fa-exclamation-triangle"></i> ' + ls.crash + '</div>'
  161. );
  162.  
  163.  
  164. $('input[name="closure_endDate"]').datepicker('remove');
  165. $('input[name="closure_endDate"]').datepicker({ format: 'yyyy-mm-dd', todayHighlight: true, autoclose: true, language: ls.locale });
  166. }
  167.  
  168. function timeAndRelativeDimensionInSpace() {
  169. var newdate = new Date();
  170. if ($('input[name="closure_startDate"]').val() !== '') {
  171. var p = $('input[name="closure_startDate"]').val().split('-');
  172. var y = Number(p[0]);
  173. var m = Number(p[1]);
  174. var d = Number(p[2]);
  175. if (!Number.isInteger(y) || isNaN(y) || !Number.isInteger(m) || isNaN(m) || !Number.isInteger(d) || isNaN(d)) {
  176. $('#RTCimprovXdaysmsg').text(ls.invalidstart);
  177. return;
  178. }
  179. newdate = new Date(y, m - 1, d);
  180. }
  181. var v = Number($('#expireinXdays').val());
  182. if (!Number.isInteger(v) || isNaN(v)) {
  183. $('#RTCimprovXdaysmsg').text('');
  184. return;
  185. }
  186.  
  187. if (v === 0) {
  188. $('#RTCimprovXdaysmsg').text(ls.notint);
  189. return;
  190. }
  191.  
  192. if (v < 0) {
  193. $('#RTCimprovXdaysmsg').text(ls.neg);
  194. return;
  195. }
  196.  
  197. $('#RTCimprovXdaysmsg').text('');
  198. newdate.setDate(newdate.getDate() + v);
  199. $('input[name="closure_endDate"]').datepicker('update', newdate);
  200. if ($('input[name="closure_endTime"]').val() === '')
  201. $('input[name="closure_endTime"]').timepicker('setTime', '05:00');
  202. }
  203.  
  204. function ohNoes() {
  205. $('input[name="closure_reason"]').val(ls.crash);
  206. var delay = Number(localStorage.getItem('RTCimprovcrashmins'));
  207. if (!Number.isInteger(delay) || isNaN(delay))
  208. delay = 120;
  209.  
  210. var cur = new Date();
  211. cur.setMinutes(cur.getMinutes() + delay);
  212. $('input[name="closure_endDate"]').datepicker('update', cur);
  213. $('input[name="closure_endTime"]').timepicker('setTime', (('0' + cur.getHours()).slice(-2)) + ':' + (('0' + cur.getMinutes()).slice(-2)));
  214. }
  215.  
  216. function thisIsWhatYouWanted() {
  217. var v;
  218. if (firstrun) {
  219. v = localStorage.getItem('RTCimprovcrashmins');
  220. firstrun = false;
  221. }
  222. else
  223. v = $('input#RTCimprovcrashdays').val();
  224.  
  225. v = Number(v);
  226. if (isNaN(Number(v)) || !Number.isInteger(v)) {
  227. localStorage.removeItem('RTCimprovcrashmins');
  228. $('#RTCimprovprefsmsg').css('color', 'green').text(ls.prefdefault);
  229. return;
  230. }
  231. if (v === 0) {
  232. localStorage.removeItem('RTCimprovcrashmins');
  233. $('#RTCimprovprefsmsg').css('color', 'green').text(ls.prefdefault);
  234. return;
  235. }
  236. if (!Number.isInteger(v) || isNaN(v)) {
  237. localStorage.removeItem('RTCimprovcrashmins');
  238. $('#RTCimprovprefsmsg').css('color', 'red').text(ls.notint);
  239. return;
  240. }
  241. if (v < 0) {
  242. localStorage.removeItem('RTCimprovcrashmins');
  243. $('#RTCimprovprefsmsg').css('color', 'red').text(ls.neg);
  244. return;
  245. }
  246. if (v > 259200) {
  247. localStorage.removeItem('RTCimprovcrashmins');
  248. $('#RTCimprovprefsmsg').css('color', 'red').text(ls.preffuture);
  249. return;
  250. }
  251. localStorage.setItem('RTCimprovcrashmins', v);
  252. $('input#RTCimprovcrashdays').val(v);
  253. var min = v % 60;
  254. var hrso = (v - min) / 60;
  255. var hrsf = hrso % 24;
  256. var days = (hrso - hrsf) / 24;
  257. var ms = min !== 1 ? ls.minpl : ls.minsing;
  258. var hs = hrsf !== 1 ? ls.hourpl : ls.hoursing;
  259. var ds = days !== 1 ? ls.daypl : ls.daysing;
  260. $('#RTCimprovprefsmsg').css('color', 'green').text(days + ' ' + ds + ', ' + hrsf + ' ' + hs + ', ' + min + ' ' + ms);
  261. }