WME Latam Pack

Permite fechar UR velhas, fazer um comentário inicial nas URs sem comentário e outras funções bacanas no WME.

// ==UserScript==
// @name                WME Latam Pack
// @description         Permite fechar UR velhas, fazer um comentário inicial nas URs sem comentário e outras funções bacanas no WME.
// @match             https://*.waze.com/*editor*
// @match             https://www.waze.com/*
// @match             https://www.google.com.br/maps*
// @version             0.183
// @grant               ericdanieldavid
// @icon			data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAYCAYAAAB0kZQKAAAABHNCSVQICAgIfAhkiAAABPNJREFUSIntlU2MldUZx3/nvOe8970fzJ1h5nasUxjAURAzBLilxZk7rUbiBGPSBdiYENNVF924aIIbE+Nel91W2xKb+NG6aEtMm5Io3AFEDCQiBMQMDDPAfA/33ve978c5pwvjRueDIu58krM6ef6/f57znOeBH+K+xuZe2L7+XrPFvSRVq8NPWGcOS+SIn/PWdZQ11jpaDUuSpE2EGBOCP5w5U//HfTdRrVbLQvj/DfKq+tQvtrD+QcuDvV00kyapSchMyp3FlNuThnNnl2g20gu+z9P1en3qvpgYHh7eH4b26MgTvTzz5CBCQCsOvzpJE096FHSBcrHMQmuOzlKZo/++yJlT8ygl9586deKD72RiaGjo8Th2Yy8ceowdj25kemmWvM4TJiGtpEVXoRMtfaQnWGw2KZeKLIWLdHd0c+7zcf7+zjjW0X/2bP36cvre3ZioVPo+fe7g1uKWh8pkqSWnc1jn0FLRU+ohUAFSSoy1LDQXyGkf6yyN6A7l9Qrlw43rrV1TUxN/Xk5frmVgz56hFzf2d1R+skXTikK08picm6WrWKar0EVe51GeQnsa5Wkq5W6kEOS0RivN+NUGc3MxgfZ+vBJDrWXCWQ5u3V4kSTPWF3o4+sFFBn50jbfqt/nN8yN44qtihmmElgqnclgyPhy7zuTH88wEHnt0nmaQrPhT1qyEc27bhr5OlFRML7QY3TTJsVN5pq7fZnxqhjANsc4SpRE3liawGN44co6JTxZ4KJezr/z+IP2jO3j/2LHD91wJhKiU1vnkVUBHl+ZfH1U4tHuWY9e6CEqWKInwPR9LhhQebx85x65tA/z6wC/Zuvu53x2dnXl2S3/v06sh1mzMzZs3vbpzT5k70RKByvPI9gfIOh+m+vN+5hozdARl/Jzm5vQ8f/rjRYK2+/hv9c/euTk5/bjQJbN5Y2X0vff/mV+Nsepz7Ny5d19HWeNJQSm3jjiLSbIYFYTMN+bpLvbQjBsshou0bYjSYvbDK/MXH93UM3p1fOrTvt6e/S/+9ldBsWPbm4ODe/etxFl1Tvx099B/dv2sc9/e4QoSjbEG6xy+5yOlxDpLalJSk2BsSilfRNkCubzA2IxbtxtcvjJHoehz7cs2E+Otw6dP11//JmfZnqjVah/ZTI509kgGq+uI0wQlHVJIPCmITRubWhwW5xxCCAKVx8PHyZRWZDDWUOzw2FntJjUxF843EJaby/GWNeGsGHl4l2HgkQLWGowA62J85YMDJRXS8wGQQuJwOOfIbAo4jDUYa7HOEGcJX1xqsDCbzJ0+U39rOd6yjblhQ/+lpRnvoPDbpDZECIlSkpnpmJuTIYWSBGlITUaaJRhncBiidsrVL5aIk4yg6GiGIZcv3eH8yRip7L6JiYkby/FW7ImhoZED1vB2pQ9vw4Bl/pbHlc8MnucAwYEXHqBU1CAEzjnakeHdv0zhnMMYGNieI0kcU+NZ5Ck7OjY2dnwl1poLbGjvyBEHz0uJCvI+pVKJ6ek5+gc023bkMcbia48L51tcu5xR6e0mbLVoRzHGur+ePHni0FqMu17ltVrNaq1FLghoNZuYzCUmQyCExjk8LTLPQxVLJeJ2myzLOH78+F3prz0xv3YrxEvW2tfaUYRz7tbYyRPfWki1Wu1GO4r6nHM4516+W+3/OwYHB7tWu69Wq+XvDf59xv8Aw6gysUnudcsAAAAASUVORK5CYII=
// @namespace http://greasemonkey.chizzum.com
// ==/UserScript==

/// <summary>
///
/// </summary>
/// <param name=""></param>
/// <returns></returns>
var global_tentativaJNF = 0;
var global_tentativaHighlights = 0;

var global_intervalosRealceRadaresUsuario = [];
var global_intervalosRealceRadaresNoSpeed = [];
var global_intervalosRealcePlacesUsuario = [];

var seg_listaSegmentosSelecionados = [];
var seg_NomeCidadeEscolhida = null; //''
var seg_IdEstadoCidadeEscolhida = null; //0
var seg_NomesRuasColetados = [];
var seg_idAcessosTravados = [];

var intervaloPainelNumeracao = 0;

///comando   |  TimeoutID   |   FinishStatus    |   isSaveComand
let global_FilaInstrucaoAssincrona = [];

//realce de places
var ou_RealcePlaceLastLon;
var ou_RealcePlaceLastLat;
var ou_RealcePlaceLastZoom;

//LISTAS----------------------------------------------------------------------------------------------
var lstChamps = false;
var champsBrazil = [];

var lstLogradouros = false;
var logradouros = [];
var logradourosAbreviados = [];

var lstPrefixos = false;
var prefixosNomes = [];
var prefixosNomesAbreviados = [];

var lstGrafias = false;
var grafias = [];
var grafiasCorretas = [];

var lstPalavrasFeias = false;
var palavrasFeias = [];

var lstUFs = false;
var UFestados = [];
var UFestadosSiglas = [];

var WMEBasepais = '';
var lstTraducoes = false;
var traducoes = [];
var traducoeColunas = { id: 0, posicao: 1, Traducao: 2 };
var enuTipoSubstituicao = { innerText: 0, value: 1, previousSibling: 2, previousSibling2x: 3, nextSibling: 4, textoSimples: 5 };

var lstNomeCategoria = false;
var nomeCategoria = [];
var nomeCategoriaColunas = { Identificacao: 0, NomePadrao: 1, Categoria: 2 };

//Final das LISTAS------------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------------------------------
/*INICIO Inicialização de componentes e HTML*/
//-----------------------------------------------------------------------------------------------------------
function genericBootstrap() {
	console.log('init');
	if (typeof (unsafeWindow) === "undefined") {
		unsafeWindow = (function () {
			var dummyElem = document.createElement('p');
			dummyElem.onclick = function () { return window; };
			return dummyElem.onclick();
		})();
	}

	if (window.location.host.indexOf("waze.com") != -1) {
		//livemap, UL ou location
		if (window.location.pathname.indexOf("livemap") != -1 || window.location.pathname.indexOf("ul") != -1 || window.location.pathname.indexOf("location") != -1)
		{
			console.log('Pagamos o livemap UL/Location. Vamos criar o butão já já.');
			window.setTimeout(
				function () {

					var inicio = 0;
					var acrescimo = 0;

					//?navigate=yes&latlng=-5.07765456%2C-42.79673475
					if (window.location.search.indexOf("latlng=") != -1) {
						inicio = window.location.search.indexOf("latlng=");
						acrescimo = 7;
					}
					//?ll=-23.20178914%2C-46.79734826&navigate=yes&zoom=17"
					else if (window.location.search.indexOf("ll=") != -1) {
						inicio = window.location.search.indexOf("ll=");
						acrescimo = 3;
					}
										
					var meio = window.location.search.indexOf("%2C");
					var fim = window.location.search.indexOf("&zoom");
			
					var lon = window.location.search.substring(meio + 3, fim); 
					var lat = window.location.search.substring(inicio + acrescimo, meio);

					var botao = '<div class="wz-poi-actions" style="text-align: center;"><a class="wz-app-button is-primary js-routing-button" href="https://www.waze.com/reporting/location?lat=' + lat + '&lng=' + lon + '&zoom=17" ';
					botao += 'target="_blank" >Criar Alerta Programado</a></div> ';
					document.getElementsByClassName("wz-folding is-open")[0].innerHTML += botao;

				}, 5000);
		}
		else if (window.location.pathname.indexOf("editor") != -1 )
		{
			console.log('Pagamos o editor. Vamos criar o butão já já.');
			window.setTimeout(genericInitScript, 500);
		}
		return;
	}
	else if (window.location.host.indexOf("anp.gov.br") != -1) {
		window.setTimeout(
			function () {
				//define o municipio e clica em pesquisar. Bença pai!
				console.log('Ahhhh muleke vamos lá, caçar na ANP.');

				var municipio = unescape(genericGetQueryString(window.location.href, "WmeMunicipio"));
				var municipiosDropDown = document.getElementsByName("sMunicipio")[0].children;

				console.log(municipio);
				console.log(municipiosDropDown);

				for (var i = 0; i < municipiosDropDown.length; i++) {
					if (genericCompararTextos(municipiosDropDown[i].text, municipio)) {
						document.getElementsByName("sMunicipio")[0].value = municipiosDropDown[i].value;
						document.getElementsByName("bPesquisar")[0].click();
						return;
					}
				}

				//se chegou aqui é pq não achou. Dá alerta!!!
				alert('Puxa, não consegui localizar o município que estava sendo visualizado no Wme. Selecione manualmente por favor.');

			}
			, 2000);
	}
	else if (window.location.href.indexOf("google.com.br/maps") != -1) {
		window.setTimeout(googleInitWme, 5000);
		return;
	}
}

function googleInitWme() {

	if (document.getElementsByClassName("widget-settings-content").length == 0) {
		//painel nunca foi aberto. Tenta denovo daqui 5 segundos.
		window.setTimeout(googleInitWme, 5000);
	}
	else if (document.getElementById('painelEditorWME') != null) {
		//painel já existe, bença e não faça nada meu amigo!
	}
	else {
		var string = '<ul><li><a role="menuitem" class="widget-settings-button" id="btnIrWme" href="" target="_blank">';
		string += '<div class="widget-settings-button-icon widget-settings-button-icon-default maps-sprite-settings-rate-review">';
		string += '</div> <div class="widget-settings-button-icon widget-settings-button-icon-hover maps-sprite-settings-rate-review-blue">';
		string += '</div> ';
		string += '<label class="widget-settings-button-label">Editar no WME</label> ';
		string += '</a>';
		string += 'com Zoom: <input type="number" min="1" max="8" value="4" size="1" id="inputZoomWME" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;">  ';
		string += '</li></ul>';

		var painel = document.createElement('div');
		painel.className = "widget-settings-list";
		painel.id = "painelEditorWME";

		painel.innerHTML = string;

		var referencial = document.getElementsByClassName("widget-settings-content")[0];
		referencial.insertBefore(painel, referencial.childNodes[4]);
		document.getElementById('btnIrWme').onclick = funOu_LinkFromGMaps;
	}
}

function genericInitScript() {
	//	Waze object needed
	if (typeof (W) == 'undefined') {
		console.log('W NOK');
		window.setTimeout(genericInitScript, 500);
		return;
    }
    MUV_Waze = W;
	MUV_waze_loginmanager = MUV_Waze.loginManager;
	if (typeof (MUV_waze_loginmanager) == 'undefined') {
		console.log('login manager NOK');
		window.setTimeout(genericInitScript, 500);
		return;
	}
	MUV_waze_user = MUV_waze_loginmanager.user;
	if (typeof (MUV_waze_user) == 'undefined' || MUV_waze_user == null) {
		console.log('user NOK');
		window.setTimeout(genericInitScript, 500);
		return;
	}
	if (MUV_waze_user.rank < 2) {
		console.log('Funções apenas disponíveis para níveis superiores.');
		return;
	}

	//Se tiver o URO+ ele usa o objeto de lá, senão cria um aqui.
	if (typeof wazeModel == "undefined") {
		if (typeof W.model != "undefined") {
			wazeModel = W.model;
		}
		else if (typeof W != "undefined") {
			if (typeof W.controller != "undefined") {
				if (typeof W.controller.model != "undefined") {
					wazeModel = W.controller.model;
				}
				else {
					window.setTimeout(genericInitScript, 500);
					return;
				}
			}
			else {
				window.setTimeout(genericInitScript, 500);
				return;
			}
		}
		else {
			window.setTimeout(genericInitScript, 500);
			return;

		}
	}

	//	Waze GUI needed
	MUV_userInfos = document.getElementById('user-details');
	if (typeof (MUV_userInfos) === 'undefined') {
		console.log('userInfos NOK');
		window.setTimeout(genericInitScript, 500);
		return;
	}

	//Dá uma espera pra ver se o JNF carregou....
	if (typeof (WMETB_JNF_FixNode) == 'undefined' && typeof (WME_JNF_FixNode) == 'undefined' && global_tentativaJNF < 5) {
		window.setTimeout(genericInitScript, 500);
		global_tentativaJNF++;
		console.log('global_tentativaJNF' + global_tentativaJNF);
		return;
	}

	if (typeof (wmech_version) == 'undefined' && global_tentativaHighlights < 5) {
		window.setTimeout(genericInitScript, 500);
		global_tentativaHighlights++;
		return;
	}

	genericLoadLists();
}

function genericLoadLists() {
	for (var codpais in wazeModel.countries.objects) {
		WMEBasepais = wazeModel.countries.objects[codpais].name;
		break;
	}

	if (WMEBasepais == '') {
		//Não carregou país ainda.
		window.setTimeout(genericLoadLists, 1500);
		return;
	}

	window.setTimeout(function () { genericLoadLists_Wait(1); }, 15000);

	var apiURL = "https://sheets.googleapis.com/v4/spreadsheets/14jhrmpba7HLrd1s4GsYerdr9QP_Zgvz7c2C0Qdg2w8k/values/";
	var apiKey = "AIzaSyCUDfVh0blt62O3ee92vYxmsxFLz4vbqDo";

	//champs
	$.getJSON(apiURL+ "champs/?key=" + apiKey, function (data) {
		//console.log(data);

		for (var i = 0; i < data.values.length; i++) {
			if (data.values[i][1] == WMEBasepais) {
				champsBrazil.push(data.values[i][0]);
			}
		}
		localStorage.setItem("champsBrazil", champsBrazil);

		lstChamps = true;
	});
	//Logradouros
	$.getJSON(apiURL+ "Logradouros/?key=" + apiKey, function (data) {

		for (var i = 0; i < data.values.length; i++) {
			if (data.values[i][2] == WMEBasepais) {
				logradouros.push(data.values[i][0]);
				logradourosAbreviados.push(data.values[i][1]);
			}
		}
		localStorage.setItem("logradouros", logradouros);
		localStorage.setItem("logradourosAbreviados", logradourosAbreviados);

		lstLogradouros = true;
	});
	//Abreviaturas
	$.getJSON(apiURL+ "Abreviaturas/?key=" + apiKey, function (data) {
		//console.log(data.values);

		for (var i = 0; i < data.values.length; i++) {
			if (data.values[i][2] == WMEBasepais) {
				prefixosNomes.push(data.values[i][0]);
				prefixosNomesAbreviados.push(data.values[i][1]);
			}
		}
		localStorage.setItem("prefixosNomes", prefixosNomes);
		localStorage.setItem("prefixosNomesAbreviados", prefixosNomesAbreviados);

		lstPrefixos = true;
	});
	//Grafias
	$.getJSON(apiURL+ "Grafias/?key=" + apiKey, function (data) {
		//console.log(data.values);

		for (var i = 0; i < data.values.length; i++) {
			if (data.values[i][2] == WMEBasepais) {
				grafias.push(data.values[i][0]);
				grafiasCorretas.push(data.values[i][1]);
			}
		}
		localStorage.setItem("grafias", grafias);
		localStorage.setItem("grafiasCorretas", grafiasCorretas);

		lstGrafias = true;
	});
	//BadWord
	$.getJSON(apiURL+ "BadWords/?key=" + apiKey, function (data) {
		//console.log(data.values);

		for (var i = 0; i < data.values.length; i++) {
			if (data.values[i][1] == WMEBasepais) {
				palavrasFeias.push(data.values[i][0]);
			}
		}
		localStorage.setItem("palavrasFeias", palavrasFeias);

		lstPalavrasFeias = true;
	});
	//UFs
	$.getJSON(apiURL+ "UFs/?key=" + apiKey, function (data) {
		//console.log(data.values);

		for (var i = 0; i < data.values.length; i++) {
			if (data.values[i][2] == WMEBasepais) {
				UFestados.push(data.values[i][0]);
				UFestadosSiglas.push(data.values[i][1]);
			}
		}
		localStorage.setItem("UFestados", UFestados);
		localStorage.setItem("UFestadosSiglas", UFestadosSiglas);

		lstUFs = true;
	});
	// //Traduções
	$.getJSON(apiURL+ "Traduções/?key=" + apiKey, function (data) {
		//console.log(data.values);

		var colunas = data.values[0]; //Primeira linha
		var colunaPais = colunas.indexOf(WMEBasepais);

		for (var i = 1; i < data.values.length; i++) {
			var traducaoItem = [];

			traducaoItem.push(data.values[i][0]);
			traducaoItem.push(data.values[i][1]);

			if (typeof (data.values[i][colunaPais]) != 'undefined') {
				traducaoItem.push(data.values[i][colunaPais]);
			}

			traducoes.push(traducaoItem);
		}
		localStorage.setItem("traducoes", traducoes);
		lstTraducoes = true;
	});
	//NomeCategoria
	$.getJSON(apiURL+ "NomeCategoria/?key=" + apiKey, function (data) {
		//console.log(data.values);

		for (var i = 0; i < data.values.length; i++) {
			if (data.values[i][3] == WMEBasepais) {
				var itemCategoria = [];
				itemCategoria.push(data.values[i][0]);
				itemCategoria.push(data.values[i][1]);
				itemCategoria.push(data.values[i][2]);

				nomeCategoria.push(itemCategoria);
			}
		}
		localStorage.setItem("nomeCategoria", nomeCategoria);

		lstNomeCategoria = true;
	});
}



function genericLoadLists_Wait(tentativa) {
	console.log('Tentando grafia ' + tentativa);

	if (lstChamps &&
		lstLogradouros &&
		lstPrefixos &&
		lstGrafias &&
		lstPalavrasFeias &&
		lstUFs &&
		lstTraducoes &&
		lstNomeCategoria
		) {
		window.setTimeout(genericMontarHTML, 2000);
	}
	else {
		if (tentativa < 5) {
			console.log('Aguardando atualização de grafias');
			window.setTimeout(function () { genericLoadLists_Wait(tentativa + 1); }, 700);
		}
		else {
			console.log('Impossível obter atualização de grafias.');

			var msg = genericTraducao('msg_Impossivel');
			genericExibirMensagem(msg);

			champsBrazil = localStorage.getItem("champsBrazil").split(',');
			logradouros = localStorage.getItem("logradouros").split(',');
			logradourosAbreviados = localStorage.getItem("logradourosAbreviados").split(',');
			prefixosNomes = localStorage.getItem("prefixosNomes").split(',');
			prefixosNomesAbreviados = localStorage.getItem("prefixosNomesAbreviados").split(',');
			grafias = localStorage.getItem("grafias").split(',');
			grafiasCorretas = localStorage.getItem("grafiasCorretas").split(',');
			palavrasFeias = localStorage.getItem("palavrasFeias").split(',');
			UFestados = localStorage.getItem("UFestados").split(',');
			UFestadosSiglas = localStorage.getItem("UFestadosSiglas").split(',');

			var traducoesPrev = localStorage.getItem("traducoes").split(',');
			for (var i = 0; i < traducoesPrev.length; i = i + 3) {
				traducoes.push([traducoesPrev[i], traducoesPrev[i + 1], traducoesPrev[i + 2]]);
			}

			var NomeCategoriaPrev = localStorage.getItem("nomeCategoria").split(',');
			for (var i = 0; i < NomeCategoriaPrev.length; i = i + 3) {
				nomeCategoria.push([NomeCategoriaPrev[i], NomeCategoriaPrev[i + 1], NomeCategoriaPrev[i + 2]]);
			}

			lslstChamps = true;
			lstLogradouros = true;
			lstPrefixos = true;
			lstGrafias = true;
			lstPalavrasFeias = true;
			lstUFs = true;
			lstTraducoes = true;

			lstNomeCategoria = true;

			window.setTimeout(genericMontarHTML, 2000);
		}
	}
}

