WME Requests

Opens the Requests module with precompiled fields to submit an request

当前为 2015-09-01 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name                WME Requests
// @namespace           https://greasyfork.org/ru/scripts/5085-wme-requests
// @description         Opens the Requests module with precompiled fields to submit an request
// @include             https://*.waze.com/editor/*
// @include             https://*.waze.com/*/editor/*
// @include             https://*.waze.com/map-editor/*
// @include             https://*.waze.com/beta_editor/*
// @grant               none
// @author              skirda
// @version             1.12.0
// ==/UserScript==

var wmer_Version = '1.12.0';
var wmer_Form = 'https://docs.google.com/forms/d/1QzvF3-lH8MuuEaSw0GA6LgLW62EiSHzQXBmG5-rQdIQ/viewform';
var wmer_FormCL = 'https://docs.google.com/forms/d/1ck0cCIV6vPy16YQZJvfmM0clOdAE2Z-kDsXn06ZwQ1s/viewform';
var wmer_Docs="https://docs.google.com/spreadsheet/ccc?key=0AtcEFFDNcic4dEE2UFh5X0lDdlRZbno3YVFYUkg0Unc";
var wmer_DocsCL="https://docs.google.com/spreadsheets/d/1ddcW8EmNjojJp7EQ4AYPdfBqNWe28WqRaQ_RtkB8JAU";

var wmer_CountDays = 5;
var wmer_UserCache = new Array();
var wmer_LanguageRU = false;
var wmer_MousePos = '';

function wmer_bootstrap()
{
	wmer_LanguageRU=window.location.href.indexOf("/ru/") > 0?true:false;

	if (typeof unsafeWindow === "undefined") {
		unsafeWindow    = ( function () {
			var dummyElem = document.createElement('p');
			dummyElem.setAttribute('onclick', 'return window;');
			return dummyElem.onclick();
		}) ();
	}

	/* begin running the code! */
	wmer_Init();
}

function consoleLog(text)
{
	console.log('WME Requests v.' + wmer_Version + ': ' + text);
}

function dump(obj)
{
	var out = "";
	if(obj && typeof(obj) == "object"){
		for (var i in obj) {
			out += i + ": " + obj[i] + "\n";
		}
	} else {
		out = obj;
	}
	return out;
}

function wmer_getUsername()
{
	var thisUser = Waze.loginManager.user;
	if (thisUser === null)
	{
		alert(wmer_LanguageRU?'Невозможно получить имя текущего пользователя':'Nobody\'s logged in.');
		return "";
	}
	return Waze.loginManager.user.userName;
}

function timeConverter(UNIX_timestamp)
{
	var datetime = new Date();
	var mEpoch = parseInt(UNIX_timestamp);
	if (mEpoch<10000000000) mEpoch *= 1000;
	datetime.setTime(mEpoch)
	// !!! UTC !!!
	return datetime.getUTCFullYear()+"-"+('0' + (datetime.getUTCMonth() + 1)).slice(-2)+"-"+('0' + datetime.getUTCDate()).slice(-2)+"+"+('0' + datetime.getUTCHours()).slice(-2) + ':' + ('0' + datetime.getUTCMinutes()).slice(-2)

}

