WME Requests

Opens the Requests module with precompiled fields to submit an request

当前为 2016-06-14 提交的版本,查看 最新版本

  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.4.0
  12. // ==/UserScript==
  13.  
  14. var wmer_Version = '2.4.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', // Level5
  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. var WMERequestAddCounty=localStorage.getItem("WMERequestAddCounty");
  365. WMERequestAddCounty= (WMERequestAddCounty && (WMERequestAddCounty === "1" || WMERequestAddCounty === "true"))?true:false;
  366. zoom += 7;
  367. var url = 'https://nominatim.openstreetmap.org/reverse';
  368. var data = {
  369. "lat": ll.lat,
  370. "lon": ll.lon,
  371. "zoom": zoom,
  372. "format": "json",
  373. "addressdetails": 1,
  374. "countrycodes": "ru",
  375. "accept-language": "Ru_ru"
  376. };
  377.  
  378. $.ajax({
  379. dataType: "json",
  380. cache: false,
  381. url: url,
  382. async: false,
  383. data: data,
  384. error: function() {
  385. },
  386. success: function(json) {
  387. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'WmeR_GetCityFromOSM(): json='+json);
  388. if (json.display_name !== undefined) {
  389. var li = '';
  390. if(wmer_Debug) console.dir(json);
  391. // json.address.country_code
  392. // json.address.state
  393. // json.address.region
  394. // json.address.city_district
  395. // json.address.suburb
  396. if (json.address.country_code !== undefined) {
  397. country_code=json.address.country_code;
  398. }
  399.  
  400. if (json.address.city !== undefined) {
  401. li = json.address.city;
  402. }
  403. else if (json.address.town !== undefined) {
  404. li = json.address.town;
  405. }
  406. else if (json.address.village !== undefined) {
  407. li = json.address.village;
  408. }
  409. else if (json.address.hamlet !== undefined) {
  410. li = json.address.hamlet;
  411. }
  412.  
  413. if (WMERequestAddCounty && li.length > 0 && json.address.county !== undefined) {
  414. li += " (" + json.address.county.replace("район","р-н").replace("область","обл.").replace("городской округ","р-н");
  415. //if (json.address.state !== undefined) {li += " / " + json.address.state; }
  416. li += ")";
  417. }
  418.  
  419. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'WmeR_GetCityFromOSM(): li='+li);
  420.  
  421. //$('#topbar-container .topbar .location-info-region .alt-location-info').html(alispan);
  422. cityName=li;
  423. }
  424. }
  425. });
  426.  
  427. return {cityName:cityName,country_code:country_code};
  428. }
  429.  
  430. function click_WMERequest() {
  431. var RenamePref="";
  432.  
  433. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'click_WMERequest()::Action: '+this.id);
  434. if (typeof Waze.selectionManager === "undefined")
  435. {
  436. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found');
  437. return;
  438. }
  439. if (Waze.selectionManager.selectedItems.length == 0)
  440. {
  441. alert(wmer_LanguageRU?'Нет выделенных объектов':'No selected segments.');
  442. return;
  443. }
  444. if (Waze.selectionManager.selectedItems.length < 2 && this.id == 'wmerBtn_join')
  445. {
  446. alert(wmer_LanguageRU?'Вы должны выделить 2 сегмента':'You must select 2 segments.');
  447. return;
  448. }
  449.  
  450. var username = wmer_getUsername();
  451. var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[0].model);
  452. if(wmer_Debug) console.log("sccObj="+JSON.stringify(sccObj))
  453. if(sccObj.city && sccObj.city.length > 0)
  454. RenamePref="Rename: '" + sccObj.city + "' => '";
  455.  
  456. var lockLevel = wmer_GetLevel();
  457. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'lockLevel= '+lockLevel);
  458. if (lockLevel == 1 && this.id == 'wmerBtn_lock')
  459. {
  460. alert(wmer_LanguageRU?'Выбранные сегменты уже разблокированы':'Selected segments are already unlocked');
  461. return;
  462. }
  463.  
  464. var normalizedLevel=Waze.loginManager.user.normalizedLevel;
  465. //normalizedLevel=2;
  466. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'My level: '+normalizedLevel);
  467. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Lock level: '+lockLevel);
  468.  
  469. if (lockLevel <= normalizedLevel && this.id == 'wmerBtn_lock') {
  470. alert(wmer_LanguageRU?'Выбранные сегменты имеют доступный вам уровень блокировки':'Selected segments have a lock level that is less or equal to yours')
  471. return;
  472. }
  473.  
  474. lockLevel=normalizedLevel;
  475.  
  476. var description='type: ' + sccObj.type + '\r' +
  477. 'country: '+ sccObj.country + '\r' +
  478. 'city: ' + sccObj.city + '\r' +
  479. 'street/name: ' + sccObj.street + '\r' +
  480. 'description: ' + sccObj.description;
  481.  
  482. description = description.replace(/%/g, '%25');
  483. description = description.replace(/\+/g, '%2B'); // +
  484. description = description.replace(' ', '%20'); // ' '
  485. description = description.replace(/\r\n/g, '\r'); // '\r\n'
  486. description = description.replace(/\r/g, '%0A'); // '\n'
  487. description = description.replace(/&/g, '%26');
  488. description = description.replace(/</g, '%3C');
  489. description = description.replace(/\>/g, '%3E');
  490. description = description.replace(/\?/g, '%3F');
  491. description = description.replace(/=/g, '%3D');
  492.  
  493. var permalink = wmer_generate_permalink();
  494.  
  495. // попытка центрировать...
  496. var urPos=new OpenLayers.LonLat(
  497. Waze.selectionManager.selectedItems[0].geometry.bounds.left+(Waze.selectionManager.selectedItems[0].geometry.bounds.right-Waze.selectionManager.selectedItems[0].geometry.bounds.left)/2,
  498. Waze.selectionManager.selectedItems[0].geometry.bounds.top-(Waze.selectionManager.selectedItems[0].geometry.bounds.top-Waze.selectionManager.selectedItems[0].geometry.bounds.bottom)/2
  499. );
  500. urPos.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326"));
  501.  
  502. var venues0='';
  503. if(getQueryString(permalink, 'venues') != -1)
  504. venues0="&venues=" + getQueryString(permalink, 'venues');
  505. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'venues0: '+venues0);
  506.  
  507. // https://www.waze.com/editor/?env=row&lon=36.11483&lat=53.96670&zoom=4&marker=yes
  508. var segments0='';
  509. if(getQueryString(permalink, 'segments') != -1)
  510. segments0="&segments=" + getQueryString(permalink, 'segments');
  511. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'segments0: '+segments0);
  512.  
  513.  
  514. var permalink5=permalink.split("&")[0] +
  515. "&zoom=" + parseInt(getQueryString(permalink, 'zoom')) +
  516. "&lon=" + urPos.lon +
  517. "&lat=" + urPos.lat +
  518. segments0 +
  519. venues0;
  520. var permalink50=permalink5;
  521.  
  522. function preparePermalink(s)
  523. {
  524. s = s.replace(/%/g, '%25'); //???
  525. s = s.replace(/&/g, '%26');
  526. s = s.replace(/\?/g, '%3F');
  527. s = s.replace(/=/g, '%3D');
  528. s = s.replace(/</g, '%3C');
  529. s = s.replace(/\>/g, '%3E');
  530. return s;
  531. }
  532.  
  533. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'permalink=' + permalink);
  534. permalink = preparePermalink(permalink);
  535. permalink5 = preparePermalink(permalink5);
  536.  
  537. //You can get entry numbers in google stylesheet: "Answers->Get precompiled URL"
  538. var curDate=new Date();
  539. curDate.setDate(curDate.getDate() + wmer_CountDays);
  540.  
  541. var action="";
  542. switch(this.id)
  543. {
  544. case 'wmerBtn_lock':
  545. action='lock';
  546. break;
  547. case 'wmerBtn_join':
  548. action='join';
  549. break;
  550. case 'wmerBtn_dir':
  551. action='direction';
  552. break;
  553. case 'wmerBtn_turn':
  554. action='turn';
  555. break;
  556. case 'wmerBtn_closures':
  557. action='closures';
  558. break;
  559.  
  560. }
  561.  
  562. function zero2(d){
  563. if((""+d).length == 1)
  564. d="0" + "" + d;
  565. return d;
  566. }
  567.  
  568. // для автозаполнения имени НП в форме
  569. var osmName=WmeR_GetCityFromOSM(urPos,parseInt(getQueryString(permalink50, 'zoom')));
  570.  
  571. if(sccObj.country === '')
  572. {
  573. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': sccObj.country=""; work with osmName!!!');
  574. switch(osmName.country_code)
  575. {
  576. case 'ru': sccObj.country='Russia'; break;
  577. case 'by': sccObj.country='Belarus'; break;
  578. case 'uz': sccObj.country='Uzbekistan'; break;
  579. case 'kz': sccObj.country='Kazakhstan'; break;
  580. }
  581. }
  582.  
  583.  
  584. var idCL=(sccObj.country=='Russia'?0:(sccObj.country=='Belarus'?1:(sccObj.country=='Uzbekistan'?2:(sccObj.country=='Kazakhstan'?3:-1))));
  585. if(idCL == -1)
  586. {
  587. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': idCL = ' +idCL + ', sccObj.countryName='+sccObj.country);
  588. return;
  589. }
  590.  
  591. var WMERequestEmail=localStorage.getItem("WMERequestEmail");
  592. if (!WMERequestEmail)
  593. WMERequestEmail=""
  594. // localStorage.setItem('WMERequestEmail', 'МЫЛО');
  595.  
  596. // !!!
  597. var url = CL[idCL].fr +
  598. '?entry.1230839078=' + username +
  599. '&entry.390417455=' + permalink5 +
  600. '&entry.1224334113=' + lockLevel +
  601. '&entry.1508498769=' + sccObj.country +
  602. '&entry.1856604039=' + action +
  603. '&entry.259824358=' + description +
  604. '&entry.1797072526=' + WMERequestEmail +
  605. '&entry.571885954='+curDate.getUTCFullYear()+'-'+zero2(curDate.getUTCMonth()+1)+'-'+zero2(curDate.getUTCDate()) +
  606. '';
  607.  
  608. // CL: always zoom = 4
  609. var urlCL = CL[idCL].f +
  610. '?entry.1109766685=' + username +
  611. '&entry.1785513403=' + WMERequestEmail +
  612. '&entry.1300384005=' + permalink5.replace(/zoom\%3D([0-9]+)\%26/,"zoom%3D4%26") +
  613. '&entry.1967623256=' + RenamePref+ osmName.cityName + (RenamePref.length>0?"'":"") +
  614. '';
  615.  
  616. var urlL5 = CL[idCL].l +
  617. '?p1=' + sccObj.username +
  618. '&p2=' + sccObj.city +
  619. '&p3=' + permalink5 +
  620. '&p4=' + timeConverter(sccObj.updatedOn) +
  621. '&p5=' + sccObj.cityID +
  622. '';
  623.  
  624. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'urlL5=' + urlL5);
  625.  
  626. if(this.id == 'wmerA_cl')
  627. {
  628. if(sccObj.city == null || sccObj.city == '')
  629. {
  630. alert(wmer_LanguageRU?"Внимание! Имя НП пустое. Сохранение не возможно.":"Attention! The name of the city is empty. Saving is not possible.")
  631. return;
  632. }
  633. }
  634.  
  635. window.open(this.id == 'wmerBtn_cl'?urlCL:(this.id == 'wmerA_cl'?urlL5:url), '_blank');
  636. }
  637.  
  638. function getQueryString(link, name)
  639. {
  640. if (link.indexOf( name + '=' ) <= 0)
  641. return -1;
  642. var pos = link.indexOf( name + '=' ) + name.length + 1;
  643. var len = link.substr(pos).indexOf('&');
  644. return (len == -1)?link.substr(pos):link.substr(pos,len);
  645. }
  646.  
  647. function wmer_generate_permalink() {
  648. var wcp=document.getElementsByClassName('WazeControlPermalink');
  649. for(var i=0; i < wcp.length; ++i)
  650. for (var j=0; j < wcp[i].getElementsByTagName('a').length;++j)
  651. {
  652. var href=wcp[i].getElementsByTagName('a')[j].href;
  653. if (href.indexOf(".waze.com/") > 0 && href.indexOf("/editor") > 0)
  654. {
  655. // kill "/ru/", kill "layers"
  656. href=href.replace("/ru/","/").replace(/layers=([0-9]+)\&/,"") + "&marker=yes";
  657. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'href=' + href);
  658. return href;
  659. }
  660. }
  661. return "";
  662. }
  663.  
  664. function CreateID()
  665. {
  666. return 'WME-Request-' + wmer_Version.replace(/\./g,"-");
  667. }
  668.  
  669.  
  670. function wmer_insertButton(z)
  671. {
  672. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'wmer_insertButton()');
  673. /*{
  674. var permalink=wmer_generate_permalink();
  675. var p = document.getElementsByClassName('WazeControlMousePosition')[0].lastChild.innerHTML.split(' ');
  676. permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+p[1]).replace(/&lon=([0-9\.]+)/g, '&lon='+p[0]);
  677. }*/
  678.  
  679. // if(document.getElementById(CreateID()) != null)
  680. // document.getElementById(CreateID()).setAttribute('style', 'display:'+(Waze.selectionManager && Waze.selectionManager.selectedItems.length == 0?'none':'')+';');
  681.  
  682. if(Waze.selectionManager.selectedItems.length == 0)
  683. return;
  684.  
  685. //
  686. if (Waze.selectionManager.selectedItems.length > 0 && Waze.selectionManager.selectedItems[0].model.type === "venue")
  687. {
  688. var area_poi=document.getElementById('WME.PlaceNames-Square');
  689. if(!area_poi)
  690. {
  691. var wcp=document.getElementsByClassName('additional-attributes list-unstyled side-panel-section');
  692. if (wcp)
  693. {
  694. var li=document.createElement("LI");
  695. li.setAttribute('id', 'WME.PlaceNames-Square');
  696. wcp[0].appendChild(li);
  697. area_poi=document.getElementById('WME.PlaceNames-Square');
  698. }
  699. }
  700.  
  701. if(area_poi)
  702. {
  703. var v_id=Waze.selectionManager.selectedItems[0].model.attributes.id;
  704. if (typeof Waze.model.venues.get(v_id).geometry.getGeodesicArea === "undefined")
  705. area_poi.innerHTML="";
  706. else
  707. {
  708. var square=Waze.model.venues.get(v_id).geometry.getGeodesicArea(Waze.map.getProjectionObject());
  709. area_poi.style=(square < 650)?"color: red;":"color: black;";
  710. area_poi.innerHTML="Площадь: " + square.toFixed(2) + " м&#178;"
  711. }
  712. }
  713.  
  714. }
  715. //
  716.  
  717. var editPanelID='';
  718. var disabled=false;
  719. var disabledjoin=false;
  720. var disabledLock=false;
  721. var disabledPM=false;
  722.  
  723. if (document.getElementById('segment-edit-general') != null)
  724. {
  725. editPanelID='segment-edit-general';
  726. disabled=false;
  727. disabledjoin=false;
  728. disabledLock=false;
  729. }
  730. else if (document.getElementById('landmark-edit-general') != null)
  731. {
  732. editPanelID='landmark-edit-general';
  733. disabledLock=false;
  734. disabledjoin=true;
  735. disabled=true;
  736. }
  737. else if (document.getElementById('node-edit-general') != null)
  738. {
  739. editPanelID='node-edit-general';
  740. disabled=true;
  741. disabledjoin=true;
  742. disabledPM=true;
  743. disabledLock=true;
  744. }
  745. else if (document.getElementById('edit-panel') != null)
  746. {
  747. editPanelID='edit-panel';
  748. disabled=true;
  749. disabledjoin=true;
  750. disabledLock=true;
  751. }
  752.  
  753.  
  754. var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[0].model);
  755. if(wmer_Debug) console.dir(sccObj)
  756. if(sccObj.country === '')
  757. {
  758. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': sccObj.country=""; work with osmName!!!');
  759. // попытка центрировать...
  760. var urPos=new OpenLayers.LonLat(
  761. Waze.selectionManager.selectedItems[0].geometry.bounds.left+(Waze.selectionManager.selectedItems[0].geometry.bounds.right-Waze.selectionManager.selectedItems[0].geometry.bounds.left)/2,
  762. Waze.selectionManager.selectedItems[0].geometry.bounds.top-(Waze.selectionManager.selectedItems[0].geometry.bounds.top-Waze.selectionManager.selectedItems[0].geometry.bounds.bottom)/2
  763. );
  764. urPos.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326"));
  765. switch(WmeR_GetCityFromOSM(urPos,parseInt(getQueryString(wmer_generate_permalink(), 'zoom'))).country_code)
  766. {
  767. case 'ru': sccObj.country='Russia'; break;
  768. case 'by': sccObj.country='Belarus'; break;
  769. case 'uz': sccObj.country='Uzbekistan'; break;
  770. case 'kz': sccObj.country='Kazakhstan'; break;
  771. }
  772. }
  773.  
  774. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': sccObj.cityID=' + sccObj.cityID + ', sccObj.country='+sccObj.country);
  775. var idCL=(sccObj.country=='Russia'?0:(sccObj.country=='Belarus'?1:(sccObj.country=='Uzbekistan'?2:(sccObj.country=='Kazakhstan'?3:-1))));
  776. if(idCL == -1)
  777. {
  778. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': idCL = ' +idCL + ', sccObj.country='+sccObj.country);
  779. idCL=0;
  780. }
  781.  
  782. if(!document.getElementById(CreateID()))
  783. {
  784. // add new edit tab to left of the map
  785. var srsCtrl = document.createElement('div');
  786. srsCtrl.id = CreateID();
  787.  
  788. var padding="padding:5px 9px"
  789. srsCtrl.innerHTML = /*'<hr>'+*/
  790. '<div class="form-group">'+
  791. '<label class="control-label">' + (wmer_LanguageRU?'Запросы':'Requests') +' ' + wmer_Version + '</label>' +
  792. '<div class="controls-container">' +
  793. '<label><a href="' + CL[idCL].dr + '" id="wmerA_dr" target="_gdocRequest" title="' + sccObj.country + '">' + (wmer_LanguageRU?'Таблица':'Table') +'</a></label> | '+
  794. '<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>'+
  795. '<button id="wmerBtn_lock" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  796. (wmer_LanguageRU?'Отправить запрос на изменение уровня блокировки объектов':'Send a request to lock/unlock segment(s)')+
  797. '"><i class="fa fa-unlock"></i>&nbsp;Lock</button>&nbsp;' +
  798. '<button id="wmerBtn_join" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  799. (wmer_LanguageRU?'Отправить запрос на присоединение сегментов':'Send a request to join several segments')+
  800. '"><i class="fa fa-cogs"></i>&nbsp;Join</button>&nbsp;' +
  801. '<button id="wmerBtn_dir" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  802. (wmer_LanguageRU?'Отправить запрос на изменение направления движения сегментов':'Send a request to change the direction of segment(s)')+
  803. '"><i class="fa fa-random"></i>&nbsp;Dir</button>&nbsp;' +
  804. '<button id="wmerBtn_turn" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  805. (wmer_LanguageRU?'Отправить запрос на изменение разрешения поворотов':'Send a request to change the turn restriction.')+
  806. '"><i class="fa fa-arrows-alt"></i>&nbsp;Turn</button>&nbsp;' +
  807. '<button id="wmerBtn_closures" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  808. (wmer_LanguageRU?'Отправить запрос на изменение перекрытие сегментов':'Send a request to change the Real Time Closures.')+
  809. '"><i class="fa fa-calendar"></i>&nbsp;Closures</button>' +
  810. '</div></div>' +
  811.  
  812.  
  813. '<div class="form-group">'+
  814. '<label class="control-label">' + (wmer_LanguageRU?'CityLock':'CityLock') +'</label>' +
  815. '<div class="controls-container">' +
  816. '<label><a href="' + CL[idCL].d + '" id="wmerA_d" target="_gdocRequest" title="' + sccObj.country + '">' + (wmer_LanguageRU?'Таблица':'Table') +'</a></label> | '+
  817. '<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>'+
  818. '<button id="wmerBtn_cl" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  819. (wmer_LanguageRU?'Отправить запрос на изменение наименования населенного пункта':'Send a request to CityLock')+
  820. '"><i class="fa fa-home"></i>&nbsp;City</button>&nbsp;<span id="wmerCitySave0"></span></br>' +
  821. '<label><span id="wmerCityID"></span></label>'+
  822. '<div class="controls-container">' +
  823. '<input name="wmerChk_county" value="" id="wmerChk_county" type="checkbox"><label for="wmerChk_county" title="'+(wmer_LanguageRU?'Добавлять РАЙОН в название НП':'Adding DISTRICT in the name of the locality')+'">&nbsp;'+(wmer_LanguageRU?'Добавлять район':'Add District')+'</label><br>' +
  824. '</div>' +
  825. //'</br><label><span id="wmerLatLon"></span></label>'+
  826. '</div></div>' +
  827.  
  828. '<div class="form-group">'+
  829. '<label class="control-label">' + (wmer_LanguageRU?'Прочее':'Other') +'</label>' +
  830. '<div class="controls-container">' +
  831. '<button id="wmerBtn_pm" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  832. (wmer_LanguageRU?'Отправить приватное сообщение в форум авторам выделенных объектов':'Send (in forum) a Private Message to the author of the segment')+
  833. '"><li class="fa fa-envelope"></li>&nbsp;PM</button>'+
  834. '</div></div>' +
  835.  
  836. '<div class="form-group">' +
  837. '<label class="control-label">' + (wmer_LanguageRU?'Настройки':'Config') +'</label>' +
  838. '<div class="controls-container">' +
  839. '<input name="wmerEdt_lang" value="" id="wmerEdt_lang" type="checkbox"><label for="wmerEdt_lang" title="Принудительно использовать русскоязычный интерфейс для WME Request">Рускоязычный интерфейс</label>' +
  840. '<label>E-mail:' +
  841. '<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>' +
  842. '<input name="wmerChk_debug" value="" id="wmerChk_debug" type="checkbox"><label for="wmerChk_debug" title="Включить логирование">&nbsp;Debug script</label><br>' +
  843. '</div></div>' +
  844. '';
  845.  
  846. // inject new tab
  847. var userTabs = getId('edit-panel');
  848. var navTabs = getElementsByClassName('nav-tabs', userTabs)[0];
  849. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': typeof navTabs=' + (typeof navTabs));
  850. if (typeof navTabs !== "undefined")
  851. {
  852. var tabContent = getElementsByClassName('tab-content', userTabs)[0];
  853.  
  854. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': typeof tabContent=' + (typeof tabContent));
  855. if (typeof tabContent !== "undefined")
  856. {
  857. newtab = document.createElement('li');
  858. newtab.innerHTML = '<a href="#' + CreateID() + '" id="pwmerequest" data-toggle="tab">'+(wmer_LanguageRU?'Запросы':'Requests')+'</a>';
  859. navTabs.appendChild(newtab);
  860.  
  861. //srsCtrl.id = "sidepanel-wmerequest";
  862. srsCtrl.className = "tab-pane";
  863. tabContent.appendChild(srsCtrl);
  864. }
  865. else
  866. srsCtrl.id='';
  867. }
  868. else
  869. srsCtrl.id='';
  870. //http://www.earthtools.org/sun/51.65500265464235/39.18297673378902/22/1/99/0
  871. //document.getElementById(editPanelID).appendChild(srsCtrl);
  872.  
  873. if(srsCtrl.id != '')
  874. {
  875. document.getElementById('wmerBtn_lock').onclick = click_WMERequest;
  876. document.getElementById('wmerBtn_dir').onclick = click_WMERequest;
  877. document.getElementById('wmerBtn_turn').onclick = click_WMERequest;
  878. document.getElementById('wmerBtn_closures').onclick = click_WMERequest;
  879. document.getElementById('wmerBtn_join').onclick = click_WMERequest;
  880. document.getElementById('wmerBtn_pm').onclick = click_submitPMForm;
  881. document.getElementById('wmerBtn_cl').onclick = click_WMERequest;
  882. }
  883.  
  884. //var permalink=wmer_generate_permalink();
  885. //var p = document.getElementsByClassName('WazeControlMousePosition')[0].innerHTML.replace(' ', '').split(',');
  886. //var p = document.getElementsByClassName('WazeControlMousePosition')[0].lastChild.innerHTML.split(' ');
  887. //permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+p[1]).replace(/&lon=([0-9\.]+)/g, '&lon='+p[0]);
  888. /*
  889. if (typeof Waze.selectionManager.selectedItems[0].geometry.x !== "undefined")
  890. {
  891. // корректировка пермалинка для камеры, жанкшина и Place (point)
  892. var urPos=new OpenLayers.LonLat(Waze.selectionManager.selectedItems[0].geometry.x,Waze.selectionManager.selectedItems[0].geometry.y);
  893. urPos.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326")); // {lon, lat}
  894. permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+urPos.lat).replace(/&lon=([0-9\.]+)/g, '&lon='+urPos.lon);
  895. }
  896. */
  897. //document.getElementById('wmerCityID').innerHTML='<small><a href="'+permalink+'">cityID: '+sccObj.cityID+'</a></small>';
  898. //document.getElementById('wmerCityID').innerHTML='<small>cityID: '+sccObj.cityID+'</small>';
  899. /*
  900. if(Waze.loginManager.user.rank >= 4)
  901. {
  902. 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>)';
  903. document.getElementById('wmerA_cl').onclick = click_WMERequest;
  904. }
  905. */
  906.  
  907. //document.getElementById('wmerLatLon').innerHTML='<small>'+p[0]+','+p[1]+'</a></small>';
  908.  
  909. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'initialised');
  910. }
  911.  
  912. if(document.getElementById(CreateID()) != null)
  913. {
  914.  
  915. // ********************
  916. if(document.getElementById('wmerA_dr'))
  917. {
  918. document.getElementById('wmerA_dr').href=CL[idCL].dr;
  919. document.getElementById('wmerA_dr').title=sccObj.country;
  920. }
  921. if(document.getElementById('wmerA_d'))
  922. {
  923. document.getElementById('wmerA_d').href=CL[idCL].d;
  924. document.getElementById('wmerA_d').title=sccObj.country;
  925. }
  926.  
  927. // ********************
  928. if(document.getElementById('wmerCityID'))
  929. document.getElementById('wmerCityID').innerHTML='<small>cityID: '+sccObj.cityID+'</small>';
  930.  
  931. // ********************
  932. // config e-mail
  933. if(document.getElementById('wmerEdt_email'))
  934. {
  935. var WMERequestEmail=localStorage.getItem("WMERequestEmail");
  936. if (!WMERequestEmail)
  937. WMERequestEmail=""
  938. document.getElementById('wmerEdt_email').value=WMERequestEmail;
  939. document.getElementById('wmerEdt_email').onchange=function(){localStorage.setItem('WMERequestEmail', this.value);}
  940. }
  941.  
  942. // ********************
  943. // config language
  944. if (document.getElementById('wmerEdt_lang'))
  945. {
  946. var WMELanguageRU=localStorage.getItem("WMELanguageRU");
  947. if (WMELanguageRU)
  948. wmer_LanguageRU=WMELanguageRU === "1"?true:false;
  949. document.getElementById('wmerEdt_lang').checked=wmer_LanguageRU;
  950. document.getElementById('wmerEdt_lang').onchange=function(){localStorage.setItem('WMELanguageRU', this.checked?"1":"0");}
  951. }
  952.  
  953. // ********************
  954. // config debug
  955. document.getElementById('wmerChk_debug').checked=wmer_Debug;
  956. document.getElementById('wmerChk_debug').onchange=function(){localStorage.setItem('wmer_Debug', this.checked?"1":"0");}
  957.  
  958. // ********************
  959. // config debug AddCounty
  960. var wmer_AddCounty = localStorage.getItem('WMERequestAddCounty')
  961. if (!wmer_AddCounty) // start value
  962. {
  963. if (idCL == 1) // BY ==> false, other ==> true
  964. wmer_AddCounty=false;
  965. else
  966. wmer_AddCounty=true;
  967. }
  968. else
  969. wmer_AddCounty=(wmer_AddCounty === "true" || wmer_AddCounty === "1")?true:false;
  970. document.getElementById('wmerChk_county').checked=wmer_AddCounty;
  971. document.getElementById('wmerChk_county').onchange=function(){localStorage.setItem('WMERequestAddCounty', this.checked?"1":"0");}
  972.  
  973.  
  974. // ********************
  975. if(Waze.loginManager.user.rank >= 4 || (sccObj.country=='Belarus' && Waze.loginManager.user.rank >= 3)) // ??? Uzbekistan ???
  976. {
  977. document.getElementById('wmerCitySave0').innerHTML=
  978. '<button id="wmerA_cl" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
  979. (wmer_LanguageRU?'Сохранить имя нового НП в Google-таблице':'Save the name of the new city in the Google Table')+
  980. '"><i class="fa fa-floppy-o"></i>&nbsp;Save</button>';
  981.  
  982. //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>)';
  983. document.getElementById('wmerA_cl').onclick = click_WMERequest;
  984. }
  985. }
  986.  
  987. if(document.getElementById(CreateID()) != null)
  988. {
  989. document.getElementById('wmerBtn_lock').disabled=disabledLock;
  990. document.getElementById('wmerBtn_dir').disabled=disabled;
  991. document.getElementById('wmerBtn_turn').disabled=disabled;
  992. document.getElementById('wmerBtn_closures').disabled=disabled;
  993. document.getElementById('wmerBtn_join').disabled=disabled;
  994. document.getElementById('wmerBtn_pm').disabled=disabledPM;
  995. document.getElementById('wmerBtn_cl').disabled=disabled;
  996. if(document.getElementById('wmerA_cl'))
  997. document.getElementById('wmerA_cl').disabled=disabled;
  998. }
  999. }
  1000.  
  1001.  
  1002. // <WME Fancy permalink> - http://userscripts.org/users/548866
  1003. function getId(node) {
  1004. return document.getElementById(node);
  1005. }
  1006.  
  1007. function getForumUserIdFromID(wmeUserID)
  1008. {
  1009. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'call getForumUserIdFromID(' + wmeUserID + ')');
  1010. var userName=Waze.model.users.get(wmeUserID);
  1011. if(wmer_Debug) console.dir(userName);
  1012. return (getForumUserIdFromName(userName.userName));
  1013. }
  1014.  
  1015. function getForumUserIdFromName(userName)
  1016. {
  1017. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'call getForumUserIdFromName(' + userName + ')');
  1018. var forumID=-1;
  1019. var forumIDs=new Array();
  1020.  
  1021. if (userName.indexOf('/')!=-1)
  1022. {
  1023. var userNames=userName.split('/');
  1024. for (var i=0; i<userNames.length; i++)
  1025. {
  1026. forumID=getForumUserIdFromName(userNames[i]);
  1027. forumIDs[i]=forumID[0];
  1028. }
  1029. return forumIDs;
  1030. }
  1031.  
  1032. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'looking for ' + userName + ' in the forum.');
  1033.  
  1034. var xhr3_object;
  1035.  
  1036. if(window.XMLHttpRequest) // Firefox & Chrome
  1037. xhr3_object = new XMLHttpRequest();
  1038. else if(window.ActiveXObject) // Internet Explorer
  1039. xhr3_object = new ActiveXObject("Microsoft.XMLHTTP");
  1040.  
  1041. xhr3_object.open("GET", "https://www.waze.com/forum/memberlist.php?username=" + userName, false);
  1042.  
  1043. xhr3_object.onreadystatechange = function() {
  1044. if(xhr3_object.readyState == 4)
  1045. {
  1046. var test = xhr3_object.responseText.match(/u=([0-9]+)"/g);
  1047. if (test==null)
  1048. {
  1049. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Forum return null');
  1050. return(-1); // no match
  1051. }
  1052. if (test.length>1)
  1053. {
  1054. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Forum return multiple match:');
  1055. if(wmer_Debug) console.dir(test);
  1056. return(-2); // multiple match
  1057. }
  1058. forumID=test[0].substring(2, test[0].length-1);
  1059. }
  1060. };
  1061.  
  1062. if(wmer_Debug) console.dir(xhr3_object);
  1063.  
  1064. try {
  1065. xhr3_object.send(null);
  1066. }
  1067. catch (err) {
  1068. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'XMLHttpRequest error: ' +err.name);
  1069. if(wmer_Debug) console.dir(err);
  1070. return(-3);
  1071. }
  1072. forumIDs[0]=forumID;
  1073. return (forumIDs);
  1074. }
  1075.  
  1076. function click_submitPMForm()
  1077. {
  1078. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'click_submitPMForm() start');
  1079. if (typeof Waze.selectionManager === "undefined")
  1080. {
  1081. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found');
  1082. return;
  1083. }
  1084.  
  1085. if (Waze.selectionManager.selectedItems.length == 0)
  1086. {
  1087. alert(wmer_LanguageRU?'Сначала необходимо выделить сегмент':'Please, select one segment before');
  1088. return false;
  1089. }
  1090.  
  1091. //-------------
  1092. var sccObjs=new Array();
  1093. for (var i=0; i < Waze.selectionManager.selectedItems.length; ++i)
  1094. {
  1095. var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[i].model);
  1096. if (sccObj.userID==-1)
  1097. {
  1098. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - Do not PM Admin!');
  1099. alert("Can't PM admin!");
  1100. return false;
  1101. }
  1102.  
  1103. var j;
  1104. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'sccObj.userID='+sccObj.userID);
  1105. for (j=0; j < wmer_UserCache.length; j+=2)
  1106. {
  1107. if (wmer_UserCache[j] === sccObj.userID)
  1108. {
  1109. sccObj.forumuserID=wmer_UserCache[j+1];
  1110. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'found ['+j+']'+wmer_UserCache[j+1]);
  1111. break;
  1112. }
  1113. }
  1114.  
  1115. if (sccObj.forumuserID == "")
  1116. {
  1117. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'not found '+sccObj.userID);
  1118. sccObj.forumuserID=getForumUserIdFromID(sccObj.userID);
  1119. wmer_UserCache.push(sccObj.userID,sccObj.forumuserID);
  1120. }
  1121.  
  1122. sccObjs.push(sccObj);
  1123. }
  1124.  
  1125. var forumIDs=new Array();
  1126. for (var i=0; i < sccObjs.length; ++i)
  1127. forumIDs[i]=sccObjs[i].forumuserID;
  1128. //-------------
  1129.  
  1130. if (forumIDs.length==1 && forumIDs[0]==-1)
  1131. {
  1132. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - User never logged to the forum...');
  1133. alert(wmer_LanguageRU?'Автор сегмента не найден на форуме':'Sorry: unable to find the user in the forum');
  1134. return false;
  1135. }
  1136. if (forumIDs.length==1 && forumIDs[0]==-2)
  1137. {
  1138. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - Several users match name. Should never happen :s');
  1139. alert(wmer_LanguageRU?'Найдено более одного пользователя\nОтправьте сообщение самостоятельно.':'Sorry: more than one user found in the forum.\nYou should look for him/her by yourself.');
  1140. return false;
  1141. }
  1142. if (forumIDs.length==1 && forumIDs[0]==-3)
  1143. {
  1144. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'A network error occurred.');
  1145. alert(wmer_LanguageRU?'Сетевые проблемы\nОтправьте сообщение самостоятельно.':'Sorry: a network error occurred.\nYou should look for him/her by yourself.');
  1146. return false;
  1147. }
  1148.  
  1149. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - all OK. go to PM!');
  1150.  
  1151. var formID="WMER-PM-FORM";
  1152.  
  1153. var nodePM;
  1154.  
  1155. if (getId("WMER-PM-Send") == null)
  1156. {
  1157. nodePM= document.createElement('div');
  1158. nodePM.id = 'WMER-PM-Send';
  1159. nodePM.style.display='hidden';
  1160. getId(CreateID()).appendChild(nodePM);
  1161. }
  1162. else
  1163. {
  1164. nodePM=getId("WMER-PM-Send");
  1165. }
  1166.  
  1167. var PMForm;
  1168. PMForm='<form id="' + formID + '" target="_blank" method="post" style="display: inline">';
  1169. PMForm+='<input id="' + formID + '-subject" type="hidden" name="subject" value="" />';
  1170. PMForm+='<input type="hidden" name="addbbcode20" value="100" />';
  1171. PMForm+='<input id="' + formID + '-message" type="hidden" name="message" value="" />';
  1172. PMForm+='<input type="hidden" name="preview" value="Preview" />';
  1173. PMForm+='<input type="hidden" name="attach_sig" value="on" />';
  1174. PMForm+='<input id="' + formID + '-ct" type="hidden" name="creation_time" value="0" />';
  1175. PMForm+='<input id="' + formID + '-lc" type="hidden" name="lastclick" value="0" />';
  1176. for (var i=0; i<forumIDs.length; i++)
  1177. {
  1178. PMForm+='<input type="hidden" name="address_list[u]['+forumIDs[i]+']" value="to" />';
  1179. }
  1180. PMForm+='</form>';
  1181. nodePM.innerHTML=PMForm;
  1182.  
  1183. var permalink=wmer_generate_permalink();
  1184. //if(wmer_Debug) console.log(permalink);
  1185. var name_object=""
  1186. linkParts=permalink.replace(/#/g, "").split('&');
  1187. for (var j=0; j<linkParts.length; j++)
  1188. {
  1189. if (linkParts[j].indexOf("segments=")==0 || linkParts[j].indexOf("venues=")==0 || linkParts[j].indexOf("cameras=")==0 || linkParts[j].indexOf("bigJunctions=")==0)
  1190. {
  1191. name_object=linkParts[j].split('=')[0]
  1192. linkParts.splice (j,1);
  1193. break;
  1194. }
  1195. }
  1196. permalink=linkParts.join('&');
  1197.  
  1198. if(wmer_Debug) console.dir(linkParts);
  1199.  
  1200. var message=wmer_LanguageRU?
  1201. 'Есть вопросы по правкам в [url=' + permalink + ']этой области редактирования[/url]:\n\n':
  1202. 'Some questions about [url=' + permalink + ']this area[/url]:\n\n';
  1203.  
  1204. function NullToEmpty(s)
  1205. {
  1206. return !s?"":s;
  1207. }
  1208. function GetTypeName(s)
  1209. {
  1210. if(wmer_LanguageRU)
  1211. {
  1212. switch(s)
  1213. {
  1214. case "segment": return "сегмент"
  1215. case "venue": return "ПОИ"
  1216. case "node": return "узел"
  1217. case "camera": return "камера"
  1218. case "bigJunction": return "развязка"
  1219. }
  1220. }
  1221. return s
  1222. //'+(wmer_LanguageRU?'Категории':'Categories')+'
  1223. }
  1224.  
  1225. for (var i=0; i < sccObjs.length; ++i)
  1226. {
  1227. var on=sccObjs[i].type === "segment"?(wmer_LanguageRU?'Улица':"Street"):(wmer_LanguageRU?'Название':"Name");
  1228. message += ''
  1229. + (wmer_LanguageRU?'Автор':'Author')+': [b]' + sccObjs[i].username + '[/b]\n'
  1230. + (wmer_LanguageRU?'Тип':'Type')+': [b]' + GetTypeName(sccObjs[i].type) + '[/b]\n'
  1231. + (sccObj.country=='Belarus'?'':(wmer_LanguageRU?'Страна':'Country')+': [b]' + sccObjs[i].country + '[/b]\n')
  1232. + (wmer_LanguageRU?'НП':'City')+': [b]' + NullToEmpty(sccObjs[i].city) + '[/b]\n'
  1233. + (sccObjs[i].poiaddress.length > 0?(wmer_LanguageRU?'Адрес':'Address')+': [b]'+sccObjs[i].poiaddress+'[/b]\n':'')
  1234. + on+ ': [b]' + NullToEmpty(sccObjs[i].street) + '[/b]\n'
  1235. + (wmer_LanguageRU?'Дата':'Date')+': [b]' + timeConverter(sccObjs[i].updatedOn).replace('+',' ') + '[/b]\n'
  1236. + (wmer_LanguageRU?'Ссылка':'Permalink')+': [url]' + permalink + '&' + name_object + '=' + sccObjs[i].objid + '[/url]\n'
  1237. + (wmer_LanguageRU?'Дополнительно':'Description')+': {' + NullToEmpty(sccObjs[i].description) + '\n}\n'
  1238. + '\n';
  1239. }
  1240. //if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + message);
  1241.  
  1242. getId(formID + '-message').value=message;
  1243. var now=new Date().getTime();
  1244. now /= 1000;
  1245. now = Math.floor(now);
  1246. getId(formID + '-ct').value=now;
  1247. getId(formID + '-lc').value=now;
  1248.  
  1249. getId(formID).action="https://www.waze.com/forum/ucp.php?i=pm&mode=compose&action=post";
  1250. getId(formID + '-subject').value=
  1251. wmer_LanguageRU?
  1252. '[WME Request] Уточнение по правкам':
  1253. '[WME Request] Question about map edits';
  1254.  
  1255. if(wmer_Debug) console.dir(getId(formID));
  1256.  
  1257. getId(formID).submit();
  1258. return true; // this forces to open in new tab!
  1259. }
  1260. // </WME Fancy permalink>
  1261.  
  1262.  
  1263. function wmer_WazeBits()
  1264. {
  1265. // if (typeof Waze === "undefined")
  1266. // Waze=unsafeWindow.Waze;
  1267.  
  1268. if (typeof Waze === "undefined")
  1269. Waze=window.Waze;
  1270. }
  1271.  
  1272. function wmer_FakeLoad()
  1273. {
  1274. wmer_WazeBits();
  1275.  
  1276. if (typeof Waze === "undefined")
  1277. {
  1278. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze not found, retrying in 500ms...');
  1279. setTimeout(wmer_FakeLoad,500);
  1280. return;
  1281. }
  1282. if (typeof Waze.selectionManager === "undefined")
  1283. {
  1284. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found, retrying in 500ms...');
  1285. setTimeout(wmer_FakeLoad,500);
  1286. return;
  1287. }
  1288. if (typeof Waze.model === "undefined")
  1289. {
  1290. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.model not found, retrying in 500ms...');
  1291. setTimeout(wmer_FakeLoad,500);
  1292. return;
  1293. }
  1294.  
  1295. try {
  1296. Waze.selectionManager.events.register("selectionchanged", null, wmer_insertButton);
  1297. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'added event handler for selectionchanged');
  1298. }
  1299. catch (err) {
  1300. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'added event handler error: ' +err.name);
  1301. }
  1302. }
  1303.  
  1304. function wmer_Init() {
  1305. if(wmer_Debug) console.log('WME Requests v.' + wmer_Version + ': ' + 'init');
  1306. setTimeout(wmer_FakeLoad, 500);
  1307. }
  1308.  
  1309. wmer_bootstrap();