function genericMontarHTML() {

	var scriptTestDebug = (typeof (chrome.extension) == 'undefined');

	/*Permissões.*/
	var JNFInstalado = (typeof (WMETB_JNF_FixNode) != 'undefined' || typeof (WME_JNF_FixNode) != 'undefined');
	var ResolvedorSenior = (W.loginManager.user.rank >= 3);
	var userChamp = champsBrazil.indexOf(W.loginManager.user.userName) != -1;
	
	if (!ResolvedorSenior && userChamp)
	{
		ResolvedorSenior = true;
	}

	if (W.loginManager.user.rank < 2) {
		return;
	}

	/*HTML de verdade*/

	pckControls = document.createElement('section');
	pckControls.style.fontSiaze = '12px';
	pckControls.id = "sidepanel-mastersbrasil";
	pckControls.className = "tab-pane";
	tabbyHTML = '';
	tabbyHTML += '<p><ul class="nav nav-tabs">';
	/*aba URS, link e definição*/
	tabbyHTML += '<li><a href="#" id="_WmelinkURs" style="text-decoration:none;font-size:12px">URs</a></li>';
	/*aba Vias, link e definição*/
	tabbyHTML += '<li><a href="#" id="_WmelinkVias" style="text-decoration:none;font-size:12px">Vias</a></li>';
	/*aba Places, link e definição*/
	tabbyHTML += '<li><a href="#" id="_WmelinkPlaces" style="text-decoration:none;font-size:12px">Places</a></li>';
	/*aba Outras, link e definição*/
	tabbyHTML += '<li><a href="#" id="_WmelinkOutrasFuncoes" style="text-decoration:none;font-size:12px">Outras Funções</a></li>';
	tabbyHTML += '</ul>';
	pckControls.innerHTML = tabbyHTML;

	/////////////////////////////*Conteúdo aba URS*/////////////////////////////
	abaURS = document.createElement('p');
	abaURS.id = 'abaURs';
	abaURS.style = 'height:300px!important;';
	abaURS.innerHTML = '<br>';
	if (ResolvedorSenior) {
		abaURS.innerHTML += '<a id="dadosURs" download="" href="">Obter CSV de informações das URs</a>';
	}
	abaURS.innerHTML += '<hr style="margin-top: 5px;margin-bottom:5px;">';
	abaURS.innerHTML += '<b>Acompanhamento de URs visíveis</b><br/>';
	abaURS.innerHTML += '<input type="button" id="btnSeguirTodas" value="Seguir todas"/><br/>';
	abaURS.innerHTML += '<input type="button" id="btnNaoSeguirTodas" value="Parar de seguir"/>';
	abaURS.innerHTML += '<hr style="margin-top: 5px;margin-bottom:10px;">';

	abaURS.innerHTML += '<b>Comunicação com as URs</b><br/>';  //@JuniorDummer - Melhoria visual  ////////////////////////FALTA TRADUÇÃO///////////////////////
	abaURS.innerHTML += 'Apenas nas URs abertas há mais de: <input type="number" min="0" value="0" size="2" style="width:50px;line-height:14px;height:22px;margin-bottom:3px;"	id="_inputDiasMensagemInicial"/><br/>';
	abaURS.innerHTML += 'Mensagem:'; //@JuniorDummer - Melhoria visual ////////////////////////FALTA TRADUÇÃO///////////////////////
	abaURS.innerHTML += '<input type="text" id="_txtAberturaUR" value="" style="width:190px;line-height:14px;height:22px;margin-bottom:4px; margin-top:4px;" title="Mensagem que deseja enviar nas URs"/><br/>';
	abaURS.innerHTML += '<input type="checkbox" id="chkSeguirInicial" checked="false" />Seguir URs comentadas<br/>';
	abaURS.innerHTML += '<input type="button" id="_MUV_btnAbre" value="Iniciar comunicação de URs"/><br/>';
	

	abaURS.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';
	abaURS.innerHTML += '<b>Fechamento de URs</b><br/>';	//@JuniorDummer - Melhoria visual ////////////////////////FALTA TRADUÇÃO///////////////////////
	abaURS.innerHTML += 'Qtd dias abertura: <input type="number" min="7" value="15" size="2" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;margin-top:4px;"	id="_inputDiasAberturaUR"/><br/>';
	abaURS.innerHTML += 'Qtd dias últ comentário: <input type="number" min="3" value="7" size="2" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;" id="_inputDiasComentarioUR"/><br/>';
	abaURS.innerHTML += 'Mensagem:'; //@JuniorDummer - Melhoria visual ////////////////////////FALTA TRADUÇÃO///////////////////////
	abaURS.innerHTML += '<input type="text" id="_txtFechamentoUR" value="" style="width:190px;line-height:25px;height:22px;margin-bottom:4px;"/><br/>';
	abaURS.innerHTML += '<input type="checkbox" id="chkOferecerAjuda" checked="true" /> Enviar comentário de apoio.<br/>';
	abaURS.innerHTML += '<input type="checkbox" id="chkFecharApenasVisiveis" checked="true" /> Apenas as visíveis.<br/>';
	abaURS.innerHTML += '<input type="button" id="_MUV_btnFecha" value="Fechar URs não identificadas" /><br/><br/>';


	if (ResolvedorSenior) {
		abaURS.innerHTML += '<input type="checkbox" id="chkResolverModoBruto" /> Modo bruto.<br/>';
		abaURS.innerHTML += '<input type="button" id="_btnResolver" value="Resolver todas as URs" title="Apriori apenas URs sem nenhum comentário serão resolvidas." /><br/>';

		abaURS.innerHTML += '<input type="checkbox" id="chkResolverOK" checked="true"/> Resolvido &nbsp&nbsp';
		abaURS.innerHTML += '<input type="checkbox" id="chkResolverNI" /> Não Identificado.<br/><br/>';

		abaURS.innerHTML += '<input type="button" id="_MUV_btnFechaMP" value="Resolver todas as MPs visíveis"/><br/><br/>';
		abaURS.innerHTML += '<select id="selFanfarrao" style="width:100px;line-height:25px;height:22px;margin-bottom:4px;"></select><br/>';
		abaURS.innerHTML += '<input type="button" id="btnFanfarrao" value="Contar URs fechadas pelo fanfarrão" />';
		abaURS.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';
	}

	abaURS.innerHTML += 'Enviar comentário em todas as URs (pode ser filtrada com URO+)<br/>';
	abaURS.innerHTML += '<input type="text" id="txtComentario" value="" style="width:256px;line-height:25px;height:22px;margin-bottom:4px;"/><br/>';
	abaURS.innerHTML += '<input type="button" id="btnComentar" value="Enviar"/>';


   /////////////////////*conteúdo aba Vias*/////////////////////
	abaVias = document.createElement('p');
	abaVias.id = 'abaVias';
	abaVias.style = 'height:300px!important;';
	abaVias.innerHTML = '<br>';
    	
	if (ResolvedorSenior) {
		abaVias.innerHTML += '<input type="button" id="btnPermitirTudo" value="Permitir todas as conversões" /><br/><br/>';
		abaVias.innerHTML += '<input type="button" id="btnLiberacao" value="Liberar junções travadas" /><br/><br/>';
	
		abaVias.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';
		abaVias.innerHTML += '<b>Revisão de Nomes</b><br/>';
		abaVias.innerHTML += 'Cidade para atribuir aos segmentos "não nomeados".<br/>';
		abaVias.innerHTML += '<select id="selCidadeSegNome" style="width:100px;line-height:25px;height:22px;margin-bottom:4px;"></select><br/>';
		if (userChamp) {
			abaVias.innerHTML += '<input type="checkbox" id="chkRevisaoPlace" checked="false"/> Revisar nomes de places.';
		}

		abaVias.innerHTML += '<input type="button" id="btnIniciarRevisao" value="Iniciar" />&nbsp&nbsp';      //<<<<======= Start
		abaVias.innerHTML += '<input type="button" id="btnPararRevisao" value="Parar" disabled="true" /><br/><br/>';
	}

	abaVias.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';
	abaVias.innerHTML += 'Acessos/saídas das vias<br/>';
	abaVias.innerHTML += '<input type="checkbox" id="chkViaIn" checked="true"/> Acesso.';
	abaVias.innerHTML += '<input type="checkbox" id="chkViaOut" checked="true"/> Saída.<br/>';
	abaVias.innerHTML += '<input type="button" id="btnTestaAcessoVia" value="Testar"/>';

	abaVias.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';
	abaVias.innerHTML += '<input type="checkbox" id="chkProtegerTotal"/>Proteção total<br/>';
	abaVias.innerHTML += '<input type="button" id="btnProtegerMapa" value="Proteger o mapa"/>';
	

	abaVias.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';
	abaVias.innerHTML += '<input type="checkbox" id="chkDirty4x4" /> Realçar vias marcadas como Dirt Road / 4x4 Trail.<br/>';
	abaVias.innerHTML += '<input type="checkbox" id="chkSobrescritaInstrucao" /> Realçar vias com instrução forçada.<br/>';
	abaVias.innerHTML += '<input type="checkbox" id="chkRoteamento" /> Realçar vias com roteamento.<br/>';
	abaVias.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';
	abaVias.innerHTML += '<input type="checkbox" id="chkVelocidades" /> Avaliar velocidades.<br/>';
	abaVias.innerHTML += '<input type="checkbox" id="chkMaturidade" /> Avaliar maturidade.<br/>';
	abaVias.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';
	abaVias.innerHTML += '<input type="checkbox" id="chkClosures" /> Apresentar interdições no feed.<br/>';
	abaVias.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';

	abaVias.innerHTML += 'Tolerância de alinhamento para seleção: <input type="number" min="0" value="1" size="2" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;"	id="inputToleranciaAlinhamento" title="Sabe aquela coisa chata de ter que selecionar vários picadinhos de segmentos sem nome, para depois colocar o nome nos benditos? Bem selecione apenas dois deles, que estejam juntos. Na aba WME Brasil vai ter um botão que te ajudará muito."/><br/>';

	/*conteúdo aba Places*/
	abaPlaces = document.createElement('p');
	abaPlaces.id = 'abaPlaces';
	abaPlaces.style = 'height:300px!important;';
	abaPlaces.innerHTML = '<br>';
	abaPlaces.innerHTML += '<input type="button" id="btnSelecionarSobreposto" value="Selecionar place (sobreposto em nó)" /><br/><br/>';
	abaPlaces.innerHTML += 'Tolerância de espaçamento: <input type="number" min="0" value="5" size="2" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;"	id="inputEspacamentoTolerancia"/><br/>';
	abaPlaces.innerHTML += '<input type="checkbox" id="chkPlacesProblematicos"/> Realçar possíveis places problemáticos.';
	abaPlaces.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';

	if (ResolvedorSenior) {
		abaPlaces.innerHTML += 'Updates<br/>';
		abaPlaces.innerHTML += '<input type="button" id="btnPlacesTrue" value="Aprovar todos" />&nbsp';
		abaPlaces.innerHTML += '<input type="button" id="btnPlacesFalse" value="Reprovar todos" /><br/>';

		abaPlaces.innerHTML += '<input type="checkbox" id="chkPlaceUsuario"/>Apenas usuário selecionado:<br/>';
		abaPlaces.innerHTML += '<select id="selUsuariosPlaces" style="width:100px;line-height:25px;height:22px;margin-bottom:4px;"></select><br/>';
		abaPlaces.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';
	}

	abaPlaces.innerHTML += 'Postos de combustível<br/>';
	abaPlaces.innerHTML += '<select id="selCidadePosto" style="width:100px;line-height:25px;height:22px;margin-bottom:4px;"></select><br/>';
	abaPlaces.innerHTML += '<input type="button" id="btnPesquisarPosto" value="Pesquisar" />';

	abaPlaces.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';

	abaPlaces.innerHTML += 'Lock<br/>';
	abaPlaces.innerHTML += '<input type="checkbox" id="chkLockPonto"/>Ponto ';
	abaPlaces.innerHTML += '<input type="checkbox" id="chkLockArea"/>Area<br/>';
	abaPlaces.innerHTML += 'Nível desejado: <input type="number" min="1" max="6" value="2" size="1" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;"	id="inputLockLevel"/><br/>';
	abaPlaces.innerHTML += '<input type="checkbox" id="chkRaiseLock"/>Subir<input type="checkbox" id="chkLowerLock"/>Descer<br/>';
	abaPlaces.innerHTML += '<input type="button" id="btnLockPlace" value="Efetuar" />';

	abaPlaces.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';

	if (ResolvedorSenior) {
		abaPlaces.innerHTML += 'Revisão de Places<br/>';
		abaPlaces.innerHTML += '<input type="button" id="btnIniciarRevisaoPlace" value="Iniciar" />&nbsp&nbsp';
		abaPlaces.innerHTML += '<input type="button" id="btnPararRevisaoPlace" value="Parar" disabled="true" /><br/>';

		abaPlaces.innerHTML += '<input type="checkbox" id="chkNomeCategoria"/>Corrigir categorias comumente erradas.<br/>';
	}

	/*conteúdo aba Outras*/
	abaOutrasFuncoes = document.createElement('p');
	abaOutrasFuncoes.id = "abaOutrasFuncoes";
	abaOutrasFuncoes.style = 'height:300px!important;';
	abaOutrasFuncoes.innerHTML = '<br>';

	abaOutrasFuncoes.innerHTML += '<input type="button" id="btnComentariosNovatos" value="Comentário de boas vias à novatos" /><br/><br/>';
	abaOutrasFuncoes.innerHTML += '<input type="text" id="txtComentarioNovato" value="" style="width:256px;line-height:25px;height:22px;margin-bottom:4px;"/><br/>';

	abaOutrasFuncoes.innerHTML += '<b>Radares</b><br/>';
	abaOutrasFuncoes.innerHTML += '<input type="checkbox" id="chkRadaresZerados" value="0" /> Realçar os sem velocidade e considerar para exclusão<br/>';

	abaOutrasFuncoes.innerHTML += '<select id="selUsuarioRadar" style="width:100px;line-height:25px;height:22px;margin-bottom:4px;"></select><br/>';
	abaOutrasFuncoes.innerHTML += '<input type="checkbox" id="chkRadarNAO" value="0" /> Não... <br/>';
	abaOutrasFuncoes.innerHTML += '<input type="checkbox" id="chkRadarCriado" value="0" /> Criado ';
	abaOutrasFuncoes.innerHTML += '<input type="checkbox" id="chkRadarAtualizado" value="0" /> Atualizado<br/>';
	abaOutrasFuncoes.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';

	abaOutrasFuncoes.innerHTML += '<input type="button" id="btnGmaps" value="Exibir no Google Maps" /><br/><br/>';
	abaOutrasFuncoes.innerHTML += '<input type="button" id="btnZoom" value="Exibir com mais zoom" /><br/><br/>';
	abaOutrasFuncoes.innerHTML += '<input type="button" id="_btnUndoAll" value="Desfazer todas as alterações" /><br/><br/>';
	abaOutrasFuncoes.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';

	if (userChamp) {
		abaOutrasFuncoes.innerHTML += '<a id="dadosEditores" download="" href="">Obter CSV de informações dos editores</a><br/><br/>';
	}

	abaOutrasFuncoes.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';
	abaOutrasFuncoes.innerHTML += 'Intervalo das execuções assíncronas (em segundos): <input type="number" min="1" value="1" size="2" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;"	id="inputExecAssync" title="Revisão de nomes, aprovação de places e outras coisas usam esse valor para calcular o tempo de cada comando a ser executado."/><br/>';

	abaOutrasFuncoes.innerHTML += '<input type="checkbox" id="chkDebugMode">Debug Mode</input><br/>';
	
	var userTabs = document.getElementById('user-info');
	var navTabs = genericgetByClass('nav-tabs', userTabs)[0];
	var tabContent = genericgetByClass('tab-content', userTabs)[0];

	newtabUR = document.createElement('li');
	newtabUR.innerHTML = '<a href="#sidepanel-mastersbrasil" data-toggle="tab" id="tituloCabecalho">WME Brasil</a>';
	newtabUR.innerHTML += '<img id="assyncEngine" src=""></img>';
	navTabs.appendChild(newtabUR);

	tabContent.appendChild(pckControls);

	pckControls.appendChild(abaURS);
	pckControls.appendChild(abaVias);
	pckControls.appendChild(abaPlaces);
	pckControls.appendChild(abaOutrasFuncoes);

	funNav_TabExibirFuncoes('URs');

	//Pegando valores customizados do usuário
	genericObterCheckboxPersistido('chkSeguirInicial');
	genericObterCheckboxPersistido('chkProtegerTotal');
	
	genericObterCheckboxPersistido('chkDirty4x4');
	genericObterCheckboxPersistido('chkSobrescritaInstrucao');
	genericObterCheckboxPersistido('chkRoteamento');
	genericObterCheckboxPersistido('chkClosures');
	genericObterCheckboxPersistido('chkVelocidades');
	genericObterCheckboxPersistido('chkMaturidade');
	genericObterCheckboxPersistido('chkPlacesProblematicos');
	
	if (ResolvedorSenior) {
		genericObterCheckboxPersistido('chkNomeCategoria');
	}

	if (localStorage.getItem("inputExecAssync") != null) {
		document.getElementById('inputExecAssync').value = localStorage.getItem("inputExecAssync");
	}

	//Eventos------------------------------------------
	//Abas
	document.getElementById('_WmelinkURs').onclick = function () { funNav_TabExibirFuncoes('URs'); };
	document.getElementById('_WmelinkVias').onclick = function () { funNav_TabExibirFuncoes('Vias'); };
	
	document.getElementById('_WmelinkPlaces').onclick = function () { funNav_TabExibirFuncoes('Places'); };
	document.getElementById('_WmelinkOutrasFuncoes').onclick = function () { funNav_TabExibirFuncoes('OutrasFuncoes'); };
	//Botões
	document.getElementById('dadosURs').onclick = funUR_ObterDados;
	document.getElementById('btnSeguirTodas').onclick = function () { funUR_SeguirTodasVisiveis(true) };
	document.getElementById('btnNaoSeguirTodas').onclick = function () { funUR_SeguirTodasVisiveis(false) };
	document.getElementById('_MUV_btnAbre').onclick = funUR_IniciarComunicacao;
	document.getElementById('_MUV_btnFecha').onclick = funUR_Encerramento;

	document.getElementById('btnComentar').onclick = funUR_EnviarComentario;
	if (ResolvedorSenior) {
		document.getElementById('_btnResolver').onclick = funUR_ResolverVisiveis;

		document.getElementById('chkResolverOK').onclick = function()
		{
			document.getElementById('chkResolverNI').checked = !document.getElementById('chkResolverOK').checked;
		};

		document.getElementById('chkResolverNI').onclick = function()
		{
			document.getElementById('chkResolverOK').checked = !document.getElementById('chkResolverNI').checked;
		};

		document.getElementById('btnFanfarrao').onclick = funUR_ContarFechadasUsuario;
		document.getElementById('_MUV_btnFechaMP').onclick = funUR_EncerramentoMP;
	}

	if (ResolvedorSenior) {
		document.getElementById('btnPermitirTudo').onclick = function () { funVia_CorretorDeNo('Permissao'); };
		document.getElementById('btnLiberacao').onclick = function () { funVia_CorretorDeNo('Liberacao'); };

		document.getElementById('btnIniciarRevisao').onclick = funRevVia_IniciarFaxinaNew;
		document.getElementById('btnPararRevisao').onclick = genericAssincStop;

		document.getElementById('selCidadeSegNome').onfocus = function () {
			seg_listaSegmentosSelecionados = [];
			genericLoadDropDownCidades('selCidadeSegNome');
		};
	}

	document.getElementById('btnTestaAcessoVia').onclick = funVia_TestarAcessos;
	document.getElementById('btnProtegerMapa').onclick = funVia_ProtegerMapa;
	
	document.getElementById('btnSelecionarSobreposto').onclick = funPlace_SelecionarSobreposto;
	document.getElementById('chkPlacesProblematicos').onclick = genericPersistirCheckboxes;

	if (ResolvedorSenior) {
		document.getElementById('btnPlacesTrue').onclick = function () { funPlace_AprovarReprovarPU(true); };
		document.getElementById('btnPlacesFalse').onclick = function () { funPlace_AprovarReprovarPU(false); };
		document.getElementById('selUsuariosPlaces').onclick = funPlace_RealcarPUsDoUsuario;
	}

	document.getElementById('selCidadePosto').onfocus = function () { genericLoadDropDownCidades('selCidadePosto'); };
	document.getElementById('btnPesquisarPosto').onclick = funPlace_PesquisarANP;
	document.getElementById('btnLockPlace').onclick = funPlace_LockPlace;

	if (ResolvedorSenior) {
		document.getElementById('btnIniciarRevisaoPlace').onclick = funRevPla_IniciarFaxina;
		document.getElementById('btnPararRevisaoPlace').onclick = genericAssincStop;

		document.getElementById('chkNomeCategoria').onclick = genericPersistirCheckboxes
	}

	document.getElementById('chkSeguirInicial').onclick = genericPersistirCheckboxes;
	document.getElementById('chkProtegerTotal').onclick = genericPersistirCheckboxes;
	
	document.getElementById('chkDirty4x4').onclick = genericPersistirCheckboxes;
	document.getElementById('chkSobrescritaInstrucao').onclick = genericPersistirCheckboxes;
	document.getElementById('chkRoteamento').onclick = genericPersistirCheckboxes;
	document.getElementById('chkMaturidade').onclick = genericPersistirCheckboxes;
	document.getElementById('chkVelocidades').onclick = genericPersistirCheckboxes;

	document.getElementById('chkClosures').onclick = genericPersistirCheckboxes;
	document.getElementById('inputExecAssync').onchange = function () { localStorage.setItem("inputExecAssync", document.getElementById('inputExecAssync').value); };

    document.getElementById('btnComentariosNovatos').onclick = funOu_ComentarioNovatos;

	document.getElementById('selUsuarioRadar').onfocus = funOu_ListarUsuariosRadar;
	document.getElementById('selUsuarioRadar').onclick = funOu_RealcarRadaresUsuario;

	document.getElementById('chkRadarNAO').onclick = funOu_RealcarRadaresUsuario;
	document.getElementById('chkRadarCriado').onclick = funOu_RealcarRadaresUsuario;
	document.getElementById('chkRadarAtualizado').onclick = funOu_RealcarRadaresUsuario;
	document.getElementById('chkRadaresZerados').onclick = funOu_Realcadores;

	document.getElementById('btnGmaps').onclick = funOu_LinkGMaps;
	document.getElementById('btnZoom').onclick = funOu_LinkZoomed;

	document.getElementById('_btnUndoAll').onclick = funOu_DesfazerTudo;

	if (userChamp) {
		document.getElementById('dadosEditores').onclick = funOu_ObterDadosTodosEditores;
	}

	//DropdownLists
	if (ResolvedorSenior) {
		document.getElementById('selFanfarrao').onfocus = funUR_LocalizarSolucionadores;
		document.getElementById('selUsuariosPlaces').onfocus = funPlace_ProcurarUsuariosPU;

		document.getElementById('chkPlaceUsuario').onclick = function () { document.getElementById('selUsuariosPlaces').options.length = 0; };
	}

	//Registrando eventos automatizados
	window.setInterval(genericMontarHTML_Selecionados, 5000);

	window.setInterval(funOu_Realcadores, 8000);//8 segundos
	window.setInterval(funOu_AssyncEngine, 5000);//5 segundos

	window.setTimeout(genericTraducoes, 5000);
}