function wmer_getCCSD(segment){ // BUBBUB!!! need use "hasOwnProperty" or "in"
	console.log('WME Requests v.' + wmer_Version + ': ' + 'start wmer_getCCSD');

	var oID="";
	var streetName="";
	var cityName="";
	var countryName="";
	var description="";
	var typeName= "";
	var cityID="";
	var userID="";
	var forumUserID="";
	var userName="";
	var updatedOn="";

	try {
		typeName=segment.type;
		/*
		"segment"
		"venue"
		"node"
		"camera" typeName: "Speed camera"
		*/
		oID=segment.fid;
		var attributesObj=segment.attributes;
		updatedOn=attributesObj.updatedOn;

		if (attributesObj.hasOwnProperty('primaryStreetID'))
		{
//Waze.model.streets.get(Waze.selectionManager.selectedItems[0].model.attributes.primaryStreetID).cityID
			console.log('WME Requests v.' + wmer_Version + ': ' + 'found street');
			var sID=attributesObj.primaryStreetID;
			var streetsObj = wazeModel.streets.get(sID);
			cityID=streetsObj.cityID;
			streetName=streetsObj.name;
		}
		else if (typeName === "camera")
		{
//Waze.selectionManager.selectedItems[0].model.model.cities.additionalInfo[0].id
			console.log('WME Requests v.' + wmer_Version + ': ' + 'found camera');
			streetName=segment.typeName;
			description="\rSpeed: "+attributesObj.speed+"\rValidated: "+attributesObj.validated + "\rAzymuth: "+attributesObj.azymuth+"\rType: "+attributesObj.type;
			cityID=segment.model.cities.additionalInfo[0].id;
			if (cityID == null)
				cityID="";
		}
		else if (typeName === "node")
		{
//Waze.selectionManager.selectedItems[0].model.segments.topCityID
			console.log('WME Requests v.' + wmer_Version + ': ' + 'found node');
			cityID=''+segment.model.segments.topCityID;

			if (cityID == null)
				cityID="";
			description="count segment(s)="+attributesObj.segIDs.length;
		}
		else // "venue"
		{
			console.log('WME Requests v.' + wmer_Version + ': ' + 'found POI ('+typeName+')');
			consoleLog("found POI ("+typeName+")");
//Waze.model.streets.get(Waze.selectionManager.selectedItems[0].attributes.streetID).cityID
			var sID=attributesObj.streetID;
			if (sID == null)
				cityID="";
			else
				cityID=wazeModel.streets.get(sID).cityID;

			if (sID == null)
				cityID="";

			description='\rCategories: '+Waze.selectionManager.selectedItems[0].attributes.categories.join(';') + '.\r' + attributesObj.description;
			if (Waze.selectionManager.selectedItems[0].attributes.categories.indexOf("GAS_STATION") != -1) // Gas Station
			{
				typeName="gas station"
				description="Brand: "+attributesObj.brand + "\rAddress: " + attributesObj.address + "\nDescription: " + attributesObj.description
			}
			streetName=attributesObj.name;
		}

		if (!(typeName === "camera" || typeName === "node" || cityID === "")) // BUGBUG!!!
		{
			console.log('WME Requests v.' + wmer_Version + ': cityID=' + cityID);
			var cityObj=wazeModel.cities.get(cityID);

			var countryID=cityObj.countryID;
			cityName=cityObj.name;
			var countriesObj=wazeModel.countries.get(countryID);

			countryName = countriesObj.name;
		}

		if (!(typeName === "node"))
		{
			userID=attributesObj.updatedBy;
			if (userID == null)
				userID=attributesObj.createdBy;

			if (userID==-1 || userID == null)
			{
				userID=attributesObj.createdBy;
				if (userID==-1)
				{
					console.log('WME Requests v.' + wmer_Version + ': ' + 'Do not PM Admin!');
				}
			}

			userName=wazeModel.users.get(userID).userName;
			console.log('WME Requests v.' + wmer_Version + ': ' + 'userName='+userName);
		}
		else
			userID="-1";
		console.log('WME Requests v.' + wmer_Version + ': ' + 'userID=' +userID);

	}
	catch (err) {
		console.log('WME Requests v.' + wmer_Version + ': error: ' +err.name);
	}

	console.log('WME Requests v.' + wmer_Version + ': ' + 'return from wmer_getCCSD');
	return {
		objid       : oID,
		type        : typeName,
		street      : streetName,
		city        : cityName,
		cityID      : cityID,
		country     : countryName,
		description : description,
	    username    : userName,
		userID      : userID,
		forumuserID : forumUserID,
		updatedOn   : updatedOn
	};
}


