WME RTC Improvements

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

目前为 2016-04-20 提交的版本。查看 最新版本

  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.1
  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.  
  18. function yoloswag() {
  19. try {
  20. var element = $('#sidepanel-prefs');
  21. if ($(element).length) {
  22. letsAGo();
  23. } else {
  24. setTimeout(yoloswag, 1000);
  25. }
  26. } catch (err) {
  27. console.log("RTCENH - " + err);
  28. setTimeout(yoloswag, 1000);
  29. }
  30. }
  31.  
  32. yoloswag();
  33.  
  34. function letsAGo() {
  35. $(document).on('mouseover', 'div.add-closure-button.btn.btn-primary', function() {
  36. $(document).off('mouseover.RTCXdays');
  37. $(document).on('mouseover.RTCXdays', 'div.edit-closure.new', function() {
  38. justDewIt();
  39. $(document).off('mouseover.RTCXdays');
  40. });
  41. });
  42.  
  43. $(document).on('input.RTCXdaysfield', 'input#expireinXdays', timeAndRelativeDimensionInSpace);
  44. $(document).on('click.RTCXdayscrash', 'div#RTCXdayscrash', ohNoes);
  45.  
  46. $('#sidepanel-prefs').append('<hr />' +
  47. '<h4 style="font-size:13px">RTC Improvements<br />' +
  48. 'Default crash length (minutes)</h4>' +
  49. '<input type="number" class="form-control" id="RTCimprovcrashdays" />' +
  50. '<span style="font-weight:bold" id="RTCimprovprefsmsg"></span>' +
  51. '<hr />');
  52. thisIsWhatYouWanted();
  53. $(document).on('input.RTCXdaysprefs', 'input#RTCimprovcrashdays', thisIsWhatYouWanted);
  54. }
  55.  
  56. function justDewIt() {
  57. $('div.edit-closure.new > form.form > div.checkbox').before(
  58. '<div class="form-group">' +
  59. '<label class="control-label">Expire in X days</label>' +
  60. '<div class="controls">' +
  61. '<input type="number" length="3" maxlength="4" class="form-control" id="expireinXdays" />' +
  62. '</div>' +
  63. '</div>' +
  64. '<span id="RTCimprovXdaysmsg" style="color:red;font-weight:bold"></span>'
  65. );
  66.  
  67. $('div.action-buttons').append(
  68. '<div class="btn btn-danger" id="RTCXdayscrash" style="float:right"><i class="fa fa-exclamation-triangle"></i>Crash</div>'
  69. );
  70.  
  71. $('input[name="closure_endDate"]').datepicker('remove');
  72. $('input[name="closure_endDate"]').datepicker({ format: 'yyyy-mm-dd', todayHighlight: true, autoclose: true });
  73. }
  74.  
  75. function timeAndRelativeDimensionInSpace() {
  76. var newdate = new Date();
  77. if ($('input[name="closure_startDate"]').val() !== '') {
  78. var p = $('input[name="closure_startDate"]').val().split('-');
  79. var y = Number(p[0]);
  80. var m = Number(p[1]);
  81. var d = Number(p[2]);
  82. if (!Number.isInteger(y) || isNaN(y) || !Number.isInteger(m) || isNaN(m) || !Number.isInteger(d) || isNaN(d)) {
  83. $('#RTCimprovXdaysmsg').text('Start date is invalid');
  84. return;
  85. }
  86. newdate = new Date(y, m - 1, d);
  87. }
  88. var v = Number($('#expireinXdays').val());
  89. if (!Number.isInteger(v) || isNaN(v)) {
  90. $('#RTCimprovXdaysmsg').text('Not a valid integer');
  91. return;
  92. }
  93.  
  94. if (v === 0) {
  95. $('#RTCimprovXdaysmsg').text('');
  96. return;
  97. }
  98.  
  99. if (v < 0) {
  100. $('#RTCimprovXdaysmsg').text('Cannot be negative');
  101. return;
  102. }
  103.  
  104. $('#RTCimprovXdaysmsg').text('');
  105. newdate.setDate(newdate.getDate() + v);
  106. $('input[name="closure_endDate"]').datepicker('update', newdate);
  107. if ($('input[name="closure_endTime"]').val() === '')
  108. $('input[name="closure_endTime"]').timepicker('setTime', '05:00');
  109. }
  110.  
  111. function ohNoes() {
  112. $('input[name="closure_reason"]').val('Crash');
  113. var delay = Number(localStorage.getItem('RTCimprovcrashmins'));
  114. if (!Number.isInteger(delay) || isNaN(delay))
  115. delay = 120;
  116.  
  117. var cur = new Date();
  118. cur.setMinutes(cur.getMinutes() + delay);
  119. $('input[name="closure_endDate"]').datepicker('update', cur);
  120. $('input[name="closure_endTime"]').timepicker('setTime', (('0' + cur.getHours()).slice(-2)) + ':' + (('0' + cur.getMinutes()).slice(-2)));
  121. }
  122.  
  123. function thisIsWhatYouWanted() {
  124. var v;
  125. if (firstrun) {
  126. v = localStorage.getItem('RTCimprovcrashmins');
  127. firstrun = false;
  128. }
  129. else
  130. v = $('input#RTCimprovcrashdays').val();
  131.  
  132. v = Number(v);
  133. if (isNaN(Number(v)) || !Number.isInteger(v)) {
  134. localStorage.removeItem('RTCimprovcrashmins');
  135. $('#RTCimprovprefsmsg').css('color', 'green').text('Default: 2 hrs');
  136. return;
  137. }
  138. if (v === 0) {
  139. localStorage.removeItem('RTCimprovcrashmins');
  140. $('#RTCimprovprefsmsg').css('color', 'green').text('Default: 2 hrs');
  141. return;
  142. }
  143. if (!Number.isInteger(v) || isNaN(v)) {
  144. localStorage.removeItem('RTCimprovcrashmins');
  145. $('#RTCimprovprefsmsg').css('color', 'red').text('Not an integer! You should fix that.');
  146. return;
  147. }
  148. if (v < 0) {
  149. localStorage.removeItem('RTCimprovcrashmins');
  150. $('#RTCimprovprefsmsg').css('color', 'red').text('Can\'t have a negative number, silly.');
  151. return;
  152. }
  153. if (v > 259200) {
  154. localStorage.removeItem('RTCimprovcrashmins');
  155. $('#RTCimprovprefsmsg').css('color', 'red').text('Can\'t be set more than 180 days in the future.');
  156. return;
  157. }
  158. localStorage.setItem('RTCimprovcrashmins', v);
  159. $('input#RTCimprovcrashdays').val(v);
  160. var min = v % 60;
  161. var hrso = (v - min) / 60;
  162. var hrsf = hrso % 24;
  163. var days = (hrso - hrsf) / 24;
  164. var ms = min !== 1 ? 'mins' : 'min';
  165. var hs = hrsf !== 1 ? 'hrs' : 'hr';
  166. var ds = days !== 1 ? 'days' : 'day';
  167. $('#RTCimprovprefsmsg').css('color', 'green').text(days + ' ' + ds + ', ' + hrsf + ' ' + hs + ', ' + min + ' ' + ms);
  168. }