function genericPersistirCheckboxes() {
	localStorage.setItem(this.attributes.id.value, this.checked);

	if (this.attributes.id.value == "chkMaturidade" ||
		this.attributes.id.value == "chkVelocidades") {
		if (this.checked) {
			if (document.getElementById("chkDirty4x4").checked) document.getElementById("chkDirty4x4").click();

			if (this.attributes.id.value == "chkMaturidade" && document.getElementById("chkVelocidades").checked) document.getElementById("chkVelocidades").click();
			if (this.attributes.id.value == "chkVelocidades" && document.getElementById("chkMaturidade").checked) document.getElementById("chkMaturidade").click();

		}

		var routeLayer = Waze.map.getLayersBy("uniqueName", "__CamadaAvaliacaoWMEBrasil");
		if (routeLayer.length > 0) {
			routeLayer[0].removeAllFeatures();
		}
	}
	else {
		if (this.checked
			&&
				(
				this.attributes.id.value == "chkDirty4x4"
				)
			) {
			if (document.getElementById("chkVelocidades").checked) document.getElementById("chkVelocidades").click();
			if (document.getElementById("chkMaturidade").checked) document.getElementById("chkMaturidade").click();
		}
	}
}

function genericObterCheckboxPersistido(chkName) {
	if (localStorage.getItem(chkName) != null)
		document.getElementById(chkName).checked = localStorage.getItem(chkName) === "true";
}

function genericMontarHTML_Selecionados() {
	try {
		if (document.getElementById('pacotao-alternative-content') != null) {
			return;
		}

		var alternativeContent;
		var todosSelecionados = [];
		var segmentosSelecionados = [];

		if (W.selectionManager.getSelectedFeatures().length > 0) {
			for (i = 0; i < W.selectionManager.getSelectedFeatures().length; i++) {
				todosSelecionados.push(Waze.selectionManager.getSelectedFeatures()[i].geometry.id);
			}

			//Agora vamos ver se elas não tem nome mesmo. (se uma tiver, tiro a liberação do botão)
			for (i = 0; i < W.selectionManager.getSelectedFeatures().length; i++) {
				for (var seg in wazeModel.segments.objects) {
					var segmento = wazeModel.segments.objects[seg];

					if (segmento.geometry.id == W.selectionManager.getSelectedFeatures()[i].geometry.id) {
						segmentosSelecionados.push(segmento);
						break;
					}
				}
			}

			if (intervaloPainelNumeracao != 0) {
				window.clearInterval(intervaloPainelNumeracao);
			}

			if (segmentosSelecionados.length >= 1) {

				var userTabs = document.getElementById('edit-panel');
				var segmentBox = genericClassName('segment', userTabs)[0];
				var navTabs = genericClassName('nav nav-tabs', segmentBox)[0];

				var PacotaoTab = document.createElement('li');
				PacotaoTab.innerHTML = '<a href="#pacotao-alternative-content" data-toggle="tab" id="pacotaoalternativo-tab-link">WME Brasil</a>';
				navTabs.appendChild(PacotaoTab);

				var tabContent = genericClassName('tab-content', segmentBox)[0];

				alternativeContent = document.createElement('div');
				alternativeContent.id = 'pacotao-alternative-content';
				alternativeContent.className = 'tab-pane';
				tabContent.appendChild(alternativeContent);

				if (W.selectionManager.getSelectedFeatures().length == 2) {
					if (segmentosSelecionados.length == Waze.selectionManager.getSelectedFeatures().length
						&&
						(
							wazeModel.streets.objects[segmentosSelecionados[0].attributes.primaryStreetID].name == null
							&&
							wazeModel.streets.objects[segmentosSelecionados[1].attributes.primaryStreetID].name == null
						)
						&& funVia_TestarSegmentosAlinhados(segmentosSelecionados[0], segmentosSelecionados[1])
						) {
						alternativeContent.innerHTML += '<input type="button" id="btnSelecionarViasNome" value="Selecionar via sem nome - Apenas em linha reta"/><br/><br/>';
						document.getElementById('btnSelecionarViasNome').onclick = funVia_SelecionarSegmentosAlinhados;
					}
				}

				alternativeContent.innerHTML += '<input type="button" id="_btnApagarNumeros" value="Apagar todos números das casas" /><br/><br/>';
				alternativeContent.innerHTML += '<input type="number" min="0" value="0" size="4" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;" id="numeroCasaMin"/> até ';
				alternativeContent.innerHTML += '<input type="number" min="0" value="0" size="4" style="width:50px;line-height:14px;height:22px;margin-bottom:4px;" id="numeroCasaMax"/><br/>';
				alternativeContent.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;">';

				alternativeContent.innerHTML += 'Nome alternativo único:<br/>';
				alternativeContent.innerHTML += '<input type="button" id="btnAplicarAlternativo" value="Incluir alternativo"/><br/><br/>';
				alternativeContent.innerHTML += '<input type="button" id="btnRevisarNomes" value="Revisar nomes"/><br/><br/>';
				alternativeContent.innerHTML += '<select id="selTrocarCidadeSelecionados" style="width:100px;line-height:25px;height:22px;margin-bottom:4px;"></select>';
				alternativeContent.innerHTML += '<input type="checkbox" id="chkMarcarSemCidade" /> Definir sem cidade.<br/>';
				alternativeContent.innerHTML += '<input type="button" id="btnTrocarCidadeSelecionados" value="Alterar cidade"/><br/>';

				if (segmentosSelecionados.length == 1) {
					alternativeContent.innerHTML += '<input type="button" id="btnPesquisar" value="Pesquisar segmento no forum"/><br/>';
					document.getElementById('btnPesquisar').onclick = funVia_PesquisarSegmentoForum;
				}
				else {
					alternativeContent.innerHTML += '<p id="PmensagemSelecionados">Se quiser pesquisar no forum, selecione APENAS UM segmento.</p><br/>';
				}

				alternativeContent.innerHTML += '<hr style="margin-top: 10px;margin-bottom:10px;" id="hrFinal">';

				genericMontarHTML_SelecionadosAtribuirBotoes();
			}
		}
	} catch (e) {
		genericLog(e);
	}
}

function genericMontarHTML_SelecionadosAtribuirBotoes() {
	window.setTimeout
	(
	function () {
		genericTraducoes();

		document.getElementById('_btnApagarNumeros').onclick = funVia_ApagarTodosNumeros;

		document.getElementById('selTrocarCidadeSelecionados').onfocus = function () {
			genericLoadDropDownCidades('selTrocarCidadeSelecionados');
			document.getElementById('chkMarcarSemCidade').checked = false;
		};
		document.getElementById('chkMarcarSemCidade').onclick = function () {
			document.getElementById('selTrocarCidadeSelecionados').options.length = 0;
		};
		document.getElementById('btnTrocarCidadeSelecionados').onclick = funVia_AplicarMudancaCidade;

		document.getElementById('btnAplicarAlternativo').onclick = funVia_AplicarNomeAlternativo;
		document.getElementById('btnRevisarNomes').onclick = funRevVia_IniciarFaxinaNew;

		//document.getElementById('btnEnviarComentario').onclick = funVia_EnviarComentario;

		intervaloPainelNumeracao = window.setInterval(
			function () {
				$('[class="overlay"]')[0].style.display = "none";
			}
		, 3000);
	}
	, 3000);
}

function genericTraducao(msg_id) {
	console.log("Obter mensagem:" + msg_id);

	for (var trad = 0; trad < traducoes.length; trad++) {
		if (traducoes[trad][traducoeColunas.posicao] == enuTipoSubstituicao.textoSimples
			&& traducoes[trad][traducoeColunas.id] == msg_id) {
			return traducoes[trad][traducoeColunas.Traducao];
		}
	}
}

function genericTraducoes() {
	if (traducoes.length > 90) //Server para evitar que se no ultimo load os texts foram pegos zuados, o mecanismos escreva coisas doidas.
	{
		for (var i = 0; i < traducoes.length; i++) {
			if (traducoes[i][traducoeColunas.posicao] != enuTipoSubstituicao.textoSimples) {
				var Componente = document.getElementById(traducoes[i][traducoeColunas.id]);
				var traducao = traducoes[i][traducoeColunas.Traducao];

				try {
					if (Componente != null && typeof (traducao) != 'undefined') {
						if (traducoes[i][traducoeColunas.posicao] == enuTipoSubstituicao.innerText) {
							Componente.innerText = traducao;
							//console.log("OK inner");
						}
						else if (traducoes[i][traducoeColunas.posicao] == enuTipoSubstituicao.value) {
							Componente.value = traducao;
							//console.log("OK value");
						}
						else if (traducoes[i][traducoeColunas.posicao] == enuTipoSubstituicao.previousSibling) {
							Componente.previousSibling.textContent = traducao;
							//console.log("OK prev");
						}
						else if (traducoes[i][traducoeColunas.posicao] == enuTipoSubstituicao.previousSibling2x) {
							Componente.previousSibling.previousSibling.textContent = traducao;
							//console.log("OK prev2");
						}
						else if (traducoes[i][traducoeColunas.posicao] == enuTipoSubstituicao.nextSibling) {
							Componente.nextSibling.textContent = traducao;
							//console.log("OK next");
						}
						else {
							console.log("Fail");
						}
					}
				} catch (e) {
					genericLog("Falha na tradução " + i + " " + Componente + "\n " + e);
				}
			}
		}
	}
}

//-----------------------------------------------------------------------------------------------------------
/*INICIO Funções genéricas*/
//-----------------------------------------------------------------------------------------------------------

function genericClassName(classname, node) {
	if (!node) node = document.getElementsByTagName("body")[0];
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = node.getElementsByTagName("*");
	for (var i = 0, j = els.length; i < j; i++)
		if (re.test(els[i].className)) a.push(els[i]);
	return a;
}

function genericgetByClass(classname, node) {
	if (!node) node = document.getElementsByTagName("body")[0];
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = node.getElementsByTagName("*");
	for (var i = 0, j = els.length; i < j; i++)
		if (re.test(els[i].className)) a.push(els[i]);
	return a;
}

function genericDesacentuaTexto(texto) {
	//Desacentuando.

	var regA = new RegExp("[À-Å]", "gi");
	var regE = new RegExp("[È-Ë]", "gi");
	var regI = new RegExp("[Ì-Ï]", "gi");
	var regO = new RegExp("[Ò-Ö]", "gi");
	var regU = new RegExp("[Ù-Ü]", "gi");

	var regC = new RegExp("[Ç]", "gi");
	var regN = new RegExp("[Ñ]", "gi");

	return texto.toUpperCase().replace(regA, "A").replace(regE, "E").replace(regI, "I").replace(regO, "O").replace(regU, "U").replace(regC, "C").replace(regN, "N");
}

/// <summary>
/// Verifica se um texto está contido no outro, desprezando acentos e maiúscula/minúscula.
/// </summary>
/// <param name="texto1"></param>
/// <param name="texto2"></param>
/// <returns>boolean</returns>
function genericCompararTextos(texto1, texto2) {
	texto1 = genericDesacentuaTexto(texto1);
	texto2 = genericDesacentuaTexto(texto2);

	return (texto1.indexOf(texto2) != -1 ||
	texto2.indexOf(texto1) != -1);
}

function genericLog(mensagem) {
	try {
		if (document.getElementById('chkDebugMode').checked) {
			var texto = genericTraducao('msg_Extreme');

			texto += mensagem.message;
			texto += '\n\n\n';
			texto += mensage.stack;

			alert(texto);

			window.open("https://www.waze.com/forum/user_message_redirect.php?username=ericdanieldavid", "_blank");
		}

		console.log(mensagem);
	}
	catch (e) {
		var msgX = genericTraducao('msg_ExtremeBad');
		alert( + mensagem + '\n\n' + e.message);
	}
}

function genericGetQueryString(link, name) {
	var pos = link.indexOf(name + '=') + name.length + 1;
	var len = link.substr(pos).indexOf('&');
	if (-1 == len) len = link.substr(pos).length;
	return link.substr(pos, len);
}

function genericSortList(x, y) {
	if (x[1] < y[1])
		return -1;

	if (x[1] > y[1])
		return 1;

	return 0;
}

//Chupinhada de WMETB_DispWarn
genericExibirMensagem = function (msg) {
	msg = "WME Latam Pack: " + msg;
	var obj = $('<div id="mylog">').append(msg).css('background-color', 'rgba(255, 150, 0, 0.6)');
    $('#WMETB_logger_warn').append(obj); obj.delay(300).slideUp({ duration: 3500, always: function () { obj.remove(); } });
};

//-----------------------------------------------------------------------------------------------------------
/*INICIO Assincronicidade*/
//-----------------------------------------------------------------------------------------------------------

/// <summary>
///
/// </summary>
/// <param name="selectorId"></param>
/// <param name="list">Array de array [0] = Id ; [1] = value</param>
/// <returns></returns>
function genericLoadDropDown(selectorId, list) {
	console.log(list);

	var selector = document.getElementById(selectorId);

	var currentId = null;
	if (selector.selectedIndex >= 0) {
		currentId = selector.options[selector.selectedIndex].value;
	}

	selector.options.length = 0;

	var usrOption = document.createElement('option');
	usrOption.setAttribute('value', 0);
	usrOption.appendChild(document.createTextNode(""));
	selector.appendChild(usrOption);

	//Reatribuo a lista ordenando pela descrição sempre.
	list = list.sort(genericSortList);

	//tiro as repetições.
	for (var i = list.length - 1; i > 0; i--) {
		if (list[i][1] == list[i - 1][1]) {
			list.splice(i, 1);
		}
	}

	for (i = 0; i < list.length; i++) {
		var usrOption = document.createElement('option');

		if (currentId !== null && list[i][0] == currentId) {
			usrOption.setAttribute('selected', true);
		}
		usrOption.setAttribute('value', list[i][0]);
		usrOption.appendChild(document.createTextNode(list[i][1]));
		selector.appendChild(usrOption);
	}
}

function genericLoadDropDownCidades(selectorId) {
	var lista = [];
	for (var objcit in wazeModel.cities.objects) {

		if (typeof (wazeModel.cities.objects[objcit].attributes.outOfScope) == "undefined" ||
			(typeof (wazeModel.cities.objects[objcit].attributes.outOfScope) != "undefined" && wazeModel.cities.objects[objcit].attributes.outOfScope == false)) {
			lista.push([wazeModel.cities.objects[objcit].attributes.id, wazeModel.cities.objects[objcit].attributes.name]);
		}
	}

	genericLoadDropDown(selectorId, lista);
}

function genericAssincCommand(comando, isSaveComand) {
	isSaveComand = isSaveComand || false; //parametro será preenchido se não passarem (preguiça de mudar o código)

	///comando   |  TimeoutID   |   FinishStatus    |   isSaveComand
	global_FilaInstrucaoAssincrona.push([comando, 0, false, isSaveComand]);
	localStorage.setItem("global_FilaInstrucaoAssincrona", global_FilaInstrucaoAssincrona);

	var idInstrucao = global_FilaInstrucaoAssincrona.length - 1;

	var qtddSaveAllow = 70;
	var qtddSaveComand = 0;

	for (var i = 0; i < global_FilaInstrucaoAssincrona.length; i++) {
		if (global_FilaInstrucaoAssincrona[i][3])       //isSaveComand
		{
			qtddSaveComand++;
		}
	}

	if (
			(qtddSaveComand < qtddSaveAllow)
		||
			(qtddSaveComand <= qtddSaveAllow && isSaveComand)
		) {
		genericAssincExecute(idInstrucao);
	}

	//Se isso é verdade, não devo executar as instruções agora. Elas estão em wait().... parametro [1] = 0, sem o timeOutID definido.

}

function genericAssincExecute(idInstrucao) {
	var temporizador = document.getElementById('inputExecAssync').value;
	var comando = global_FilaInstrucaoAssincrona[idInstrucao][0];

	var instrucaoFuncao = "                                                     \
		var timeOutID = window.setTimeout(function () {                         \
																				\
			console.log(\"Instrução " + idInstrucao + " - Started\");           "

			+
				comando
			+
			
			"genericAssincOK(" + idInstrucao + ");                               \
			console.log(\"Instrução " + idInstrucao + " - OK\");                \
																				\
		}, ((" + idInstrucao + " + 1) * " + (temporizador + 500) + "));         \
		return timeOutID;                   ";

	console.log(instrucaoFuncao);

	var funct = new Function(instrucaoFuncao);
	global_FilaInstrucaoAssincrona[idInstrucao][1] = funct.call();
}

function genericAssincStop() {
	console.log(global_FilaInstrucaoAssincrona);

	for (var i = 0; i < global_FilaInstrucaoAssincrona.length; i++) {
		globalThis.clearTimeout(global_FilaInstrucaoAssincrona[i][1]);
	}

	global_FilaInstrucaoAssincrona = [];
	console.log(global_FilaInstrucaoAssincrona);

	var tims = 1000;while (tims--){globalThis.clearTimeout(tims);}

	document.getElementById('btnIniciarRevisaoPlace').disabled = false;
	document.getElementById('btnPararRevisaoPlace').disabled = true;

	document.getElementById('btnIniciarRevisao').disabled = false;
	document.getElementById('btnPararRevisao').disabled = true;

	genericExibirMensagem("Revisão paralizada.");
}

function genericAssincRestart() {
	//pega a fila de instruções que ficou sem gerar timeout e manda vê.
	var qtddSave = document.getElementById('inputQtddSave').value;
	if (wazeModel.actionManager.unsavedActionsNum() == 0) {
		console.log('Retomando fila pendente.');

		//Até quantos saves deve fazer.
		var qtExecute = 70;

		for (var i = 0; i < global_FilaInstrucaoAssincrona.length; i++) {
			genericAssincExecute(i);

			//isSaveComand
			if (global_FilaInstrucaoAssincrona[i][3] == true) {
				qtExecute--;
			}

			if (qtExecute == -1) {
				break;
			}
		}

		console.log('Fila reprovisionada. ' + qtExecute + ' atualmente.');
	}

}

genericAssincBreak = function () {
	var paralizador = document.createElement('section');
	paralizador.id = 'paralizador';

	var painel = null;
	var textobotao = '';
	if (document.getElementsByClassName('segment').length > 0) {
		textobotao = '<input type="button" id="btnParalizarRevisao" value="' + genericTraducao('msg_ParalizarSegmento') + '" class="btn btn-default"/><br/>';
		paralizador.innerHTML += textobotao;
		painel = document.getElementsByClassName('segment')[0]; //Comando atual é de segmento.
	}

	if (document.getElementsByClassName('landmark').length > 0) {
		textobotao = '<input type="button" id="btnParalizarRevisao" value="' + genericTraducao('msg_ParalizarPlace') + '" class="btn btn-default"/><br/>';
		paralizador.innerHTML += textobotao;
		painel = document.getElementsByClassName('landmark')[0]; //Comando atual é de place (revisão de nome).
	}

	if (painel == null &&
		document.getElementsByClassName('place-update').length > 0) {

		for (var i = 0; i < document.getElementsByClassName('place-update').length; i++) {
			if (document.getElementsByClassName('place-update')[i].className == "place-update") {
				//Comando atual é de aprovação de place.
				painel = document.getElementsByClassName('place-update')[i];
				break;
			}
		}
		textobotao = '<input type="button" id="btnParalizarRevisao" value="' + genericTraducao('msg_ParalizarPlace') + '" class="btn btn-block btn-primary"/>';
		paralizador.className = "navigation";
		paralizador.innerHTML += textobotao;
	}

	console.log(textobotao);

	if ($('[class="' + painel.className + '"]').find('input[id="btnParalizarRevisao"]').length == 0) {
		painel.insertBefore(paralizador, painel.children[1]);
		document.getElementById('btnParalizarRevisao').onclick = genericAssincStop;
	}
}

genericAssincOK = function (idInstrucao) {
	global_FilaInstrucaoAssincrona[idInstrucao][2] = true;

	//Ultimo.
	if (idInstrucao == global_FilaInstrucaoAssincrona.length - 1) {
		var msg = genericTraducao('msg_AtualizacoesOK');
		genericExibirMensagem(msg);
		global_FilaInstrucaoAssincrona = [];

		var t = [];
		Waze.selectionManager.setSelectedModels(t);

		console.log('Alterações feitas com sucesso. Fim da fila assincrona.');
	}
	else {
		//Se ele não é o último, tem mais alguém pendente....
		if (global_FilaInstrucaoAssincrona[idInstrucao + 1][1] == 0) //o próximo é fila que ficou parada?
		{
			console.log("Instrução final, id" + idInstrucao);
			console.log(global_FilaInstrucaoAssincrona);

			console.log('OK! Fila andou e a ultima instrução já foi salva. Bora pro agito minha gente!!!!');
			global_FilaInstrucaoAssincrona = global_FilaInstrucaoAssincrona.slice(idInstrucao + 1);
			//global_FilaInstrucaoAssincrona.splice(0, idInstrucao + 1);

			console.log(global_FilaInstrucaoAssincrona);
		}
	}
}

//-----------------------------------------------------------------------------------------------------------
/*INICIO navegabilidade*/
//-----------------------------------------------------------------------------------------------------------
function funNav_InativarTodasTab() {

	var tabs = document.getElementById("sidepanel-mastersbrasil").children;

	//0 é um P vazio

	//1 são os botões de tab
	for	(var j =0; j<tabs[1].children.length; j++)
	{
		tabs[1].children[j].className = "";
	}

	for (var i = 2; i < tabs.length; i++) {
		tabs[i].style.display = 'none';
	}
}

