WME Requests

Opens the Requests module with precompiled fields to submit an request

当前为 2014-09-17 提交的版本,查看 最新版本

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