function wmer_userRank(segment)
{
	var usrRank = 0;
	if (segment.attributes.lockRank)
	{
		var updatedBy = wazeModel.users.get(segment.attributes.updatedBy);
		return updatedBy != null ? updatedBy.rank : 0;
	}
	return 0;
}

//It returns the maximum lock level
function wmer_GetLevel() {
	//attributes.rank dovrebbe essere il road rank
	var sel = Waze.selectionManager.selectedItems;
	var maxR = wmer_userRank(sel[0]);
	for (i = 1; i < sel.length; i++)
	{
		if (maxR == 5)
		{
			return 6;
		}
		var usrRank = wmer_userRank(sel[i]);
		if (usrRank > maxR) {
			maxR = usrRank;
		}
	}
	return maxR + 1;
}

function click_WMERequest() {
	console.log('WME Requests v.' + wmer_Version + ': ' + 'click_WMERequest()::Action: '+this.id);
	if (typeof Waze.selectionManager === "undefined")
	{
		console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found');
		return;
	}
	if (Waze.selectionManager.selectedItems.length == 0)
	{
		alert(wmer_LanguageRU?'Нет выделенных объектов':'No selected segments.');
		return;
	}
	if (Waze.selectionManager.selectedItems.length < 2 && this.id == 'wmerBtn_join')
	{
		alert(wmer_LanguageRU?'Вы должны выделить 2 сегмента':'You must select 2 segments.');
		return;
	}

	var username = wmer_getUsername();
	var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[0].model);

	var lockLevel = wmer_GetLevel();
	if (lockLevel == 1 && this.id == 'wmerBtn_lock')
	{
		alert(wmer_LanguageRU?'Выбранные сегменты уже разблокированы':'Selected segments are already unlocked');
		return;
	}

	console.log('WME Requests v.' + wmer_Version + ': ' + 'My level: '+Waze.loginManager.user.normalizedLevel);
	console.log('WME Requests v.' + wmer_Version + ': ' + 'Lock level: '+lockLevel);

	if (lockLevel <= Waze.loginManager.user.normalizedLevel && this.id == 'wmerBtn_lock') {
		alert(wmer_LanguageRU?'Выбранные сегменты имеют доступный вам уровень блокировки':'Selected segments have a lock level that is less or equal to yours')
		return;
	}

	var description='type: ' + sccObj.type + '\r' +
					'country: '+ sccObj.country + '\r' +
					'city: ' + sccObj.city + '\r' +
					'street/name: ' + sccObj.street + '\r' +
					'description: ' + sccObj.description;

	description = description.replace(/%/g, '%25');
	description = description.replace(/\+/g, '%2B');   // +
	description = description.replace(' ', '%20');   // ' '
	description = description.replace(/\r\n/g, '\r');  // '\r\n'
	description = description.replace(/\r/g, '%0A');  // '\n'
	description = description.replace(/&/g, '%26');
	description = description.replace(/</g, '%3C');
	description = description.replace(/\>/g, '%3E');
	description = description.replace(/\?/g, '%3F');
	description = description.replace(/=/g, '%3D');

	var permalink = wmer_generate_permalink();
	console.log('WME Requests v.' + wmer_Version + ': ' + 'permalink=' + permalink);
	permalink = permalink.replace(/%/g, '%25'); //???
	permalink = permalink.replace(/&/g, '%26');
	permalink = permalink.replace(/\?/g, '%3F');
	permalink = permalink.replace(/=/g, '%3D');
	permalink = permalink.replace(/</g, '%3C');
	permalink = permalink.replace(/\>/g, '%3E');
	//You can get entry numbers in google stylesheet: "Answers->Get precompiled URL"
	var curDate=new Date();
	curDate.setDate(curDate.getDate() + wmer_CountDays);

	var action="";
	switch(this.id)
	{
		case 'wmerBtn_lock':
			action='lock';
			break;
		case 'wmerBtn_join':
			action='join';
			break;
		case 'wmerBtn_dir':
			action='direction';
			break;
		case 'wmerBtn_turn':
			action='turn';
			break;
		case 'wmerBtn_closures':
			action='closures';
			break;

	}

	function zero2(d){
		if((""+d).length == 1)
			d="0" + "" + d;
		return d;
	}

	var url = wmer_Form +
			'?entry.1230839078=' + username +
			'&entry.390417455=' + permalink +
			'&entry.1224334113=' + lockLevel +
			'&entry.1508498769=' + sccObj.country +
			'&entry.1856604039=' + action +
			'&entry.259824358=' + description +
			'&entry.571885954='+curDate.getFullYear()+'-'+zero2(curDate.getMonth()+1)+'-'+zero2(curDate.getDate());
	//entry.1797072526=e-mail


	var urlCL = wmer_FormCL +
			'?entry.1109766685=' + username +
			'&entry.1300384005=' + permalink +
			'';

	    var urlL5 = 'https://script.google.com/macros/s/AKfycbzqA15-fy4g4StdRUmnuMj9z6rJ56gQPjCYpgCMni7h/exec' +
			'?p1=' + sccObj.username +
			'&p2=' + sccObj.city +
			'&p3=' + permalink +
			'&p4=' + timeConverter(sccObj.updatedOn) +
			'&p5=' + sccObj.cityID +
			'';

	if(this.id == 'wmerA_cl')
	{
		if(sccObj.city == null || sccObj.city == '')
		{
			alert(wmer_LanguageRU?"Внимание! Имя НП пустое. Сохранение не возможно.":"Attention! The name of the city is empty. Saving is not possible.")
			return;
		}
	}

	window.open(this.id == 'wmerBtn_cl'?urlCL:(this.id == 'wmerA_cl'?urlL5:url), '_blank');
}