function funNav_TabExibirFuncoes(grupo) {
	funNav_InativarTodasTab();
	funNav_AtivarTab(grupo);
	document.getElementById('aba' + grupo).style.display = 'block';
}

function funNav_AtivarTab(grupo) {
	console.log('ativando ' + grupo);
	var e = document.getElementById("_Wmelink" + grupo).parentElement;
	e.className = "active";
}

function funNav_InativarTab(grupo) {
	console.log('INativando ' + grupo);
	var e = document.getElementById("_Wmelink" + grupo).parentElement;
	e.className = "";
}

//-----------------------------------------------------------------------------------------------------------
/*INICIO funções de botões*/
//-----------------------------------------------------------------------------------------------------------
function funUR_ObterDados() {
	var dataCache =
	[
		'id',
		'type',
		'typeText',
		'description',
		'state',
		'driveDate',
		'resolvedOn',
		'updatedOn',
		'updatedBy',
		'comments'
	];

	for (var urobj in wazeModel.updateRequestSessions.objects) {
		var ureq = wazeModel.updateRequestSessions.objects[urobj];
		var murInfo = wazeModel.mapUpdateRequests.objects[urobj];

		var drive = new Date(); drive.setTime(murInfo.attributes.driveDate);
		var resolved = new Date(); resolved.setTime(murInfo.attributes.resolvedOn);
		var updated = new Date(); resolved.setTime(murInfo.attributes.updatedOn);

		var strMensagem = '';

		for (i = 0; i < ureq.comments.length; i++) {
			var updatedBy = ureq.comments[i].userID;

			var user = wazeModel.users.get(updatedBy);
			var nome = 'Wazer(reportante)';
			if (updatedBy != -1) {
				if (user != null) {
					nome = user.userName;
				}
			}

			strMensagem += nome + ': ' + ureq.comments[i].text;
		}

		var resolvedBy = murInfo.attributes.updatedBy;
		var nomeResolvedBy = '';
		if (resolvedBy != -1) {
			if (wazeModel.users.get(resolvedBy) != null) {
				nomeResolvedBy = wazeModel.users.get(resolvedBy).userName;
			}
		}

		var descricao = murInfo.attributes.description;

		if (descricao != null && descricao != '') {
			descricao = descricao.replace(',', '_').replace(new RegExp(String.fromCharCode(10), 'g'), '');
		}

		dataCache.push('\n' +
			murInfo.attributes.id,
			murInfo.attributes.type,
			murInfo.attributes.typeText,
			descricao,
			murInfo.getState(),
			drive.toDateString(),
			resolved.toDateString(),
			updated.toDateString(),
			nomeResolvedBy,
			strMensagem.replace(',', '_').replace(new RegExp(String.fromCharCode(10), 'g'), '')
		);

		$('#dadosURs').each(function () {
			this.href = 'data:text/csv;base64,' + btoa(dataCache);
			this.download = 'URs.csv';
		});
	}
}

function funUR_SeguirTodasVisiveis(resp) {

	var msgConfirmacao = genericTraducao('msg_ConfirmacaoUR');

	if (confirm(msgConfirmacao)) {
		var contagemSeguindo = 0;
		for (var urobj in wazeModel.updateRequestSessions.objects) {
			var ureq = wazeModel.updateRequestSessions.objects[urobj];

			for (var murobj in wazeModel.mapUpdateRequests.objects) {
				var murInfo = wazeModel.mapUpdateRequests.objects[murobj];

				if (murInfo.attributes.id == ureq.id) {
					if (Waze.map.getExtent().toGeometry().containsPoint(murInfo.geometry)) {
						ureq.setFollowing(resp);
						contagemSeguindo++;
					}
					break;
				}
			}
		}

		(resp==true?msgConfirmacao = genericTraducao('msg_SeguindoAgora'):msgConfirmacao = 'Deixou de seguir '); //Sem acesso a planilha de tradução; não consigo colocar a genericTraducao pra brincar =( (biuick84)
		genericExibirMensagem(msgConfirmacao + contagemSeguindo + ' URs');
	}
}

function funUR_IniciarComunicacao() {

	try {
		var cont = 0;
		var diasAberturaMsgInicial = document.getElementById('_inputDiasMensagemInicial').value;
		var seguirAposEnvio = document.getElementById('chkSeguirInicial').checked;

		for (var urobj in wazeModel.updateRequestSessions.objects) {
			var ureq = wazeModel.updateRequestSessions.objects[urobj];
			if (ureq.comments.length == 0 && ureq.open == true) {
				for (var murobj in wazeModel.mapUpdateRequests.objects) {
					var murInfo = wazeModel.mapUpdateRequests.objects[murobj];
					var dateNow = new Date();
					var diasAbertura = Math.floor((dateNow.getTime() - murInfo.attributes.driveDate) / 86400000);

					if (murInfo.attributes.id == ureq.id) {
						if (
								(murInfo.attributes.description == null || murInfo.attributes.description == '')
								&&
								diasAbertura >= diasAberturaMsgInicial
								&&
								Waze.map.getExtent().toGeometry().containsPoint(murInfo.geometry)
							) {
							var textoAbertura = document.getElementById('_txtAberturaUR').value;
							if (textoAbertura == '') {
								textoAbertura = genericTraducao('msg_PadraoAberturaUR');
							}

							ureq.addComment(textoAbertura);
							ureq.setFollowing(seguirAposEnvio);
							cont = cont + 1;
							break;
						}
					}
				}
			}
		}

		genericExibirMensagem(genericTraducao('msg_ConfirmacaoContatoUR') + cont + ' URs.');
	} catch (e) {
		genericLog(e);
	}
}

function funUR_Encerramento() {
	try {
		var diasConfAbertura = document.getElementById('_inputDiasAberturaUR').value;
		var diasConfComentario = document.getElementById('_inputDiasComentarioUR').value;

		var userChamp = champsBrazil.indexOf(W.loginManager.user.userName) != -1;
		
		var qtdeFechada = 0;

		if ((diasConfAbertura < 7 ||
			diasConfComentario < 3) && !userChamp) {
			genericExibirMensagem(genericTraducao('msg_ParametrosFecharUR'));
			return;
		}

		for (var urobj in wazeModel.updateRequestSessions.objects) {
			var ureq = wazeModel.updateRequestSessions.objects[urobj];
			if (ureq.comments.length > 0 && ureq.open == true) {
				var dateNow = new Date();
				var diasComentario = Math.floor((dateNow.getTime() - ureq.comments.slice(-1)[0].createdOn) / 86400000);

				if (diasComentario >= diasConfComentario) {
					if (ureq.comments.slice(-1)[0].userID != -1
					&& ureq.comments.slice(-1)[0].text.toUpperCase().indexOf('ENCERRAR') == -1
					&& ureq.comments.slice(-1)[0].text.toUpperCase().indexOf('FECHAR') == -1
					&& ureq.comments.slice(-1)[0].text.toUpperCase().indexOf('FINALIZAR') == -1
					&& ureq.comments.slice(-1)[0].text.toUpperCase().indexOf('FECHE') == -1
					&& ureq.comments.slice(-1)[0].text.toUpperCase().indexOf('ENCERRE') == -1
						)//Não foi o reportante o ultimo, não tem as palavras chaves no último comentário
					{
						for (var murobj in wazeModel.mapUpdateRequests.objects) {
							var murInfo = wazeModel.mapUpdateRequests.objects[murobj];
							var diasAbertura = Math.floor((dateNow.getTime() - murInfo.attributes.driveDate) / 86400000);

							if (murInfo.attributes.id == ureq.id) {
								if (diasAbertura >= diasConfAbertura
									&& murInfo.attributes.permissions != 0) //Só onde realmente tem permissão.
								{
									var fechamento = false;
									var ultimato = false;

									//Hora de brincar e analisar o histórico.
									if (document.getElementById('chkOferecerAjuda').checked) {
										if (ureq.comments.length != 1) {
											var FoiCobradoAgora = funUR_CobrarEditorSolucaoPendente(ureq);
											if (FoiCobradoAgora) {
												continue;
											}
										}
										else {
											ultimato = true;
										}
									}
									else {
										if (ureq.comments.length != 1) {
											continue;
										}
									}

									//Final análise.

									if (document.getElementById('chkFecharApenasVisiveis').checked == false) {
										fechamento = true;
									}

									if (document.getElementById('chkFecharApenasVisiveis').checked == true
										&& Waze.map.getExtent().toGeometry().containsPoint(murInfo.geometry)
									) {
										fechamento = true;
									}


									if (fechamento == true) {
										var textFechamento = document.getElementById('_txtFechamentoUR').value;
										if (textFechamento == '') {
											textFechamento = 'Wazer, ';

											if (ultimato) {
												textFechamento += genericTraducao('msg_UltimatoUsuario');
											}

											textFechamento += genericTraducao('msg_Fechamento');
										}

										ureq.addComment(textFechamento);
										ureq.setFollowing(false);

										console.log('Fechando');
										console.log(ureq);

										var instrucaoFechamento = "";
										instrucaoFechamento = "$('div[data-id=" + murInfo.attributes.id + "]').click();";
										genericAssincCommand(instrucaoFechamento, false);

										instrucaoFechamento = "$('label[for^=\"state-not-identified\"]').click();";
										genericAssincCommand(instrucaoFechamento, true);

										instrucaoFechamento = "$('button[class=\"btn btn-primary done\"]').click();";
										genericAssincCommand(instrucaoFechamento, false);
										qtdeFechada++;
										break;
									}
								}
							}
						}
					}
					else {
						if (ureq.comments.slice(-1)[0].userID == -1
							&& diasComentario >= diasConfAbertura
							&& document.getElementById('chkOferecerAjuda').checked
							) {
							var FoiCobrado = funUR_CobrarEditorSolucaoPendente(ureq);
							if (FoiCobrado) {
								continue;
							}
						}
					}
				}
			}
		}
		
		if (qtdeFechada <= 0)
			genericExibirMensagem('Nada a encerrar'); //Sem acesso a planilha de tradução; não consigo colocar a genericTraducao pra brincar =( (biuick84)
	} catch (e) {
		genericLog(e);
	}
}

function funUR_EncerramentoMP() {
	try {
		for (var problemaID in wazeModel.problems.objects) {
			var problema = wazeModel.problems.objects[problemaID];

			if (Waze.map.getExtent().toGeometry().containsPoint(problema.geometry)) {

				var instrucao = "$('div[data-id=\"" + problema.attributes.id + "\"]').click();";
				genericAssincCommand(instrucao, false);

				instrucao = "$('label[for=\"state-solved\"]').click();";
				genericAssincCommand(instrucao, true);
			}

		}
	} catch (e) {
		genericLog(e);
	}
}

function funUR_EnviarComentario() {

	try {
		var cont = 0;

		for (var urobj in wazeModel.updateRequestSessions.objects) {
			var ureq = wazeModel.updateRequestSessions.objects[urobj];
			if (ureq.open == true) {
				for (var murobj in wazeModel.mapUpdateRequests.objects) {
					var murInfo = wazeModel.mapUpdateRequests.objects[murobj];

					if (murInfo.attributes.id == ureq.id) {
						if (Waze.map.getExtent().toGeometry().containsPoint(murInfo.geometry)) {

							if ($('div[data-id="' + ureq.id + '"]')[0].style.visibility == "visible")
							{
								var textoAbertura = document.getElementById('txtComentario').value;

								if (ureq.comments.length != 0) {
									if (ureq.comments.slice(-1)[0].text == textoAbertura) {
										break;
									}
								}

								if (textoAbertura != "") {
									ureq.addComment(textoAbertura);
									console.log(ureq);
									cont = cont + 1;
									break;
								}
							}
						}
					}
				}
			}
		}

		genericExibirMensagem(genericTraducao('msg_ComentarioUR') + cont + ' URs.');
	} catch (e) {
		genericLog(e);
	}
}

/// <summary>
///
/// </summary>
/// <param name="ureq">objeto do tipo updateRequestSessions</param>
/// <returns></returns>
function funUR_CobrarEditorSolucaoPendente(ureq) {
	if (ureq.comments.slice(-1)[0].text.indexOf('inatividade') == -1) {
		//Obter os editores que comentaram.

		var strMensagem = '';

		var distId = [];
		for (i = 0; i < ureq.comments.length; i++) {
			var updatedBy = ureq.comments[i].userID;
			if (updatedBy != -1
				&& updatedBy != wazeModel.loginManager.user.id
				) {
				if (distId.indexOf(updatedBy) == -1) {
					var user = wazeModel.users.get(updatedBy);

					console.log(ureq);

					strMensagem += user.userName + ', ';

					distId.push(updatedBy);
				}

				if (updatedBy == 46379388 && wazeModel.loginManager.user.id == 12739915) {
					//ericdanieldavid não cobra mais o OlavoAG.
					return true;
				}
			}
		}
		strMensagem += genericTraducao('msg_CobrandoEditor');

		//Varer o array e tirar o próprio usuário. Se for só eu, mata!
		if (distId.length > 0) {
			ureq.addComment(strMensagem);
			return true;
		}
	}

	return false;
}

function funUR_ResolverVisiveis() {
	var requestsResolver = new Array();
	for (var urobj in wazeModel.updateRequestSessions.objects) {
		var ureq = wazeModel.updateRequestSessions.objects[urobj];

        if (
            ureq.open == true
            &&
            (ureq.comments.length == 0 || document.getElementById('chkResolverModoBruto').checked)

        )
        {
			for (var murobj in wazeModel.mapUpdateRequests.objects) {
				var murInfo = wazeModel.mapUpdateRequests.objects[murobj];

				if (murInfo.attributes.id == ureq.id) {
                    if (Waze.map.getExtent().toGeometry().containsPoint(murInfo.geometry)
                        && $('div[data-id="' + ureq.id + '"]')[0].style.visibility == "visible"
                    ) {
						requestsResolver.push(murInfo);
					}
					break;
				}
			}
		}
	}

	console.log(requestsResolver);

	//primeiro conta, se der confirma ai sim marca como resolvido.
	if (requestsResolver.length > 0) {
		if (confirm(requestsResolver.length + genericTraducao('msg_ResolverTudoConfirma'))) {
			var index;
			for (index = 0; index < requestsResolver.length; ++index) {
				var instrucaoFechar = "";

				instrucaoFechar = "$('div[data-id=" + requestsResolver[index].attributes.id + "]').click();";
				genericAssincCommand(instrucaoFechar, false);

				if (document.getElementById('chkResolverOK').checked)
				{
					instrucaoFechar = "$('label[for^=\"state-solved\"]').click();";
				}
				else
				{
					instrucaoFechar = "$('label[for^=\"state-not-identified\"]').click();";
				}

				genericAssincCommand(instrucaoFechar, true);

				instrucaoFechar = "$('button[class=\"btn btn-primary done\"]').click();";
				genericAssincCommand(instrucaoFechar, false);
			}
		}
	}
	else {
		genericExibirMensagem(genericTraducao('msg_NadaResolver'));
	}
}

function funUR_LocalizarSolucionadores() {
	var selectUser = document.getElementById('selFanfarrao');
	var numUsers = wazeModel.users.objects.length;

	var currentId = null;
	if (selectUser.selectedIndex >= 0) {
		currentId = selectUser.options[selectUser.selectedIndex].value;
	}

	var editorIds = new Array();
	var distId = new Array();

	for (var urobj in wazeModel.updateRequestSessions.objects) {
		var ureq = wazeModel.updateRequestSessions.objects[urobj];

		for (var murobj in wazeModel.mapUpdateRequests.objects) {
			var murInfo = wazeModel.mapUpdateRequests.objects[murobj];
			if (murInfo.attributes.id == ureq.id) {
				if (murInfo.attributes.resolvedBy != null) {
					var resolvedBy = murInfo.attributes.resolvedBy;
					if (distId.indexOf(resolvedBy) == -1) {
						var user = wazeModel.users.get(resolvedBy);
						var usrRank = user.normalizedLevel;

						var tmpAry = new Array();
						tmpAry.push(user.userName + ' (' + usrRank + ')');
						tmpAry.push(resolvedBy);

						editorIds.push(tmpAry);
						distId.push(resolvedBy);
					}
				}
				break;
			}
		}
	}

	selectUser.options.length = 0;

	for (var i = 0; i < editorIds.length; i++) {
		var usrOption = document.createElement('option');

		if (currentId !== null && editorIds[i][1] == currentId) {
			usrOption.setAttribute('selected', true);
		}
		usrOption.setAttribute('value', editorIds[i][1]);
		usrOption.appendChild(document.createTextNode(editorIds[i][0]));
		selectUser.appendChild(usrOption);
	}
}

function funUR_ContarFechadasUsuario() {
	var count = 0;
	for (var urobj in wazeModel.updateRequestSessions.objects) {
		var ureq = wazeModel.updateRequestSessions.objects[urobj];

		for (var murobj in wazeModel.mapUpdateRequests.objects) {
			var murInfo = wazeModel.mapUpdateRequests.objects[murobj];
			if (murInfo.attributes.id == ureq.id) {
				if (murInfo.attributes.resolvedBy == document.getElementById('selFanfarrao').value) {
					count++;
				}
				break;
			}
		}
	}

	alert(wazeModel.users.get(document.getElementById('selFanfarrao').value).userName + ' ----> ' + count + ' URs.');
}

//-----------------------------------------------------------------------------------------------------------
/// <summary>
///
/// </summary>
/// <param name="tipoCorrecao">enum ['Reverse', 'Permissao', 'Liberacao'] - tipo de correção a realizar</param>
/// <param name="uturn">boolean - se deve ou não corrigir U-Turn também</param>
/// <returns></returns>
function funVia_CorretorDeNo(tipoCorrecao) {
	var ModoBruto = false;
	var inicioExecucao = Date.now();

	var msgLenta = genericTraducao('msg_CorrecaoNoLenta');

	for (var node in wazeModel.nodes.objects) {
		if (inicioExecucao + 15000 < Date.now()) {
			if (confirm(msgLenta)) {
				inicioExecucao = Date.now();
			}
			else {
				break;
			}
		}

		var nozinho = wazeModel.nodes.objects[node];

		if (tipoCorrecao == 'Permissao') {
			try {
				if (Waze.map.getExtent().toGeometry().containsPoint(nozinho.geometry)) {

					var s = wazeModel.getTurnGraph();

					if (nozinho.attributes.segIDs.length > 1 &&
						nozinho.areConnectionsEditable()) {
						if (!nozinho.areAllConnectionsEnabled()) {
							var instrucao = "                               \
							var t = [];                                     \
							t.push(wazeModel.nodes.objects["+ node + "]);   \
							Waze.selectionManager.setSelectedModels(t);";
							genericAssincCommand(instrucao, false);

							instrucao = "$('[class=\"allow-connections btn btn-default\"]')[0].click();";
							genericAssincCommand(instrucao, true);
						}
					}
				}
			}
			catch (err) { }
		}

		if (tipoCorrecao == 'Liberacao') {
			try {
				if (Waze.map.getExtent().toGeometry().containsPoint(nozinho.geometry)
					&& nozinho.areAllConnectionsDisabled()) {
					var instrucao = "                               \
							var t = [];                                     \
							t.push(wazeModel.nodes.objects["+ node + "]);   \
							Waze.selectionManager.setSelectedModels(t);";
					genericAssincCommand(instrucao, false);

					instrucao = "$('[class=\"allow-connections btn btn-default\"]')[0].click();";
					genericAssincCommand(instrucao, true);
				}
			}
			catch (err) { }
		}

		if (wazeModel.actionManager.unsavedActionsNum() > 150) {
			if (ModoBruto == false &&
			confirm(genericTraducao('msg_CorrecaoPesada'))) {
				break;
			}
			else {
				ModoBruto = true;
			}
		}
	}
}

function funVia_TestarAcessos() {

	try {
		var tipoAcesso;
		if (document.getElementById('chkViaIn').checked && document.getElementById('chkViaOut').checked) {
			tipoAcesso = 'InOut';
		}
		else if (document.getElementById('chkViaIn').checked) {
			tipoAcesso = 'In';
		}
		else if (document.getElementById('chkViaOut').checked) {
			tipoAcesso = 'Out';
		}
		else {
			genericExibirMensagem(genericTraducao('msg_TipoTesteAcesso'));
			return;
		}

		seg_idAcessosTravados = [];
		var segmentosTestados = [];

		for (var node in wazeModel.nodes.objects) {
			if (wazeModel.nodes.objects[node].attributes.segIDs.length > 1) //Se só tem 1, é rua sem saída.
			{
				if (Waze.map.getExtent().toGeometry().containsPoint(wazeModel.nodes.objects[node].geometry)) {
					for (i = 0; i < wazeModel.nodes.objects[node].attributes.segIDs.length; i++) {
						var segIDTeste = wazeModel.nodes.objects[node].attributes.segIDs[i];
						if (segmentosTestados.indexOf(segIDTeste) == -1) {
							console.log('Testando segmento ' + segIDTeste);
							segmentosTestados.push(segIDTeste);

							var segmento = wazeModel.segments.objects[segIDTeste];
							var outroNo = (segmento.attributes.fromNodeID != node ? segmento.attributes.fromNodeID : segmento.attributes.toNodeID);

							if (!funVia_TestarAcessosNo(wazeModel.segments.objects[segIDTeste], wazeModel.nodes.objects[node], tipoAcesso)
								&&
								!funVia_TestarAcessosNo(wazeModel.segments.objects[segIDTeste], wazeModel.nodes.objects[outroNo], tipoAcesso)
							) {
								seg_idAcessosTravados.push(segIDTeste);
							}
						}
					}
				}
			}
		}

		var t = [];
		seg_idAcessosTravados.forEach(
			function (entry) {
				t.push(wazeModel.segments.objects[entry]);
			}
		);

		if (t.length > 0) {
			Waze.selectionManager.setSelectedModels(t);
			genericExibirMensagem(t.length + genericTraducao('msg_TesteAcessoProblema') + '<br/>' +
				(tipoAcesso == 'In' ? genericTraducao('msg_TesteAcessoProblemaIn') : (tipoAcesso == 'Out' ? genericTraducao('msg_TesteAcessoProblemaOut') : genericTraducao('msg_TesteAcessoProblemaInOut')))
			);
		}
		else {
			genericExibirMensagem(genericTraducao('msg_TesteAcessoNoProblem'));
		}
	} catch (e) {
		genericLog(e);
	}
}

