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