WME Requests

Opens the Requests module with precompiled fields to submit an request

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

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