Greasy Fork 还支持 简体中文。

WME Requests

Opens the Requests module with precompiled fields to submit an request

目前為 2015-11-10 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name WME Requests
  3. // @namespace https://greasyfork.org/ru/scripts/5085-wme-requests
  4. // @description Opens the Requests module with precompiled fields to submit an request
  5. // @include https://*.waze.com/editor/*
  6. // @include https://*.waze.com/*/editor/*
  7. // @include https://*.waze.com/map-editor/*
  8. // @include https://*.waze.com/beta_editor/*
  9. // @grant none
  10. // @author skirda
  11. // @version 1.14.0
  12. // ==/UserScript==
  13.  
  14. var wmer_Version = '1.14.0';
  15.  
  16.  
  17. var CL=new Array(
  18. {
  19. c:'Russia',
  20. f:'https://docs.google.com/forms/d/1ck0cCIV6vPy16YQZJvfmM0clOdAE2Z-kDsXn06ZwQ1s/viewform',
  21. d:'https://docs.google.com/spreadsheets/d/1ddcW8EmNjojJp7EQ4AYPdfBqNWe28WqRaQ_RtkB8JAU',
  22. l:'https://script.google.com/macros/s/AKfycbzqA15-fy4g4StdRUmnuMj9z6rJ56gQPjCYpgCMni7h/exec',
  23. fr:'https://docs.google.com/forms/d/1QzvF3-lH8MuuEaSw0GA6LgLW62EiSHzQXBmG5-rQdIQ/viewform',
  24. dr:'https://docs.google.com/spreadsheet/ccc?key=0AtcEFFDNcic4dEE2UFh5X0lDdlRZbno3YVFYUkg0Unc'
  25. },
  26. {
  27. c:'Belarus',
  28. f:'https://docs.google.com/forms/d/1a7g7ONWOIHfxr8ZEXKxRXUkIxFF7xFb-2uX4LlydWXo/viewform',
  29. d:'https://docs.google.com/spreadsheets/d/1uuRY8ib5h_8xMfpzgXG2N78foMtftUNkPzJxP56mDXI',
  30. l:'https://script.google.com/macros/s/AKfycbz8_xLefn_06nLRsfwnupviEEStCXfttg777KryBMnD/exec',
  31. fr:'https://docs.google.com/forms/d/1a9wXzngDV_KGoYZC65X_-xAUfcyA7vgftaEBC9aHAMM/viewform',
  32. dr:'https://docs.google.com/spreadsheets/d/1gge9vlSuDrxkzH0ubiRGcx3VOawYA-Hub7EZzP94siI'
  33. }
  34. );
  35.  
  36. // через солько дней вернуть лок обратно
  37. var wmer_CountDays = 5;
  38. var wmer_UserCache = new Array();
  39. var wmer_LanguageRU = false;
  40. var wmer_MousePos = '';
  41.  
  42. function wmer_bootstrap()
  43. {
  44. wmer_LanguageRU=window.location.href.indexOf("/ru/") > 0?true:false;
  45.  
  46. if (typeof unsafeWindow === "undefined") {
  47. unsafeWindow = ( function () {
  48. var dummyElem = document.createElement('p');
  49. dummyElem.setAttribute('onclick', 'return window;');
  50. return dummyElem.onclick();
  51. }) ();
  52. }
  53.  
  54. /* begin running the code! */
  55. wmer_Init();
  56. }
  57.  
  58. function wmer_getUsername()
  59. {
  60. var thisUser = Waze.loginManager.user;
  61. if (thisUser === null)
  62. {
  63. alert(wmer_LanguageRU?'Невозможно получить имя текущего пользователя':'Nobody\'s logged in.');
  64. return "";
  65. }
  66. return Waze.loginManager.user.userName;
  67. }
  68.  
  69. function timeConverter(UNIX_timestamp)
  70. {
  71. var datetime = new Date();
  72. var mEpoch = parseInt(UNIX_timestamp);
  73. if (mEpoch<10000000000) mEpoch *= 1000;
  74. datetime.setTime(mEpoch)
  75. // !!! UTC !!!
  76. return datetime.getUTCFullYear()+"-"+('0' + (datetime.getUTCMonth() + 1)).slice(-2)+"-"+('0' + datetime.getUTCDate()).slice(-2)+"+"+('0' + datetime.getUTCHours()).slice(-2) + ':' + ('0' + datetime.getUTCMinutes()).slice(-2)
  77.  
  78. }
  79.  
  80. function wmer_getCCSD(segment){ // BUBBUB!!! need use "hasOwnProperty" or "in"
  81. console.log('WME Requests v.' + wmer_Version + ': ' + 'start wmer_getCCSD');
  82.  
  83. var oID="";
  84. var streetName="";
  85. var cityName="";
  86. var countryName="";
  87. var description="";
  88. var typeName= "";
  89. var cityID="";
  90. var userID="";
  91. var forumUserID="";
  92. var userName="";
  93. var updatedOn="";
  94.  
  95. try {
  96. typeName=segment.type;
  97. /*
  98. "segment"
  99. "venue"
  100. "node"
  101. "camera" typeName: "Speed camera"
  102. */
  103. oID=segment.fid;
  104. var attributesObj=segment.attributes;
  105. updatedOn=attributesObj.updatedOn;
  106.  
  107. if (attributesObj.hasOwnProperty('primaryStreetID'))
  108. {
  109. //Waze.model.streets.get(Waze.selectionManager.selectedItems[0].model.attributes.primaryStreetID).cityID
  110. console.log('WME Requests v.' + wmer_Version + ': ' + 'found street');
  111. var sID=attributesObj.primaryStreetID;
  112. var streetsObj = wazeModel.streets.get(sID);
  113. cityID=streetsObj.cityID;
  114. streetName=streetsObj.name;
  115. }
  116. else if (typeName === "camera")
  117. {
  118. //Waze.selectionManager.selectedItems[0].model.model.cities.additionalInfo[0].id
  119. console.log('WME Requests v.' + wmer_Version + ': ' + 'found camera');
  120. streetName=segment.typeName;
  121. description="\rSpeed: "+attributesObj.speed+"\rValidated: "+attributesObj.validated + "\rAzymuth: "+attributesObj.azymuth+"\rType: "+attributesObj.type;
  122. cityID=segment.model.cities.additionalInfo[0].id;
  123. if (cityID == null)
  124. cityID="";
  125. }
  126. else if (typeName === "node")
  127. {
  128. //Waze.selectionManager.selectedItems[0].model.segments.topCityID
  129. console.log('WME Requests v.' + wmer_Version + ': ' + 'found node');
  130. cityID=''+segment.model.segments.topCityID;
  131.  
  132. if (cityID == null)
  133. cityID="";
  134. description="count segment(s)="+attributesObj.segIDs.length;
  135. }
  136. else // "venue"
  137. {
  138. console.log('WME Requests v.' + wmer_Version + ': ' + 'found POI ('+typeName+')');
  139. //Waze.model.streets.get(Waze.selectionManager.selectedItems[0].attributes.streetID).cityID
  140. var sID=attributesObj.streetID;
  141. if (sID == null)
  142. cityID="";
  143. else
  144. cityID=wazeModel.streets.get(sID).cityID;
  145.  
  146. if (sID == null)
  147. cityID="";
  148.  
  149. if (typeof Waze.selectionManager.selectedItems[0].attributes.categories === "undefined")
  150. {
  151. console.log('WME Requests v.' + wmer_Version + ': ' + 'categories=undefined');
  152. console.log('WME Requests v.' + wmer_Version + ': ' + 'attributesObj.description='+attributesObj.description);
  153.  
  154. }
  155. else
  156. {
  157. description='\rCategories: '+Waze.selectionManager.selectedItems[0].attributes.categories.join(';') + '.\r' + attributesObj.description;
  158. if (Waze.selectionManager.selectedItems[0].attributes.categories.indexOf("GAS_STATION") != -1) // Gas Station
  159. {
  160. typeName="gas station"
  161. description="Brand: "+attributesObj.brand + "\rAddress: " + attributesObj.address + "\nDescription: " + attributesObj.description
  162. }
  163. }
  164. streetName=attributesObj.name;
  165. }
  166.  
  167. if (!(typeName === "camera" || typeName === "node" || cityID === "")) // BUGBUG!!!
  168. {
  169. console.log('WME Requests v.' + wmer_Version + ': cityID=' + cityID);
  170. var cityObj=wazeModel.cities.get(cityID);
  171.  
  172. var countryID=cityObj.countryID;
  173. cityName=cityObj.name;
  174. var countriesObj=wazeModel.countries.get(countryID);
  175.  
  176. countryName = countriesObj.name;
  177. }
  178.  
  179. if (!(typeName === "node"))
  180. {
  181. userID=attributesObj.updatedBy;
  182. if (userID == null)
  183. userID=attributesObj.createdBy;
  184.  
  185. if (userID==-1 || userID == null)
  186. {
  187. userID=attributesObj.createdBy;
  188. if (userID==-1)
  189. {
  190. console.log('WME Requests v.' + wmer_Version + ': ' + 'Do not PM Admin!');
  191. }
  192. }
  193.  
  194. userName=wazeModel.users.get(userID).userName;
  195. console.log('WME Requests v.' + wmer_Version + ': ' + 'userName='+userName);
  196. }
  197. else
  198. userID="-1";
  199. console.log('WME Requests v.' + wmer_Version + ': ' + 'userID=' +userID);
  200.  
  201. }
  202. catch (err) {
  203. console.log('WME Requests v.' + wmer_Version + ': error['+err.columnNumber+','+err.lineNumber+']: ' +err.name);
  204. }
  205.  
  206. console.log('WME Requests v.' + wmer_Version + ': ' + 'return from wmer_getCCSD');
  207. return {
  208. objid : oID,
  209. type : typeName,
  210. street : streetName,
  211. city : cityName,
  212. cityID : cityID,
  213. country : countryName,
  214. description : description,
  215. username : userName,
  216. userID : userID,
  217. forumuserID : forumUserID,
  218. updatedOn : updatedOn
  219. };
  220. }
  221.  
  222.  
  223. function wmer_userRank(segment)
  224. {
  225. var usrRank = 0;
  226. if (segment.attributes.lockRank)
  227. {
  228. var updatedBy = wazeModel.users.get(segment.attributes.updatedBy);
  229. return updatedBy != null ? updatedBy.rank : 0;
  230. }
  231. return 0;
  232. }
  233.  
  234. //It returns the maximum lock level
  235. function wmer_GetLevel() {
  236. //attributes.rank dovrebbe essere il road rank
  237. var sel = Waze.selectionManager.selectedItems;
  238. var maxR = wmer_userRank(sel[0]);
  239. for (i = 1; i < sel.length; i++)
  240. {
  241. if (maxR == 5)
  242. {
  243. return 6;
  244. }
  245. var usrRank = wmer_userRank(sel[i]);
  246. if (usrRank > maxR) {
  247. maxR = usrRank;
  248. }
  249. }
  250. return maxR + 1;
  251. }
  252.  
  253. function click_WMERequest() {
  254. console.log('WME Requests v.' + wmer_Version + ': ' + 'click_WMERequest()::Action: '+this.id);
  255. if (typeof Waze.selectionManager === "undefined")
  256. {
  257. console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found');
  258. return;
  259. }
  260. if (Waze.selectionManager.selectedItems.length == 0)
  261. {
  262. alert(wmer_LanguageRU?'Нет выделенных объектов':'No selected segments.');
  263. return;
  264. }
  265. if (Waze.selectionManager.selectedItems.length < 2 && this.id == 'wmerBtn_join')
  266. {
  267. alert(wmer_LanguageRU?'Вы должны выделить 2 сегмента':'You must select 2 segments.');
  268. return;
  269. }
  270.  
  271. var username = wmer_getUsername();
  272. var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[0].model);
  273. //console.dir(sccObj)
  274.  
  275. var lockLevel = wmer_GetLevel();
  276. if (lockLevel == 1 && this.id == 'wmerBtn_lock')
  277. {
  278. alert(wmer_LanguageRU?'Выбранные сегменты уже разблокированы':'Selected segments are already unlocked');
  279. return;
  280. }
  281.  
  282. console.log('WME Requests v.' + wmer_Version + ': ' + 'My level: '+Waze.loginManager.user.normalizedLevel);
  283. console.log('WME Requests v.' + wmer_Version + ': ' + 'Lock level: '+lockLevel);
  284.  
  285. if (lockLevel <= Waze.loginManager.user.normalizedLevel && this.id == 'wmerBtn_lock') {
  286. alert(wmer_LanguageRU?'Выбранные сегменты имеют доступный вам уровень блокировки':'Selected segments have a lock level that is less or equal to yours')
  287. return;
  288. }
  289.  
  290. var description='type: ' + sccObj.type + '\r' +
  291. 'country: '+ sccObj.country + '\r' +
  292. 'city: ' + sccObj.city + '\r' +
  293. 'street/name: ' + sccObj.street + '\r' +
  294. 'description: ' + sccObj.description;
  295.  
  296. description = description.replace(/%/g, '%25');
  297. description = description.replace(/\+/g, '%2B'); // +
  298. description = description.replace(' ', '%20'); // ' '
  299. description = description.replace(/\r\n/g, '\r'); // '\r\n'
  300. description = description.replace(/\r/g, '%0A'); // '\n'
  301. description = description.replace(/&/g, '%26');
  302. description = description.replace(/</g, '%3C');
  303. description = description.replace(/\>/g, '%3E');
  304. description = description.replace(/\?/g, '%3F');
  305. description = description.replace(/=/g, '%3D');
  306.  
  307. var permalink = wmer_generate_permalink();
  308. console.log('WME Requests v.' + wmer_Version + ': ' + 'permalink=' + permalink);
  309. permalink = permalink.replace(/%/g, '%25'); //???
  310. permalink = permalink.replace(/&/g, '%26');
  311. permalink = permalink.replace(/\?/g, '%3F');
  312. permalink = permalink.replace(/=/g, '%3D');
  313. permalink = permalink.replace(/</g, '%3C');
  314. permalink = permalink.replace(/\>/g, '%3E');
  315. //You can get entry numbers in google stylesheet: "Answers->Get precompiled URL"
  316. var curDate=new Date();
  317. curDate.setDate(curDate.getDate() + wmer_CountDays);
  318.  
  319. var action="";
  320. switch(this.id)
  321. {
  322. case 'wmerBtn_lock':
  323. action='lock';
  324. break;
  325. case 'wmerBtn_join':
  326. action='join';
  327. break;
  328. case 'wmerBtn_dir':
  329. action='direction';
  330. break;
  331. case 'wmerBtn_turn':
  332. action='turn';
  333. break;
  334. case 'wmerBtn_closures':
  335. action='closures';
  336. break;
  337.  
  338. }
  339.  
  340. function zero2(d){
  341. if((""+d).length == 1)
  342. d="0" + "" + d;
  343. return d;
  344. }
  345.  
  346. var idCL=(sccObj.country=='Russia'?0:(sccObj.country=='Belarus'?1:-1));
  347. if(idCL == -1)
  348. {
  349. console.log('WME Requests v.' + wmer_Version + ': idCL = ' +idCL + ', sccObj.countryName='+sccObj.country);
  350. return;
  351. }
  352.  
  353. var WMERequestEmail=localStorage.getItem("WMERequestEmail");
  354. if (!WMERequestEmail)
  355. WMERequestEmail=""
  356. // localStorage.setItem('WMERequestEmail', 'МЫЛО');
  357.  
  358. // !!!
  359. var url = CL[idCL].fr +
  360. '?entry.1230839078=' + username +
  361. '&entry.390417455=' + permalink +
  362. '&entry.1224334113=' + lockLevel +
  363. '&entry.1508498769=' + sccObj.country +
  364. '&entry.1856604039=' + action +
  365. '&entry.259824358=' + description +
  366. '&entry.1797072526=' + WMERequestEmail +
  367. '&entry.571885954='+curDate.getFullYear()+'-'+zero2(curDate.getMonth()+1)+'-'+zero2(curDate.getDate()) +
  368. '';
  369.  
  370. // CL: always zoom = 4
  371. var urlCL = CL[idCL].f +
  372. '?entry.1109766685=' + username +
  373. '&entry.1785513403=' + WMERequestEmail +
  374. '&entry.1300384005=' + permalink.replace(/zoom\%3D([0-9]+)\%26/,"zoom%3D4%26") +
  375. '';
  376.  
  377. var urlL5 = CL[idCL].l +
  378. '?p1=' + sccObj.username +
  379. '&p2=' + sccObj.city +
  380. '&p3=' + permalink +
  381. '&p4=' + timeConverter(sccObj.updatedOn) +
  382. '&p5=' + sccObj.cityID +
  383. '';
  384.  
  385. if(this.id == 'wmerA_cl')
  386. {
  387. if(sccObj.city == null || sccObj.city == '')
  388. {
  389. alert(wmer_LanguageRU?"Внимание! Имя НП пустое. Сохранение не возможно.":"Attention! The name of the city is empty. Saving is not possible.")
  390. return;
  391. }
  392. }
  393.  
  394. window.open(this.id == 'wmerBtn_cl'?urlCL:(this.id == 'wmerA_cl'?urlL5:url), '_blank');
  395. }
  396.  
  397. function wmer_generate_permalink() {
  398. var wcp=document.getElementsByClassName('WazeControlPermalink');
  399. for(var i=0; i < wcp.length; ++i)
  400. for (var j=0; j < wcp[i].getElementsByTagName('a').length;++j)
  401. {
  402. var href=wcp[i].getElementsByTagName('a')[j].href;
  403. if (href.indexOf(".waze.com/") > 0 && href.indexOf("/editor") > 0)
  404. {
  405. // kill "/ru/", kill "layers"
  406. href=href.replace("/ru/","/").replace(/layers=([0-9]+)\&/,"");
  407. console.log('WME Requests v.' + wmer_Version + ': ' + 'href=' + href);
  408. return href;
  409. }
  410. }
  411. return "";
  412. }
  413.  
  414.  
  415. function wmer_insertButton(z)
  416. {
  417. console.log('WME Requests v.' + wmer_Version + ': ' + 'wmer_insertButton()');
  418. /*{
  419. var permalink=wmer_generate_permalink();
  420. var p = document.getElementsByClassName('WazeControlMousePosition')[0].lastChild.innerHTML.split(' ');
  421. permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+p[1]).replace(/&lon=([0-9\.]+)/g, '&lon='+p[0]);
  422. }*/
  423.  
  424. if(document.getElementById('WME.Request_' + wmer_Version) != null)
  425. document.getElementById('WME.Request_' + wmer_Version).setAttribute('style', 'display:'+(Waze.selectionManager && Waze.selectionManager.selectedItems.length == 0?'none':'')+';');
  426.  
  427. if(Waze.selectionManager.selectedItems.length == 0)
  428. return;
  429.  
  430. var editPanelID='';
  431. var disabled=false;
  432. var disabledjoin=false;
  433. var disabledLock=false;
  434. var disabledPM=false;
  435.  
  436. if (document.getElementById('segment-edit-general') != null)
  437. {
  438. editPanelID='segment-edit-general';
  439. disabled=false;
  440. disabledjoin=false;
  441. disabledLock=false;
  442. }
  443. else if (document.getElementById('landmark-edit-general') != null)
  444. {
  445. editPanelID='landmark-edit-general';
  446. disabledLock=false;
  447. disabledjoin=true;
  448. disabled=true;
  449. }
  450. else if (document.getElementById('node-edit-general') != null)
  451. {
  452. editPanelID='node-edit-general';
  453. disabled=true;
  454. disabledjoin=true;
  455. disabledPM=true;
  456. disabledLock=true;
  457. }
  458. else if (document.getElementById('edit-panel') != null)
  459. {
  460. editPanelID='edit-panel';
  461. disabled=true;
  462. disabledjoin=true;
  463. disabledLock=true;
  464. }
  465.  
  466. var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[0].model);
  467. //console.dir(sccObj)
  468. console.log('WME Requests v.' + wmer_Version + ': sccObj.cityID=' + sccObj.cityID + ', sccObj.country='+sccObj.country);
  469. var idCL=(sccObj.country=='Russia'?0:(sccObj.country=='Belarus'?1:-1));
  470. if(idCL == -1)
  471. {
  472. console.log('WME Requests v.' + wmer_Version + ': idCL = ' +idCL + ', sccObj.country='+sccObj.country);
  473. idCL=0;
  474. }
  475.  
  476. if(document.getElementById('WME.Request_' + wmer_Version) == null)
  477. {
  478.  
  479. srsCtrl = document.createElement('section');
  480. srsCtrl.id = 'WME.Request_' + wmer_Version;
  481.  
  482. var padding="padding:5px 9px"
  483. srsCtrl.innerHTML = /*'<hr>'+*/
  484. '<a href="' + CL[idCL].dr + '" target="_gdocRequest" title="' + sccObj.country + '">Requests:</a> '+
  485. '(<a href="https://www.waze.com/forum/viewtopic.php?p=662218#p662218" title="WME Requests ' + wmer_Version + '" style="font-size: 10px" target="_blank">?</a>)&nbsp;/&nbsp;'+
  486. '<a href="' + CL[idCL].d + '" target="_gdocRequest" title="' + sccObj.country + '">CityLock:</a> '+
  487. '(<a href="https://www.waze.com/forum/viewtopic.php?f=787&t=105793" title="City Lock ' + wmer_Version + '" style="font-size: 10px" target="_blank">?</a>)'+
  488. '</br>'+
  489. '<button id="wmerBtn_lock" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  490. (wmer_LanguageRU?'Отправить запрос на изменение уровня блокировки объектов':'Send a request to lock/unlock segment(s)')+
  491. '"><i class="icon-unlock"></i>&nbsp;Lock</button>&nbsp;' +
  492. '<button id="wmerBtn_join" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  493. (wmer_LanguageRU?'Отправить запрос на присоединение сегментов':'Send a request to join several segments')+
  494. '"><i class="icon-cogs"></i>&nbsp;Join</button>&nbsp;' +
  495. '<button id="wmerBtn_dir" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  496. (wmer_LanguageRU?'Отправить запрос на изменение направления движения сегментов':'Send a request to change the direction of segment(s)')+
  497. '"><i class="icon-random"></i>&nbsp;Dir</button>&nbsp;' +
  498. '<button id="wmerBtn_turn" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  499. (wmer_LanguageRU?'Отправить запрос на изменение разрешения поворотов':'Send a request to change the turn restriction.')+
  500. '"><i class="icon-arrows-alt">&#xf047;</i>&nbsp;Turn</button>&nbsp;' +
  501. '<button id="wmerBtn_closures" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  502. (wmer_LanguageRU?'Отправить запрос на изменение перекрытие сегментов':'Send a request to change the Real Time Closures.')+
  503. '"><i class="icon-calendar"></i>&nbsp;Closures</button><br>' +
  504. '<button id="wmerBtn_pm" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  505. (wmer_LanguageRU?'Отправить приватное сообщение в форум авторам выделенных объектов':'Send (in forum) a Private Message to the author of the segment')+
  506. '"><i class="icon-envelope"></i>&nbsp;PM</button>&nbsp;' +
  507. '<button id="wmerBtn_cl" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  508. (wmer_LanguageRU?'Отправить запрос на изменение наименования населенного пункта':'Send a request to CityLock')+
  509. '"><i class="icon-home"></i>&nbsp;City</button>' +
  510. '</br><span id="wmerCityID"></span>'+
  511. '</br><span id="wmerLatLon"></span>'+
  512. '<hr>';
  513. //http://www.earthtools.org/sun/51.65500265464235/39.18297673378902/22/1/99/0
  514. document.getElementById(editPanelID).appendChild(srsCtrl);
  515.  
  516. document.getElementById('wmerBtn_lock').onclick = click_WMERequest;
  517. document.getElementById('wmerBtn_dir').onclick = click_WMERequest;
  518. document.getElementById('wmerBtn_turn').onclick = click_WMERequest;
  519. document.getElementById('wmerBtn_closures').onclick = click_WMERequest;
  520. document.getElementById('wmerBtn_join').onclick = click_WMERequest;
  521. document.getElementById('wmerBtn_pm').onclick = click_submitPMForm;
  522. document.getElementById('wmerBtn_cl').onclick = click_WMERequest;
  523.  
  524. var permalink=wmer_generate_permalink();
  525. //var p = document.getElementsByClassName('WazeControlMousePosition')[0].innerHTML.replace(' ', '').split(',');
  526. var p = document.getElementsByClassName('WazeControlMousePosition')[0].lastChild.innerHTML.split(' ');
  527. permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+p[1]).replace(/&lon=([0-9\.]+)/g, '&lon='+p[0]);
  528. /*
  529. if (typeof Waze.selectionManager.selectedItems[0].geometry.x !== "undefined")
  530. {
  531. // корректировка пермалинка для камеры, жанкшина и Place (point)
  532. var urPos=new OpenLayers.LonLat(Waze.selectionManager.selectedItems[0].geometry.x,Waze.selectionManager.selectedItems[0].geometry.y);
  533. urPos.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326")); // {lon, lat}
  534. permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+urPos.lat).replace(/&lon=([0-9\.]+)/g, '&lon='+urPos.lon);
  535. }
  536. */
  537. //document.getElementById('wmerCityID').innerHTML='<small><a href="'+permalink+'">cityID: '+sccObj.cityID+'</a></small>';
  538. document.getElementById('wmerCityID').innerHTML='<small>cityID: '+sccObj.cityID+'</small>';
  539. if(Waze.loginManager.user.rank >= 4)
  540. {
  541. document.getElementById('wmerCityID').innerHTML+='&nbsp;(<small><a style="cursor: pointer" title="Save the name of the new city in the Google Table" id="wmerA_cl">save</a></small>)';
  542. document.getElementById('wmerA_cl').onclick = click_WMERequest;
  543. }
  544.  
  545. //document.getElementById('wmerLatLon').innerHTML='<small>'+p[0]+','+p[1]+'</a></small>';
  546.  
  547. console.log('WME Requests v.' + wmer_Version + ': ' + 'initialised');
  548.  
  549. }
  550.  
  551. if(document.getElementById('WME.Request_' + wmer_Version) != null)
  552. {
  553. document.getElementById('wmerBtn_lock').disabled=disabledLock;
  554. document.getElementById('wmerBtn_dir').disabled=disabled;
  555. document.getElementById('wmerBtn_turn').disabled=disabled;
  556. document.getElementById('wmerBtn_closures').disabled=disabled;
  557. document.getElementById('wmerBtn_join').disabled=disabled;
  558. document.getElementById('wmerBtn_pm').disabled=disabledPM;
  559. document.getElementById('wmerBtn_cl').disabled=disabled;
  560. }
  561. }
  562.  
  563.  
  564. // <WME Fancy permalink> - http://userscripts.org/users/548866
  565. function getId(node) {
  566. return document.getElementById(node);
  567. }
  568.  
  569. function getForumUserIdFromID(wmeUserID)
  570. {
  571. console.log('WME Requests v.' + wmer_Version + ': ' + 'call getForumUserIdFromID(' + wmeUserID + ')');
  572. var userName=wazeModel.users.get(wmeUserID);
  573. console.dir(userName);
  574. return (getForumUserIdFromName(userName.userName));
  575. }
  576.  
  577. function getForumUserIdFromName(userName)
  578. {
  579. console.log('WME Requests v.' + wmer_Version + ': ' + 'call getForumUserIdFromName(' + userName + ')');
  580. var forumID=-1;
  581. var forumIDs=new Array();
  582.  
  583. if (userName.indexOf('/')!=-1)
  584. {
  585. var userNames=userName.split('/');
  586. for (var i=0; i<userNames.length; i++)
  587. {
  588. forumID=getForumUserIdFromName(userNames[i]);
  589. forumIDs[i]=forumID[0];
  590. }
  591. return forumIDs;
  592. }
  593.  
  594. console.log('WME Requests v.' + wmer_Version + ': ' + 'looking for ' + userName + ' in the forum.');
  595.  
  596. var xhr3_object;
  597.  
  598. if(window.XMLHttpRequest) // Firefox & Chrome
  599. xhr3_object = new XMLHttpRequest();
  600. else if(window.ActiveXObject) // Internet Explorer
  601. xhr3_object = new ActiveXObject("Microsoft.XMLHTTP");
  602.  
  603. xhr3_object.open("GET", "https://www.waze.com/forum/memberlist.php?username=" + userName, false);
  604.  
  605. xhr3_object.onreadystatechange = function() {
  606. if(xhr3_object.readyState == 4)
  607. {
  608. var test = xhr3_object.responseText.match(/u=([0-9]+)"/g);
  609. if (test==null)
  610. {
  611. console.log('WME Requests v.' + wmer_Version + ': ' + 'Forum return null');
  612. return(-1); // no match
  613. }
  614. if (test.length>1)
  615. {
  616. console.log('WME Requests v.' + wmer_Version + ': ' + 'Forum return multiple match:');
  617. console.dir(test);
  618. return(-2); // multiple match
  619. }
  620. forumID=test[0].substring(2, test[0].length-1);
  621. }
  622. };
  623.  
  624. console.dir(xhr3_object);
  625.  
  626. try {
  627. xhr3_object.send(null);
  628. }
  629. catch (err) {
  630. console.log('WME Requests v.' + wmer_Version + ': ' + 'XMLHttpRequest error: ' +err.name);
  631. console.dir(err);
  632. return(-3);
  633. }
  634. forumIDs[0]=forumID;
  635. return (forumIDs);
  636. }
  637.  
  638. function click_submitPMForm()
  639. {
  640. console.log('WME Requests v.' + wmer_Version + ': ' + 'click_submitPMForm() start');
  641. if (typeof Waze.selectionManager === "undefined")
  642. {
  643. console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found');
  644. return;
  645. }
  646.  
  647. if (Waze.selectionManager.selectedItems.length == 0)
  648. {
  649. alert(wmer_LanguageRU?'Сначала необходимо выделить сегмент':'Please, select one segment before');
  650. return false;
  651. }
  652.  
  653. //-------------
  654. var sccObjs=new Array();
  655. for (var i=0; i < Waze.selectionManager.selectedItems.length; ++i)
  656. {
  657. var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[i].model);
  658. if (sccObj.userID==-1)
  659. {
  660. console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - Do not PM Admin!');
  661. alert("Can't PM admin!");
  662. return false;
  663. }
  664.  
  665. var j;
  666. for (j=0; j < wmer_UserCache.length; j+=2)
  667. {
  668. if (wmer_UserCache[j] === sccObj.userID)
  669. {
  670. sccObj.forumuserID=wmer_UserCache[j+1];
  671. console.log('WME Requests v.' + wmer_Version + ': ' + 'found ['+j+']'+wmer_UserCache[j+1]);
  672. break;
  673. }
  674. }
  675.  
  676. if (sccObj.forumuserID == "")
  677. {
  678. console.log('WME Requests v.' + wmer_Version + ': ' + 'not found '+sccObj.userID);
  679. sccObj.forumuserID=getForumUserIdFromID(sccObj.userID);
  680. wmer_UserCache.push(sccObj.userID,sccObj.forumuserID);
  681. }
  682.  
  683. sccObjs.push(sccObj);
  684. }
  685.  
  686. var forumIDs=new Array();
  687. for (var i=0; i < sccObjs.length; ++i)
  688. forumIDs[i]=sccObjs[i].forumuserID;
  689. //-------------
  690.  
  691. if (forumIDs.length==1 && forumIDs[0]==-1)
  692. {
  693. console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - User never logged to the forum...');
  694. alert(wmer_LanguageRU?'Автор сегмента не найден на форуме':'Sorry: unable to find the user in the forum');
  695. return false;
  696. }
  697. if (forumIDs.length==1 && forumIDs[0]==-2)
  698. {
  699. console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - Several users match name. Should never happen :s');
  700. alert(wmer_LanguageRU?'Найдено более одного пользователя\nОтправьте сообщение самостоятельно.':'Sorry: more than one user found in the forum.\nYou should look for him/her by yourself.');
  701. return false;
  702. }
  703. if (forumIDs.length==1 && forumIDs[0]==-3)
  704. {
  705. console.log('WME Requests v.' + wmer_Version + ': ' + 'A network error occurred.');
  706. alert(wmer_LanguageRU?'Сетевые проблемы\nОтправьте сообщение самостоятельно.':'Sorry: a network error occurred.\nYou should look for him/her by yourself.');
  707. return false;
  708. }
  709.  
  710. console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - all OK. go to PM!');
  711.  
  712. var formID="WMER-PM-FORM";
  713.  
  714. var nodePM;
  715.  
  716. if (getId("WMER-PM-Send") == null)
  717. {
  718. nodePM= document.createElement('div');
  719. nodePM.id = 'WMER-PM-Send';
  720. nodePM.style.display='hidden';
  721. getId('WME.Request_' + wmer_Version).appendChild(nodePM);
  722. }
  723. else
  724. {
  725. nodePM=getId("WMER-PM-Send");
  726. }
  727.  
  728. var PMForm;
  729. PMForm='<form id="' + formID + '" target="_blank" method="post" style="display: inline">';
  730. PMForm+='<input id="' + formID + '-subject" type="hidden" name="subject" value="" />';
  731. PMForm+='<input type="hidden" name="addbbcode20" value="100" />';
  732. PMForm+='<input id="' + formID + '-message" type="hidden" name="message" value="" />';
  733. PMForm+='<input type="hidden" name="preview" value="Preview" />';
  734. PMForm+='<input type="hidden" name="attach_sig" value="on" />';
  735. PMForm+='<input id="' + formID + '-ct" type="hidden" name="creation_time" value="0" />';
  736. PMForm+='<input id="' + formID + '-lc" type="hidden" name="lastclick" value="0" />';
  737. for (var i=0; i<forumIDs.length; i++)
  738. {
  739. PMForm+='<input type="hidden" name="address_list[u]['+forumIDs[i]+']" value="to" />';
  740. }
  741. PMForm+='</form>';
  742. nodePM.innerHTML=PMForm;
  743.  
  744. var permalink=wmer_generate_permalink();
  745. linkParts=permalink.replace(/#/g, "").split('&');
  746. for (var j=0; j<linkParts.length; j++)
  747. {
  748. if (linkParts[j].indexOf("segments=")==0)
  749. {
  750. linkParts.splice (j,1);
  751. break;
  752. }
  753. }
  754. //console.dir(linkParts);
  755.  
  756. var message=wmer_LanguageRU?
  757. 'Есть вопросы по вашим правкам в [url=' + permalink + ']этой области редактирования[/url]:\n\n':
  758. 'Some questions about [url=' + permalink + ']this area[/url]:\n\n';
  759.  
  760. permalink=linkParts.join('&');
  761.  
  762. for (var i=0; i < sccObjs.length; ++i)
  763. {
  764. message += '[b]2' + sccObjs[i].username + '[/b]: '+
  765. sccObjs[i].type+' ('+
  766. '[url=' + permalink + '&segments=' + sccObjs[i].objid + ']'+
  767. (sccObjs[i].country === ''?'':'country: [b]'+sccObjs[i].country+'[/b]/')+
  768. (sccObjs[i].city === ''?'':'city: [b]'+sccObjs[i].city+'[/b]/')+
  769. 'name: [b]'+(sccObjs[i].street==null?'<<noname>>':sccObjs[i].street)+'[/b]'+
  770. (sccObjs[i].description === ''?'':'/description: [b]'+sccObjs[i].description+'[/b]') +
  771. '[/url])\n\n';
  772. }
  773. //console.log('WME Requests v.' + wmer_Version + ': ' + message);
  774.  
  775. getId(formID + '-message').value=message;
  776. var now=new Date().getTime();
  777. now /= 1000;
  778. now = Math.floor(now);
  779. getId(formID + '-ct').value=now;
  780. getId(formID + '-lc').value=now;
  781.  
  782. getId(formID).action="https://www.waze.com/forum/ucp.php?i=pm&mode=compose&action=post";
  783. getId(formID + '-subject').value=
  784. wmer_LanguageRU?
  785. '[WME Request] Уточнение по вашим правкам.':
  786. '[WME Request] Question about your map edits';
  787.  
  788. //console.dir(getId(formID));
  789.  
  790. getId(formID).submit();
  791. return true; // this forces to open in new tab!
  792. }
  793. // </WME Fancy permalink>
  794.  
  795.  
  796. function wmer_WazeBits()
  797. {
  798. if (typeof Waze === "undefined")
  799. Waze=unsafeWindow.Waze;
  800.  
  801. if (typeof Waze === "undefined")
  802. Waze=window.Waze;
  803. }
  804.  
  805. function wmer_FakeLoad()
  806. {
  807. wmer_WazeBits();
  808.  
  809. if (typeof Waze === "undefined")
  810. {
  811. console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze not found, retrying in 500ms...');
  812. setTimeout(wmer_FakeLoad,500);
  813. return;
  814. }
  815. if (typeof Waze.selectionManager === "undefined")
  816. {
  817. console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found, retrying in 500ms...');
  818. setTimeout(wmer_FakeLoad,500);
  819. return;
  820. }
  821. if (typeof Waze.model === "undefined")
  822. {
  823. console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.model not found, retrying in 500ms...');
  824. setTimeout(wmer_FakeLoad,500);
  825. return;
  826. }
  827.  
  828. wazeModel = Waze.model;
  829.  
  830. try {
  831. Waze.selectionManager.events.register("selectionchanged", null, wmer_insertButton);
  832. console.log('WME Requests v.' + wmer_Version + ': ' + 'added event handler for selectionchanged');
  833. }
  834. catch (err) {
  835. console.log('WME Requests v.' + wmer_Version + ': ' + 'added event handler error: ' +err.name);
  836. }
  837. }
  838.  
  839. function wmer_Init() {
  840. console.log('WME Requests v.' + wmer_Version + ': ' + 'init');
  841. setTimeout(wmer_FakeLoad, 500);
  842. }
  843.  
  844. wmer_bootstrap();