/*jslint plusplus:false,white:false,undef: false, rhino: true, onevar: true, evil: true */
/*
Title: Utilitários
Arquivo:
i3geo/classesjs/classe_util.js
Licenca:
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@mma.gov.br
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;
tanto a versão 2 da Licença.
Este programa é distribuído na expectativa de que seja útil,
porém, SEM NENHUMA GARANTIA; nem mesmo a garantia implícita
de COMERCIABILIDADE OU ADEQUAÇÃO 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'){
i3GEO = [];
}
/*
Propriedade: navm
Verdadeiro (true) se o navegador for o Internet Explorer
Tipo:
{boolean}
Default:
{false}
*/
navm = false;
/*
Propriedade: navn
Verdadeiro (true) se o navegador for o Firefox
Tipo:
{boolean}
Default:
{false}
*/
navn = false;
//seta as variáveis navn e navm
var app = navigator.appName.substring(0,1);
if (app==='N'){navn=true;}else{navm=true;}
/*
Variavel: g_operacao
Nome da última operação que foi executada.
Dependendo do tipo de operação são aplicadas as atualizações necessárias aos componentes do mapa. Por exemplo, redesenha o corpo do mapa, atualiza a lista de temas, etc.
Essas operações são controladas pela função ajaxiniciaparametros.
*/
g_operacao = "";
/*
Variavel: g_tipoacao
Tipo de ação que está sendo executada.
Quando o usuário clica no mapa, essa variável é pesquisada para definir o tipo de operação que deve ser executada.
É definida quando o usuário seleciona uma determinada ferramenta do i3Geo.
*/
g_tipoacao = "zoomli";
g_postpx = "px";
g_tipotop = "top";
g_tipoleft = "left";
if (navm)
{
g_postpx = ""; //utilizado para crossbrowser
g_tipotop = "pixelTop"; //utilizado para crossbrowser
g_tipoleft = "pixelLeft"; //utilizado para crossbrowser
}
/*
Function: $i
Obtém um elemento DOM a partir de seu id
Parametros:
id - {String} ID do elemento.
Returns:
{Object} Objeto.
*/
$i = function(id)
{return document.getElementById(id);};
/*
Function: Array.remove()
Extende os métodos de um objeto Array, permitindo remover um elemento.
*/
Array.prototype.remove=function(s){
try{
var i = this.indexOf(s);
if(i !== -1){this.splice(i, 1);}
}catch(e){}
};
/*
Classe: i3GEO.util
Utilitários.
*/
i3GEO.util = {
/*
Variavel: PINS
Elementos IMG criados na função criaPin
Tipo:
{Array}
*/
PINS: [],
/*
Variavel:BOXES
Elementos DIV criados na função criaBox
Tipo:
{Array}
*/
BOXES: [],
/*
Function: escapeURL
Converte uma string em uma url válida
Parametros:
sUrl {String} - url que será convertida
Return:
Tipo:
{String}
*/
escapeURL: function(sUrl){
var re;
sUrl = escape(sUrl);
re = new RegExp("%3F", "g");
sUrl = sUrl.replace(re,'?');
re = new RegExp("%3D", "g");
sUrl = sUrl.replace(re,'=');
re = new RegExp("%26", "g");
sUrl = sUrl.replace(re,'&');
return sUrl;
},
/*
Function: insereCookie
Cria um novo cookie.
Parametros:
nome - {String} Nome do cookie.
valor - (String) Valor do cookie
*/
insereCookie: function(nome,valor) {
document.cookie = nome+"="+valor+";path=/";
},
/*
Function: pegaCookie
Pega o valor de um cookie.
Parametros:
nome - {String} Nome do cookie.
Returns:
(String) - valor do cookie
*/
pegaCookie: function(nome){
var cookies,i,fim;
cookies = document.cookie;
i = cookies.indexOf(nome);
if(i === -1)
{return null;}
fim = cookies.indexOf(";",i);
if (fim === -1)
{fim = cookies.length;}
return (unescape(cookies.substring(i,fim))).split("=")[1];
},
/*
Function: listaChaves
Lista as chaves de um objeto.
Parametros:
obj - {Object}
Return:
(Array) - array com as chaves.
*/
listaChaves: function (obj) {
var keys,key;
keys = [];
for(key in obj){
if(obj[key])
{keys.push(key);}
}
return keys;
},
/*
Function: criaBotaoAplicar
Cria um botão flutuante do tipo aplicar.
O novo botão é adicionado no DOM com ID "i3geo_aplicar" e posicionado sobre o objeto definido
Parametros:
nomeFuncao - {String} Nome da função que será executada quando o botão for cllicado
titulo - (opcional) {String} Título que será mostrado no botão
classe - (opcional) {String} Nome da classe (estilo) que será aplicado ao botão.
obj - (opcional) {Objeto} Objeto DOM que foi clicado para provocar a criação do botão.
Return:
(Object) - Objeto DOM criado.
*/
criaBotaoAplicar: function (nomeFuncao,titulo,classe,obj) {
try
{clearTimeout(tempoBotaoAplicar);}
catch(e){}
var novoel,xy;
tempoBotaoAplicar = eval("setTimeout('"+nomeFuncao+"\(\)',(i3GEO.configura.tempoAplicar))");
autoRedesenho("reinicia");
if(arguments.length === 1)
{titulo = "Aplicar";}
if(arguments.length === 1 || arguments.length === 2)
{classe = "i3geoBotaoAplicar";}
if (!document.getElementById("i3geo_aplicar"))
{
novoel = document.createElement("input");
novoel.id = 'i3geo_aplicar';
novoel.type = 'button';
novoel.value = titulo;
novoel.style.cursor="pointer";
novoel.style.fontSize="10px";
novoel.style.zIndex = 15000;
novoel.style.position="absolute";
novoel.style.display="none";
novoel.onmouseover = function(){this.style.display="block";};
novoel.onmouseout = function(){this.style.display="none";};
novoel.className = classe;
document.body.appendChild(novoel);
}
else
{novoel = document.getElementById("i3geo_aplicar");}
novoel.onclick = function(){
clearTimeout(i3GEO.parametros.tempo);
i3GEO.parametros.tempo = "";
this.style.display='none';
eval(nomeFuncao+"\(\)");
};
//reposiciona o botao
if(arguments.length === 4){
novoel.style.display="block";
xy = YAHOO.util.Dom.getXY(obj);
YAHOO.util.Dom.setXY(novoel,xy);
}
return (novoel);
},
/*
Function: arvore
Cria uma árvore com base em um objeto contendo aspropriedades.
Parametros:
titulo - {String} cabeçaljo da árvore
onde - {String} nome do id doelemento que conterá a árvore
obj - {Object} objeto contendo os parâmetros, exemplo
g_listaPropriedades = {
"propriedades": [
{ text: "p2", url: "javascript:tipoimagem()" }
]}
*/
arvore: function(titulo,onde,obj){
//YAHOO.log("arvore", "i3geo");
var arvore,root,tempNode,currentIconMode,d,c,i,linha,conteudo;
if(!$i(onde)){return;}
try{
arvore = new YAHOO.widget.TreeView(onde);
root = arvore.getRoot();
tempNode = new YAHOO.widget.TextNode('', root, false);
tempNode.isLeaf = false;
tempNode.enableHighlight = false;
}
catch(e){}
titulo = "
"+titulo+"
";
d = {html:titulo};
tempNode = new YAHOO.widget.HTMLNode(d, root, true,true);
tempNode.enableHighlight = false;
c = obj.propriedades.length;
for (i=0, j=c; i"+$trad(linha.text)+"";
d = {html:conteudo};
temaNode = new YAHOO.widget.HTMLNode(d, tempNode, false,true);
temaNode.enableHighlight = false;
}
arvore.collapseAll();
arvore.draw();
//YAHOO.log("Fim arvore", "i3geo");
},
/*
Function: removeAcentos
Remove acentos de uma palavra ou frase
Parametros:
palavra {String}
Return:
{String}
*/
removeAcentos: function(palavra) {
var re;
re = /ã|á|à|â/gi;
palavra = palavra.replace(re,"a");
re = /é/gi;
palavra = palavra.replace(re,"e");
re = /í/gi;
palavra = palavra.replace(re,"i");
re = /ó|õ/gi;
palavra = palavra.replace(re,"o");
re = /ç/gi;
palavra = palavra.replace(re,"c");
re = /ú/gi;
palavra = palavra.replace(re,"u");
return(palavra);
},
/*
Function: protocolo
Obtém o protocolo utilizado na URL atual
Return:
{String} - protocolo
*/
protocolo: function(){
var u = window.location.href;
u = u.split(":");
return (u[0]);
},
/*
Function: pegaPosicaoObjeto
Retorna a posição x,y de um objeto em relação a tela do navegador
Parametros:
obj {Object} - objeto dom
Return:
{Array} - array com a posição [x,y]
*/
pegaPosicaoObjeto: function(obj){
if(obj)
{
if(!obj.style)
{return [0,0];}
if(obj.style.position === "absolute")
{return [(parseInt(obj.style.left,10)),(parseInt(obj.style.top,10))];}
else{
var curleft = 0,curtop = 0;
if(obj){
if (obj.offsetParent) {
do {
curleft += obj.offsetLeft-obj.scrollLeft;
curtop += obj.offsetTop-obj.scrollTop;
} while (obj = obj.offsetParent);
}
}
return [curleft+document.body.scrollLeft,curtop+document.body.scrollTop];
}
}
else
{return [0,0];}
},
/*
Function: pegaElementoPai
Pega o elemento pai de um elemento clicado para identificar o código do tema.
Parametros:
e - elemento do DOM.
Return:
{Node} - objeto DOM
*/
pegaElementoPai: function(e){
var targ;
if (!e)
{e = window.event;}
if (e.target)
{targ = e.target;}
else
if (e.srcElement)
{targ = e.srcElement;}
if (targ.nodeType === 3)
{targ = targ.parentNode;}
tparent=targ.parentNode;
return(tparent);
},
/*
Function: mudaCursor
Altera o cursor do ponteiro do mouse.
Os cursores disponíveis são definidos por default em classe_configura.js
Parametros:
cursores {i3GEO.configura.cursores} - objeto JSON com as URIs de cada cursor (veja i3GEO.configura.cursores)
tipo {String} - tipo de cursor disponível em cursores
idobjeto {String} - id do objeto que terá o estilo alterado para o cursor desejado
locaplic {String} - onde está instalado o i3Geo
*/
mudaCursor: function(cursores,tipo,idobjeto,locaplic){
var o,c;
o = document.getElementById(idobjeto);
c = eval("cursores."+tipo+".ie");
if(c === "default" || c === "pointer" || c === "crosshair" || c === "help" || c === "move" || c === "text")
{o.style.cursor = c;}
else{
if(o){
if(navm){
o.style.cursor = "URL(\""+locaplic+eval("cursores."+tipo+".ie")+"\"),auto";
}
else{
o.style.cursor = "URL(\""+locaplic+eval("cursores."+tipo+".ff")+"\"),auto";
}
}
}
},
/*
Function: criaBox
Cria um elemento div na página atual.
Esse elemento pode ser utilizado para desenhar retângulos sobre o mapa
Parametros:
id {String} - id do elemento que será criado. Por default, será 'boxg'
*/
criaBox: function(id){
if(arguments.length === 0)
{id = "boxg";}
if (!$i(id))
{
var novoel = document.createElement("div");
novoel.id = id;
novoel.style.zIndex=1;
novoel.innerHTML = '';
document.body.appendChild(novoel);
novoel.onmouseover = function(){novoel.style.display='none';};
novoel.onmouseout = function(){novoel.style.display='block';};
i3GEO.util.BOXES.push(id);
}
else
{$i(id).style.display="block";}
},
/*
Function: escondeBox
Esconde os BOXES com IDs registrados em i3GEO.util.BOXES
Os ids são criado pela função criaBox
*/
escondeBox: function(){
var l,i;
l = i3GEO.util.BOXES.length;
for (i=0; i";
},
/*
Function: $top ou nome curto $top
Muda a posição (superior) de um objeto tanto no IE como no Firefox.
Exemplo: $top("imagem",100)
Parametros:
id - identificador do objeto
valor - posição em relação ao topo.
*/
$top: function(id,valor){
if (document.getElementById(id).style){
if (document.getElementById(id).style.pixelTop)
{document.getElementById(id).style.pixelTop=valor;}
else
{document.getElementById(id).style.top=valor+"px";}
}
},
/*
Function: $left ou nome curto $left
Muda a posição (esquerda) de um objeto tanto no IE como no Firefox.
Exemplo: $left("imagem",100)
Parametros:
id - identificador do objeto
valor - posição em relação a esquerda.
*/
$left: function(id,valor){
if (document.getElementById(id).style){
if (document.getElementById(id).style.pixelLeft)
{document.getElementById(id).style.pixelLeft=valor;}
else
{document.getElementById(id).style.left=valor+"px";}
}
},
/*
Function: insereMarca
Insere ou remove pontos no mapa.
*/
insereMarca:{
/*
Armazena o valor do ID do div criado para inserir pontos
Tipo:
{Array}
*/
CONTAINER: [],
/*
Function: cria
Insere um ponto no mapa
Os pontos são inseridos em um contaier de pontos e mostrados temporáriamente
Parametros:
xi {Numeric} - coordenada x.
yi {Numeric} - coordenada y.
funcaoOnclick {String} - funcao que sera executada quando a marca
for clicada, se for "", o container será esvaziado ao ser clicado na marca
container {String} - id do container que receberá os pontos
*/
cria:function(xi,yi,funcaoOnclick,container){
try{
var novoel,i,novoimg,temp;
if(i3GEO.util.insereMarca.CONTAINER.toString().search(container) < 0)
{i3GEO.util.insereMarca.CONTAINER.push(container);}
//verifica se existe o container para os pontos
if (!$i(container)){
novoel = document.createElement("div");
novoel.id = container;
i = novoel.style;
i.position = "absolute";
i.top = parseInt($i(i3GEO.Interface.IDCORPO).style.top,10);
i.left = parseInt($i(i3GEO.Interface.IDCORPO).style.left,10);
document.body.appendChild(novoel);
}
container = $i(container);
novoel = document.createElement("div");
i = novoel.style;
i.position = "absolute";
i.zIndex=2000;
i.top=(yi - 4)+"px";
i.left=(xi - 4)+"px";
i.width="4px";
i.height="4px";
novoimg = document.createElement("img");
if (funcaoOnclick !== "")
{novoimg.onclick = funcaoOnclick;}
else
{novoimg.onclick=function(){i3GEO.util.insereMarca.limpa();};}
novoimg.src=i3GEO.configura.locaplic+"/imagens/dot1.gif";
temp = novoimg.style;
temp.width="6px";
temp.height="6px";
temp.zIndex=2000;
novoel.appendChild(novoimg);
container.appendChild(novoel);
if(i3GEO.eventos.NAVEGAMAPA.toString().search("i3GEO.util.insereMarca.limpa()") < 0)
{i3GEO.eventos.NAVEGAMAPA.push("i3GEO.util.insereMarca.limpa()");}
}
catch(e){alert("Ocorreu um erro. inseremarca"+e);}
},
limpa: function(){
try{
var n,i;
n = i3GEO.util.insereMarca.CONTAINER.length;
for(i=0;i';
ins += "";
ins += texto;
ins += '
';
if(wsrc !== "")
{ins += '';}
ins += '
';
novoel = document.createElement("div");
novoel.id = "i3geo_janelaCor";
novoel.style.display="block";
novoel.innerHTML = ins;
if($i("i3geo"))
{$i("i3geo").appendChild(novoel);}
else
{document.body.appendChild(novoel);}
wdocaiframe = $i("i3geo_janelaCori");
if (wdocaiframe)
{
temp = wdocaiframe.style;
temp.width = parseInt(wlargura,10)-12;
temp.height=waltura;
wdocaiframe.style.display = "block";
wdocaiframe.src = wsrc;
}
if(nx === "" || nx === "center"){fix = true;}
YAHOO.janelaCor.xp.panel = new YAHOO.widget.ResizePanel(id, { zIndex:5000, modal:modal, width: wlargura_, fixedcenter: fix, constraintoviewport: false, visible: true, iframe:false} );
YAHOO.janelaCor.xp.panel.render();
$i(id+'_cabecalho').className = classe;
},
/*
Function: ajaxhttp
Cria o objeto XMLHttpRequest para uso com funções próprias de chamada em ajax
O uso dessa função não é recomendado. Dê preferência para uso da chamada ajax via YUI
Return:
{XMLHttpRequest}
*/
ajaxhttp: function(){
var objhttp1;
try
{objhttp1 = new XMLHttpRequest();}
catch(ee){
try{objhttp1 = new ActiveXObject("Msxml2.XMLHTTP");}
catch(e){
try{objhttp1 = new ActiveXObject("Microsoft.XMLHTTP");}
catch(E)
{objhttp1 = false;}
}
}
return(objhttp1);
},
/*
Function: ajaxexecASXml
Executa uma chamada ajax no modo assíncrono retornando o resultado em XML.
Parametros:
programa {String} - URL do programa que será executado no servidor.
funcao {funcao} - função que tratará o resultado.
Returns:
O resultado em um objeto DOM. Se o retorno contiver a palavra "Erro", é gerado um alert.
*/
ajaxexecASXml: function(programa,funcao){
var h,ohttp,retorno;
if (programa.search("http") === 0){
h = window.location.host;
if (programa.search(h) < 0){
alert("OOps! Nao e possivel chamar um XML de outro host.\nContacte o administrador do sistema.\nConfigure corretamente o ms_configura.php");
return;
}
}
ohttp = i3GEO.util.ajaxhttp();
ohttp.open("GET",programa,true);
retorno = "";
ohttp.onreadystatechange=function(){
var retorno,parser,dom;
if (ohttp.readyState === 4){
retorno = ohttp.responseText;
if (retorno !== undefined){
if (document.implementation.createDocument){
parser = new DOMParser();
dom = parser.parseFromString(retorno, "text/xml");
}
else{
dom = new ActiveXObject("Microsoft.XMLDOM");
dom.async="false";
dom.load(programa);
}
}
else
{dom = "erro";}
if (funcao !== "volta")
{eval(funcao+'(dom)');}
else
{return dom;}
}
};
ohttp.send(null);
},
/*
Function: aparece
Aplica efeito de aparecimento suave de um objetov
Parametros:
id {String} - id do objeto
tempo {Integer} - tempo em milesegundos que levará o efeito
intervalo {Integer} - intervalo entre uma imagem e outra
*/
aparece: function(id,tempo,intervalo){
var n,obj,opacidade,fadei,tempoFadei;
n = parseInt(tempo / intervalo,10);
obj = $i(id);
if(n === 1){
obj.style.display = "block";
if (navm)
{obj.style.filter='alpha(opacity=100)';}
else
{obj.style.opacity= 1;}
}
tempo = n * intervalo;
intervalo = (intervalo * 100) / tempo;
opacidade = 0;
if (navm)
{obj.style.filter='alpha(opacity=0)';}
else
{obj.style.opacity= 0;}
obj.style.display = "block";
fadei = function(){
opacidade += intervalo;
if (navm)
{obj.style.filter='alpha(opacity='+opacidade+')';}
else
{obj.style.opacity= opacidade/100;}
if(opacidade < 100)
{tempoFadei = setTimeout(fadei, tempo);}
else{
clearTimeout(tempoFadei);
if (navm)
{obj.style.filter='alpha(opacity=100)';}
else
{obj.style.opacity= 1;}
}
};
tempoFadei = setTimeout(fadei, tempo);
},
/*
Function: desaparece
Aplica efeito de desaparecimento suave de um objeto
Parametros:
id {String} - id do objeto
tempo {Integer} - tempo em milesegundos que levará o efeito
intervalo {Integer} - intervalo entre uma imagem e outra
removeobj {Boolean} - remove ou não o objeto no final
*/
desaparece: function(id,tempo,intervalo,removeobj){
var n,obj,opacidade,fade,p,tempoFade;
n = parseInt(tempo / intervalo,10);
obj = $i(id);
if(n === 1){
obj.style.display = "none";
if(removeobj){
p = obj.parentNode;
if(p)
{p.removeChild(obj);}
}
return;
}
tempo = n * intervalo;
intervalo = (intervalo * 100) / tempo;
opacidade = 100;
if (navm)
{obj.style.filter='alpha(opacity=100)';}
else
{obj.style.opacity= 1;}
obj.style.display = "block";
fade = function(){
opacidade -= intervalo;
if (navm)
{obj.style.filter='alpha(opacity='+opacidade+')';}
else
{obj.style.opacity= opacidade/100;}
if(opacidade > 0){
tempoFade = setTimeout(fade, tempo);
}
else{
clearTimeout(tempoFade);
obj.style.display = "none";
if (navm)
{obj.style.filter='alpha(opacity=100)';}
else
{obj.style.opacity= 1;}
if(removeobj){
p = obj.parentNode;
if(p)
{p.removeChild(obj);}
}
}
};
tempoFade = setTimeout(fade, tempo);
},
/*
Function: wkt2ext
Calcula a extensão geográfica de uma geometria fornecida no formato WKT
Parametros:
wkt {String} - geometria no formato wkt
tipo {String} - tipo de geometria (polygon,point,line)
Return:
{String} - extensão geográfica (xmin ymin xmax ymax)
*/
wkt2ext:function(wkt,tipo){
var re,x,y,w,xMin,xMax,yMin,yMax,temp;
tipo = tipo.toLowerCase();
ext = false;
if(tipo === "polygon"){
try{
re = new RegExp("POLYGON", "g");
wkt = wkt.replace(re,"");
wkt = wkt.split("(")[2].split(")")[0];
wkt = wkt.split(",");
x = [];
y = [];
for (w=0;w';
ins += '
';
if (texto === "")
{texto = $i(onde).innerHTML;}
ins += texto;
ins += '
';
if (onde !== "")
{$i(onde).innerHTML = ins;}
else
{return(ins);}
},
/*
Function: randomRGB
Gera uma cor RGB de forma aleatória
Return:
{String} - r,g,b
*/
randomRGB: function(){
var v = Math.random(),
r = parseInt(255*v,10),
g;
v = Math.random();
g = parseInt(255*v,10);
v = Math.random();
b = parseInt(255*v,10);
return (r+","+g+","+b);
},
/*
Function: comboTemas
Cria um combo (caixa de seleção) com a lista de temas existentes no mapa e de determinado tipo
Parametros:
id {String} - id do elemento select que será criado
funcao {Function} - função que será executada ao terminar a montagem do combo. Essa função receberá
como parâmetros um Array associativo contendo os dados em HTML gerados e o tipo de resultado. P.ex.:
{dados:comboTemas,tipo:"dados"}
tipo será uma string que pode ser "dados"|"mensagem"|"erro" indicando o tipo de retorno.
onde {String} - id do elemento HTML que receberá o combo. É utilizado apenas para inserir uma mensagem de aguarde.
nome {String} - valor que será incluido no parametro "name" do elemento "select".
multiplo {Booleano} - indica se o combo permite seleções múltiplas
tipoCombo {String} - Tipo de temas que serão incluídos no combo ligados|selecionados|raster
*/
comboTemas: function(id,funcao,onde,nome,multiplo,tipoCombo){
if (arguments.length > 2)
{$i(onde).innerHTML="buscando temas...";}
if (arguments.length === 3)
{nome = "";}
if (arguments.length < 5)
{multiplo = false;}
var monta, lista;
monta = function(retorno){
var i,comboTemas,temp,n,nome;
if (retorno !== undefined)
{
if(retorno.data)
{retorno = retorno.data;}
n = retorno.length;
if (n > 0)
{
if(multiplo)
{comboTemas = "