function funVia_ProtegerMapa() {
	for (var segId in wazeModel.segments.objects) {
		var segmento = wazeModel.segments.objects[segId];

		if (funRevVia_VerificarSegmentoVisivel(segmento)) {

			if (segmento.attributes.lockRank != null
				&&
				(segmento.attributes.lockRank < segmento.attributes.rank
				||
					(
						segmento.attributes.lockRank == segmento.attributes.rank &&
						document.getElementById('chkProtegerTotal').checked
					)
				)

				) {
				var instrucao = "                                       \
					var segmento = wazeModel.segments.objects["+ segId + "];   \
																			\
					var t = new Array();                                    \
					t.push(segmento);                                       \
					Waze.selectionManager.setSelectedModels(t);                        \
					genericAssincBreak();";

				genericAssincCommand(instrucao, false);

				instrucao = "$('[id=\"unpavedCheckbox\"]').click();     \
							document.getElementById(\"unpavedCheckbox\").checked = false;";
				genericAssincCommand(instrucao, false);

				instrucao = "\
				wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].oldAttributes = { lockRank: " + segmento.attributes.lockRank + " };    \
				wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].newAttributes = { lockRank: null };                                    \
				$('[name=\"lockRank\"]')[0].value = null;";
				console.log(instrucao);
				genericAssincCommand(instrucao, true);
			}
		}
	}
}

/// <summary>
///
/// </summary>
/// <param name="segmento">Segmento que é base para teste</param>
/// <param name="no">nó principal de teste</param>
/// <param name="tipoAcesso">enum ['In','Out','InOut']</param>
/// <returns>boolean (true está OK, false está cagado)</returns>
function funVia_TestarAcessosNo(segmento, no, tipoAcesso) {
	if (no.areAllConnectionsDisabled()) {
		return false;
	}

	//Se qualquer conversão é permitida, pára de testar e dá return TRUE
	var segmentosTestar = no.attributes.segIDs.clone();
	var index = segmentosTestar.indexOf(segmento.attributes.id);

	if (index > -1) {
		segmentosTestar.splice(index, 1);
	}

	if (segmentosTestar.length > 0) {
		for (j = 0; j < segmentosTestar.length; j++) {
			var SegTeste = segmentosTestar[j];

			var liberadoIn = false;
			if (tipoAcesso == 'In' || tipoAcesso == 'InOut') {
				if
				(
					(!segmento.attributes.fwdDirection || !segmento.attributes.revDirection)
					&&
					(
					//Aqui só sai nunca entra
						(segmento.attributes.fwdDirection && segmento.attributes.toNodeID == no.attributes.id)
						||
						(segmento.attributes.revDirection && segmento.attributes.fromNodeID == no.attributes.id)
					)
				) {
					console.log('mão única inversa a este nó');
					liberadoIn = true;
				}
				else {
					liberadoIn = wazeModel.segments.objects[SegTeste].isTurnAllowed(segmento, no); //do primeiro pro segundo, nesse nó.
				}
			}

			var liberadoOut = false;
			if (tipoAcesso == 'Out' || tipoAcesso == 'InOut') {
				if (
					(!segmento.attributes.fwdDirection || !segmento.attributes.revDirection)
					&&
					(
					//Aqui só entra não se sai.
						(segmento.attributes.fwdDirection && segmento.attributes.toNodeID == no.attributes.id)
						||
						(segmento.attributes.revDirection && segmento.attributes.fromNodeID == no.attributes.id)
					)
				) {
					console.log('mão única inversa a este nó');
					liberadoOut = true;
				}
				else {
					liberadoOut = segmento.isTurnAllowed(wazeModel.segments.objects[SegTeste], no); //do primeiro pro segundo, nesse nó.
				}
			}

			if (
				(tipoAcesso == 'In' && liberadoIn) ||
				(tipoAcesso == 'Out' && liberadoOut) ||
				(tipoAcesso == 'InOut' && (liberadoIn || liberadoOut))
				) {
				return true; //Achou 1 permitido, tá limpo!
			}
		}

		return false;
	}

	return true;
}

function funVia_ApagarTodosNumeros() {
	try {
		if ($('[class="olLayerDiv house-numbers-layer"]').length == 0) {
			genericExibirMensagem(genericTraducao('msg_ApagarAbrirPainel'));
			return;
		}

		var qtddNumeros = $("div[class=number-preview]").length;
		console.log('Encontrados ' + qtddNumeros + ' números de casas. Vamos a destruição!');

		var intervaloMenor = parseInt(document.getElementById('numeroCasaMin').value);
		var intervaloMaior = parseInt(document.getElementById('numeroCasaMax').value);

		for (var i = qtddNumeros - 1; i >= 0; i--) {

			var numero = $("div[class=number-preview]")[i];
			var numeroAtual = numero.innerHTML;

			if (intervaloMenor <= intervaloMaior) {
				if (
					(numeroAtual >= intervaloMenor &&
					numeroAtual <= intervaloMaior)
					||
					(intervaloMenor == 0 &&
					intervaloMaior == 0)
					) {
					numero.click();
					numero.parentElement.getElementsByClassName("delete-button")[0].click();
				}
				else {
					console.log('Ignorado ' + numeroAtual);
				}
			}
			else {
				genericExibirMensagem("Intervalo inválido!");
			}
		}
	} catch (e) {
		genericLog(e);
	}
}

function funVia_AplicarNomeAlternativo() {
	var NomeAlternativo = window.prompt(genericTraducao('msg_confirmAlternativo'));
	console.log(NomeAlternativo);

	var todosSelecionados = [];
	for (i = 0; i < Waze.selectionManager.getSelectedFeatures().length; i++) {
		todosSelecionados.push(Waze.selectionManager.getSelectedFeatures()[i].geometry.id);
	}

	console.log("Selecionados " + todosSelecionados.length + " segmentos para aplicação de alternativo único.");

	for (var i = 0; i < todosSelecionados.length; i++) {

		var instrucao = "                                       \
		var geometryID = "+ todosSelecionados[i] + ";            \
		var segmentoAlternar;                                   \
																\
		for (var seg in wazeModel.segments.objects) {           \
			var segmento = wazeModel.segments.objects[seg];     \
																\
			if (segmento.geometry.id == geometryID) {           \
				segmentoAlternar = segmento;                    \
				break;                                          \
			}                                                   \
		}                                                       \
																\
		var t = new Array();                                    \
		t.push(segmentoAlternar);                               \
		Waze.selectionManager.setSelectedModels(t);                        \
		$('a[class=\"address-edit-input primary-street\"]').click();";
		genericAssincCommand(instrucao);

		instrucao = "$('a[class=\"add-alt-street-btn\"]').click();";
		genericAssincCommand(instrucao);

		instrucao = "$('tr[class=\"alt-street-form-template new-alt-street\"]').find('input[name=\"streetName\"]').attr(\"value\", \"" + NomeAlternativo + "\");";
		genericAssincCommand(instrucao);

		instrucao = "$('div[class=\"action-buttons\"]').find('button[class=\"save-button waze-btn waze-btn-blue waze-btn-smaller\"]').click();";
		genericAssincCommand(instrucao);

	}
}

function genericGerarIframe(timeout, id, sourceLink) {
	window.setTimeout(
		function () {
			var ifra = document.createElement('iframe');
			ifra.id = 'ifra' + id;
			ifra.style = "width:2px;height:2px";
			ifra.src = sourceLink;

			document.getElementById('rodapezinho').appendChild(ifra);

			window.setTimeout(function () { console.log('Limpando ' + ifra); ifra.src = ""; }, 5000);
		}
	, timeout * 700);

	console.log(sourceLink);
}

function funVia_PesquisarSegmentoForum() {
	var todosSelecionados = [];
	for (i = 0; i < Waze.selectionManager.getSelectedFeatures().length; i++) {
		todosSelecionados.push(Waze.selectionManager.getSelectedFeatures()[i].geometry.id);
	}

	for (var i = 0; i < todosSelecionados.length; i++) {
		var segmentoPesquisar;
		for (var seg in wazeModel.segments.objects) {
			var segmento = wazeModel.segments.objects[seg];

			if (segmento.geometry.id == todosSelecionados[i]) {
				segmentoPesquisar = segmento.attributes.id;
				break;
			}
		}
	}

	var mapsUrl = 'https://www.waze.com/forum/search.php?keywords=' + segmentoPesquisar + '&terms=all&author=&sv=0&sc=1&sf=all&sr=posts&sk=t&sd=d&st=0&ch=300&t=0&submit=Search';
	window.open(mapsUrl, '_blank');
}

function funVia_AplicarMudancaCidade() {
	var todosSelecionados = [];
	for (i = 0; i < Waze.selectionManager.getSelectedFeatures().length; i++) {
		todosSelecionados.push(Waze.selectionManager.getSelectedFeatures()[i].geometry.id);
	}

	if (todosSelecionados.length > 0) {
		var seg_NomeCidadeEscolhida_MudancaCidade;
		var seg_IdEstadoCidadeEscolhida_MudancaCidade;
		var semCidade = false;

		if (!document.getElementById('chkMarcarSemCidade').checked) {
			for (var cit in wazeModel.cities.objects) {
				if (document.getElementById('selTrocarCidadeSelecionados').value == wazeModel.cities.objects[cit].attributes.id) {
					seg_NomeCidadeEscolhida_MudancaCidade = wazeModel.cities.objects[cit].attributes.name;
					seg_IdEstadoCidadeEscolhida_MudancaCidade = wazeModel.cities.objects[cit].attributes.stateID;

					break;
				}
			}
		}
		else {
			semCidade = true;
		}

		for (var i = 0; i < todosSelecionados.length; i++) {

			var segmentoAlternar;
			for (var seg in wazeModel.segments.objects) {
				var segmento = wazeModel.segments.objects[seg];

				if (segmento.geometry.id == todosSelecionados[i]) {
					segmentoAlternar = segmento.attributes.id;
					break;
				}
			}

			var comando = "                                                                 \
			var segmentoAlternar = wazeModel.segments.objects["+ segmentoAlternar + "];     \
			var t = [];                                                                     \
			t.push(segmentoAlternar);                                                       \
			Waze.selectionManager.setSelectedModels(t);"
			genericAssincCommand(comando);

			comando = "$('a[class=\"address-edit-input primary-street\"]').click();";
			genericAssincCommand(comando);

			if (semCidade) {
				comando = "$('input[name=\"emptyCity\"]').click();";
			}
			else {
				comando = "$('[name=stateID]').val(\"" + seg_IdEstadoCidadeEscolhida_MudancaCidade + "\");          \
				$('input[name=\"cityName\"]').attr(\"value\", \"" + seg_NomeCidadeEscolhida_MudancaCidade + "\");";
			}
			genericAssincCommand(comando);

			comando = "$('div[class=\"action-buttons\"]').find('button[class=\"save-button waze-btn waze-btn-blue waze-btn-smaller\"]').click();";
			genericAssincCommand(comando);

		}
	}
}

function funVia_SinalizarVariacaoVelocidades() {
	if (document.getElementById('chkVelocidades').checked) {

		console.log('Avaliando velocidades...');

		var WM = Waze.map;

		var rlayers = WM.getLayersBy("uniqueName", "__CamadaAvaliacaoWMEBrasil");
		if (rlayers.length == 0) {
			var drc_style1 = new OL.Style({
				strokeDashstyle: 'solid',
				strokeColor: "${strokeColor}",
				strokeOpacity: 1.0,
				strokeWidth: "${strokeWidth}",
				fillColor: '#0040FF',
				fillOpacity: 1.0,
				pointRadius: "${pointRadius}",
				label: "${labelText}",
				fontFamily: "Tahoma, Courier New",
				labelOutlineColor: "${labelOutlineColor}",
				labelOutlineWidth: "${labelOutlineWidth}",
				fontColor: "${fontColor}",
				fontOpacity: 1.0,
				fontSize: "${fontSize}",
				display: 'block'
			});

			var drc_mapLayer1 = new OL.Layer.Vector("Velocidades Máximas", {
				displayInLayerSwitcher: true,
				uniqueName: "__CamadaAvaliacaoWMEBrasil",
				styleMap: new OL.StyleMap(drc_style1)
			});

			drc_mapLayer1.setVisibility(true);

			WM.addLayer(drc_mapLayer1);
		}

		var routeLayer = WM.getLayersBy("uniqueName", "__CamadaAvaliacaoWMEBrasil")[0];
		routeLayer.removeAllFeatures();

		var labelFeatures = [];

		for (var seg in wazeModel.segments.objects) {

			var Avaliacao = funVia_AvaliarVelocidade(seg);

			if (Avaliacao != '') {

				var segmento = wazeModel.segments.objects[seg];

				var segText = (segmento.attributes.fwdDirection ? 'AB: ' + segmento.attributes.fwdMaxSpeed : '') +
								(segmento.attributes.fwdDirection && segmento.attributes.revDirection ? ' / ' : '') +
								(segmento.attributes.revDirection ? 'BA: ' + segmento.attributes.revMaxSpeed : '');

				var label = new OpenLayers.Feature.Vector(segmento.getCenter(), {
					labelText: segText,
					fontColor: '#ffffff',
					fontSize: "13px",
					pointRadius: 0,
					labelOutlineWidth: 6,
					labelOutlineColor: Avaliacao
				});
				labelFeatures.push(label);
			}

		}
		if (labelFeatures.length > 0) {
			routeLayer.addFeatures(labelFeatures);
		}
	}
}

function funVia_SinalizarMaturidade() {
	if (document.getElementById('chkMaturidade').checked) {

		console.log('Avaliando maturidade...');

		var WM = Waze.map;

		var rlayers = WM.getLayersBy("uniqueName", "__CamadaAvaliacaoWMEBrasil");
		if (rlayers.length == 0) {
			var drc_style1 = new OL.Style({
				strokeDashstyle: 'solid',
				strokeColor: "${strokeColor}",
				strokeOpacity: 1.0,
				strokeWidth: "${strokeWidth}",
				fillColor: '#0040FF',
				fillOpacity: 1.0,
				pointRadius: "${pointRadius}",
				label: "${labelText}",
				fontFamily: "Tahoma, Courier New",
				labelOutlineColor: "${labelOutlineColor}",
				labelOutlineWidth: "${labelOutlineWidth}",
				fontColor: "${fontColor}",
				fontOpacity: 1.0,
				fontSize: "${fontSize}",
				display: 'block'
			});

			var drc_mapLayer1 = new OL.Layer.Vector("Maturidade das vias", {
				displayInLayerSwitcher: true,
				uniqueName: "__CamadaAvaliacaoWMEBrasil",
				styleMap: new OL.StyleMap(drc_style1)
			});

			drc_mapLayer1.setVisibility(true);

			WM.addLayer(drc_mapLayer1);
		}

		var routeLayer = WM.getLayersBy("uniqueName", "__CamadaAvaliacaoWMEBrasil")[0];
		routeLayer.removeAllFeatures();

		var labelFeatures = [];

		for (var seg in wazeModel.segments.objects) {

			var Avaliacao = funVia_AvaliarMaturidade(seg);

			if (Avaliacao != '') {

				var segmento = wazeModel.segments.objects[seg];

				var segText = "•••";

				var label = new OpenLayers.Feature.Vector(segmento.getCenter(), {
					labelText: segText,
					fontColor: '#ffffff',
					fontSize: "13px",
					pointRadius: 0,
					labelOutlineWidth: 6,
					labelOutlineColor: Avaliacao
				});
				labelFeatures.push(label);
			}

		}
		if (labelFeatures.length > 0) {
			routeLayer.addFeatures(labelFeatures);
		}
	}
}

function funVia_AvaliarVelocidade(idSegmento) {
	var segmentoPrime = wazeModel.segments.objects[idSegmento];

	//Se tem algum null

	if (
		((segmentoPrime.attributes.fwdDirection && segmentoPrime.attributes.revDirection) && (segmentoPrime.attributes.fwdMaxSpeed == null || segmentoPrime.attributes.revMaxSpeed == null))
		||
		((segmentoPrime.attributes.fwdDirection && !segmentoPrime.attributes.revDirection) && (segmentoPrime.attributes.fwdMaxSpeed == null))
		||
		((!segmentoPrime.attributes.fwdDirection && segmentoPrime.attributes.revDirection) && (segmentoPrime.attributes.revMaxSpeed == null))
		) {
		return '#ff0000';
	}

	var somavelocidadeAB = 0;
	var somavelocidadeBA = 0;
	var contasegmentos = 0;

	for (var seg in wazeModel.segments.objects) {
		if (wazeModel.segments.objects[seg].attributes.primaryStreetID == segmentoPrime.attributes.primaryStreetID &&
			seg != idSegmento) {
			somavelocidadeAB += wazeModel.segments.objects[seg].attributes.fwdMaxSpeed;
			somavelocidadeBA += wazeModel.segments.objects[seg].attributes.revMaxSpeed;
			contasegmentos++;
		}
	}

	if (contasegmentos > 0) {
		//Se a street tem velocidades diferentes
		if (
		((segmentoPrime.attributes.fwdDirection && segmentoPrime.attributes.revDirection) && (segmentoPrime.attributes.fwdMaxSpeed != somavelocidadeAB / contasegmentos || segmentoPrime.attributes.revMaxSpeed != somavelocidadeBA / contasegmentos))
		||
		((segmentoPrime.attributes.fwdDirection && !segmentoPrime.attributes.revDirection) && (segmentoPrime.attributes.fwdMaxSpeed != somavelocidadeAB / contasegmentos))
		||
		((!segmentoPrime.attributes.fwdDirection && segmentoPrime.attributes.revDirection) && (segmentoPrime.attributes.revMaxSpeed != somavelocidadeBA / contasegmentos))
		) {
			return '#cc00ff';
		}
	}

	return '';
}

function funVia_AvaliarMaturidade(idSegmento) {
	var segmentoPrime = wazeModel.segments.objects[idSegmento];

	var dateNow = new Date();
	var diasUpdate = Math.floor((dateNow.getTime() - segmentoPrime.attributes.updatedOn) / 86400000);


	if (diasUpdate > 90) {
		return '#66ff33';
	}
	else if (diasUpdate > 30) {
		return '#ffff66';
	}
	else if (diasUpdate > 15) {
		return '#ff9900';
	}
	else {
		return '#ff3300';
	}
}

function funVia_TestarSegmentosAlinhados(segmento1, segmento2) {
	//Os pontos somente estarão alinhados se o determinante da matriz quadrada calculado pela regra de Sarrus for igual a 0.
	/*
	x1  y1  1|
	x2  y2  1| = 0
	x3  y3  1|

	x1  y1  1|x1  y1  |
	x2  y2  1|x2  y2  | = 0
	x3  y3  1|x3  y3  |

	x1 * y2 * 1     = A
	y1 * 1  * x3    = B
	1  * x2 * y3    = C

	x3 * y2 * 1     = D
	y3 * 1  * x1    = E
	1  * x2 * y1    = F

	(A+B+C)-(D+E+F) = 0?
	*/

	//Só retas valem.
	if (segmento1.geometry.components.length != 2 ||
		segmento2.geometry.components.length != 2) {
		return false;
	}

	var noExtremo1;
	var noExtremo2;
	var noComum;

	//Só se estiverem "congruentes" (juntas) - com 1 ponto em comum.
	if (segmento1.attributes.fromNodeID == segmento2.attributes.fromNodeID) {
		noExtremo1 = wazeModel.nodes.objects[segmento1.attributes.toNodeID];
		noExtremo2 = wazeModel.nodes.objects[segmento2.attributes.toNodeID];
		noComum = wazeModel.nodes.objects[segmento1.attributes.fromNodeID];
	}
	else if (segmento1.attributes.toNodeID == segmento2.attributes.toNodeID) {
		noExtremo1 = wazeModel.nodes.objects[segmento1.attributes.fromNodeID];
		noExtremo2 = wazeModel.nodes.objects[segmento2.attributes.fromNodeID];
		noComum = wazeModel.nodes.objects[segmento1.attributes.toNodeID];
	}
	else if (segmento1.attributes.fromNodeID == segmento2.attributes.toNodeID) {
		noExtremo1 = wazeModel.nodes.objects[segmento1.attributes.toNodeID];
		noExtremo2 = wazeModel.nodes.objects[segmento2.attributes.fromNodeID];
		noComum = wazeModel.nodes.objects[segmento1.attributes.fromNodeID];
	}
	else if (segmento1.attributes.toNodeID == segmento2.attributes.fromNodeID) {
		noExtremo1 = wazeModel.nodes.objects[segmento1.attributes.fromNodeID];
		noExtremo2 = wazeModel.nodes.objects[segmento2.attributes.toNodeID];
		noComum = wazeModel.nodes.objects[segmento1.attributes.toNodeID];
	}
	else {
		return false;
	}

	var A = noExtremo1.geometry.x * noExtremo2.geometry.y;
	var B = noExtremo1.geometry.y * noComum.geometry.x;
	var C = noExtremo2.geometry.x * noComum.geometry.y;

	var D = noComum.geometry.x * noExtremo2.geometry.y;
	var E = noComum.geometry.y * noExtremo1.geometry.x;
	var F = noExtremo2.geometry.x * noExtremo1.geometry.y;

	var tolerancia = parseInt(document.getElementById('inputToleranciaAlinhamento').value) * 100;

	console.log(segmento1.attributes.id);
	console.log(segmento2.attributes.id);
	console.log('Alinhamento: A     ' + A);
	console.log('Alinhamento: B     ' + B);
	console.log('Alinhamento: C     ' + C);
	console.log('Alinhamento: D     ' + D);
	console.log('Alinhamento: E     ' + E);
	console.log('Alinhamento: F     ' + F);

	console.log((A + B + C) - (D + E + F));

	console.log('Tolerancia de ' + tolerancia);


	return (
		(A + B + C) - (D + E + F) < tolerancia
		&&
		(A + B + C) - (D + E + F) > -1 * tolerancia
		);
}

