/** * Title: Eventos * * Controla as operações que são executadas em eventos que ocorrem no mapa. * * As listas de operações consistem em variáveis com nomes de funções. * * As listas são inicializadas com algunmas funções já pré-definidas, mas podem ser acrescentadas outras. * * Namespace: * * i3GEO.eventos * * Exemplos: * * Para incluir uma função em um determinado evento utilize * * if(i3GEO.eventos.NAVEGAMAPA.toString().search("i3GEO.gadgets.atualizaEscalaNumerica()") < 0) * * {i3GEO.eventos.NAVEGAMAPA.push("i3GEO.gadgets.atualizaEscalaNumerica()");} * * Para remover utilize * * i3GEO.eventos.NAVEGAMAPA.remove("i3GEO.gadgets.atualizaEscalaNumerica()"); * * Veja: * * */ //TODO criar metodos para remover e adicionar eventos /** * 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 ADEQUACÃ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') { var i3GEO = {}; } /** * Variavel: objposicaocursor * * Utilizada como variável global para armazenar a posição do mouse * * (start code) * * objposicaocursor = { * ddx : "", * ddy : "", * dmsx : "", * dmsy : "", * telax : "", * telay : "", * imgx : "", * imgy : "", * refx : "", * refy : "" * }; * * (end) */ objposicaocursor = { ddx : "", ddy : "", dmsx : "", dmsy : "", telax : "", telay : "", imgx : "", imgy : "", refx : "", refy : "" }; i3GEO.eventos = { /** * Variavel: SELECAO * * Armazena as funções (eventos) que serão executadas quando uma operação de seleção e concluida. * * Tipo: * * {Array} */ SELECAO : [], /** * Variavel: ATUALIZAARVORECAMADAS * * Armazena as funções (eventos) que serão executadas quando a árvore de camadas for atualizada. * * Tipo: * * {Array} */ ATUALIZAARVORECAMADAS : [], /** * Variavel: ATIVATEMA * * Armazena as funções (eventos) que serão executadas quando um tema da árvore de camadas é * ativado. * * Tipo: * * {Array} */ ATIVATEMA : [], /** * Variavel: NAVEGAMAPA * * Armazena as funções que serão executadas quando é feita uma operação de * navegação sobre o mapa. * * Tipo: * * {Array} */ NAVEGAMAPA : [], /** * Variavel: MOUSEPARADO * * Armazena as funções que serão executadas quando o usuário estaciona o mouse sobre o mapa por alguns * instantes. * * Tipo: * * {Array} * */ MOUSEPARADO : [ ], /** * Variavel: MOUSEMOVE * * Armazena as funções que serão executadas quando o usuário move o mouse sobre o mapa * * Tipo: * * {Array} */ MOUSEMOVE : [], /** * Variavel: MOUSEDOWN * * Armazena as funções que serão executadas quando o usuário pressiona o botão do mouse sobre o * mapa * * Tipo: * * {Array} */ MOUSEDOWN : [], /** * Variavel: MOUSEUP * * Armazena as funções que serão executadas quando o usuário solta o botão do mouse sobre o mapa * * Tipo: * * {Array} * * Default: * * {["i3GEO.eventos.cliquePerm.executa()"]} */ MOUSEUP : [ "i3GEO.eventos.cliquePerm.executa()" ], /** * Variavel: MOUSECLIQUE * * Armazena as funções que serão executadas quando o usuário clica sobre o mapa * * Tipo: * * {Array} * * Default: * * {["i3GEO.eventos.cliqueCapturaPt()"]} */ MOUSECLIQUE : [ "i3GEO.eventos.cliqueCapturaPt()" ], /** * Variavel: MOUSECLIQUEPERM * * Armazena as funções permanentes que serão executadas quando o usuário clica sobre o mapa * * As operações definidas aqui normalmente não fazem verificação de status de outras ferramentas * e podem ser bloqueadas momentaneamente alterando-se i3GEO.eventos.cliquePerm.status * * Tipo: * * {Array} * * Default: * * i3GEO.configura.funcaoTip */ MOUSECLIQUEPERM : [ i3GEO.configura.funcaoTip ], /** * Timer utilizado pelo contador do mouse parado * * Tipo: * * {Timeout} */ TIMERPARADO : "", /** * Function: mouseParado * * Executa as funções definidas em MOUSEPARADO quando é detectado que o mouse está estacionado. * * A execução desse evento é controlado por um timer definido no evento onmousemove (sobre o mapa). * */ mouseParado : function() { try { clearTimeout(this.TIMERPARADO); } catch (e) { this.TIMERPARADO = ""; } if (objposicaocursor.dentroDomapa === false) { return; } try { if (objposicaocursor.imgy === "") { objposicaocursor.imgy = 1; objposicaocursor.imgx = 1; } if (i3GEO.eventos.MOUSEPARADO.length > 0 && objposicaocursor.imgy > 0 && objposicaocursor.imgx > 0) { if (objposicaocursor.imgx > 0) { i3GEO.eventos.executaEventos(i3GEO.eventos.MOUSEPARADO); } } } catch (e) { if (typeof (console) !== 'undefined') console.error("i3GEO.eventos.mouseParado" + e); } }, /** * Function: navegaMapa * * Executa as funções armazenadas em NAVEGAMAPA, ou seja, operações executadas quando o mapa tem sua * extensão geográfica alterada. */ navegaMapa : function() { i3GEO.eventos.executaEventos(this.NAVEGAMAPA); }, /** * Function: mousemoveMapa * * Executa as funções armazenadas em MOUSEMOVE. */ mousemoveMapa : function() { i3GEO.eventos.executaEventos(this.MOUSEMOVE); }, /** * Function: mousedownMapa * * Executa as funções armazenadas em MOUSEDOWN. */ mousedownMapa : function() { i3GEO.eventos.executaEventos(this.MOUSEDOWN); }, /** * Function: mouseupMapa * * Executa as funções armazenadas em MOUSEUP. */ mouseupMapa : function(exy) { // console.error(exy.target.id); // console.error(exy.target.style.zIndex); // tenta evitar abrir o balao em objetos do openlayers ou googlemaps if (!exy) { i3GEO.eventos.executaEventos(this.MOUSEUP); } else { if (i3GEO.Interface.ATUAL === "googlemaps" && exy.target && !exy.target.src) { i3GEO.eventos.executaEventos(this.MOUSEUP); } if (i3GEO.Interface.ATUAL === "openlayers" && exy.target && (i3GEO.desenho.layergrafico || exy.target.style.zIndex == "" || exy.target.style.zIndex == 1)) { var parente = exy.target.parentNode; if (parente && (parente.className === "olLayerDiv" || parente.className === "olLayerDiv olLayerGrid" || (parente.childNodes && parente.childNodes[0].attributes[0].nodeValue === "olTileImage"))) { i3GEO.eventos.executaEventos(this.MOUSEUP); } } } }, /** * Function: mousecliqueMapa * * Executa as funções armazenadas em MOUSECLIQUE. */ mousecliqueMapa : function() { i3GEO.eventos.executaEventos(this.MOUSECLIQUE); }, /** * Executa a pilha de nomes de funcoes ou funcoes armazenados em um array * * Parameter: * * eventos {array} - array com os nomes das funções */ executaEventos : function(eventos) { if (i3GEO.Interface.STATUS.pan === true) { return; } var f = 0; try { if (eventos.length > 0) { f = eventos.length - 1; if (f >= 0) { do { if (eventos[f] !== "") { if (typeof (eventos[f]) === "function") { eventos[f].call(); } else { eval(eventos[f]); } } } while (f--); } } } catch (e) { if (typeof (console) !== 'undefined') console.error(e); eventos[f] = ""; } }, /** * Captura a posição do mouse sobre um mapa. O cálculo pode ser feito sobre o corpo do mapa principal ou sob o * corpo do mapa de referência * * O resultado dos cálculos são armazenados no objeto objposicaocursor esse objeto terá as seguintes * propriedades: * * objposicaocursor.ddx valor de x em décimos de grau * * objposicaocursor.ddy valor de y em décimos de grau * * objposicaocursor.dmsx valor de x em dms * * objposicaocursor.dmsy valor de y em dms * * objposicaocursor.telax posicao x na tela em pixels * * objposicaocursor.telay posicao y na tela em pixels * * objposicaocursor.imgx posicao x no mapa em pixels * * objposicaocursor.imgy: posicao y no mapa em pixels * * objposicaocursor.refx: posicao x no mapa de referência em pixels * * objposicaocursor.refy: posicao x no mapa de referência em pixels * * Parameters: * * e {Event object} - objeto do tipo evento disparado sobre o objeto em foco */ posicaoMouseMapa : function(e) { // // os eventos da interface googlemaps são definidos em i3GEO.Interface // se a interface for googleearth, googlemaps ou openlayers, os eventos são controlados // pelas respectivas apis // caso contrário, o i3geo irá controlar os cálculos // var teladd, teladms, container = "", targ = "", pos, mousex, mousey, xfig, yfig, xreffig, yreffig, xtela, ytela, c, ex; if (!e) { e = window.event; } try { if (e.target) { targ = e.target; } else if (e.srcElement) { targ = e.srcElement; } if (targ.parentNode) { container = targ.parentNode.id; } } catch (erro) { return; } if (container !== "mapaReferencia") { return; } pos = i3GEO.util.pegaPosicaoObjeto(targ); // // pega a posicao correta do mouse // mousex = 0; mousey = 0; if (e.pageX || e.pageY) { mousex = e.pageX; mousey = e.pageY; } else if (e.clientX || e.clientY) { mousex = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; mousey = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; } // // faz os cálculos de posicionamento // fig e reffig são a mesma coisa por enquanto // xfig = mousex - pos[0]; yfig = mousey - pos[1]; xreffig = xfig; yreffig = yfig; xtela = mousex; ytela = mousey; // // celula e extent são necessários para se fazer a // conversão de coordenadas de tela para coordenadas geográficas // esses valores são obtidos das funções ajax que redesenham ou inicializam o mapa // c = i3GEO.parametros.pixelsize; ex = i3GEO.parametros.mapexten; c = i3GEO.parametros.celularef; ex = i3GEO.parametros.extentref; teladd = i3GEO.calculo.tela2dd(xfig, yfig, c, ex, targ.id); teladms = i3GEO.calculo.dd2dms(teladd[0], teladd[1]); objposicaocursor = { ddx : teladd[0], ddy : teladd[1], dmsx : teladms[0], dmsy : teladms[1], telax : xtela, telay : ytela, imgx : xfig, imgy : yfig, refx : xreffig, refy : yreffig, dentroDomapa : true }; }, /** * Ativa os eventos relacionados ao mapa (movimentação do mouse sobre o mapa) * * Define o que será executado quando o mouse é clicado ou movido sobre o mapa. * * Além das funções padrão,são ativadas aquelas definidas nas variáveis de * configuração (veja classe_configura.js) * * Parametro: * * docMapa {DOM node} - objeto que será alvo da ativação dos cliques */ ativa : function(docMapa) { if (typeof (console) !== 'undefined') console.info("i3GEO.eventos.ativa()"); if (!docMapa) { return; } docMapa.onmouseover = function() { objposicaocursor.dentroDomapa = true; this.onmousemove = function(exy) { // var executar = new Function("i3GEO.eventos.mouseParado().call"); // ativa o clique sobre o mapa (o evento click e desativado no evento moveend da interface i3GEO.eventos.cliquePerm.status = true; i3GEO.eventos.posicaoMouseMapa(exy); try { try { clearTimeout(i3GEO.eventos.TIMERPARADO); } catch (e) {} i3GEO.eventos.TIMERPARADO = setTimeout(function() { i3GEO.eventos.mouseParado(); }, i3GEO.configura.tempoMouseParado); } catch (e) {} try { i3GEO.eventos.mousemoveMapa(); } catch (e) {} }; }; docMapa.onmouseout = function() { objposicaocursor.dentroDomapa = true; try { objmapaparado = "parar"; } catch (e) {} }; docMapa.onmousedown = function(exy) { if (!i3GEO.eventos.botaoDireita(exy)) { i3GEO.eventos.mousedownMapa(); } }; docMapa.onclick = function(exy) { if (!i3GEO.eventos.botaoDireita(exy)) { i3GEO.eventos.mousecliqueMapa(exy); } }; docMapa.onmouseup = function(exy) { if (!i3GEO.eventos.botaoDireita(exy)) { i3GEO.eventos.mouseupMapa(exy); } }; }, /** * Retorna true se o botão da direita foi utilizado no evento do mouse * * Parametro: * * exy - evento * * Return: {boolean} */ botaoDireita : function(exy) { try { var k = (navm) ? event.button : exy.button; if (k !== 2) { return false; } else { return true; } } catch (e) { return false; } }, /** * Captura um ponto na tela e retorna o resultado para a janela interna que estiver aberta. * * As coordenadas do ponto, em DMS, são repassadas para os campos do tipo input da janela interna que estiver aberta. A * janela aberta deve ter os seguintes elementos do tipo input (ids): ixg,ixm,ixs,iyg,iym,iys */ cliqueCapturaPt : function(ixg, ixm, ixs, iyg, iym, iys) { if (typeof (console) !== 'undefined') console.info("i3GEO.eventos.cliqueCapturaPt()"); var x, y, doc = document; if (arguments.length === 0) { ixg = "ixg"; ixm = "ixm"; ixs = "ixs"; iyg = "iyg"; iym = "iym"; iys = "iys"; if ($i("wdocai")) { doc = (navm) ? document.frames("wdocai").document : $i("wdocai").contentDocument; } } // // algumas operacoes de analise podem precisar das coordenadas // nesses casos, g_tipoacao e definida como "capturaponto" // if (g_tipoacao !== "capturaponto") { return; } else { try { if (doc) { x = objposicaocursor.dmsx.split(" "); y = objposicaocursor.dmsy.split(" "); if (doc.getElementById(ixg)) { doc.getElementById(ixg).value = x[0]; } if (doc.getElementById(ixm)) { doc.getElementById(ixm).value = x[1]; } if (doc.getElementById(ixs)) { doc.getElementById(ixs).value = x[2]; } if (doc.getElementById(iyg)) { doc.getElementById(iyg).value = y[0]; } if (doc.getElementById(iym)) { doc.getElementById(iym).value = y[1]; } if (doc.getElementById(iys)) { doc.getElementById(iys).value = y[2]; } } } catch (m) {} } }, /** * Section: i3GEO.eventos.cliquePerm * * Executa as funções armazenadas em MOUSECLIQUEPERM * * i3GEO.eventos.cliquePerm.executa é definido como um evento de clique sobre o mapa * * Essas são operações que ocorrem de forma permanente sempre que o usuário clica no mapa. As * operações de clique devem alterar o status desse objeto para bloquear a execução quando for o caso * * Exemplo, pode ser necessário bloquear as funções permanentes quando o usuário clica no mapa para * calcular distâncias, para isso, altere i3GEO.eventos.cliquePerm.status = false e depois volte para true */ cliquePerm : { /** * Propriedade: ativo * * Indica se as operações permanentes serão ou não executadas * * Essa propriedade bloqueia todas as operações mesmo que momentâneamente o status esteja true * * Type: * * {boolean} * * Default: * * true */ ativo : true, /** * * Indica se as operações permanentes serão ou não executadas se 'ativo' estiver true. Status pode * ser momentâneo e controlado em tempo de execução * * Type: boolean */ status : true, /** * Executa os eventos definidos em MOUSECLIQUEPERM */ executa : function(evt) { if (i3GEO.eventos.cliquePerm.ativo === true && i3GEO.eventos.cliquePerm.status === true) { i3GEO.eventos.executaEventos(i3GEO.eventos.MOUSECLIQUEPERM); } }, /** * Function: ativa * * Ativa os cliques permanentes */ ativa : function() { if (i3GEO.eventos.cliquePerm.ativoinicial === true) { i3GEO.eventos.cliquePerm.ativo = true; } }, /** * Function: desativa * * Desaativa momentaneamente os cliques permanentes */ desativa : function() { if (i3GEO.eventos.cliquePerm.ativoinicial === true) { i3GEO.eventos.cliquePerm.ativo = false; } }, // uso interno, definido na criacao do mapa ativoinicial : true } };