WME Requests

Opens the Requests module with precompiled fields to submit an request

当前为 2016-05-20 提交的版本,查看 最新版本

  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 2.4.1
  12. // ==/UserScript==
  13.  
  14. var wmer_Version = '2.4.1';
  15.  
  16. var CL=new Array(
  17. {
  18. c:'Russia',
  19. // Запрос на добавление населенного пункта
  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. // WME Request (ответы)
  24. fr:'https://docs.google.com/forms/d/1QzvF3-lH8MuuEaSw0GA6LgLW62EiSHzQXBmG5-rQdIQ/viewform',
  25. dr:'https://docs.google.com/spreadsheet/ccc?key=0AtcEFFDNcic4dEE2UFh5X0lDdlRZbno3YVFYUkg0Unc'
  26. },
  27. {
  28. c:'Belarus',
  29. // Запрос на добавление населенного пункта
  30. f:'https://docs.google.com/forms/d/1a7g7ONWOIHfxr8ZEXKxRXUkIxFF7xFb-2uX4LlydWXo/viewform',
  31. d:'https://docs.google.com/spreadsheets/d/1uuRY8ib5h_8xMfpzgXG2N78foMtftUNkPzJxP56mDXI',
  32. l:'https://script.google.com/macros/s/AKfycbz8_xLefn_06nLRsfwnupviEEStCXfttg777KryBMnD/exec',
  33. // WME Request (ответы)
  34. fr:'https://docs.google.com/forms/d/1a9wXzngDV_KGoYZC65X_-xAUfcyA7vgftaEBC9aHAMM/viewform',
  35. dr:'https://docs.google.com/spreadsheets/d/1gge9vlSuDrxkzH0ubiRGcx3VOawYA-Hub7EZzP94siI'
  36. },
  37. {
  38. c:'Uzbekistan',
  39. // Запрос на добавление населенного пункта
  40. f:'https://docs.google.com/forms/d/1wr3Bjkm1SKbThThdZ0ea80iriuoX9JJ4xRvutXcPGws/viewform', //
  41. d:'https://docs.google.com/spreadsheets/d/1sjniZzrQT5ygaZaMUzXKeoPFweASF7S7QPebNrHLo0Y', //
  42. l:'https://script.google.com/macros/s/AKfycbwKbjrauFor_XH4woPWrW9mkqvYCGzGXFoi6saWync/exec', //
  43. // WME Request (ответы)
  44. fr:'https://docs.google.com/forms/d/12oEAxVdrQZPUwHWK2AxKH0pIQwzG9UagRO0_ehRoaa4/viewform', //
  45. dr:'https://docs.google.com/spreadsheets/d/1wDYm7BKOpktL7MACucV-p94n-6M4HuyJy8HGntbumY4' //
  46. },
  47. {
  48. c:'Kazakhstan',
  49. // Запрос на добавление населенного пункта
  50. f:'https://docs.google.com/forms/d/1zdqseCwkJqxkmb7w9geTcKI-VKA5dNl-QKvuIw1rObg/viewform',//
  51. d:'https://docs.google.com/spreadsheets/d/1rmmxyNOh7zSYU0U9v0nN0yx8ZOW9Vr83YepmC3vt8ms', //
  52. l:'https://script.google.com/macros/s/AKfycbyvmneTt9c8HuwuDevm5tGB8vBvkL9lHu9Bl_JWrNo/exec', //
  53. // WME Request (ответы)
  54. fr:'https://docs.google.com/forms/d/1Ap4i0pSbBc7OKfggSao8XmirjdlxQWIBEVQ1Cq1WYyQ/viewform', //
  55. dr:'https://docs.google.com/spreadsheets/d/1Vl1sXOCRK4eTCihfHJPB5oI2nDu9g7cVIu0gpcxI0-g' //
  56. }
  57.  
  58. );
  59.  
  60. // через солько дней вернуть лок обратно
  61. var wmer_CountDays = 5;
  62. var wmer_UserCache = new Array();
  63. var wmer_LanguageRU = false;
  64. var wmer_Debug = false;
  65. var wmer_MousePos = '';
  66.  
  67. function wmer_bootstrap()
  68. {
  69. wmer_LanguageRU=I18n.locale === "ru"?true:false;
  70.  
  71. var WMELanguageRU=localStorage.getItem("WMELanguageRU");
  72. if (WMELanguageRU)
  73. wmer_LanguageRU=WMELanguageRU === "1"?true:false;
  74. // localStorage.setItem('WMELanguageRU', '1');
  75.  
  76. wmer_Debug=localStorage.getItem("wmer_Debug");
  77. if (wmer_Debug && (wmer_Debug === "true" || wmer_Debug === "1"))
  78. wmer_Debug=true;
  79. // localStorage.setItem('wmer_Debug', '1');
  80.  
  81. wmer_Init();
  82. }
  83.  
  84. /* helper function */
  85. function getElementsByClassName(classname, node) {
  86. if(!node)
  87. node = document.getElementsByTagName("body")[0];
  88. var a = [];
  89. var re = new RegExp('\\b' + classname + '\\b');
  90. var els = node.getElementsByTagName("*");
  91. for (var i=0,j=els.length; i<j; i++)
  92. if (re.test(els[i].className)) a.push(els[i]);
  93. return a;
  94. }
  95.  
  96.  
  97. function wmer_getUsername()
  98. {
  99. var thisUser = Waze.loginManager.user;
  100. if (thisUser === null)
  101. {
  102. alert(wmer_LanguageRU?'Невозможно получить имя текущего пользователя':'Nobody\'s logged in.');
  103. return "";
  104. }
  105. return Waze.loginManager.user.userName;
  106. }
  107.  
  108. function timeConverter(UNIX_timestamp)
  109. {
  110. var datetime = new Date();
  111. var mEpoch = parseInt(UNIX_timestamp);
  112. if (mEpoch<10000000000) mEpoch *= 1000;
  113. datetime.setTime(mEpoch)
  114. // !!! UTC !!!
  115. return datetime.getUTCFullYear()+"-"+('0' + (datetime.getUTCMonth() + 1)).slice(-2)+"-"+('0' + datetime.getUTCDate()).slice(-2)+"+"+('0' + datetime.getUTCHours()).slice(-2) + ':' + ('0' + datetime.getUTCMinutes()).slice(-2)
  116.  
  117. }
  118.  
  119. function wmer_getCCSD(segment){ // BUBBUB!!! need use "hasOwnProperty" or "in"
  120. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'start wmer_getCCSD');
  121.  
  122. var oID="";
  123. var streetName="";
  124. var cityName="";
  125. var countryName="";
  126. var description="";
  127. var typeName= "";
  128. var cityID="";
  129. var userID="";
  130. var forumUserID="";
  131. var userName="";
  132. var updatedOn="";
  133. var poiaddress="";
  134.  
  135. try {
  136. typeName=segment.type;
  137. /*
  138. "segment"
  139. "venue"
  140. "node"
  141. "camera" typeName: "Speed camera"
  142. "bigJunction"
  143. */
  144. oID=segment.attributes.id;
  145. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': oID=' + oID);
  146.  
  147. if(segment.attributes.hasOwnProperty('updatedOn'))
  148. updatedOn=segment.attributes.updatedOn;
  149. else
  150. updatedOn=segment.attributes.createdOn;
  151.  
  152. if (segment.attributes.hasOwnProperty('primaryStreetID'))
  153. {
  154. //Waze.model.streets.get(Waze.selectionManager.selectedItems[0].model.attributes.primaryStreetID).cityID
  155. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'found street');
  156. var sID=segment.attributes.primaryStreetID;
  157. if (sID)
  158. {
  159. var streetsObj = Waze.model.streets.get(sID);
  160. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'typeof streetsObj='+(typeof streetsObj));
  161. if (typeof streetsObj !== "undefined")
  162. {
  163. cityID=streetsObj.cityID;
  164. streetName=streetsObj.name;
  165. }
  166. }
  167. }
  168. else if (typeName === "camera")
  169. {
  170. //Waze.selectionManager.selectedItems[0].model.model.cities.additionalInfo[0].id
  171. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'found camera');
  172. streetName=segment.typeName;
  173. description= "\n "+(wmer_LanguageRU?'Скорость':'Speed')+": "+segment.attributes.speed
  174. +"\n "+(wmer_LanguageRU?'Подтверждено':'Approved')+": "+segment.attributes.validated
  175. +"\n "+(wmer_LanguageRU?'Тип':'Type')+": "+I18n.translations[wmer_LanguageRU?"ru":window.I18n.currentLocale()].edit.camera.fields.type[segment.attributes.type];
  176. // +"\n "+(wmer_LanguageRU?'Азимут':'Azymuth')+": "+segment.attributes.azymuth
  177. //if(segment.attributes.hasOwnProperty('updatedOn'))
  178. cityID=segment.model.cities.additionalInfo[0].id;
  179. if (cityID == null)
  180. cityID="";
  181. }
  182. else if (typeName === "node")
  183. {
  184. //Waze.selectionManager.selectedItems[0].model.segments.topCityID
  185. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'found node');
  186. cityID=''+segment.model.segments.topCityID;
  187.  
  188. if (cityID == null)
  189. cityID="";
  190. description="\n count segment(s)="+segment.attributes.segIDs.length;
  191. }
  192. else if(typeName === "bigJunction")
  193. {
  194. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'found bigJunction');
  195. cityID=''+segment.model.segments.topCityID;
  196. if (cityID == null)
  197. cityID="";
  198. description="\n count segment(s)="+segment.attributes.segIDs.length;
  199. }
  200. else // "venue"
  201. {
  202. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'found POI ('+typeName+')');
  203. //Waze.model.streets.get(Waze.selectionManager.selectedItems[0].attributes.streetID).cityID
  204. var sID=segment.attributes.streetID;
  205. if (sID == null)
  206. cityID="";
  207. else
  208. cityID=Waze.model.streets.get(sID).cityID;
  209.  
  210. if (sID == null)
  211. cityID="";
  212.  
  213. if (typeof Waze.selectionManager.selectedItems[0].model.attributes.categories === "undefined")
  214. {
  215. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'categories=undefined');
  216. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'segment.attributes.description='+segment.attributes.description);
  217.  
  218. }
  219. else
  220. {
  221. var vcats=segment.attributes.categories;
  222. var arrvcats=[]
  223. for(var i=0; i < vcats.length; ++i)
  224. {
  225. //if(wmer_Debug) console.log("segment.attributes.categories["+i+"]='"+segment.attributes.categories[i]+"'")
  226. arrvcats.push(window.I18n.translations[wmer_LanguageRU?"ru":window.I18n.currentLocale()].venues.categories[vcats[i]])
  227. //if(wmer_Debug) console.log("segment.attributes.categories["+i+"]='"+segment.attributes.categories[i]+"'")
  228. }
  229. description='\n '+(wmer_LanguageRU?'Категории':'Categories')+': '+(arrvcats.length > 0?arrvcats.join(';')+'.':'')+'\n ' + segment.attributes.description;
  230. //if(wmer_Debug) console.log(description)
  231. arrvcats=[];
  232.  
  233.  
  234. if (segment.attributes.categories.indexOf("GAS_STATION") != -1) // Gas Station
  235. {
  236. typeName="gas_station"
  237. description="\n "+(wmer_LanguageRU?'Брэнд':'Brand')+": "+segment.attributes.brand
  238. + "\n "+(wmer_LanguageRU?'Адрес':'Address')+": " + segment.attributes.address
  239. + "\n "+(wmer_LanguageRU?'Описание':'Description')+": " + segment.attributes.description;
  240. }
  241. }
  242.  
  243. if(segment.attributes.hasOwnProperty('streetID'))
  244. poiaddress+=Waze.model.streets.get(segment.attributes.streetID).name
  245. if(segment.attributes.hasOwnProperty('houseNumber'))
  246. {
  247. if(poiaddress.length > 0)
  248. poiaddress+= " "
  249. poiaddress+=segment.attributes.houseNumber
  250. }
  251. streetName=segment.attributes.name;
  252. }
  253.  
  254. if (!(/*typeName === "camera" || */typeName === "node" || cityID === "")) // BUGBUG!!!
  255. {
  256. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': cityID=' + cityID);
  257. var cityObj=Waze.model.cities.get(cityID);
  258. if (typeof cityObj !== "undefined")
  259. {
  260. var countryID=cityObj.countryID;
  261. cityName=cityObj.name;
  262. var countriesObj=Waze.model.countries.get(countryID);
  263. if (typeof countriesObj !== "undefined")
  264. countryName = countriesObj.name;
  265. }
  266. }
  267.  
  268. if (!(typeName === "node"))
  269. {
  270. userID=segment.attributes.updatedBy;
  271. if (userID == null)
  272. userID=segment.attributes.createdBy;
  273.  
  274. if (userID==-1 || userID == null)
  275. {
  276. userID=segment.attributes.createdBy;
  277. if (userID==-1)
  278. {
  279. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Do not PM Admin!');
  280. }
  281. }
  282.  
  283. userName=Waze.model.users.get(userID).userName;
  284. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'userName='+userName);
  285. }
  286. else
  287. userID="-1";
  288.  
  289. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'userID=' +userID);
  290.  
  291. }
  292. catch (err) {
  293. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': error['+err.columnNumber+','+err.lineNumber+']: ' +err.name);
  294. }
  295.  
  296. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'return from wmer_getCCSD');
  297. return {
  298. objid : oID,
  299. type : typeName,
  300. street : streetName,
  301. city : cityName,
  302. cityID : cityID,
  303. country : countryName,
  304. description : description,
  305. username : userName,
  306. userID : userID,
  307. forumuserID : forumUserID,
  308. updatedOn : updatedOn,
  309. poiaddress : poiaddress
  310. };
  311. }
  312.  
  313.  
  314. function wmer_userRank(segment)
  315. {
  316. var usrRank = 0;
  317. /*
  318. if (segment.attributes.lockRank)
  319. {
  320. var updatedBy = Waze.model.users.get(segment.attributes.updatedBy);
  321. return updatedBy != null ? updatedBy.rank : 0;
  322. }
  323. return 0;
  324. */
  325. if (Waze.selectionManager.selectedItems[0].model.attributes.hasOwnProperty('lockRank'))
  326. return segment.attributes.lockRank;
  327. else
  328. return 0;
  329. }
  330.  
  331. //It returns the maximum lock level
  332. function wmer_GetLevel() {
  333. //attributes.rank dovrebbe essere il road rank
  334. var sel = Waze.selectionManager.selectedItems;
  335. var maxR = wmer_userRank(sel[0].model);
  336.  
  337. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'wmer_GetLevel() maxR='+maxR);
  338. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'wmer_GetLevel() sel.length='+sel.length);
  339.  
  340. for (i = 1; i < sel.length; i++)
  341. {
  342. if (maxR == 5)
  343. {
  344. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'wmer_GetLevel() return 6');
  345. return 6;
  346. }
  347. var usrRank = wmer_userRank(sel[i].model);
  348. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'wmer_GetLevel() usrRank='+usrRank);
  349. if (usrRank > maxR) {
  350. maxR = usrRank;
  351. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'wmer_GetLevel() '+maxR);
  352. }
  353. }
  354. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'wmer_GetLevel() return [maxR + 1] = '+(maxR + 1));
  355. return maxR + 1;
  356. }
  357.  
  358. // получить данные имени НП у OSM
  359. function WmeR_GetCityFromOSM(ll,zoom)
  360. {
  361. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'WmeR_GetCityFromOSM([lat='+ll.lat+',lon='+ll.lon+'],'+zoom+')');
  362. var cityName='';
  363. var country_code='';
  364. zoom += 7;
  365. var url = 'https://nominatim.openstreetmap.org/reverse';
  366. var data = {
  367. "lat": ll.lat,
  368. "lon": ll.lon,
  369. "zoom": zoom,
  370. "format": "json",
  371. "addressdetails": 1,
  372. "countrycodes": "ru",
  373. "accept-language": "Ru_ru"
  374. };
  375.  
  376. $.ajax({
  377. dataType: "json",
  378. cache: false,
  379. url: url,
  380. async: false,
  381. data: data,
  382. error: function() {
  383. },
  384. success: function(json) {
  385. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'WmeR_GetCityFromOSM(): json='+json);
  386. if (json.display_name !== undefined) {
  387. var li = '';
  388. if(wmer_Debug) console.dir(json);
  389. // json.address.country_code
  390. // json.address.state
  391. // json.address.region
  392. // json.address.city_district
  393. // json.address.suburb
  394. if (json.address.country_code !== undefined) {
  395. country_code=json.address.country_code;
  396. }
  397.  
  398. if (json.address.city !== undefined) {
  399. li = json.address.city;
  400. }
  401. else if (json.address.town !== undefined) {
  402. li = json.address.town;
  403. }
  404. else if (json.address.village !== undefined) {
  405. li = json.address.village;
  406. }
  407. else if (json.address.hamlet !== undefined) {
  408. li = json.address.hamlet;
  409. }
  410.  
  411. if (li.length > 0 && json.address.county !== undefined) {
  412. li += " (" + json.address.county;
  413. //if (json.address.state !== undefined) {li += " / " + json.address.state; }
  414. li += ")";
  415. }
  416.  
  417. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'WmeR_GetCityFromOSM(): li='+li);
  418.  
  419. //$('#topbar-container .topbar .location-info-region .alt-location-info').html(alispan);
  420. cityName=li;
  421. }
  422. }
  423. });
  424.  
  425. return {cityName:cityName,country_code:country_code};
  426. }
  427.  
  428. function click_WMERequest() {
  429. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'click_WMERequest()::Action: '+this.id);
  430. if (typeof Waze.selectionManager === "undefined")
  431. {
  432. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found');
  433. return;
  434. }
  435. if (Waze.selectionManager.selectedItems.length == 0)
  436. {
  437. alert(wmer_LanguageRU?'Нет выделенных объектов':'No selected segments.');
  438. return;
  439. }
  440. if (Waze.selectionManager.selectedItems.length < 2 && this.id == 'wmerBtn_join')
  441. {
  442. alert(wmer_LanguageRU?'Вы должны выделить 2 сегмента':'You must select 2 segments.');
  443. return;
  444. }
  445.  
  446. var username = wmer_getUsername();
  447. var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[0].model);
  448. if(wmer_Debug) console.dir(sccObj)
  449.  
  450. var lockLevel = wmer_GetLevel();
  451. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'lockLevel= '+lockLevel);
  452. if (lockLevel == 1 && this.id == 'wmerBtn_lock')
  453. {
  454. alert(wmer_LanguageRU?'Выбранные сегменты уже разблокированы':'Selected segments are already unlocked');
  455. return;
  456. }
  457.  
  458. var normalizedLevel=Waze.loginManager.user.normalizedLevel;
  459. //normalizedLevel=2;
  460. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'My level: '+normalizedLevel);
  461. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Lock level: '+lockLevel);
  462.  
  463. if (lockLevel <= normalizedLevel && this.id == 'wmerBtn_lock') {
  464. alert(wmer_LanguageRU?'Выбранные сегменты имеют доступный вам уровень блокировки':'Selected segments have a lock level that is less or equal to yours')
  465. return;
  466. }
  467.  
  468. lockLevel=normalizedLevel;
  469.  
  470. var description='type: ' + sccObj.type + '\r' +
  471. 'country: '+ sccObj.country + '\r' +
  472. 'city: ' + sccObj.city + '\r' +
  473. 'street/name: ' + sccObj.street + '\r' +
  474. 'description: ' + sccObj.description;
  475.  
  476. description = description.replace(/%/g, '%25');
  477. description = description.replace(/\+/g, '%2B'); // +
  478. description = description.replace(' ', '%20'); // ' '
  479. description = description.replace(/\r\n/g, '\r'); // '\r\n'
  480. description = description.replace(/\r/g, '%0A'); // '\n'
  481. description = description.replace(/&/g, '%26');
  482. description = description.replace(/</g, '%3C');
  483. description = description.replace(/\>/g, '%3E');
  484. description = description.replace(/\?/g, '%3F');
  485. description = description.replace(/=/g, '%3D');
  486.  
  487. var permalink = wmer_generate_permalink();
  488.  
  489. // попытка центрировать...
  490. var urPos=new OpenLayers.LonLat(
  491. Waze.selectionManager.selectedItems[0].geometry.bounds.left+(Waze.selectionManager.selectedItems[0].geometry.bounds.right-Waze.selectionManager.selectedItems[0].geometry.bounds.left)/2,
  492. Waze.selectionManager.selectedItems[0].geometry.bounds.top-(Waze.selectionManager.selectedItems[0].geometry.bounds.top-Waze.selectionManager.selectedItems[0].geometry.bounds.bottom)/2
  493. );
  494. urPos.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326"));
  495.  
  496. var venues0='';
  497. if(getQueryString(permalink, 'venues') != -1)
  498. venues0="&venues=" + getQueryString(permalink, 'venues');
  499. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'venues0: '+venues0);
  500.  
  501. // https://www.waze.com/editor/?env=row&lon=36.11483&lat=53.96670&zoom=4&marker=yes
  502. var segments0='';
  503. if(getQueryString(permalink, 'segments') != -1)
  504. segments0="&segments=" + getQueryString(permalink, 'segments');
  505. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'segments0: '+segments0);
  506.  
  507.  
  508. var permalink5=permalink.split("&")[0] +
  509. "&zoom=" + parseInt(getQueryString(permalink, 'zoom')) +
  510. "&lon=" + urPos.lon +
  511. "&lat=" + urPos.lat +
  512. segments0 +
  513. venues0;
  514. var permalink50=permalink5;
  515.  
  516. function preparePermalink(s)
  517. {
  518. s = s.replace(/%/g, '%25'); //???
  519. s = s.replace(/&/g, '%26');
  520. s = s.replace(/\?/g, '%3F');
  521. s = s.replace(/=/g, '%3D');
  522. s = s.replace(/</g, '%3C');
  523. s = s.replace(/\>/g, '%3E');
  524. return s;
  525. }
  526.  
  527. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'permalink=' + permalink);
  528. permalink = preparePermalink(permalink);
  529. permalink5 = preparePermalink(permalink5);
  530.  
  531. //You can get entry numbers in google stylesheet: "Answers->Get precompiled URL"
  532. var curDate=new Date();
  533. curDate.setDate(curDate.getDate() + wmer_CountDays);
  534.  
  535. var action="";
  536. switch(this.id)
  537. {
  538. case 'wmerBtn_lock':
  539. action='lock';
  540. break;
  541. case 'wmerBtn_join':
  542. action='join';
  543. break;
  544. case 'wmerBtn_dir':
  545. action='direction';
  546. break;
  547. case 'wmerBtn_turn':
  548. action='turn';
  549. break;
  550. case 'wmerBtn_closures':
  551. action='closures';
  552. break;
  553.  
  554. }
  555.  
  556. function zero2(d){
  557. if((""+d).length == 1)
  558. d="0" + "" + d;
  559. return d;
  560. }
  561.  
  562. // для автозаполнения имени НП в форме
  563. var osmName=WmeR_GetCityFromOSM(urPos,parseInt(getQueryString(permalink50, 'zoom')));
  564.  
  565. if(sccObj.country === '')
  566. {
  567. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': sccObj.country=""; work with osmName!!!');
  568. switch(osmName.country_code)
  569. {
  570. case 'ru': sccObj.country='Russia'; break;
  571. case 'by': sccObj.country='Belarus'; break;
  572. case 'by': sccObj.country='Uzbekistan'; break;
  573. case 'uz': sccObj.country='Kazakhstan'; break;
  574. }
  575. }
  576.  
  577.  
  578. var idCL=(sccObj.country=='Russia'?0:(sccObj.country=='Belarus'?1:(sccObj.country=='Uzbekistan'?2:(sccObj.country=='Kazakhstan'?2:-1))));
  579. if(idCL == -1)
  580. {
  581. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': idCL = ' +idCL + ', sccObj.countryName='+sccObj.country);
  582. return;
  583. }
  584.  
  585. var WMERequestEmail=localStorage.getItem("WMERequestEmail");
  586. if (!WMERequestEmail)
  587. WMERequestEmail=""
  588. // localStorage.setItem('WMERequestEmail', 'МЫЛО');
  589.  
  590. // !!!
  591. var url = CL[idCL].fr +
  592. '?entry.1230839078=' + username +
  593. '&entry.390417455=' + permalink5 +
  594. '&entry.1224334113=' + lockLevel +
  595. '&entry.1508498769=' + sccObj.country +
  596. '&entry.1856604039=' + action +
  597. '&entry.259824358=' + description +
  598. '&entry.1797072526=' + WMERequestEmail +
  599. '&entry.571885954='+curDate.getFullYear()+'-'+zero2(curDate.getMonth()+1)+'-'+zero2(curDate.getDate()) +
  600. '';
  601.  
  602.  
  603. // CL: always zoom = 4
  604. var urlCL = CL[idCL].f +
  605. '?entry.1109766685=' + username +
  606. '&entry.1785513403=' + WMERequestEmail +
  607. '&entry.1300384005=' + permalink5.replace(/zoom\%3D([0-9]+)\%26/,"zoom%3D4%26") +
  608. '&entry.1967623256=' + osmName.cityName +
  609. '';
  610.  
  611. var urlL5 = CL[idCL].l +
  612. '?p1=' + sccObj.username +
  613. '&p2=' + sccObj.city +
  614. '&p3=' + permalink5 +
  615. '&p4=' + timeConverter(sccObj.updatedOn) +
  616. '&p5=' + sccObj.cityID +
  617. '';
  618.  
  619. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'urlL5=' + urlL5);
  620.  
  621. if(this.id == 'wmerA_cl')
  622. {
  623. if(sccObj.city == null || sccObj.city == '')
  624. {
  625. alert(wmer_LanguageRU?"Внимание! Имя НП пустое. Сохранение не возможно.":"Attention! The name of the city is empty. Saving is not possible.")
  626. return;
  627. }
  628. }
  629.  
  630. window.open(this.id == 'wmerBtn_cl'?urlCL:(this.id == 'wmerA_cl'?urlL5:url), '_blank');
  631. }
  632.  
  633. function getQueryString(link, name)
  634. {
  635. if (link.indexOf( name + '=' ) <= 0)
  636. return -1;
  637. var pos = link.indexOf( name + '=' ) + name.length + 1;
  638. var len = link.substr(pos).indexOf('&');
  639. return (len == -1)?link.substr(pos):link.substr(pos,len);
  640. }
  641.  
  642. function wmer_generate_permalink() {
  643. var wcp=document.getElementsByClassName('WazeControlPermalink');
  644. for(var i=0; i < wcp.length; ++i)
  645. for (var j=0; j < wcp[i].getElementsByTagName('a').length;++j)
  646. {
  647. var href=wcp[i].getElementsByTagName('a')[j].href;
  648. if (href.indexOf(".waze.com/") > 0 && href.indexOf("/editor") > 0)
  649. {
  650. // kill "/ru/", kill "layers"
  651. href=href.replace("/ru/","/").replace(/layers=([0-9]+)\&/,"") + "&marker=yes";
  652. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'href=' + href);
  653. return href;
  654. }
  655. }
  656. return "";
  657. }
  658.  
  659. function CreateID()
  660. {
  661. return 'WME-Request-' + wmer_Version.replace(/\./g,"-");
  662. }
  663.  
  664.  
  665. function wmer_insertButton(z)
  666. {
  667. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'wmer_insertButton()');
  668. /*{
  669. var permalink=wmer_generate_permalink();
  670. var p = document.getElementsByClassName('WazeControlMousePosition')[0].lastChild.innerHTML.split(' ');
  671. permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+p[1]).replace(/&lon=([0-9\.]+)/g, '&lon='+p[0]);
  672. }*/
  673.  
  674. // if(document.getElementById(CreateID()) != null)
  675. // document.getElementById(CreateID()).setAttribute('style', 'display:'+(Waze.selectionManager && Waze.selectionManager.selectedItems.length == 0?'none':'')+';');
  676.  
  677. if(Waze.selectionManager.selectedItems.length == 0)
  678. return;
  679.  
  680. //
  681. if (Waze.selectionManager.selectedItems.length > 0 && Waze.selectionManager.selectedItems[0].model.type === "venue")
  682. {
  683. var area_poi=document.getElementById('WME.PlaceNames-Square');
  684. if(!area_poi)
  685. {
  686. var wcp=document.getElementsByClassName('additional-attributes list-unstyled side-panel-section');
  687. if (wcp)
  688. {
  689. var li=document.createElement("LI");
  690. li.setAttribute('id', 'WME.PlaceNames-Square');
  691. wcp[0].appendChild(li);
  692. area_poi=document.getElementById('WME.PlaceNames-Square');
  693. }
  694. }
  695.  
  696. if(area_poi)
  697. {
  698. var v_id=Waze.selectionManager.selectedItems[0].model.attributes.id;
  699. if (typeof Waze.model.venues.get(v_id).geometry.getGeodesicArea === "undefined")
  700. area_poi.innerHTML="";
  701. else
  702. {
  703. var square=Waze.model.venues.get(v_id).geometry.getGeodesicArea(Waze.map.getProjectionObject());
  704. area_poi.style=(square < 650)?"color: red;":"color: black;";
  705. area_poi.innerHTML="Площадь: " + square.toFixed(2) + " м&#178;"
  706. }
  707. }
  708.  
  709. }
  710. //
  711.  
  712. var editPanelID='';
  713. var disabled=false;
  714. var disabledjoin=false;
  715. var disabledLock=false;
  716. var disabledPM=false;
  717.  
  718. if (document.getElementById('segment-edit-general') != null)
  719. {
  720. editPanelID='segment-edit-general';
  721. disabled=false;
  722. disabledjoin=false;
  723. disabledLock=false;
  724. }
  725. else if (document.getElementById('landmark-edit-general') != null)
  726. {
  727. editPanelID='landmark-edit-general';
  728. disabledLock=false;
  729. disabledjoin=true;
  730. disabled=true;
  731. }
  732. else if (document.getElementById('node-edit-general') != null)
  733. {
  734. editPanelID='node-edit-general';
  735. disabled=true;
  736. disabledjoin=true;
  737. disabledPM=true;
  738. disabledLock=true;
  739. }
  740. else if (document.getElementById('edit-panel') != null)
  741. {
  742. editPanelID='edit-panel';
  743. disabled=true;
  744. disabledjoin=true;
  745. disabledLock=true;
  746. }
  747.  
  748. var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[0].model);
  749. if(wmer_Debug) console.dir(sccObj)
  750.  
  751. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': sccObj.cityID=' + sccObj.cityID + ', sccObj.country='+sccObj.country);
  752. var idCL=(sccObj.country=='Russia'?0:(sccObj.country=='Belarus'?1:(sccObj.country=='Uzbekistan'?2:(sccObj.country=='Kazakhstan'?2:-1))));
  753. if(idCL == -1)
  754. {
  755. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': idCL = ' +idCL + ', sccObj.country='+sccObj.country);
  756. idCL=0;
  757. }
  758.  
  759. if(!document.getElementById(CreateID()))
  760. {
  761. // add new edit tab to left of the map
  762. var srsCtrl = document.createElement('div');
  763. srsCtrl.id = CreateID();
  764.  
  765. var padding="padding:5px 9px"
  766. srsCtrl.innerHTML = /*'<hr>'+*/
  767. '<div class="form-group">'+
  768. '<label class="control-label">' + (wmer_LanguageRU?'Запросы':'Requests') +' ' + wmer_Version + '</label>' +
  769. '<div class="controls">' +
  770. '<label><a href="' + CL[idCL].dr + '" target="_gdocRequest" title="' + sccObj.country + '">' + (wmer_LanguageRU?'Таблица':'Table') +'</a></label> | '+
  771. '<label><a href="https://www.waze.com/forum/viewtopic.php?p=662218#p662218" title="City Lock ' + wmer_Version + '" target="_blank">' + (wmer_LanguageRU?'О проекте':'About') +'</a></label></br>'+
  772. '<button id="wmerBtn_lock" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  773. (wmer_LanguageRU?'Отправить запрос на изменение уровня блокировки объектов':'Send a request to lock/unlock segment(s)')+
  774. '"><i class="fa fa-unlock"></i>&nbsp;Lock</button>&nbsp;' +
  775. '<button id="wmerBtn_join" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  776. (wmer_LanguageRU?'Отправить запрос на присоединение сегментов':'Send a request to join several segments')+
  777. '"><i class="fa fa-cogs"></i>&nbsp;Join</button>&nbsp;' +
  778. '<button id="wmerBtn_dir" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  779. (wmer_LanguageRU?'Отправить запрос на изменение направления движения сегментов':'Send a request to change the direction of segment(s)')+
  780. '"><i class="fa fa-random"></i>&nbsp;Dir</button>&nbsp;' +
  781. '<button id="wmerBtn_turn" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  782. (wmer_LanguageRU?'Отправить запрос на изменение разрешения поворотов':'Send a request to change the turn restriction.')+
  783. '"><i class="fa fa-arrows-alt"></i>&nbsp;Turn</button>&nbsp;' +
  784. '<button id="wmerBtn_closures" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  785. (wmer_LanguageRU?'Отправить запрос на изменение перекрытие сегментов':'Send a request to change the Real Time Closures.')+
  786. '"><i class="fa fa-calendar"></i>&nbsp;Closures</button>' +
  787. '</div></div>' +
  788.  
  789.  
  790. '<div class="form-group">'+
  791. '<label class="control-label">' + (wmer_LanguageRU?'CityLock':'CityLock') +'</label>' +
  792. '<div class="controls">' +
  793. '<label><a href="' + CL[idCL].d + '" target="_gdocRequest" title="' + sccObj.country + '">' + (wmer_LanguageRU?'Таблица':'Table') +'</a></label> | '+
  794. '<label><a href="https://www.waze.com/forum/viewtopic.php?f=787&t=105793" title="City Lock ' + wmer_Version + '" target="_blank">' + (wmer_LanguageRU?'О проекте':'About') +'</a></label></br>'+
  795. '<button id="wmerBtn_cl" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  796. (wmer_LanguageRU?'Отправить запрос на изменение наименования населенного пункта':'Send a request to CityLock')+
  797. '"><i class="fa fa-home"></i>&nbsp;City</button>&nbsp;<span id="wmerCitySave0"></span>' +
  798. '</br><label><span id="wmerCityID"></span></label>'+
  799. //'</br><label><span id="wmerLatLon"></span></label>'+
  800. '</div></div>' +
  801.  
  802. '<div class="form-group">'+
  803. '<label class="control-label">' + (wmer_LanguageRU?'Прочее':'Other') +'</label>' +
  804. '<div class="controls">' +
  805. '<button id="wmerBtn_pm" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  806. (wmer_LanguageRU?'Отправить приватное сообщение в форум авторам выделенных объектов':'Send (in forum) a Private Message to the author of the segment')+
  807. '"><li class="fa fa-envelope"></li>&nbsp;PM</button>'+
  808. '</div></div>' +
  809.  
  810. '<div class="form-group">' +
  811. '<label class="control-label">' + (wmer_LanguageRU?'Настройки':'Config') +'</label>' +
  812. '<div class="controls-container">' +
  813. '<input name="wmerEdt_lang" value="" id="wmerEdt_lang" type="checkbox"><label for="wmerEdt_lang" title="Принудительно использовать русскоязычный интерфейс для WME Request">Рускоязычный интерфейс</label>' +
  814. '<label>E-mail:' +
  815. '<input title="' + (wmer_LanguageRU?'Ваш e-mail адрес':'Your e-mail address') +'" type="text" class="form-control" autocomplete="off" id="wmerEdt_email" name="wmerEdt_email" value="" size="15"/></label><br>' +
  816. '<input name="wmerChk_debug" value="" id="wmerChk_debug" type="checkbox"><label for="wmerChk_debug" title="Включить логирование">&nbsp;Debug script</label><br>' +
  817. '</div></div>' +
  818. '';
  819.  
  820. // inject new tab
  821. var userTabs = getId('edit-panel');
  822. var navTabs = getElementsByClassName('nav-tabs', userTabs)[0];
  823. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': typeof navTabs=' + (typeof navTabs));
  824. if (typeof navTabs !== "undefined")
  825. {
  826. var tabContent = getElementsByClassName('tab-content', userTabs)[0];
  827.  
  828. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': typeof tabContent=' + (typeof tabContent));
  829. if (typeof tabContent !== "undefined")
  830. {
  831. newtab = document.createElement('li');
  832. newtab.innerHTML = '<a href="#' + CreateID() + '" id="pwmerequest" data-toggle="tab">'+(wmer_LanguageRU?'Запросы':'Requests')+'</a>';
  833. navTabs.appendChild(newtab);
  834.  
  835. //srsCtrl.id = "sidepanel-wmerequest";
  836. srsCtrl.className = "tab-pane";
  837. tabContent.appendChild(srsCtrl);
  838. }
  839. else
  840. srsCtrl.id='';
  841. }
  842. else
  843. srsCtrl.id='';
  844. //http://www.earthtools.org/sun/51.65500265464235/39.18297673378902/22/1/99/0
  845. //document.getElementById(editPanelID).appendChild(srsCtrl);
  846.  
  847. if(srsCtrl.id != '')
  848. {
  849. document.getElementById('wmerBtn_lock').onclick = click_WMERequest;
  850. document.getElementById('wmerBtn_dir').onclick = click_WMERequest;
  851. document.getElementById('wmerBtn_turn').onclick = click_WMERequest;
  852. document.getElementById('wmerBtn_closures').onclick = click_WMERequest;
  853. document.getElementById('wmerBtn_join').onclick = click_WMERequest;
  854. document.getElementById('wmerBtn_pm').onclick = click_submitPMForm;
  855. document.getElementById('wmerBtn_cl').onclick = click_WMERequest;
  856. }
  857.  
  858. //var permalink=wmer_generate_permalink();
  859. //var p = document.getElementsByClassName('WazeControlMousePosition')[0].innerHTML.replace(' ', '').split(',');
  860. //var p = document.getElementsByClassName('WazeControlMousePosition')[0].lastChild.innerHTML.split(' ');
  861. //permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+p[1]).replace(/&lon=([0-9\.]+)/g, '&lon='+p[0]);
  862. /*
  863. if (typeof Waze.selectionManager.selectedItems[0].geometry.x !== "undefined")
  864. {
  865. // корректировка пермалинка для камеры, жанкшина и Place (point)
  866. var urPos=new OpenLayers.LonLat(Waze.selectionManager.selectedItems[0].geometry.x,Waze.selectionManager.selectedItems[0].geometry.y);
  867. urPos.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326")); // {lon, lat}
  868. permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+urPos.lat).replace(/&lon=([0-9\.]+)/g, '&lon='+urPos.lon);
  869. }
  870. */
  871. //document.getElementById('wmerCityID').innerHTML='<small><a href="'+permalink+'">cityID: '+sccObj.cityID+'</a></small>';
  872. //document.getElementById('wmerCityID').innerHTML='<small>cityID: '+sccObj.cityID+'</small>';
  873. /*
  874. if(Waze.loginManager.user.rank >= 4)
  875. {
  876. 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>)';
  877. document.getElementById('wmerA_cl').onclick = click_WMERequest;
  878. }
  879. */
  880.  
  881. //document.getElementById('wmerLatLon').innerHTML='<small>'+p[0]+','+p[1]+'</a></small>';
  882.  
  883. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'initialised');
  884. }
  885.  
  886. if(document.getElementById(CreateID()) != null)
  887. {
  888. document.getElementById('wmerCityID').innerHTML='<small>cityID: '+sccObj.cityID+'</small>';
  889.  
  890. // config e-mail
  891. var WMERequestEmail=localStorage.getItem("WMERequestEmail");
  892. if (!WMERequestEmail)
  893. WMERequestEmail=""
  894. document.getElementById('wmerEdt_email').value=WMERequestEmail;
  895. document.getElementById('wmerEdt_email').onchange=function(){localStorage.setItem('WMERequestEmail', this.value);}
  896.  
  897. // config language
  898. var WMELanguageRU=localStorage.getItem("WMELanguageRU");
  899. if (WMELanguageRU)
  900. wmer_LanguageRU=WMELanguageRU === "1"?true:false;
  901. document.getElementById('wmerEdt_lang').checked=wmer_LanguageRU;
  902. document.getElementById('wmerEdt_lang').onchange=function(){localStorage.setItem('WMELanguageRU', this.checked?"1":"0");}
  903.  
  904. document.getElementById('wmerChk_debug').checked=wmer_Debug;
  905. document.getElementById('wmerChk_debug').onchange=function(){localStorage.setItem('wmer_Debug', this.checked?"1":"0");}
  906.  
  907.  
  908.  
  909. if(Waze.loginManager.user.rank >= 4 || (sccObj.country=='Belarus' && Waze.loginManager.user.rank >= 3)) // ??? Uzbekistan ???
  910. {
  911. document.getElementById('wmerCitySave0').innerHTML=
  912. '<button id="wmerA_cl" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  913. (wmer_LanguageRU?'Сохранить имя нового НП в Google-таблице':'Save the name of the new city in the Google Table')+
  914. '"><i class="fa fa-floppy-o"></i>&nbsp;Save</button>';
  915.  
  916. //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>)';
  917. document.getElementById('wmerA_cl').onclick = click_WMERequest;
  918. }
  919. }
  920.  
  921. if(document.getElementById(CreateID()) != null)
  922. {
  923. document.getElementById('wmerBtn_lock').disabled=disabledLock;
  924. document.getElementById('wmerBtn_dir').disabled=disabled;
  925. document.getElementById('wmerBtn_turn').disabled=disabled;
  926. document.getElementById('wmerBtn_closures').disabled=disabled;
  927. document.getElementById('wmerBtn_join').disabled=disabled;
  928. document.getElementById('wmerBtn_pm').disabled=disabledPM;
  929. document.getElementById('wmerBtn_cl').disabled=disabled;
  930. if(document.getElementById('wmerA_cl'))
  931. document.getElementById('wmerA_cl').disabled=disabled;
  932. }
  933. }
  934.  
  935.  
  936. // <WME Fancy permalink> - http://userscripts.org/users/548866
  937. function getId(node) {
  938. return document.getElementById(node);
  939. }
  940.  
  941. function getForumUserIdFromID(wmeUserID)
  942. {
  943. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'call getForumUserIdFromID(' + wmeUserID + ')');
  944. var userName=Waze.model.users.get(wmeUserID);
  945. if(wmer_Debug) console.dir(userName);
  946. return (getForumUserIdFromName(userName.userName));
  947. }
  948.  
  949. function getForumUserIdFromName(userName)
  950. {
  951. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'call getForumUserIdFromName(' + userName + ')');
  952. var forumID=-1;
  953. var forumIDs=new Array();
  954.  
  955. if (userName.indexOf('/')!=-1)
  956. {
  957. var userNames=userName.split('/');
  958. for (var i=0; i<userNames.length; i++)
  959. {
  960. forumID=getForumUserIdFromName(userNames[i]);
  961. forumIDs[i]=forumID[0];
  962. }
  963. return forumIDs;
  964. }
  965.  
  966. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'looking for ' + userName + ' in the forum.');
  967.  
  968. var xhr3_object;
  969.  
  970. if(window.XMLHttpRequest) // Firefox & Chrome
  971. xhr3_object = new XMLHttpRequest();
  972. else if(window.ActiveXObject) // Internet Explorer
  973. xhr3_object = new ActiveXObject("Microsoft.XMLHTTP");
  974.  
  975. xhr3_object.open("GET", "https://www.waze.com/forum/memberlist.php?username=" + userName, false);
  976.  
  977. xhr3_object.onreadystatechange = function() {
  978. if(xhr3_object.readyState == 4)
  979. {
  980. var test = xhr3_object.responseText.match(/u=([0-9]+)"/g);
  981. if (test==null)
  982. {
  983. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Forum return null');
  984. return(-1); // no match
  985. }
  986. if (test.length>1)
  987. {
  988. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Forum return multiple match:');
  989. if(wmer_Debug) console.dir(test);
  990. return(-2); // multiple match
  991. }
  992. forumID=test[0].substring(2, test[0].length-1);
  993. }
  994. };
  995.  
  996. if(wmer_Debug) console.dir(xhr3_object);
  997.  
  998. try {
  999. xhr3_object.send(null);
  1000. }
  1001. catch (err) {
  1002. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'XMLHttpRequest error: ' +err.name);
  1003. if(wmer_Debug) console.dir(err);
  1004. return(-3);
  1005. }
  1006. forumIDs[0]=forumID;
  1007. return (forumIDs);
  1008. }
  1009.  
  1010. function click_submitPMForm()
  1011. {
  1012. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'click_submitPMForm() start');
  1013. if (typeof Waze.selectionManager === "undefined")
  1014. {
  1015. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found');
  1016. return;
  1017. }
  1018.  
  1019. if (Waze.selectionManager.selectedItems.length == 0)
  1020. {
  1021. alert(wmer_LanguageRU?'Сначала необходимо выделить сегмент':'Please, select one segment before');
  1022. return false;
  1023. }
  1024.  
  1025. //-------------
  1026. var sccObjs=new Array();
  1027. for (var i=0; i < Waze.selectionManager.selectedItems.length; ++i)
  1028. {
  1029. var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[i].model);
  1030. if (sccObj.userID==-1)
  1031. {
  1032. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - Do not PM Admin!');
  1033. alert("Can't PM admin!");
  1034. return false;
  1035. }
  1036.  
  1037. var j;
  1038. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'sccObj.userID='+sccObj.userID);
  1039. for (j=0; j < wmer_UserCache.length; j+=2)
  1040. {
  1041. if (wmer_UserCache[j] === sccObj.userID)
  1042. {
  1043. sccObj.forumuserID=wmer_UserCache[j+1];
  1044. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'found ['+j+']'+wmer_UserCache[j+1]);
  1045. break;
  1046. }
  1047. }
  1048.  
  1049. if (sccObj.forumuserID == "")
  1050. {
  1051. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'not found '+sccObj.userID);
  1052. sccObj.forumuserID=getForumUserIdFromID(sccObj.userID);
  1053. wmer_UserCache.push(sccObj.userID,sccObj.forumuserID);
  1054. }
  1055.  
  1056. sccObjs.push(sccObj);
  1057. }
  1058.  
  1059. var forumIDs=new Array();
  1060. for (var i=0; i < sccObjs.length; ++i)
  1061. forumIDs[i]=sccObjs[i].forumuserID;
  1062. //-------------
  1063.  
  1064. if (forumIDs.length==1 && forumIDs[0]==-1)
  1065. {
  1066. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - User never logged to the forum...');
  1067. alert(wmer_LanguageRU?'Автор сегмента не найден на форуме':'Sorry: unable to find the user in the forum');
  1068. return false;
  1069. }
  1070. if (forumIDs.length==1 && forumIDs[0]==-2)
  1071. {
  1072. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - Several users match name. Should never happen :s');
  1073. alert(wmer_LanguageRU?'Найдено более одного пользователя\nОтправьте сообщение самостоятельно.':'Sorry: more than one user found in the forum.\nYou should look for him/her by yourself.');
  1074. return false;
  1075. }
  1076. if (forumIDs.length==1 && forumIDs[0]==-3)
  1077. {
  1078. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'A network error occurred.');
  1079. alert(wmer_LanguageRU?'Сетевые проблемы\nОтправьте сообщение самостоятельно.':'Sorry: a network error occurred.\nYou should look for him/her by yourself.');
  1080. return false;
  1081. }
  1082.  
  1083. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - all OK. go to PM!');
  1084.  
  1085. var formID="WMER-PM-FORM";
  1086.  
  1087. var nodePM;
  1088.  
  1089. if (getId("WMER-PM-Send") == null)
  1090. {
  1091. nodePM= document.createElement('div');
  1092. nodePM.id = 'WMER-PM-Send';
  1093. nodePM.style.display='hidden';
  1094. getId(CreateID()).appendChild(nodePM);
  1095. }
  1096. else
  1097. {
  1098. nodePM=getId("WMER-PM-Send");
  1099. }
  1100.  
  1101. var PMForm;
  1102. PMForm='<form id="' + formID + '" target="_blank" method="post" style="display: inline">';
  1103. PMForm+='<input id="' + formID + '-subject" type="hidden" name="subject" value="" />';
  1104. PMForm+='<input type="hidden" name="addbbcode20" value="100" />';
  1105. PMForm+='<input id="' + formID + '-message" type="hidden" name="message" value="" />';
  1106. PMForm+='<input type="hidden" name="preview" value="Preview" />';
  1107. PMForm+='<input type="hidden" name="attach_sig" value="on" />';
  1108. PMForm+='<input id="' + formID + '-ct" type="hidden" name="creation_time" value="0" />';
  1109. PMForm+='<input id="' + formID + '-lc" type="hidden" name="lastclick" value="0" />';
  1110. for (var i=0; i<forumIDs.length; i++)
  1111. {
  1112. PMForm+='<input type="hidden" name="address_list[u]['+forumIDs[i]+']" value="to" />';
  1113. }
  1114. PMForm+='</form>';
  1115. nodePM.innerHTML=PMForm;
  1116.  
  1117. var permalink=wmer_generate_permalink();
  1118. //if(wmer_Debug) console.log(permalink);
  1119. var name_object=""
  1120. linkParts=permalink.replace(/#/g, "").split('&');
  1121. for (var j=0; j<linkParts.length; j++)
  1122. {
  1123. if (linkParts[j].indexOf("segments=")==0 || linkParts[j].indexOf("venues=")==0 || linkParts[j].indexOf("cameras=")==0 || linkParts[j].indexOf("bigJunctions=")==0)
  1124. {
  1125. name_object=linkParts[j].split('=')[0]
  1126. linkParts.splice (j,1);
  1127. break;
  1128. }
  1129. }
  1130. permalink=linkParts.join('&');
  1131.  
  1132. if(wmer_Debug) console.dir(linkParts);
  1133.  
  1134. var message=wmer_LanguageRU?
  1135. 'Есть вопросы по правкам в [url=' + permalink + ']этой области редактирования[/url]:\n\n':
  1136. 'Some questions about [url=' + permalink + ']this area[/url]:\n\n';
  1137.  
  1138. function NullToEmpty(s)
  1139. {
  1140. return !s?"":s;
  1141. }
  1142. function GetTypeName(s)
  1143. {
  1144. if(wmer_LanguageRU)
  1145. {
  1146. switch(s)
  1147. {
  1148. case "segment": return "сегмент"
  1149. case "venue": return "ПОИ"
  1150. case "node": return "узел"
  1151. case "camera": return "камера"
  1152. case "bigJunction": return "развязка"
  1153. }
  1154. }
  1155. return s
  1156. //'+(wmer_LanguageRU?'Категории':'Categories')+'
  1157. }
  1158.  
  1159. for (var i=0; i < sccObjs.length; ++i)
  1160. {
  1161. var on=sccObjs[i].type === "segment"?(wmer_LanguageRU?'Улица':"Street"):(wmer_LanguageRU?'Название':"Name");
  1162. message += ''
  1163. + (wmer_LanguageRU?'Автор':'Author')+': [b]' + sccObjs[i].username + '[/b]\n'
  1164. + (wmer_LanguageRU?'Тип':'Type')+': [b]' + GetTypeName(sccObjs[i].type) + '[/b]\n'
  1165. + (sccObj.country=='Belarus'?'':(wmer_LanguageRU?'Страна':'Country')+': [b]' + sccObjs[i].country + '[/b]\n')
  1166. + (wmer_LanguageRU?'НП':'City')+': [b]' + NullToEmpty(sccObjs[i].city) + '[/b]\n'
  1167. + (sccObjs[i].poiaddress.length > 0?(wmer_LanguageRU?'Адрес':'Address')+': [b]'+sccObjs[i].poiaddress+'[/b]\n':'')
  1168. + on+ ': [b]' + NullToEmpty(sccObjs[i].street) + '[/b]\n'
  1169. + (wmer_LanguageRU?'Дата':'Date')+': [b]' + timeConverter(sccObjs[i].updatedOn).replace('+',' ') + '[/b]\n'
  1170. + (wmer_LanguageRU?'Ссылка':'Permalink')+': [url]' + permalink + '&' + name_object + '=' + sccObjs[i].objid + '[/url]\n'
  1171. + (wmer_LanguageRU?'Дополнительно':'Description')+': {' + NullToEmpty(sccObjs[i].description) + '\n}\n'
  1172. + '\n';
  1173. }
  1174. //if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + message);
  1175.  
  1176. getId(formID + '-message').value=message;
  1177. var now=new Date().getTime();
  1178. now /= 1000;
  1179. now = Math.floor(now);
  1180. getId(formID + '-ct').value=now;
  1181. getId(formID + '-lc').value=now;
  1182.  
  1183. getId(formID).action="https://www.waze.com/forum/ucp.php?i=pm&mode=compose&action=post";
  1184. getId(formID + '-subject').value=
  1185. wmer_LanguageRU?
  1186. '[WME Request] Уточнение по правкам':
  1187. '[WME Request] Question about map edits';
  1188.  
  1189. if(wmer_Debug) console.dir(getId(formID));
  1190.  
  1191. getId(formID).submit();
  1192. return true; // this forces to open in new tab!
  1193. }
  1194. // </WME Fancy permalink>
  1195.  
  1196.  
  1197. function wmer_WazeBits()
  1198. {
  1199. // if (typeof Waze === "undefined")
  1200. // Waze=unsafeWindow.Waze;
  1201.  
  1202. if (typeof Waze === "undefined")
  1203. Waze=window.Waze;
  1204. }
  1205.  
  1206. function wmer_FakeLoad()
  1207. {
  1208. wmer_WazeBits();
  1209.  
  1210. if (typeof Waze === "undefined")
  1211. {
  1212. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze not found, retrying in 500ms...');
  1213. setTimeout(wmer_FakeLoad,500);
  1214. return;
  1215. }
  1216. if (typeof Waze.selectionManager === "undefined")
  1217. {
  1218. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found, retrying in 500ms...');
  1219. setTimeout(wmer_FakeLoad,500);
  1220. return;
  1221. }
  1222. if (typeof Waze.model === "undefined")
  1223. {
  1224. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.model not found, retrying in 500ms...');
  1225. setTimeout(wmer_FakeLoad,500);
  1226. return;
  1227. }
  1228.  
  1229. try {
  1230. Waze.selectionManager.events.register("selectionchanged", null, wmer_insertButton);
  1231. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'added event handler for selectionchanged');
  1232. }
  1233. catch (err) {
  1234. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'added event handler error: ' +err.name);
  1235. }
  1236. }
  1237.  
  1238. function wmer_Init() {
  1239. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'init');
  1240. setTimeout(wmer_FakeLoad, 500);
  1241. }
  1242.  
  1243. wmer_bootstrap();