function funVia_SelecionarSegmentosAlinhados(segmento1, segmento2) {
	segmento2 = segmento2 || true;
	var chamadaRaiz = false;

	console.log(segmento1);
	console.log(segmento2);

	//****************************************************************************************************************************************
	if (segmento2 == true) {
		console.log('Raiz');
		chamadaRaiz = true;
		seg_listaSegmentosSelecionados = [];//estes são os segmentos "prime"... aquilo q o usuário selecionou mesmo.

		for (i = 0; i < Waze.selectionManager.getSelectedFeatures().length; i++) {
			for (var seg in wazeModel.segments.objects) {
				var segmento = wazeModel.segments.objects[seg];

				if (segmento.geometry.id == Waze.selectionManager.getSelectedFeatures()[i].geometry.id) {
					if (wazeModel.streets.objects[segmento.attributes.primaryStreetID].name == null) {
						seg_listaSegmentosSelecionados.push(segmento);
					}
					break;
				}
			}
		}
		segmento1 = seg_listaSegmentosSelecionados[0];
		segmento2 = seg_listaSegmentosSelecionados[1];

		console.log(seg_listaSegmentosSelecionados);

		for (var i = 0; i < wazeModel.nodes.objects[segmento1.attributes.fromNodeID].attributes.segIDs.length; i++) {
			//Vou testar EXCETO se for o segmento 1- pq ele já é o garantido.
			if (wazeModel.nodes.objects[segmento1.attributes.fromNodeID].attributes.segIDs[i] != segmento1.attributes.id) {
				var segmentoTeste = wazeModel.segments.objects[wazeModel.nodes.objects[segmento1.attributes.fromNodeID].attributes.segIDs[i]];
				if (funVia_TestarSegmentosAlinhados(segmento1, segmentoTeste) &&
					wazeModel.streets.objects[segmentoTeste.attributes.primaryStreetID].name == null) {
					seg_listaSegmentosSelecionados.push(segmentoTeste);

					funVia_SelecionarSegmentosAlinhados(segmento1, segmentoTeste);
				}
			}
		}

		for (var i = 0; i < wazeModel.nodes.objects[segmento1.attributes.toNodeID].attributes.segIDs.length; i++) {
			//Vou testar EXCETO se for o segmento 1- pq ele já é o garantido.
			if (wazeModel.nodes.objects[segmento1.attributes.toNodeID].attributes.segIDs[i] != segmento1.attributes.id) {
				var segmentoTeste = wazeModel.segments.objects[wazeModel.nodes.objects[segmento1.attributes.toNodeID].attributes.segIDs[i]];
				if (funVia_TestarSegmentosAlinhados(segmento1, segmentoTeste) &&
					wazeModel.streets.objects[segmentoTeste.attributes.primaryStreetID].name == null) {
					seg_listaSegmentosSelecionados.push(segmentoTeste);

					funVia_SelecionarSegmentosAlinhados(segmento1, segmentoTeste);
				}
			}
		}
	}
	//****************************************************************************************************************************************


	var segmentoJaSelecionado = false;
	if (!chamadaRaiz) {
		for (var i = 0; i < seg_listaSegmentosSelecionados.length - 1; i++) {
			if (seg_listaSegmentosSelecionados[i].attributes.id == segmento2.attributes.id) {
				segmentoJaSelecionado = true;
			}
		}
	}

	if (!segmentoJaSelecionado) {
		for (var i = 0; i < wazeModel.nodes.objects[segmento2.attributes.fromNodeID].attributes.segIDs.length; i++) {
			//Vou testar EXCETO se for o segmento 1- pq ele já é o garantido.
			if (wazeModel.nodes.objects[segmento2.attributes.fromNodeID].attributes.segIDs[i] != segmento2.attributes.id) {
				var segmentoTeste = wazeModel.segments.objects[wazeModel.nodes.objects[segmento2.attributes.fromNodeID].attributes.segIDs[i]];
				if (funVia_TestarSegmentosAlinhados(segmento2, segmentoTeste) &&
					wazeModel.streets.objects[segmentoTeste.attributes.primaryStreetID].name == null) {
					seg_listaSegmentosSelecionados.push(segmentoTeste);

					funVia_SelecionarSegmentosAlinhados(segmento2, segmentoTeste);
				}
			}
		}

		for (var i = 0; i < wazeModel.nodes.objects[segmento2.attributes.toNodeID].attributes.segIDs.length; i++) {
			//Vou testar EXCETO se for o segmento 1- pq ele já é o garantido.
			if (wazeModel.nodes.objects[segmento2.attributes.toNodeID].attributes.segIDs[i] != segmento2.attributes.id) {
				var segmentoTeste = wazeModel.segments.objects[wazeModel.nodes.objects[segmento2.attributes.toNodeID].attributes.segIDs[i]];
				if (funVia_TestarSegmentosAlinhados(segmento2, segmentoTeste) &&
					wazeModel.streets.objects[segmentoTeste.attributes.primaryStreetID].name == null) {
					seg_listaSegmentosSelecionados.push(segmentoTeste);

					funVia_SelecionarSegmentosAlinhados(segmento2, segmentoTeste);
				}
			}
		}
	}

	if (chamadaRaiz) {
		console.log(seg_listaSegmentosSelecionados);
		Waze.selectionManager.setSelectedModels(seg_listaSegmentosSelecionados);
		seg_listaSegmentosSelecionados = [];
	}
}

funVia_SelecionarSegmentoClosure = function (idSegmento) {
	console.log('Selecionando segmento ' + idSegmento);

	var seg = wazeModel.segments.objects[idSegmento];
	var sel = []; sel.push(seg);
	Waze.selectionManager.setSelectedModels(sel);
	var currentZoom = Waze.map.getZoom();

	window.setTimeout(function () {
		Waze.map.zoomToExtent(seg.geometry.getBounds());
		Waze.map.zoomTo(currentZoom);

		$('[class="nav nav-tabs"]')[1].children[1].children[0].click();//vai pra aba de interdição
	}, 300);
};
//-----------------------------------------------------------------------------------------------------------

function funPlace_ObterPoint(geometryPlace) {
	if (geometryPlace.id.indexOf('Geometry_Point') != -1) {
		return geometryPlace;
	}
	else {
		return funPlace_ObterPoint(geometryPlace.components[0]);
	}
}

/// <summary>
/// Usuários que tem coisa pra aprovar.
/// </summary>
/// <param name=""></param>
/// <returns></returns>
function funPlace_ProcurarUsuariosPU() {
	var usuariosPUs = [];

	if (document.getElementById('chkPlaceUsuario').checked) {
		for (var objs in wazeModel.venues.objects) {
			var place = wazeModel.venues.objects[objs];

			if (!place.attributes.adLocked) {
				for (var i = 0; i < place.attributes.venueUpdateRequests.length; i++) {
					var usuario = wazeModel.users.get(place.attributes.venueUpdateRequests[i].attributes.createdBy);

					if (Waze.map.getExtent().toGeometry().containsPoint(funPlace_ObterPoint(place.attributes.geometry)) &&
						usuariosPUs.indexOf(place.attributes.venueUpdateRequests[i].attributes.createdBy) == -1 &&

						(
						(
						typeof (usuario.temporary) != 'undefined' &&
						usuario.temporary == false
						)
						||
						typeof (usuario.temporary) == 'undefined'
						)
						) {
						usuariosPUs.push([place.attributes.venueUpdateRequests[i].attributes.createdBy, usuario.userName]);
					}
				}
			}
		}

		console.log(usuariosPUs.length + ' identificados.');

		if (usuariosPUs.length == 0) //Já que perdeu tempo de caçar PU e naõ achou nenhum. Localiza os places.
		{
			for (var objs in wazeModel.venues.objects) {
				var place = wazeModel.venues.objects[objs];

				if (!place.attributes.adLocked &&
					Waze.map.getExtent().toGeometry().containsPoint(funPlace_ObterPoint(place.attributes.geometry))) {

					var criador = wazeModel.users.get(place.attributes.createdBy);
					var atualizador = wazeModel.users.get(place.attributes.updatedBy);
					if (
						usuariosPUs.indexOf(criador.id) == -1 &&
						(
						(
						typeof (criador.temporary) != 'undefined' &&
						criador.temporary == false
						)
						||
						typeof (criador.temporary) == 'undefined'
						)

						) {
						usuariosPUs.push([criador.id, criador.userName]);
					}
					if (
						usuariosPUs.indexOf(atualizador.id) == -1 &&
						(
						(
						typeof (atualizador.temporary) != 'undefined' &&
						atualizador.temporary == false
						)
						||
						typeof (atualizador.temporary) == 'undefined'
						)

						) {
						usuariosPUs.push([atualizador.id, atualizador.userName]);
					}

				}
			}
		}
	}

	genericLoadDropDown('selUsuariosPlaces', usuariosPUs);
}

/// <summary>
/// Do que tem pra aprovar o que é do usuário.
/// </summary>
/// <param name=""></param>
/// <returns></returns>
function funPlace_RealcarPUsDoUsuario() {

	console.log(global_intervalosRealcePlacesUsuario);

	for (i = 0; i < global_intervalosRealcePlacesUsuario.length; i++) {
		console.log('parando ' + global_intervalosRealcePlacesUsuario[i]);
		window.clearInterval(global_intervalosRealcePlacesUsuario[i]);
	}

	global_intervalosRealcePlacesUsuario = [];

	for (var objs in wazeModel.venues.objects) {
		var place = wazeModel.venues.objects[objs];

		if (!place.attributes.adLocked) {

			var danadoAtualizou = false;

			for (var i = 0; i < place.attributes.venueUpdateRequests.length; i++) {

				if (place.attributes.venueUpdateRequests[i].attributes.createdBy == document.getElementById('selUsuariosPlaces').value) {
					$('div[data-id="' + place.attributes.id + '"]').css("fill", "#FF0000");
					$('div[data-id="' + place.attributes.id + '"]').css("background-color", "#FF0000");
					danadoAtualizou = true;
					break;
				}

			}

			if (!danadoAtualizou) {
				$('div[data-id="' + place.attributes.id + '"]').css("fill", "");
				$('div[data-id="' + place.attributes.id + '"]').css("background-color", "");
			}

			if (place.attributes.venueUpdateRequests.length == 0 &&
				(place.attributes.createdBy == document.getElementById('selUsuariosPlaces').value ||
				place.attributes.updatedBy == document.getElementById('selUsuariosPlaces').value
				)) {
				global_intervalosRealcePlacesUsuario.push(funOu_RealcadorPlaceUpdate(place.attributes.id));
			}
		}
	}
}

function funPlace_SelecionarSobreposto() {
	try {
		var tolerancia = parseInt(document.getElementById('inputEspacamentoTolerancia').value);
		var nosJuncao = [];//id, X, Y
		var poinPlaces = [];//id, X, Y

		for (var node in wazeModel.nodes.objects) {
			if (Waze.map.getExtent().toGeometry().containsPoint(wazeModel.nodes.objects[node].geometry)) {
				nosJuncao.push([node, (-1) * wazeModel.nodes.objects[node].geometry.x, (-1) * wazeModel.nodes.objects[node].geometry.y]);
			}
		}

		for (var objs in wazeModel.venues.objects) {
			var landmark = wazeModel.venues.objects[objs];
			if (landmark.attributes.geometry.__proto__.CLASS_NAME.toUpperCase().indexOf("POINT") != -1) {

				if (Waze.map.getExtent().toGeometry().containsPoint(landmark.attributes.geometry)) {
					poinPlaces.push([objs, (-1) * landmark.attributes.geometry.x, (-1) * landmark.attributes.geometry.y]);
				}
			}
		}

		console.log(tolerancia);
		console.log(nosJuncao);
		console.log(poinPlaces);

		nosJuncao = nosJuncao.sort(genericSortList);
		poinPlaces = poinPlaces.sort(genericSortList);

		console.log(nosJuncao);
		console.log(poinPlaces);

		for (var i = 0; i < poinPlaces.length; i++) {
			for (var j = 0; j < nosJuncao.length; j++) {
				//ordenei por X pq se o ponto + tolerancia < junção, nem olha mais as outras junções. Proximo ponto!
				if (poinPlaces[i][1] + tolerancia < nosJuncao[j][1]) {
					continue;
				}

				if (poinPlaces[i][1] < nosJuncao[j][1] + tolerancia && poinPlaces[i][1] + tolerancia > nosJuncao[j][1] &&
					poinPlaces[i][2] < nosJuncao[j][2] + tolerancia && poinPlaces[i][2] + tolerancia > nosJuncao[j][2]) {

					console.log('Selecionar ' + poinPlaces[i][0]);

					var t = [];
					t.push(wazeModel.venues.objects[poinPlaces[i][0]]);
					Waze.selectionManager.setSelectedModels(t);

					return;
				}
			}
		}
	} catch (e) {
		genericLog(e);
	}




}

function funPlace_PesquisarANP() {

	try {
		var countCity = 0;
		var selecionadaListada = false;
		var idCidade = 0;

		for (var cit in wazeModel.cities.objects) {
			if (wazeModel.cities.objects[cit].attributes.name != "") {
				if (typeof (wazeModel.cities.objects[cit].attributes.outOfScope) == "undefined" ||
				(typeof (wazeModel.cities.objects[cit].attributes.outOfScope) != "undefined" && wazeModel.cities.objects[cit].attributes.outOfScope == false)) {
					idCidade = wazeModel.cities.objects[cit].attributes.id;
					countCity++;

					if (document.getElementById('selCidadePosto').value == wazeModel.cities.objects[cit].attributes.id) {
						selecionadaListada = true;
						break;
					}
				}
			}
		}

		if (selecionadaListada == false && countCity > 1) {
			genericExibirMensagem(genericTraducao('msg_ANP'));
			return;
		}

		var indexEstado = UFestados.indexOf(wazeModel.states.objects[wazeModel.cities.objects[idCidade].attributes.stateID].name);

		var link = "https://postos.anp.gov.br/consulta.asp";
		link += "?WmeMunicipio=" + wazeModel.cities.objects[idCidade].attributes.name.toUpperCase();

		var site = "<html>                                                                      \
			<body onload='document.forms[\"frmPesquisa\"].submit()'>                        \
			<form method=\"Post\" action=\"" + link + "\" name=\"frmPesquisa\">             \
				<input name=\"sEstado\" value=\""+ UFestadosSiglas[indexEstado] + "\"/>     \
			</form>                                                                         \
			</body>                                                                         \
			</html>";
		var popupWindow = window.open("", "_blank");
		popupWindow.document.write(site);
		popupWindow.document.close();

		console.log(indexEstado);
		console.log(codMunicipios);
		console.log(nomePosto);
	} catch (e) {
		genericLog(e);
	}
}

function funPlace_LockPlace() {
	if (global_FilaInstrucaoAssincrona.length > 0) {
		genericAssincStop();
		return;
	}

	var lockarPonto = document.getElementById('chkLockPonto').checked;
	var lockarArea = document.getElementById('chkLockArea').checked;
	var lockRaise = document.getElementById('chkRaiseLock').checked;
	var lockLower = document.getElementById('chkLowerLock').checked;

	var lvlLock = document.getElementById('inputLockLevel').value - 1;

	console.log('Queremos um lock ' + lvlLock + ' na área');

	for (var objs in wazeModel.venues.objects) {
		var landmark = wazeModel.venues.objects[objs];

		if (Waze.map.getExtent().toGeometry().containsPoint(funPlace_ObterPoint(landmark.attributes.geometry))) {
			if (
				((lockRaise == lockLower) && (landmark.attributes.lockRank != lvlLock))
				|| ((lockRaise) && (landmark.attributes.lockRank < lvlLock))
				|| ((lockLower) && (landmark.attributes.lockRank > lvlLock))) {
				console.log(landmark);

				if (
						(lockarPonto &&
						landmark.attributes.geometry.__proto__.CLASS_NAME.toUpperCase().indexOf("POINT") != -1)
					||
						(lockarArea &&
						landmark.attributes.geometry.__proto__.CLASS_NAME.toUpperCase().indexOf("POINT") == -1)
					) {
					var instrucao = "                                                                                       \
					var landmark = wazeModel.venues.objects[\""+ landmark.attributes.id + "\"];                             \
																															\
					var t = [];                                                                                             \
					t.push(landmark);                                                                                       \
					Waze.selectionManager.setSelectedModels(t);                                                                        \
																															\
					genericAssincBreak();";
					genericAssincCommand(instrucao, false);

					instrucao = "$('input[name=\"services\"]')[0].click();";    //Fake... só serve pra gerar Action no ActionManager
					genericAssincCommand(instrucao, false);

					instrucao = "                                                                               \
					wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].newAttributes = \
						{ lockRank: " + lvlLock + " };                                                          \
																												\
					wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].oldAttributes = \
						{ lockRank: " + landmark.attributes.lockRank + " };";
					genericAssincCommand(instrucao, true);
				}
			}
		}
	}
}

function funPlace_AprovarReprovarPU(valor) {

	if (global_FilaInstrucaoAssincrona.length > 0) {
		genericAssincStop();
		return;
	}

	var apenasUsuario = document.getElementById('chkPlaceUsuario').checked;
	var usuario = document.getElementById('selUsuariosPlaces').value;


	for (var objs in wazeModel.venues.objects) {
		var landmark = wazeModel.venues.objects[objs];

		if (landmark.attributes.venueUpdateRequests.length > 0
			&& landmark.attributes.adLocked == false
			&& landmark.attributes.permissions == -1
			) {
			if (!apenasUsuario ||
				(apenasUsuario && landmark.attributes.venueUpdateRequests[0].attributes.createdBy == usuario)) {

				if (
					document.getElementById('chkFecharApenasVisiveis').checked &&
					!Waze.map.getExtent().toGeometry().containsPoint(funPlace_ObterPoint(landmark.attributes.geometry))) {
					continue;
				}

				console.log('Aprovação de places, enfilerando place' + objs);

				var strComando = "$('[data-id=\"" + objs + "\"]').click();        \
								genericAssincBreak();";
				genericAssincCommand(strComando);

				for (var i = 0; i < landmark.attributes.venueUpdateRequests.length; i++) {

					//if (landmark.attributes.venueUpdateRequests[i]._pending)
					{
						if (valor) {
							strComando = "$('[class=\"approve\"]').click();";
							genericAssincCommand(strComando, true);
						}
						else {

							console.log(landmark);

							if (landmark.attributes.venueUpdateRequests[i].attributes.updateType == "flag") {
								strComando = "$('[class=\"approve\"]').click();";
							}
							else {
								strComando = "$('[class=\"reject\"]').click();";
							}
							genericAssincCommand(strComando, true);
						}

						if (i < landmark.attributes.venueUpdateRequests.length - 1)//Não ultimo.
						{
							strComando = "$('[class=\"next waze-plain-btn\"]').click();";
							genericAssincCommand(strComando);
						}
					}
				}
			}
		}
	}

	if (global_FilaInstrucaoAssincrona.length > 0) {
		strComando = "$('[class=\"close-panel\"]').click();";
		genericAssincCommand(strComando);
	}

	console.log(global_FilaInstrucaoAssincrona);
}

//-----------------------------------------------------------------------------------------------------------

function funOu_ListarUsuariosRadar() {
	var usuariosPUs = [];
	var usuario;
	for (var key in wazeModel.cameras.objects) {
		var radar = wazeModel.cameras.objects[key];
		if (Waze.map.getExtent().toGeometry().containsPoint(radar.geometry)) {

			if (usuariosPUs.indexOf(radar.attributes.updatedBy) == -1) {

				usuario = wazeModel.users.get(radar.attributes.updatedBy);
				if (typeof (usuario) != 'undefined' &&
					(
					typeof (usuario.temporary) == 'undefined' ||
					usuario.temporary == false)) {

					console.log(usuario);
					usuariosPUs.push([radar.attributes.updatedBy, usuario.userName]);
				}
			}

			if (usuariosPUs.indexOf(radar.attributes.createdBy) == -1) {

				usuario = wazeModel.users.get(radar.attributes.createdBy);
				if (typeof (usuario) != 'undefined' &&
					(
					typeof (usuario.temporary) == 'undefined' ||
					usuario.temporary == false)) {
					console.log(usuario);
					usuariosPUs.push([radar.attributes.createdBy, usuario.userName]);
				}
			}
		}
	}

	console.log(usuariosPUs);

	genericLoadDropDown('selUsuarioRadar', usuariosPUs);
}

function funOu_RealcarRadaresUsuario() {
	var usuarioradar = document.getElementById('selUsuarioRadar').value;

	console.log(global_intervalosRealceRadaresUsuario);

	for (i = 0; i < global_intervalosRealceRadaresUsuario.length; i++) {
		console.log('parando ' + global_intervalosRealceRadaresUsuario[i]);
		window.clearInterval(global_intervalosRealceRadaresUsuario[i]);
	}

	global_intervalosRealceRadaresUsuario = [];

	for (var key in wazeModel.cameras.objects) {
		var radar = wazeModel.cameras.objects[key];
		if (radar.attributes.permissions < 0 &&
			Waze.map.getExtent().toGeometry().containsPoint(radar.geometry)) {
			if (
					(
						document.getElementById('chkRadarNAO').checked &&
						(
							(document.getElementById('chkRadarCriado').checked && radar.attributes.createdBy != usuarioradar)
						||
							(document.getElementById('chkRadarAtualizado').checked && radar.attributes.updatedBy != usuarioradar)
						)
					)
				||

					(
						!document.getElementById('chkRadarNAO').checked &&
						(
							(document.getElementById('chkRadarCriado').checked && radar.attributes.createdBy == usuarioradar)
						||
							(document.getElementById('chkRadarAtualizado').checked && radar.attributes.updatedBy == usuarioradar)
						)
					)


				) {
				global_intervalosRealceRadaresUsuario.push(funOu_RealcadorRadar(radar.geometry.id));
			}
			else {
				$('image[id="' + radar.geometry.id + '"]').animate({ opacity: 1 });
			}
		}
	}
}