function wmer_generate_permalink() {
  	var wcp=document.getElementsByClassName('WazeControlPermalink');
  	for(var i=0; i < wcp.length; ++i)
  		for (var j=0; j < wcp[i].getElementsByTagName('a').length;++j)
  		{
  			var href=wcp[i].getElementsByTagName('a')[j].href;
			if (href.indexOf(".waze.com/") > 0 && href.indexOf("/editor") > 0)
			{
				return href;
			}
		}
	return "";
}


function wmer_insertButton(z)
{
	console.log('WME Requests v.' + wmer_Version + ': ' + 'wmer_insertButton()');
	/*{
		var permalink=wmer_generate_permalink();
		var p = document.getElementsByClassName('WazeControlMousePosition')[0].lastChild.innerHTML.split(' ');
		permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+p[1]).replace(/&lon=([0-9\.]+)/g, '&lon='+p[0]);
	}*/

	if(document.getElementById('WME.Request_' + wmer_Version) != null)
		document.getElementById('WME.Request_' + wmer_Version).setAttribute('style', 'display:'+(Waze.selectionManager && Waze.selectionManager.selectedItems.length == 0?'none':'')+';');

	if(Waze.selectionManager.selectedItems.length == 0)
		return;

	var editPanelID='';
	var disabled=false;
	var disabledjoin=false;
	var disabledLock=false;
	var disabledPM=false;

	if (document.getElementById('segment-edit-general') != null)
	{
		editPanelID='segment-edit-general';
		disabled=false;
		disabledjoin=false;
		disabledLock=false;
	}
	else if (document.getElementById('landmark-edit-general') != null)
	{
		editPanelID='landmark-edit-general';
		disabledLock=false;
		disabledjoin=true;
		disabled=true;
	}
	else if (document.getElementById('node-edit-general') != null)
	{
		editPanelID='node-edit-general';
		disabled=true;
		disabledjoin=true;
		disabledPM=true;
		disabledLock=true;
	}
	else if (document.getElementById('edit-panel') != null)
	{
		editPanelID='edit-panel';
		disabled=true;
		disabledjoin=true;
		disabledLock=true;
	}

	if(document.getElementById('WME.Request_' + wmer_Version) == null)
	{
		srsCtrl = document.createElement('section');
		srsCtrl.id = 'WME.Request_' + wmer_Version;

		var padding="padding:5px 9px"
		srsCtrl.innerHTML = /*'<hr>'+*/
			'<a href="' + wmer_Docs + '" target="_gdocRequest">Requests:</a> '+
			'(<a href="https://www.waze.com/forum/viewtopic.php?p=662218#p662218" title="WME Requests ' + wmer_Version + '" style="font-size: 10px" target="_blank">?</a>)&nbsp;/&nbsp;'+
			'<a href="' + wmer_DocsCL + '" target="_gdocRequest">CityLock:</a> '+
			'(<a href="https://www.waze.com/forum/viewtopic.php?f=787&t=105793" title="City Lock ' + wmer_Version + '" style="font-size: 10px" target="_blank">?</a>)'+
			'</br>'+
			'<button id="wmerBtn_lock" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
				(wmer_LanguageRU?'Отправить запрос на изменение уровня блокировки объектов':'Send a request to lock/unlock segment(s)')+
				'"><i class="icon-unlock"></i>&nbsp;Lock</button>&nbsp;' +
			'<button id="wmerBtn_join" class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
				(wmer_LanguageRU?'Отправить запрос на присоединение сегментов':'Send a request to join several segments')+
				'"><i class="icon-cogs"></i>&nbsp;Join</button>&nbsp;' +
			'<button id="wmerBtn_dir"  class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
				(wmer_LanguageRU?'Отправить запрос на изменение направления движения сегментов':'Send a request to change the direction of segment(s)')+
				'"><i class="icon-random"></i>&nbsp;Dir</button>&nbsp;' +
			'<button id="wmerBtn_turn"  class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
				(wmer_LanguageRU?'Отправить запрос на изменение разрешения поворотов':'Send a request to change the turn restriction.')+
				'"><i class="icon-arrows-alt">&#xf047;</i>&nbsp;Turn</button>&nbsp;' +
			'<button id="wmerBtn_closures"  class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
				(wmer_LanguageRU?'Отправить запрос на изменение перекрытие сегментов':'Send a request to change the Real Time Closures.')+
				'"><i class="icon-calendar"></i>&nbsp;Closures</button><br>' +
			'<button id="wmerBtn_pm"   class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
				(wmer_LanguageRU?'Отправить приватное сообщение в форум авторам выделенных объектов':'Send (in forum) a Private Message to the author of the segment')+
				'"><i class="icon-envelope"></i>&nbsp;PM</button>&nbsp;' +
			'<button id="wmerBtn_cl"   class="btn btn-default" style="font-size:9px;'+padding+'" title="'+
				(wmer_LanguageRU?'Отправить запрос на изменение наименования населенного пункта':'Send a request to CityLock')+
				'"><i class="icon-home"></i>&nbsp;City</button>' +
			'</br><span id="wmerCityID"></span>'+
			'</br><span id="wmerLatLon"></span>'+
			'<hr>';
		//http://www.earthtools.org/sun/51.65500265464235/39.18297673378902/22/1/99/0
		document.getElementById(editPanelID).appendChild(srsCtrl);

		document.getElementById('wmerBtn_lock').onclick = click_WMERequest;
		document.getElementById('wmerBtn_dir').onclick  = click_WMERequest;
		document.getElementById('wmerBtn_turn').onclick  = click_WMERequest;
		document.getElementById('wmerBtn_closures').onclick  = click_WMERequest;
		document.getElementById('wmerBtn_join').onclick = click_WMERequest;
		document.getElementById('wmerBtn_pm').onclick   = click_submitPMForm;
		document.getElementById('wmerBtn_cl').onclick   = click_WMERequest;

		var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[0].model);
		console.log('WME Requests v.' + wmer_Version + ': ' + sccObj.cityID);

		var permalink=wmer_generate_permalink();
		//var p = document.getElementsByClassName('WazeControlMousePosition')[0].innerHTML.replace(' ', '').split(',');
		var p = document.getElementsByClassName('WazeControlMousePosition')[0].lastChild.innerHTML.split(' ');
		permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+p[1]).replace(/&lon=([0-9\.]+)/g, '&lon='+p[0]);
        /*
		if (typeof Waze.selectionManager.selectedItems[0].geometry.x !== "undefined")
		{
			// корректировка пермалинка для камеры, жанкшина и Place (point)
			var urPos=new OpenLayers.LonLat(Waze.selectionManager.selectedItems[0].geometry.x,Waze.selectionManager.selectedItems[0].geometry.y);
			urPos.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326")); // {lon, lat}
			permalink=permalink.replace(/#/g, "").replace(/&lat=([0-9\.]+)/g, '&lat='+urPos.lat).replace(/&lon=([0-9\.]+)/g, '&lon='+urPos.lon);
		}
        */
		//document.getElementById('wmerCityID').innerHTML='<small><a href="'+permalink+'">cityID: '+sccObj.cityID+'</a></small>';
		document.getElementById('wmerCityID').innerHTML='<small>cityID: '+sccObj.cityID+'</small>';
		if(Waze.loginManager.user.rank >= 4)
		{
			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>)';
			document.getElementById('wmerA_cl').onclick   = click_WMERequest;
		}

		//document.getElementById('wmerLatLon').innerHTML='<small>'+p[0]+','+p[1]+'</a></small>';

		console.log('WME Requests v.' + wmer_Version + ': ' + 'initialised');

	}

	if(document.getElementById('WME.Request_' + wmer_Version) != null)
	{
		document.getElementById('wmerBtn_lock').disabled=disabledLock;
		document.getElementById('wmerBtn_dir').disabled=disabled;
		document.getElementById('wmerBtn_turn').disabled=disabled;
		document.getElementById('wmerBtn_closures').disabled=disabled;
		document.getElementById('wmerBtn_join').disabled=disabled;
		document.getElementById('wmerBtn_pm').disabled=disabledPM;
		document.getElementById('wmerBtn_cl').disabled=disabled;
	}
}


