/*
Title: Mapa
i3GEO.mapa
Executa operações obre o mapa principal
Em i3GEO.mapa.dialogo estao as funcoes de abertura dos dialogos para alteracao das propriedades do mapa,
como cor de fundo, tipo de imagem, legenda etc.
Arquivo:
i3geo/classesjs/classe_mapa.js
Licença:
GPL2
i3Geo Interface Integrada de Ferramentas de Geoprocessamento para Internet
Direitos Autorais Reservados (c) 2006 Ministério do Meio Ambiente Brasil
Desenvolvedor: Edmar Moretti edmar.moretti@gmail.com
Este programa é software livre; você pode redistribuí-lo
e/ou modificá-lo sob os termos da Licença Pública Geral
GNU conforme publicada pela Free Software Foundation;
Este programa é distribuído na expectativa de que seja útil,
porém, SEM NENHUMA GARANTIA; nem mesmo a garantia implícita
de COMERCIABILIDADE OU ADEQUACAO A UMA FINALIDADE ESPECÍFICA.
Consulte a Licença Pública Geral do GNU para mais detalhes.
Você deve ter recebido uma cópia da Licença Pública Geral do
GNU junto com este programa; se não, escreva para a
Free Software Foundation, Inc., no endereço
59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
*/
if(typeof(i3GEO) === 'undefined'){
var i3GEO = {};
}
i3GEO.mapa = {
/*
Propriedade: AUTORESIZE
Indica se o tamanho do mapa sera ajustado toda vez que o navegador for redimensionado
Type:
{boolean}
Default:
{false}
*/
AUTORESIZE: false,
/*
Armazena o nome dos objetos geoXml adicionados ao mapa pela API do google maps
Tipo:
{Array}
*/
GEOXML: [],
/*
Function: insereDobraPagina
Insere o icone do tipo "dobra de pagina" que permite alterar o renderizador do mapa
Parametros:
tipo {string} - tipo de icone googlemaps|openlayers
imagem {string} - endereco da imagem que sera utilizada no icone
*/
insereDobraPagina: function(tipo,imagem){
var novoel = $i("i3GEOdobraPagina");
if(!novoel){
novoel = document.createElement("img");
}
novoel.src = imagem;
novoel.id = "i3GEOdobraPagina";
if(tipo === "googlemaps"){
novoel.onclick = function(evt){
i3GEO.Interface.atual2gm.inicia();
};
}
if(tipo === "openlayers"){
novoel.onclick = function(evt){
i3GEO.Interface.atual2ol.inicia();
};
}
novoel.style.cursor = "pointer";
novoel.style.position = "absolute";
novoel.style.top = i3GEO.parametros.h - 35 + "px";
novoel.style.zIndex = "50000";
novoel.style.left = i3GEO.parametros.w - 35 + "px";
$i(i3GEO.Interface.IDMAPA).appendChild(novoel);
YAHOO.util.Event.addListener("i3GEOdobraPagina", "click", YAHOO.util.Event.stopPropagation);
YAHOO.util.Event.addListener("i3GEOdobraPagina", "click", YAHOO.util.Event.preventDefault);
},
/*
Reposiciona o icone do tipo "dobra de pagina"
*/
reposicionaDobraPagina: function(){
var novoel = $i("i3GEOdobraPagina");
if(!novoel){
return;
}
novoel.style.top = i3GEO.parametros.h - 35 + "px";
novoel.style.left = i3GEO.parametros.w - 35 + "px";
},
/*
Ativa o redimensionamento automatico do mapa sempre que o navegador for redimensionado
e definido como um evento do elemento window
*/
ativaAutoResize: function(){
window.onresize = function(){
var Dw,Dh, r = false;
Dw = YAHOO.util.Dom.getViewportWidth();
Dh = YAHOO.util.Dom.getViewportHeight();
if(Math.abs(Dw - i3GEO.tamanhodoc[0]) > 50){
r = true;
}
if(Math.abs(Dh - i3GEO.tamanhodoc[1]) > 50){
r = true;
}
if(r === false)
{return;}
i3GEO.tamanhodoc = [Dw,Dh];
setTimeout(function(){
i3GEO.reCalculaTamanho();
i3GEO.barraDeBotoes.recria("i3geo_barra2");
if(i3GEO.Interface.TABLET === true)
{i3GEO.guias.escondeGuias();return;}
if(i3GEO.guias.TIPO === "movel")
{i3GEO.guias.guiaMovel.reposiciona();}
else
{i3GEO.guias.ajustaAltura();}
i3GEO.mapa.reposicionaDobraPagina();
},2000);
};
},
/*
Ajusta o posicionamento do corpo do mapa
Esse ajuste e necessario na inicializacao, uma vez que o mapa utiliza style.position='absolute'
Parameters:
elemento {String} - id do elemento HTML que devera ser ajustado e que contem o mapa
*/
ajustaPosicao: function(elemento){
if(typeof(console) !== 'undefined'){console.info("i3GEO.mapa.ajustaPosicao()");}
if(arguments.length === 0){return;}
var imagemxi = 0,
imagemyi = 0,
dc = $i(elemento),
c;
if(!dc){return;}
try{
while ((dc.offsetParent) && (dc.offsetParent.id !== "i3geo")){
dc = dc.offsetParent;
imagemxi += dc.offsetLeft;
imagemyi += dc.offsetTop;
}
c = $i(i3GEO.Interface.IDCORPO);
if (c){
c.style.position="absolute";
if(navm)
{$left(i3GEO.Interface.IDCORPO,imagemxi - 1);}
else
{$left(i3GEO.Interface.IDCORPO,imagemxi);}
$top(i3GEO.Interface.IDCORPO,imagemyi);
}
}
catch(e){i3GEO.janela.tempoMsg("Ocorreu um erro. i3GEO.mapa.ajustaPosicao "+e);}
},
/*
Function: ativaTema
Altera a variavel i3GEO.temaAtivo e atualiza a interface em funcao do novo tema que for ativado
O tema anteriormente ativo tem sua cor alterada para a cor normal e o novo tema e destacado com uma cor diferente
Executa tambem as funcoes armazenadas em i3GEO.eventos.ATIVATEMA
Parametros:
codigo {string} - codigo da camada
*/
ativaTema: function(codigo){
if(codigo){
if(codigo === "")
{return;}
if(i3GEO.temaAtivo !== "")
{i3GEO.util.defineValor("ArvoreTituloTema"+i3GEO.temaAtivo,"style.color","");}
i3GEO.temaAtivo = codigo;
i3GEO.util.defineValor("ArvoreTituloTema"+codigo,"style.color","brown");
}
},
/*
Function: ativaLogo
Ativa ou desativa a logo marca.
*/
ativaLogo: function(){
if(typeof(console) !== 'undefined'){console.info("i3GEO.mapa.ativaLogo()");}
if(i3GEO.Interface.ATUAL === "googlemaps")
{alert($trad("x21"));return;}
i3GEO.php.ativalogo(i3GEO.atualiza);
var cr = $i("i3GEOcopyright");
if(cr){
if(cr.style.display === "block")
{cr.style.display = "none";}
else
{cr.style.display = "block";}
}
},
/*
Verifica se ocorreu algum problema na atualizacao do corpo do mapa e inicia o processo de tentativa de recuperacao
Parametro:
retorno {string} - objeto recebido da funcao PHP de atualizacao do mapa
*/
verifica:function(retorno){
if(typeof(console) !== 'undefined'){console.info("i3GEO.mapa.verifica()");}
try{
if(retorno.data)
{retorno = retorno.data;}
if (retorno.variaveis)
{retorno = retorno.variaveis;}
if ((retorno === "erro") || (typeof(retorno) === 'undefined')){
i3GEO.mapa.ajustaPosicao();
i3GEO.janela.fechaAguarde();
i3GEO.mapa.recupera.inicia();
}
i3GEO.mapa.recupera.TENTATIVA = 0;
}
catch(e){
if(i3GEO.Interface.ATUAL === "openlayers" || i3GEO.Interface.ATUAL === "googlemaps"){
i3GEO.janela.fechaAguarde();
return;
}
if(this.recupera.TENTATIVA === 0){
i3GEO.janela.tempoMsg("Erro no mapa. Sera feita uma tentativa de recuperacao.");
i3GEO.mapa.recupera.inicia();
}
else{
i3GEO.janela.tempoMsg("Recuperacao impossivel. Sera feita uma tentativa de reiniciar o mapa.");
if (this.recupera.TENTATIVA === 1){
this.recupera.TENTATIVA = 2;
i3GEO.php.reiniciaMapa(i3GEO.atualiza);
}
}
if(typeof(console) !== 'undefined'){console.error("i3GEO.mapa.verifica "+e);}
}
},
/*
Tenta recuperar o mapa caso ocorra algum problema
O i3Geo mantem sempre uma copia do arquivo mapfile em uso. Essa funcao tenta
usar essa copia para restaurar o funcionamento do mapa
*/
recupera:{
/*
Armazena a quantidade de tentativas de recuperacao que foram feitas
Tipo:
{Integer}
*/
TENTATIVA: 0,
/*
Inicia a tentativa de recuperacao
*/
inicia: function(){
i3GEO.mapa.ajustaPosicao();
i3GEO.janela.fechaAguarde();
if(this.recupera.TENTATIVA === 0){
this.recupera.TENTATIVA++;
this.recupera.restaura();
}
},
/*
Restaura o mapa para a copia de seguranca existente no servidor
*/
restaura: function(){
i3GEO.php.recuperamapa(i3GEO.atualiza);
}
},
/*
Classe: i3GEO.mapa.legendaHTML
Controla a obtencao da legenda do mapa formatada em HTML.
util para mostrar a legenda na tela
*/
legendaHTML:{
/*
Propriedade: incluiBotaoLibera
Define se na legenda sera incluido o botao para liberar a legenda e inclui-la em uma janela flutuante
Tipo:
{boolean}
Default:
{true}
*/
incluiBotaoLibera: false,
/*
Armazena o id definido na criacao da legenda
*/
ID: "",
/*
* Armazena a lista de camadas que devem ficar escondidas na legenda
*/
CAMADASSEMLEGENDA: [],
/*
Function: cria
Cria a legenda HTML
O elemento HTML definido em ID deve ter style=display:block
A legenda e incluida no id definido. Se id for igual a "", sera apenas definido o evento de atualizacao,
permitindo que seja criada a janela flutuante, por exemplo:
i3GEO.mapa.legendaHTML.cria("");
i3GEO.mapa.legendaHTML.libera();
Parametros:
id {String} - id do elemento que recebera a legenda
*/
cria: function(id){
if(typeof(console) !== 'undefined'){console.info("i3GEO.mapa.legendaHTML.cria()");}
if(arguments.length === 0)
{id = "";}
i3GEO.mapa.legendaHTML.ID = id;
if(i3GEO.eventos.NAVEGAMAPA.toString().search("i3GEO.mapa.legendaHTML.atualiza()") < 0)
{i3GEO.eventos.NAVEGAMAPA.push("i3GEO.mapa.legendaHTML.atualiza()");}
i3GEO.mapa.legendaHTML.atualiza();
},
/*
Function: atualiza
Atualiza o elemento HTML do mapa utilizado para mostrar a legenda
*/
atualiza: function(){
if(typeof(console) !== 'undefined'){console.info("i3GEO.mapa.legendaHTML.atualiza()");}
var idleg = $i("wlegenda_corpo"),
temp = function(retorno){
var legenda = "",ins,re;
re = new RegExp("", "g");
if (retorno.data !== "erro" && retorno.data !== undefined ){
legenda = "
'+$trad("x11")+'