function funOu_RealcarPlaces() {
	var inicioExecucao = Date.now();

	if (document.getElementById('chkPlacesProblematicos').checked && global_FilaInstrucaoAssincrona.length == 0) {
		for (var objs in wazeModel.venues.objects) {
			if (inicioExecucao + 15000 < Date.now()) {
				genericExibirMensagem("Too many places... :-(");
				break;
			}

			var landmark = wazeModel.venues.objects[objs];

			if (!Waze.map.getExtent().toGeometry().containsPoint(funPlace_ObterPoint(landmark.attributes.geometry))) {
				continue;
			}

			var nomeVia = "";
			if (landmark.attributes.streetID != null &&
				landmark.attributes.streetID != "" &&
				typeof (wazeModel.streets.objects[landmark.attributes.streetID]) != "undefined") {
				nomeVia = wazeModel.streets.objects[landmark.attributes.streetID].name;
			}

			var sobreposto = false;

			//sobrepostos (mesmo nome ou mesmo tipo [exceto outros]) tipos (ponto área) diferentes
			if (landmark.attributes.geometry.__proto__.CLASS_NAME.toUpperCase().indexOf("POINT") != -1) {	//esse é ponto e está sobrepondo uma área.
				for (var placePoli in wazeModel.venues.objects) {
					var landmarkPoligonal = wazeModel.venues.objects[placePoli];

					if (landmarkPoligonal.attributes.geometry.__proto__.CLASS_NAME.toUpperCase().indexOf("POLYGON") != -1 &&
						(
						genericCompararTextos(landmarkPoligonal.attributes.name, landmark.attributes.name)
						)
					) {
						if (landmarkPoligonal.attributes.geometry.containsPoint(landmark.attributes.geometry)) {
							sobreposto = true;
							break;
						}
					}
				}
			}

			if  //posto com badeiras zuadas OU sem nome
				(landmark.isGasStation() &&
					(landmark.attributes.brand == "Esso" ||
					landmark.attributes.brand == "Ypiranga" ||
					landmark.attributes.name == "")
				) {
				$('[id="' + landmark.geometry.id + '"]').css("fill", "#8dc63f"); // verde
			}

			for (var h = 0; h < palavrasFeias.length; h++) {
				if//"casa" tipos outros (se tiver número aproveita, senão lixo)
							(!landmark.isResidential() &&
								(
									genericCompararTextos(landmark.attributes.name, palavrasFeias[h])
								||
									new RegExp(palavrasFeias[h].toUpperCase(), "gi").test(genericDesacentuaTexto(landmark.attributes.name))
								)
							) {
					$('[id="' + landmark.geometry.id + '"]').css("fill", "#ff8000");//laranja
				}
			}

			if//"casa" tipos outros (se tiver número aproveita, senão lixo)
			(!landmark.isResidential() &&
				landmark.attributes.categories.length > 0 &&
				landmark.attributes.categories[0] == "OTHER" &&
				(landmark.attributes.name.toUpperCase().indexOf("CASA") == 0)
			) {
				if (landmark.attributes.houseNumber != "") {
					$('[id="' + landmark.geometry.id + '"]').css("fill", "#ff00ff");//magenta
				}
				else {
					$('[id="' + landmark.geometry.id + '"]').css("fill", "#FF0000");//vermelho
				}
			}

			if //place com nome de rua no nome do place
				(nomeVia != null &&
					nomeVia != "" &&
					landmark.attributes.name.toUpperCase().indexOf("PÇ") == -1 &&
					genericCompararTextos(landmark.attributes.name, nomeVia)
				) {
				$('[id="' + landmark.geometry.id + '"]').css("fill", "#FF0000");//vermelho
			}

			if
			(sobreposto) {
				$('[id="' + landmark.geometry.id + '"]').css("fill", "#00ACC8");//azul
			}
		}
	}
}

function funOu_RealcarDirty4x4() {
	if (document.getElementById('chkDirty4x4').checked) {
		console.log("funOu_RealcarDirty4x4.");
		for (var seg in wazeModel.segments.objects) {
			var segmentoTestado = wazeModel.segments.objects[seg];

			if (segmentoTestado.attributes.flags == 16) {
				$('[id="' + segmentoTestado.geometry.id + '"]').attr("stroke", "#663300");
				$('[id="' + segmentoTestado.geometry.id + '"]').attr("stroke-opacity", "1");
			}
		}
	}
}

function funOu_RealcarSobrescritaInstrucao() {
	if (document.getElementById('chkSobrescritaInstrucao').checked) {
		console.log("funOu_RealcarSobrescritaInstrucao.");
		for (var item in W.model.getTurnGraph()._adjacencyList) {

			for (var subItem in W.model.getTurnGraph()._adjacencyList[item]) {
				if (W.model.getTurnGraph()._adjacencyList[item][subItem]._instructionOpcode != null) {
					var idSegmento = item.substring(0, item.length - 1);
					$('[id="' + wazeModel.segments.objects[idSegmento].geometry.id + '"]').attr("stroke", "	#0000CD");
					$('[id="' + wazeModel.segments.objects[idSegmento].geometry.id + '"]').attr("stroke-opacity", "1");
				}
			}
		}
	}
}

function funOu_RealcarSegmentosComRoteamento() {
	if (document.getElementById('chkRoteamento').checked) {
		console.log("funOu_SegmentosComRoteamento.");
		for (var seg in wazeModel.segments.objects) {
			var segmentoTestado = wazeModel.segments.objects[seg];

			if (segmentoTestado.attributes.routingRoadType != null) {
				$('[id="' + segmentoTestado.geometry.id + '"]').attr("stroke", "#ff3df5");
				$('[id="' + segmentoTestado.geometry.id + '"]').attr("stroke-opacity", "1");
			}
		}
	}
}

function funOu_RealcarRadaresSemVelocidade() {
	for (i = 0; i < global_intervalosRealceRadaresNoSpeed.length; i++) {
		window.clearInterval(global_intervalosRealceRadaresNoSpeed[i]);
	}
	global_intervalosRealceRadaresNoSpeed = [];

	if (document.getElementById('chkRadaresZerados').checked) {
		for (var key in wazeModel.cameras.objects) {
			var radar = wazeModel.cameras.objects[key];
			if (radar.attributes.permissions < 0 &&
				Waze.map.getExtent().toGeometry().containsPoint(radar.geometry)) {
				if (radar.attributes.validated &&
				(radar.attributes.speed == null || radar.attributes.speed == 0)) {
					console.log(radar.geometry.id);
					global_intervalosRealceRadaresNoSpeed.push(funOu_RealcadorRadar(radar.geometry.id));
				}
				else {
					$('image[id="' + radar.geometry.id + '"]').animate({ opacity: 1 });
				}
			}
		}
		console.log(global_intervalosRealceRadaresNoSpeed);
	}
}

function funOu_RealcadorRadar(idRadar) {
	console.log('DEVE Realçar radar ' + idRadar);

	return window.setInterval(function () {
		console.log('Realçar radar ' + idRadar);
		$('image[id="' + idRadar + '"]').animate({ opacity: 0.3 });
		window.setTimeout(
			function () {
				$('image[id="' + idRadar + '"]').animate({ opacity: 1 });
			}, 1000);
	}, 2000);
}

function funOu_RealcadorPlaceUpdate(idPlace) {

	return window.setInterval(function () {

		$('div[data-id="' + idPlace + '"]').animate({ opacity: 0.3 });
		window.setTimeout(
			function () {
				$('div[data-id="' + idPlace + '"]').animate({ opacity: 1 });
			}, 1000);
	}, 2000);
}

function funOu_Realcadores() {

	var href = $('.WazeControlPermalink a').attr('href');

	var lon = genericGetQueryString(href, 'lon');
	var lat = genericGetQueryString(href, 'lat');
	var zoom = parseInt(genericGetQueryString(href, 'zoom'));

	if (ou_RealcePlaceLastLon == lon &&
		ou_RealcePlaceLastLat == lat &&
		ou_RealcePlaceLastZoom == zoom) {

		return;
	}
	else {
		console.log('Atualizando parametros de realce.');
		ou_RealcePlaceLastLon = lon;
		ou_RealcePlaceLastLat = lat;
		ou_RealcePlaceLastZoom = zoom;
	}

	//Places
	if (zoom >= 4) {
		funOu_RealcarPlaces();
	}

	//Radares
	funOu_RealcarRadaresSemVelocidade();

	//4x4
	funOu_RealcarDirty4x4();

	//Sobre escrita de instrução
	funOu_RealcarSobrescritaInstrucao();

	//Roteamento diferente de neutro
	funOu_RealcarSegmentosComRoteamento();

	//Interdições
	funOu_ListarInterdicoesFeed();

	//Velocidades
	funVia_SinalizarVariacaoVelocidades();

	//Maturidade
	funVia_SinalizarMaturidade();
}

function funOu_ListarInterdicoesFeed() {
	if (document.getElementById('chkClosures').checked) {
		while (document.getElementById('listaClosures') != null) {
			document.getElementById('listaClosures').remove();
		}

		var idSegmentosDesenhados = [];
		for (var closureId in wazeModel.roadClosures.objects) {
			var closureObj = wazeModel.roadClosures.objects[closureId];
			var DoisSentidos = false;

			var segmento = wazeModel.segments.objects[closureObj.segID];

			if (segmento != null
				&& idSegmentosDesenhados.indexOf(closureObj.segID) == -1
				&& funRevVia_VerificarSegmentoVisivel(segmento)) {
				for (var closureIdReverso in wazeModel.roadClosures.objects) {
					if (wazeModel.roadClosures.objects[closureIdReverso].segID == closureObj.segID) {
						DoisSentidos = true;
						break;
					}
				}

				console.log(closureObj);
				console.log('Duplo sentido ' + DoisSentidos);

				var Myhtml = document.createElement('ul');
				Myhtml.id = "listaClosures";
				Myhtml.className = 'full-closures list-unstyled';

				var txtHTM = '';

				txtHTM += '<li class="closure-item"  style="display: block;">';
				txtHTM += '<div class="details section"  style="display: block;">';

				txtHTM += '<div class="buttons pull-right"  style="display: block;">';
				txtHTM += '<div class="btn btn-block btn-default" style="display: block;" onclick="funVia_SelecionarSegmentoClosure(' + closureObj.segID + ')" >';
				txtHTM += '<i class="fa fa-pencil"  style="display: block;"></i>';
				txtHTM += '</div></div>';
				txtHTM += '<div class="direction">';

				if (DoisSentidos) {
					txtHTM += '<div class="dir-label span">';
					txtHTM += genericTraducao('msg_ClosuresMaoDupla');
					txtHTM += '</div>';
				}
				else {
					txtHTM += '<div class="dir-icon">' + (closureObj.forward ? 'A' : 'B') + '</div>';
					txtHTM += '<div class="dir-sep"></div>';
					txtHTM += '<div class="dir-icon">' + (closureObj.forward ? 'B' : 'A') + '</div>';
				}

				var rua = wazeModel.streets.objects[segmento.attributes.primaryStreetID];
				var cidade = wazeModel.cities.objects[rua.cityID];


				txtHTM += '</div>';
				txtHTM += '<div class="subtext"><span class="street">' + rua.name + '</span><span class="city">, ' + cidade.attributes.name + '</span><span class="country"></span></div>';
				txtHTM += '<h3 class="reason">' + closureObj.reason + '</h3>';
				txtHTM += '</div>';

				txtHTM += '<div class="dates row section">';
				txtHTM += '<div class="col-xs-6 start-date">';
				txtHTM += '<div class="date-label">Início</div>';
				txtHTM += '<div class="date">' + closureObj.startDate.substring(0, 10) + '</div>';
				txtHTM += '<div class="time">' + closureObj.startDate.substring(11) + '</div>';
				txtHTM += '</div>';

				txtHTM += '<div class="col-xs-6 end-date">';
				txtHTM += '<div class="date-label">Fim</div>';
				txtHTM += '<div class="date">' + closureObj.endDate.substring(0, 10) + '</div>';
				txtHTM += '<div class="time">' + closureObj.endDate.substring(11) + '</div>';
				txtHTM += '</div>';
				txtHTM += '</div></li>';

				Myhtml.innerHTML = txtHTM;

				var divClos = document.createElement('div');
				divClos.className = "closures-list";
				divClos.appendChild(Myhtml);
				document.getElementsByClassName("feed-issues")[0].appendChild(divClos);

				idSegmentosDesenhados.push(closureObj.segID);
			}
		}
	}
}

function funOu_ComentarioNovatos() {

	var comentarioNovato = genericTraducao('msg_ComentarioNovato');
	if (document.getElementById('txtComentarioNovato').value != '') {
		comentarioNovato = document.getElementById('txtComentarioNovato').value;
	}

	var quantosComentarios = 0;

	for (var idComent in W.model.mapComments.objects) {
		var comentario = W.model.mapComments.objects[idComent];

		if (comentario.attributes.conversation.length == 0
			&& comentario.attributes.lockRank == 0
			&& comentario.attributes.endDate == null
			&& W.model.users.getObjectById(comentario.attributes.createdBy).rank == 0
		) {
			quantosComentarios++;

            comentario.addComment(comentarioNovato);

            var instrucao = "													\
			var comentario = W.model.mapComments.objects[\""+ idComent + "\"];	\
			var t = [];														\
			t.push(comentario);												\
			W.selectionManager.setSelectedModels(t);";

            genericAssincCommand(instrucao, false);

            instrucao = "$('#lockRank-2').click();";
            genericAssincCommand(instrucao, false);

            var dataFinal = new Date();
			dataFinal.setDate(dataFinal.getDate() + 3);

            instrucao = "wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].newAttributes = { endDate: \"" + formatDate(dataFinal) + " 00:00\" };";
            genericAssincCommand(instrucao, true);

		}
	}

	genericExibirMensagem(genericTraducao('msg_ComentarioUR') + quantosComentarios + '.');
}

function formatDate(date) {
    var d = new Date(date),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();

    if (month.length < 2) 
        month = '0' + month;
    if (day.length < 2) 
        day = '0' + day;

    return [year, month, day].join('-');
}

function funOu_LinkGMaps() {
	var href = $('.WazeControlPermalink a').attr('href');

	var lon = genericGetQueryString(href, 'lon');
	var lat = genericGetQueryString(href, 'lat');
	var zoom = parseInt(genericGetQueryString(href, 'zoom'));

	zoom = zoom > 6 ? 19 : zoom + 12;
	var mapsUrl = 'https://maps.google.com/?ll=' + lat + ',' + lon + '&z=' + zoom;
	window.open(mapsUrl, '_blank');
}

function funOu_LinkFromGMaps() {
	var href = window.location.href;
	var posLon = href.indexOf('@-') + 1;
	var posLat = href.indexOf(',-', posLon) + 1;
	var posFim = href.indexOf(',', posLat);

	var lon = href.substr(posLon, posLat - posLon - 1);
	var lat = href.substr(posLat, posFim - posLat);
	var zoom = parseInt(document.getElementById('inputZoomWME').value);

	var mapsUrl = 'https://www.waze.com/pt-BR/editor/?env=row&lon=' + lat + '&lat=' + lon + '&zoom=' + zoom;
	window.open(mapsUrl, '_blank');


	$('#btnIrWme').each(function () {
		this.href = mapsUrl;
	});
}

function funOu_LinkZoomed() {
	var href = $('.WazeControlPermalink a').attr('href');
	var zoom = parseInt(genericGetQueryString(href, 'zoom'));

	var mapsUrl = href.replace('zoom=' + zoom, 'zoom=' + (zoom + 2));
	window.open(mapsUrl, '_blank');
}

function funOu_DesfazerTudo() {
	while (wazeModel.actionManager.undo()) {
		//faz nada... só desfaz... kkk
	}
}

function funOu_ObterDadosTodosEditores() {
	var distId = [];

	//Editores de segmentos
	for (var seg in wazeModel.segments.objects) {
		var updatedBy = wazeModel.segments.objects[seg].attributes.createdBy;
		if (distId.indexOf(updatedBy) == -1) {
			distId.push(updatedBy);
		}

		updatedBy = wazeModel.segments.objects[seg].attributes.updatedBy;
		if (distId.indexOf(updatedBy) == -1) {
			distId.push(updatedBy);
		}
	}

	//Editores de radares
	for (var key in wazeModel.cameras.objects) {
		var updatedBy = wazeModel.cameras.objects[key].attributes.updatedBy;
		if (distId.indexOf(updatedBy) == -1) {
			distId.push(updatedBy);
		}
	}

	//Editores de UR
	for (var urobj in wazeModel.updateRequestSessions.objects) {
		var ureq = wazeModel.updateRequestSessions.objects[urobj];
		if (ureq.comments.length != 0) {
			for (i = 0; i < ureq.comments.length; i++) {
				var updatedBy = ureq.comments[i].userID;
				if (distId.indexOf(updatedBy) == -1) {
					distId.push(updatedBy);
				}
			}
		}
	}

	var dataCache =
	[
		'login'
	];

	for (i = 0; i < distId.length; i++) {
		if (distId[i] != -1) {
			var user = wazeModel.users.get(distId[i]);
			if (typeof (user) != 'undefined') {
				dataCache.push('\n' + user.userName);
			}
		}
	}

	$('#dadosEditores').each(function () {
		this.href = 'data:text/csv;base64,' + btoa(dataCache);
		this.download = 'editores.csv';
	});
}

function funOu_AssyncEngine() {

	if(document.getElementById("tituloCabecalho") == null)
	{
		var userTabs = document.getElementById('user-info');
		var navTabs = genericgetByClass('nav-tabs', userTabs)[0];
		var tabContent = genericgetByClass('tab-content', userTabs)[0];
	
		newtabUR = document.createElement('li');
		newtabUR.innerHTML = '<a href="#sidepanel-mastersbrasil" data-toggle="tab" id="tituloCabecalho">WME Brasil</a>';
		newtabUR.innerHTML += '<img id="assyncEngine" src=""></img>';
		navTabs.appendChild(newtabUR);
	}

	var img = document.getElementById('assyncEngine');
	
	if (global_FilaInstrucaoAssincrona.length == 0) {
		img.src = '';
		img.title = '';
	}
	else {
		img.src = 'https://i.imgur.com/SbRFZJE.gif';
		img.title = global_FilaInstrucaoAssincrona.length + ' pendentes neste momento.';
	}	
}

//-----------------------------------------------------------------------------------------------------------
/*INICIO Revisão de nomes*/
//-----------------------------------------------------------------------------------------------------------

/// <summary>
/// Verifica se pode fazer a revisão: cidade escolhida ou se vai criar a cidade nova.
/// </summary>
/// <param name=""></param>
/// <returns>boolean (true -> pode fazer a revisão | false -> não pode fazer a revisão)</returns>
function funRevVia_VerificarCidadeEscolhida() {
	var userChamp = champsBrazil.indexOf(W.loginManager.user.userName) != -1;

	var countCity = 0;
	var adaListada = false;
	seg_NomeCidadeEscolhida = null;
	var selecionadaListada = false;

	for (var cit in wazeModel.cities.objects) {
		if (wazeModel.cities.objects[cit].attributes.name != "") {
			if (typeof (wazeModel.cities.objects[cit].attributes.outOfScope) == "undefined" ||
			(typeof (wazeModel.cities.objects[cit].attributes.outOfScope) != "undefined" && wazeModel.cities.objects[cit].attributes.outOfScope == false)) {
				seg_NomeCidadeEscolhida = wazeModel.cities.objects[cit].attributes.name;
				seg_IdEstadoCidadeEscolhida = wazeModel.cities.objects[cit].attributes.stateID;
				countCity++;

				if (document.getElementById('selCidadeSegNome').value == wazeModel.cities.objects[cit].attributes.id) {
					selecionadaListada = true;
					break;
				}
			}
		}
	}

	console.log("seg_NomeCidadeEscolhida = " + seg_NomeCidadeEscolhida);

	if (seg_NomeCidadeEscolhida == null && !userChamp) {
		//Não tem cidade nenhuma, precisa de champ pra criar.
		genericExibirMensagem(genericTraducao('msg_SemCidade'));
		genericAssincStop();
		return false;
	}

	if (countCity > 1 && !selecionadaListada) {
		//se não tiver nada pra nomear do zero, então, encrencar pra q!?
		var segmentoPelado = false;

		for (var seg in wazeModel.segments.objects) {
			if (wazeModel.segments.objects[seg].attributes.primaryStreetID == null) {
				segmentoPelado = true;
				break;
			}
		}

		if (segmentoPelado) {
			//Terá que selecionar no combo.
			genericExibirMensagem(genericTraducao('msg_RevisaoPeladosCidade'));
			genericAssincStop();
			return false;
		}
	}

	return true;
}