// <WME Fancy permalink> - http://userscripts.org/users/548866
function getId(node) {
  return document.getElementById(node);
}

function getForumUserIdFromID(wmeUserID)
{
	console.log('WME Requests v.' + wmer_Version + ': ' + 'call getForumUserIdFromID(' + wmeUserID + ')');
	var userName=wazeModel.users.get(wmeUserID);
	console.dir(userName);
	return (getForumUserIdFromName(userName.userName));
}

function getForumUserIdFromName(userName)
{
	console.log('WME Requests v.' + wmer_Version + ': ' + 'call getForumUserIdFromName(' + userName + ')');
	var forumID=-1;
	var forumIDs=new Array();

	if (userName.indexOf('/')!=-1)
	{
		var userNames=userName.split('/');
		for (var i=0; i<userNames.length; i++)
		{
			forumID=getForumUserIdFromName(userNames[i]);
			forumIDs[i]=forumID[0];
		}
		return forumIDs;
	}

	console.log('WME Requests v.' + wmer_Version + ': ' + 'looking for ' + userName + ' in the forum.');

	var xhr3_object;

	if(window.XMLHttpRequest) // Firefox & Chrome
		xhr3_object = new XMLHttpRequest();
	else if(window.ActiveXObject) // Internet Explorer
		xhr3_object = new ActiveXObject("Microsoft.XMLHTTP");

	xhr3_object.open("GET", "https://www.waze.com/forum/memberlist.php?username=" + userName, false);

	xhr3_object.onreadystatechange = function() {
		if(xhr3_object.readyState == 4)
		{
			var test = xhr3_object.responseText.match(/u=([0-9]+)"/g);
			if (test==null)
			{
				console.log('WME Requests v.' + wmer_Version + ': ' + 'Forum return null');
				return(-1); // no match
			}
			if (test.length>1)
			{
				console.log('WME Requests v.' + wmer_Version + ': ' + 'Forum return multiple match:');
				console.dir(test);
				return(-2); // multiple match
			}
			forumID=test[0].substring(2, test[0].length-1);
		}
	};

	console.dir(xhr3_object);

	try {
		xhr3_object.send(null);
	}
	catch (err) {
		console.log('WME Requests v.' + wmer_Version + ': ' + 'XMLHttpRequest error: ' +err.name);
		console.dir(err);
		return(-3);
	}
	forumIDs[0]=forumID;
	return (forumIDs);
}

function click_submitPMForm()
{
	if (typeof Waze.selectionManager === "undefined")
	{
		console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found');
		return;
	}

	if (Waze.selectionManager.selectedItems.length == 0)
	{
		alert(wmer_LanguageRU?'Сначала необходимо выделить сегмент':'Please, select one segment before');
		return false;
	}

	//-------------
	var sccObjs=new Array();
	for (var i=0; i < Waze.selectionManager.selectedItems.length; ++i)
	{
		var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[i].model);
		if (sccObj.userID==-1)
		{
			console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - Do not PM Admin!');
			alert("Can't PM admin!");
			return false;
		}

		var j;
		for (j=0; j < wmer_UserCache.length; j+=2)
		{
			if (wmer_UserCache[j] === sccObj.userID)
			{
				sccObj.forumuserID=wmer_UserCache[j+1];
				console.log('WME Requests v.' + wmer_Version + ': ' + 'found ['+j+']'+wmer_UserCache[j+1]);
				break;
			}
		}

		if (sccObj.forumuserID == "")
		{
			console.log('WME Requests v.' + wmer_Version + ': ' + 'not found '+sccObj.userID);
			sccObj.forumuserID=getForumUserIdFromID(sccObj.userID);
			wmer_UserCache.push(sccObj.userID,sccObj.forumuserID);
		}

		sccObjs.push(sccObj);
	}

	var forumIDs=new Array();
	for (var i=0; i < sccObjs.length; ++i)
		forumIDs[i]=sccObjs[i].forumuserID;
	//-------------

	if (forumIDs.length==1 && forumIDs[0]==-1)
	{
		console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - User never logged to the forum...');
		alert(wmer_LanguageRU?'Автор сегмента не найден на форуме':'Sorry: unable to find the user in the forum');
		return false;
	}
	if (forumIDs.length==1 && forumIDs[0]==-2)
	{
		console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - Several users match name. Should never happen :s');
		alert(wmer_LanguageRU?'Найдено более одного пользователя\nОтправьте сообщение самостоятельно.':'Sorry: more than one user found in the forum.\nYou should look for him/her by yourself.');
		return false;
	}
	if (forumIDs.length==1 && forumIDs[0]==-3)
	{
		console.log('WME Requests v.' + wmer_Version + ': ' + 'A network error occurred.');
		alert(wmer_LanguageRU?'Сетевые проблемы\nОтправьте сообщение самостоятельно.':'Sorry: a network error occurred.\nYou should look for him/her by yourself.');
		return false;
	}

	console.log('WME Requests v.' + wmer_Version + ': ' + 'PM request - all OK. go to PM!');

	var formID="WMER-PM-FORM";

	var nodePM;

	if (getId("WMER-PM-Send") == null)
	{
		nodePM= document.createElement('div');
		nodePM.id = 'WMER-PM-Send';
		nodePM.style.display='hidden';
		getId('WME.Request_' + wmer_Version).appendChild(nodePM);
	}
	else
	{
		nodePM=getId("WMER-PM-Send");
	}

	var PMForm;
	PMForm='<form id="' + formID + '" target="_blank" method="post" style="display: inline">';
	PMForm+='<input id="' + formID + '-subject" type="hidden" name="subject" value="" />';
	PMForm+='<input type="hidden" name="addbbcode20" value="100" />';
	PMForm+='<input id="' + formID + '-message" type="hidden" name="message" value="" />';
	PMForm+='<input type="hidden" name="preview" value="Preview" />';
	PMForm+='<input type="hidden" name="attach_sig" value="on" />';
	PMForm+='<input id="' + formID + '-ct" type="hidden" name="creation_time" value="0" />';
	PMForm+='<input id="' + formID + '-lc" type="hidden" name="lastclick" value="0" />';
	for (var i=0; i<forumIDs.length; i++)
	{
		PMForm+='<input type="hidden" name="address_list[u]['+forumIDs[i]+']" value="to" />';
	}
	PMForm+='</form>';
	nodePM.innerHTML=PMForm;

	var permalink=wmer_generate_permalink();
	linkParts=permalink.replace(/#/g, "").split('&');
	for (var j=0; j<linkParts.length; j++)
	{
		if (linkParts[j].indexOf("segments=")==0)
		{
			linkParts.splice (j,1);
			break;
		}
	}
	//console.dir(linkParts);

	var message=wmer_LanguageRU?
		'Есть вопросы по вашим правкам в [url=' + permalink + ']этой области редактирования[/url]:\n\n':
		'Some questions about [url=' + permalink + ']this area[/url]:\n\n';

	permalink=linkParts.join('&');

	for (var i=0; i < sccObjs.length; ++i)
	{
		message += '[b]2' + sccObjs[i].username + '[/b]: '+
			sccObjs[i].type+' ('+
			'[url=' + permalink + '&segments=' + sccObjs[i].objid + ']'+
			(sccObjs[i].country === ''?'':'country: [b]'+sccObjs[i].country+'[/b]/')+
			(sccObjs[i].city === ''?'':'city: [b]'+sccObjs[i].city+'[/b]/')+
			'name: [b]'+(sccObjs[i].street==null?'<<noname>>':sccObjs[i].street)+'[/b]'+
			(sccObjs[i].description === ''?'':'/description: [b]'+sccObjs[i].description+'[/b]') +
			'[/url])\n\n';
	}
	//consoleLog(message);

	getId(formID + '-message').value=message;
	var now=new Date().getTime();
	now /= 1000;
	now = Math.floor(now);
	getId(formID + '-ct').value=now;
	getId(formID + '-lc').value=now;

	getId(formID).action="https://www.waze.com/forum/ucp.php?i=pm&mode=compose&action=post";
	getId(formID + '-subject').value=
		wmer_LanguageRU?
			'[WME Request] Уточнение по вашим правкам.':
			'[WME Request] Question about your map edits';

	//console.dir(getId(formID));

	getId(formID).submit();
	return true; // this forces to open in new tab!
}
// </WME Fancy permalink>


function wmer_WazeBits()
{
	if (typeof Waze === "undefined")
		Waze=unsafeWindow.Waze;

	if (typeof Waze === "undefined")
		Waze=window.Waze;
}

function wmer_FakeLoad()
{
	wmer_WazeBits();

	if (typeof Waze === "undefined")
	{
		console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze not found, retrying in 500ms...');
		setTimeout(wmer_FakeLoad,500);
		return;
	}
	if (typeof Waze.selectionManager === "undefined")
	{
		console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.selectionManager not found, retrying in 500ms...');
		setTimeout(wmer_FakeLoad,500);
		return;
	}
	if (typeof Waze.model === "undefined")
	{
		console.log('WME Requests v.' + wmer_Version + ': ' + 'Waze.model not found, retrying in 500ms...');
		setTimeout(wmer_FakeLoad,500);
		return;
	}

	wazeModel = Waze.model;

	try {
		Waze.selectionManager.events.register("selectionchanged", null, wmer_insertButton);
		console.log('WME Requests v.' + wmer_Version + ': ' + 'added event handler for selectionchanged');
	}
	catch (err) {
		console.log('WME Requests v.' + wmer_Version + ': ' + 'added event handler error: ' +err.name);
	}
}

function wmer_Init() {
	console.log('WME Requests v.' + wmer_Version + ': ' + 'init');
	setTimeout(wmer_FakeLoad, 500);
}

wmer_bootstrap();