function funRevVia_CorrigirNome(streetID) {
	var rua = wazeModel.streets.objects[streetID].name;
	var logradouroDaRuaOriginal = rua.substring(0, rua.indexOf(" "));
	var logradouroDaRua = logradouroDaRuaOriginal;
	var nomeDaRuaOriginal = " " + rua.substring(rua.indexOf(" ") + 1, rua.length) + " ";
	var nomeDaRua = nomeDaRuaOriginal;

	console.log('logradouroDaRuaOriginal= ' + logradouroDaRuaOriginal);
	console.log('nomeDaRuaOriginal= ' + nomeDaRuaOriginal);

	if (logradouros.indexOf(logradouroDaRua) != -1) {
		//tem logradouro pra atualizar.
		logradouroDaRua = logradourosAbreviados[logradouros.indexOf(logradouroDaRua)];
	}
	else {
		//tá soando como sigla de rodovia.
		if (logradouroDaRua.indexOf("-") != -1) {
			var Sigla = logradouroDaRua.substring(0, logradouroDaRua.indexOf("-") + 1);
			if (logradouros.indexOf(Sigla) != -1) {
				logradouroDaRua = logradouroDaRua.replace(Sigla, logradourosAbreviados[logradouros.indexOf(Sigla)]);
			}
		}
	}

	for (x = 0; x < prefixosNomes.length; x++) {
		if (nomeDaRua.indexOf(prefixosNomes[x]) != -1) {
			nomeDaRua = nomeDaRua.replace(prefixosNomes[x], prefixosNomesAbreviados[x]);
		}
	}

	nomeDaRua = funRevisao_CorrigirNome(nomeDaRua);

	//////////////////////////////////////////////////////////////////////////////////////////
	//Regionalização estadual.
	//Goiás -> "Rua" não abrevia, se tiver abreviado "desabrevia"
	var Estado = wazeModel.states.objects[wazeModel.cities.objects[wazeModel.streets.objects[streetID].cityID].attributes.stateID].name;
	if (Estado == "Goiás") {
		if (logradouroDaRuaOriginal == "R." ||
			logradouroDaRua == "R.") {
			logradouroDaRua = "Rua";
		}
	}
	//////////////////////////////////////////////////////////////////////////////////////////
	//Fim das regionalizaçoes.
	//////////////////////////////////////////////////////////////////////////////////////////

	if (logradouroDaRuaOriginal != logradouroDaRua
		|| nomeDaRuaOriginal != nomeDaRua) {
		return (logradouroDaRua + nomeDaRua).trim();
	}
	else {
		return (logradouroDaRuaOriginal + nomeDaRuaOriginal).trim();
	}
}

function funRevVia_IniciarFaxinaNew() {   //<<<<Nomes

	seg_listaSegmentosSelecionados = [];
	var userChamp = champsBrazil.indexOf(W.loginManager.user.userName) != -1;

	document.getElementById('btnIniciarRevisao').disabled = true;
	document.getElementById('btnPararRevisao').disabled = false;

	for (i = 0; i < Waze.selectionManager.getSelectedFeatures().length; i++) {
		for (var seg in wazeModel.segments.objects) {
			if (wazeModel.segments.objects[seg].geometry.id == Waze.selectionManager.getSelectedFeatures()[i].geometry.id) {
				seg_listaSegmentosSelecionados.push(seg);
				break;
			}
		}
	}

	if (funRevVia_VerificarCidadeEscolhida() == false) {
		return;
	}

	genericExibirMensagem(genericTraducao('msg_RevisaoAguarde'));
	var streetAlterados = [];

	for (var seg in wazeModel.segments.objects) {
		if (seg_listaSegmentosSelecionados.length != 0 &&
			seg_listaSegmentosSelecionados.indexOf(seg) == -1) {
			//se for de selecionados, e não é dos selecioados, Tchau!
			continue;
		}

		var segmento = wazeModel.segments.objects[seg];
		var segmentoSelecionado = false;
		var painelAberto = false;

		//Só fazer na tela.
		if (funRevVia_VerificarSegmentoVisivel(segmento)) {
			var segmentoSts = [];
			segmentoSts.push(segmento.attributes.primaryStreetID);
			segmentoSts = segmentoSts.concat(segmento.attributes.streetIDs); //Assim para primaryStreetID ser a primeira SEMPRE

			var NomeOriginais = [];
			var NomesModificados = [];

			for (iBuscaNome = 0; iBuscaNome < segmentoSts.length; iBuscaNome++) {
				console.log("buscando nomes: " + segmentoSts[iBuscaNome]);

				if (typeof (wazeModel.streets.objects[segmentoSts[iBuscaNome]]) != 'undefined'
					&& typeof (wazeModel.streets.objects[segmentoSts[iBuscaNome]].name) != 'undefined'
					&& wazeModel.streets.objects[segmentoSts[iBuscaNome]].name != null
					&& wazeModel.streets.objects[segmentoSts[iBuscaNome]].name != "") {
					NomeOriginais.push(wazeModel.streets.objects[segmentoSts[iBuscaNome]].name);
					NomesModificados.push(funRevVia_CorrigirNome(segmentoSts[iBuscaNome]));
				}
			}

			//sangrentos
			if (segmento.attributes.primaryStreetID == null) {

				funRevVia_SelecionarSegmento(segmento, segmentoSelecionado);
				painelAberto = funRevVia_AbrirPainel(painelAberto);
				funRevVia_CorrigirSegmentoSangrento(segmento);
				funRevVia_AplicarCorrecao(painelAberto);
				continue;
			}

			if (streetAlterados.indexOf(segmentoSts[0]) == -1) {
				//faz a mudança por streetId (que significam os nomes da via - principal e alternativos).
				for (iStreetLocalizada = 0; iStreetLocalizada < segmentoSts.length; iStreetLocalizada++) {
					//Alternativos duplicados (inválidos)
					if (funRevVia_CorrigirNomesDuplicados(segmento, segmentoSts, NomesModificados, iStreetLocalizada, segmentoSelecionado, painelAberto)) {
						segmentoSelecionado = true;
						painelAberto = true;
					}

					console.log('Original: ' + NomeOriginais[iStreetLocalizada]);
					console.log('Abreviado: ' + NomesModificados[iStreetLocalizada]);

					//se teve mudança, faça-a!
					if (NomeOriginais[iStreetLocalizada] != NomesModificados[iStreetLocalizada]) {
						funRevVia_CorrigirGrafiaNome(segmento, segmentoSts, NomesModificados, iStreetLocalizada, segmentoSelecionado, painelAberto);
						segmentoSelecionado = true;
						painelAberto = true;

						streetAlterados = streetAlterados.concat(segmentoSts);
					}
				}

				funRevVia_AplicarCorrecao(painelAberto);
			}
		}
	}

	console.log("Acabou revisão de nomes de segmentos.");
	console.log(seg_NomesRuasColetados);
	document.getElementById('btnIniciarRevisao').disabled = false;
	document.getElementById('btnPararRevisao').disabled = true;


	if (document.getElementById('chkRevisaoPlace') != null &&
		document.getElementById('chkRevisaoPlace').checked) {
		funRevPla_IniciarFaxina();
	}
}

function funRevVia_VerificarSegmentoVisivel(segmento) {
	var totalGeo = segmento.geometry.components.length;
	var naTela = 0;
	for (var compSegmento = 0; compSegmento < totalGeo; compSegmento++) {
		var pontogeometrico = segmento.geometry.components[compSegmento];

		if (Waze.map.getExtent().toGeometry().containsPoint(pontogeometrico)) {
			naTela++;
		}
	}

	return (naTela == totalGeo);
}

function funRevVia_SelecionarSegmento(segmento, segmentoSelecionado) {
	if (!segmentoSelecionado) {
		var instrucao = "                                                           \
		var segmento = wazeModel.segments.objects["+ segmento.attributes.id + "];  \
		var t = [];                                                                 \
		t.push(segmento);                                                           \
		Waze.selectionManager.setSelectedModels(t);";
		genericAssincCommand(instrucao, false);
	}

	return true;
}

function funRevVia_AbrirPainel(painelAberto) {  ///ABRIR PAINEL PARA EDIÇÃO DO NOME
	if (!painelAberto) {
		var instrucao = "                                   \
			$('[class=\"full-address\"]').click();     \
			genericAssincBreak();";
		genericAssincCommand(instrucao, false);
	}

	return true;
}

function funRevVia_CorrigirSegmentoSangrento(segmento) {
	var instrucao = "";

	if (seg_NomeCidadeEscolhida != null) {
		instrucao = "$('[class=\"form-control state-id\"]').val(\"" + seg_IdEstadoCidadeEscolhida + "\");";
		genericAssincCommand(instrucao, false);

		console.log(instrucao);

		instrucao = "$('input[class=\"city-name form-control\"]').attr(\"value\",\"" + seg_NomeCidadeEscolhida + "\");";

		console.log(instrucao);
	}
	else {
		instrucao = "$('input[class=\"empty-city\"]').click();";
	}
	genericAssincCommand(instrucao, false);

	instrucao = "$('input[class=\"empty-street\"]').click();";
	genericAssincCommand(instrucao, false);

}

function funRevVia_CorrigirNomesDuplicados(segmento, segmentoSts, NomesModificados, iStreetLocalizada, segmentoSelecionado, painelAberto) {
	if (iStreetLocalizada != 0) {
		//Vejo se já está na lista, se tiver é duplicado, deve ser apagado.
		var existente = false;
		for (j = 0; j < segmentoSts.length; j++) {
			if (NomesModificados[iStreetLocalizada] == NomesModificados[j] && iStreetLocalizada != j) {
				//Opa é um duplicado, apaga o iStreetLocalizada
				existente = true;
				break;
			}
		}

		if (existente) {
			funRevVia_SelecionarSegmento(segmento, segmentoSelecionado);
			funRevVia_AbrirPainel(painelAberto);

			console.log("apagando nome duplicado" + segmentoSts[iStreetLocalizada]);
			var instrucao = "$('tr[data-id=\"" + segmentoSts[iStreetLocalizada] + "\"]').find('a[class=\"alt-street-delete\"]').click();";
			genericAssincCommand(instrucao, true);
		}

		return existente;
	}

	return false;
}

function funRevVia_CorrigirGrafiaNome(segmento, segmentoSts, NomesModificados, iStreetLocalizada, segmentoSelecionado, painelAberto) {

	seg_NomesRuasColetados.push(NomesModificados[iStreetLocalizada]);
	segmentoSelecionado = funRevVia_SelecionarSegmento(segmento, segmentoSelecionado);  ///////////////////////////////////////////ACOMPANHAR

	//junior tu tava apanhando pra selecionar toda a via, a treta tá aqui.
	//Como antes o beta e o produção eram diferentes, eu tava disparando todos os possíveis aqui.
	var instrucao = "                                                                                   \
		$('a[class=\"select-entire-street\"]').click();                                                 \
		$('button[class=\"action-button btn btn-default btn-positive select-entire-street\"]').click(); \
		$('button[class=\"action-button btn btn-default select-entire-street\"]').click();              \
		$('button[class=\"action-button select-entire-street waze-btn waze-btn-white\"]').click();";
	genericAssincCommand(instrucao, false);

	painelAberto = funRevVia_AbrirPainel(painelAberto);

	//Principal ou alternativa?
	if (iStreetLocalizada == 0) {

		instrucao = "document.getElementsByClassName(\"form-control street-name tts-input\")[0].value = \"" + NomesModificados[iStreetLocalizada] + "\";";
		genericAssincCommand(instrucao, false);

		//Força o campo a saber que mudou. O WME guarda o valor em algum outro canto.
		instrucao = "$('[class=\"form-control street-name tts-input\"]').trigger('change');";
		genericAssincCommand(instrucao, false);

	}
	else {

		//Alternativo a gente apaga e cria outro.
		instrucao = "$('tr[data-id=\"" + segmentoSts[iStreetLocalizada] + "\"]').find('a[class=\"alt-street-delete\"]').click();";
		genericAssincCommand(instrucao, false);

		instrucao = "$('a[class=\"add-alt-street-btn\"]').click();";
		genericAssincCommand(instrucao, false);

		instrucao = "$('tr[class=\"alt-street-form-template new-alt-street\"]').find('input[name=\"streetName\"]').attr(\"value\", \"" + NomesModificados[iStreetLocalizada] + "\");";
		genericAssincCommand(instrucao, false);

		funRevVia_AplicarCorrecao(painelAberto);
	}
}

function funRevVia_AplicarCorrecao(painelAberto) {
	//Para este segmento acabou. Se mudou aplicar.
	if (painelAberto) {

		var instrucao = "                                                                                       \
			$('div[class=\"action-buttons\"]').find('button[class=\"save-button waze-btn waze-btn-blue waze-btn-smaller\"]').click();   \
			genericAssincBreak();";
		genericAssincCommand(instrucao, true);
	}
}

//-----------------------------------------------------------------------------------------------------------

function funRevPla_IniciarFaxina() {
	document.getElementById('btnIniciarRevisaoPlace').disabled = true;
	document.getElementById('btnPararRevisaoPlace').disabled = false;

	seg_NomesRuasColetados = [];

	for (var place in wazeModel.venues.objects) {
		var landmark = wazeModel.venues.objects[place];

		//places não visuais, não faço nada com eles.
		if (!Waze.map.getExtent().toGeometry().containsPoint(funPlace_ObterPoint(landmark.attributes.geometry))) {
			continue;
		}

		if (landmark.attributes.approved &&
			landmark.attributes.venueUpdateRequests.length == 0 &&
			landmark.state == null)//não pegar quem já deletei.
		{
			console.log('Avaliando place ' + place);

			//Posto de Combustível sem nome
			if (landmark.attributes.name == "") {
				if (landmark.isGasStation()) {
					//Colocar "Posto de Combustível"
					funRevPla_SelecionarPlace(landmark);
					funRevPla_NovoNome("Posto de Combustível")
					continue;
				}
			}

			//Posto ESSO ou Ypiranga
			if (landmark.isGasStation()) {
				if (landmark.attributes.brand == "Esso") {
					var nome = " " + landmark.attributes.name + " ";
					nome = nome.replace("Esso", "Shell").trim();
					funRevPla_SelecionarPlace(landmark);
					funRevPla_MudarBandeira(nome, "Shell");
					continue;
				}

				if (landmark.attributes.brand == "Ypiranga") {
					funRevPla_SelecionarPlace(landmark);
					funRevPla_MudarBandeira(landmark.attributes.name, "Ipiranga");
					continue;
				}
			}

			//Arrumar Categorias
			if (document.getElementById('chkNomeCategoria').checked) {
				for (var iCategorias = 0; iCategorias < nomeCategoria.length; iCategorias++) {
					var testeNome = new RegExp(genericDesacentuaTexto(nomeCategoria[iCategorias][nomeCategoriaColunas.Identificacao]), "gi");

					if (testeNome.test(genericDesacentuaTexto(landmark.attributes.name))) {
						console.log('identificado em ' + nomeCategoria[iCategorias][nomeCategoriaColunas.Identificacao]);


						var placeAlterado = false;

						if (nomeCategoria[iCategorias][nomeCategoriaColunas.NomePadrao] != "") {
							funRevPla_SelecionarPlace(landmark);
							funRevPla_NovoNome(nomeCategoria[iCategorias][nomeCategoriaColunas.NomePadrao]);
							placeAlterado = true;
						}

						if (landmark.attributes.categories[0] != nomeCategoria[iCategorias][nomeCategoriaColunas.Categoria]) {
							funRevPla_SelecionarPlace(landmark);
							funRevPla_AlterarCategoria(nomeCategoria[iCategorias][nomeCategoriaColunas.Categoria]);
							placeAlterado = true;
						}

						if (placeAlterado) {
							continue;
						}
					}
				}
			}

			var nomeOriginal = " " + landmark.attributes.name;

			//Se tiver tudo maiusculo, pelo menos vamos deixar "arrumadinho"
			if (nomeOriginal == nomeOriginal.toUpperCase()) {
				var splitado = nomeOriginal.split(' ');
				nomeOriginal = '';
				for (x = 0; x < splitado.length; x++) {
					nomeOriginal += splitado[x].charAt(0).toUpperCase() + splitado[x].slice(1).toLowerCase() + ' ';
				}
			}

			var nomeNovo = funRevisao_CorrigirNome(nomeOriginal);

			if (nomeOriginal.trim() != nomeNovo.trim()) {
				//Ajusta o nome
				seg_NomesRuasColetados.push(nomeOriginal + "    trocando por      " + nomeNovo);

				funRevPla_SelecionarPlace(landmark);
				funRevPla_NovoNome(nomeNovo.trim());
				continue;
			}
		}
	}

	console.log("Acabou");
	console.log(seg_NomesRuasColetados);

	document.getElementById('btnIniciarRevisaoPlace').disabled = false;
	document.getElementById('btnPararRevisaoPlace').disabled = true;
}

function funRevPla_SelecionarPlace(landmark) {
	var instrucao = "                                                                                       \
	var landmark = wazeModel.venues.objects[\""+ landmark.attributes.id + "\"];                             \
																											\
	console.log(\"Update place \" + landmark.attributes.id + \" Started\");                                 \
																											\
	var t = [];                                                                                             \
	t.push(landmark);                                                                                       \
	Waze.selectionManager.setSelectedModels(t);                                                                        \
																											\
	genericAssincBreak();";
	genericAssincCommand(instrucao, false);
}

function funRevPla_Apagar() {
	var instrucao = "$('div[class=\"toolbar-button WazeControlDeleteFeature ItemInactive\"]').click();";
	genericAssincCommand(instrucao, true);
}

function funRevPla_ConverterResidencial(numero) {
	var instrucao;

	if (numero != null) {
		instrucao = "$('a[class=\"address-edit-input primary-street\"]').click();";
		genericAssincCommand(instrucao, false);

		instrucao = "$('input[name=\"houseNumber\"]').attr('value', " + numero + ");";
		genericAssincCommand(instrucao, false);

		instrucao = "$('button[class=\"save-button waze-btn waze-btn-blue waze-btn-smaller\"]').click();";
		genericAssincCommand(instrucao, true);
	}

	instrucao = "$('button[class=\"btn-link toggle-residential\"]').click();";
	genericAssincCommand(instrucao, true);
}

function funRevPla_MudarBandeira(novoNome, bandeira) {
	var instrucao = "$('input[name=\"services\"]')[0].click();";    //Fake... só serve pra gerar Action no ActionManager
	genericAssincCommand(instrucao, false);

	instrucao = "                                                                               \
				wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].newAttributes = \
					{ name: \""+ novoNome + "\", brand: \"" + bandeira + "\" };                             \
																											\
				$('[name=\"name\"]')[0].value = \""+ novoNome + "\";                                        \
																											\
				wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].oldAttributes = \
					{ name: \"\", brand: \"\" };";
	genericAssincCommand(instrucao, true);
}

function funRevPla_NovoNome(novoNome) {
	var instrucao = "$('input[name=\"services\"]')[0].click();";    //Fake... só serve pra gerar Action no ActionManager
	genericAssincCommand(instrucao, false);

	instrucao = "                                                                               \
			wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].newAttributes = \
				{ name: \"" + novoNome + "\"};                                                          \
																										\
			$('[name=\"name\"]')[0].value = \""+ novoNome + "\";                                        \
																										\
			wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].oldAttributes = \
				{ name: \"\" };";

	genericAssincCommand(instrucao, true);
}

function funRevPla_AdicionarAlternativo(alternativo) {
	var instrucao = "$('[class=\"add\"]')[0].click();";
	genericAssincCommand(instrucao, false);

	instrucao = "$('input[name=\"services\"]')[0].click();";    //Fake... só serve pra gerar Action no ActionManager
	genericAssincCommand(instrucao, false);

	instrucao = "                                                                                       \
			wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].newAttributes = \
				{ aliases: [\"" + alternativo + "\"] };                                                 \
																										\
			$('[class=\"alias-name form-control\"]')[0].value = \"" + alternativo + "\";                    \
																										\
			wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].oldAttributes = \
				{ aliases: [] };";

	genericAssincCommand(instrucao, true);
}

function funRevPla_AlterarCategoria(novaCategoria) {
	var instrucao = "$('[class=\"fa fa-remove\"]').click();";
	genericAssincCommand(instrucao, false);

	for (var item in W.Config.venues.subcategories) {
		var categoria = W.Config.venues.subcategories[item];

		if (item == novaCategoria) {
			instrucao = "$('[data-category=\"" + item + "\"]')[0].click();";
			genericAssincCommand(instrucao, false);
			break;
		}

		for (var cats = 0; cats < categoria.length; cats++) {
			if (categoria[cats] == novaCategoria) {
				instrucao = "$('[data-category=\"" + item + "\"]')[0].click();";
				genericAssincCommand(instrucao, false);

				console.log(novaCategoria);

				instrucao = "$('[data-category=\"" + novaCategoria + "\"]')[0].click();";
				genericAssincCommand(instrucao, true);

				break;
			}
		}
	}
}

function funRevPla_Descricao(descricao) {
	var instrucao = "$('input[name=\"services\"]')[0].click();";    //Fake... só serve pra gerar Action no ActionManager
	genericAssincCommand(instrucao, false);

	instrucao = "                                                                                       \
			wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].newAttributes = \
				{ description: \"" + descricao + "\"};                                                  \
																										\
			$('[name=\"description\"]')[0].value = \"" + descricao + "\";                               \
																										\
			wazeModel.actionManager.getActions()[wazeModel.actionManager.getActions().length - 1].oldAttributes = \
				{ description: \"\" };";

	genericAssincCommand(instrucao, true);
}

/// <summary>
/// Faz as devidas abreviações e correções de grafia registradas nas listas
/// </summary>
/// <param name="nomeCorrigir">Nome a corrigir</param>
/// <returns>Nome Corrigido</returns>
function funRevisao_CorrigirNome(nomeCorrigir) {
	for (x = 0; x < grafias.length; x++) {
		if (nomeCorrigir.toUpperCase().indexOf(grafias[x].toUpperCase()) != -1) {
			var re = new RegExp(grafias[x], "gi");
			nomeCorrigir = nomeCorrigir.replace(re, grafiasCorretas[x]);
		}
	}

	return nomeCorrigir;
}
/*FINAL Revisão de nomes*/

/*FINAL*/

/* engage! =================================================================== */
genericBootstrap();
/* end ======================================================================= */