/*! 
	\file TeWMSInterface.js
	\brief Criação da estrutura de pseudojanela flutuante para apresentação da interface de cliente WMS.
		   Integra a biblioteca de funções de apoio à execução da camada cliente,
		   responsável pela interação entre usuário e interface, introduzindo
           dinamismo ao documento e reduzindo a quantidade de requisições ao
           servidor de aplicação na medida em que realiza tarefas de validação de entradas e
           requisições em segundo plano, assim como alterações na estrutura e na forma do documento HTML DOM
           da camada de apresentação.

     Author:  André Carvalho
     Data : 21/04/2007

     Alteração: André Carvalho
     Data : 14/06/2007
     
     Comentários: André Carvalho
     Data: 04/10/2007
*/
/*! Atributo de controle com a lista planos disponíveis no servidores WMS pesquisado. */
var listServers = new Array();
/*! Atributo de controle de exibição de elementos selecionados na árvore de planos disponíveis. */
var boolStop = false;
/*! Instância de classe que representa o cliente WMS. */
var wmsClient;
/*! Representa o retorno do servidor para um request de getMap(), a imagem WMS ou uma exceção */
var strImgWMS = "";
/*! Atributos da requisição de getMap(). */
var paransMap = "";
/*! Referência ao objeto iframe que exibe a resposta do servidor WMS, formatada em HTML. */
var iframeWMS = null;
/*! Atributo de controle de acesso para o botão de inclusão de servidor WMS na lista de histórico. */
var permiteAcesso = false;
/*! Pré-carregamento de imagem. */
home_off = new Image();
/*! Pré-carregamento de imagem. */
home_off.src = '../../img/homeoff.gif';
/*! Pré-carregamento de imagem. */
home_on = new Image();
/*! Pré-carregamento de imagem. */
home_on.src = '../../img/home.gif';
/*! String HTML que representa corpo da interface de pesquisa de servidores WMS, inserida na janela flutuante.  */
var strPesqWMS = ""+
"<table width='100%' align='center' bgcolor='#f5f5f5' border='0' style='padding-top:1px;padding-left:1px;'>"+
    "<tr>"+
      "<td align='center' colspan='2'>&nbsp;</td>"+
    "</tr>"+
    "<tr>"+
      	"<td align='center' colspan='2'>"+
	      	"<table width='100%' align='center' border='0' class='tblLinks'>"+
	      		"<tr>"+
				    "<td width='100%' align='center' colspan='2'>"+
				      "<font face='Geneva, Arial, Helvetica, san-serif' size='-1' color='#333333'>"+
				      "Forneça a url de um serviço ou selecione-o na lista:"+
				      "</font></td></tr><tr>"+
				      "<td width='100%' align='right' colspan='2'>"+
				      	"<input type='text' id='txtUrl' class='txt' value='http://www.earthetc.com/ecwp/ecw_wms.dll' style='background:#FFF; padding:4px; color:#333;' />"+
				      "</td>"+
			    "</tr>"+
			    "<tr valign='bottom'>"+
			      "<td align='center' colspan='2'>&nbsp;</td>"+
			    "</tr>"+
				"<tr>"+
					"<td width='50%' align='right' colspan='2'>"+
					"<div id='btHistorico' style='position:relative;display:none'><input class='bt' type='button' value='histórico' "+
					"title='Inclui o endereço digitado na lista de histórico de servidore WMS.' onclick='registerLog(getRegisterLogIdUs(), getRegisterLogIdFun()); iframeWMS.setHistoryWms();'></div>"+
					"&nbsp;&nbsp;&nbsp;&nbsp;"+
					"<div id='btDesenhar' style='position:relative;display:none'><input type='button' value='desenhar' class='bt' "+
					"title='Solicita o plano selecionado ao servidor WMS e insere na área de visualização.' onclick='boolStop=true; iframeWMS.getSelectedElements();'></div>"+
					"&nbsp;&nbsp;&nbsp;&nbsp;"+
					"<input type='button' value='procurar' class='bt' title='Procurar o serviço solicitado na rede.' onclick=searchWMS(document.getElementById('txtUrl').value);>"+
					"</td>"+
				"</tr>"+
				"<tr>"+
					"<td align='center' colspan='2'>"+
					"<div id='frameHttp' class='frameHttpMsg'></div>"+
					"</td>"+
				"</tr>"+
		    "</table>"+
    	"</td>"+
    "</tr>"+
    "<tr valign='bottom'>"+
      "<td align='center' colspan='2'>&nbsp;</td>"+
    "</tr>"+
    "<tr valign='bottom'>"+
      "<td width='50%' align='center' style='cursor:pointer;' id='aba1' onclick='swapBgColor(this); listarLayersWMS();'>"+
	      "<font face='Geneva, Arial, Helvetica, san-serif' size='-2' color='#333333'>"+
	      "Lista de Planos WMS."+
	      "</font>"+
      "</td>"+
      "<td width='50%' align='left' style='cursor:pointer; background-color:#d7e5d7' id='aba2' onclick='swapBgColor(this); listarServersWMS();'>"+
	      "<font face='Geneva, Arial, Helvetica, san-serif' size='-2' color='#333333'>"+
	      "Lista de Servidores de Mapa WMS."+
	      "</font>"+
      "</td>"+
    "</tr>"+
	'<tr valign="top">'+
		'<td width="100%" height="270" align="center" colspan="2">'+
			'<div id="serversWMS" style="position:relative;'+
			((!isIE_)?('height:100%;'):(''))+
			'"></div>'+
			'<div id="layersWMS" style="position:relative;display:none;'+
			((!isIE_)?('height:100%;'):(''))+
			'"></div>'+
		'</td>'+
	'</tr>'+
 '</table>';
///////////////////////////////////////////////////////////////////////////////////////
/*! Corpo html da janela flutuante de pesquisa de servidores WMS. */
var strFrmFlutWMS = 
'<table border="0" width="100%" cellspacing="0" cellpadding="0" valign="bottom>'+
	'<tr>'+
	'<td width="100%" valign="bottom">'+
		'<table border="0" width="100%" cellspacing="0" cellpadding="0" height="25" '+
		'class="divBarra" bgcolor="#d7e5d7">'+
		'<tr>'+
		'<td valign="middle" align="center" width="20%">'+
			   '<img style="cursor:pointer" src="../../img/homeoff.gif" name="home_" border="0" '+
			   'onclick=roll_("home_");'+
			   'alt="" title="Sobe janela!">'+
		'</td>'+
		'<td id="titleBarWMS" style="cursor:move" width="60%" title="Move janela!">'+
			'<ilayer width="100%" onSelectStart="return false">'+
			'<layer width="100%" onMouseover="isHot=true;if (isN4) ddN4(janelaWMS)" onMouseout="isHot=false">'+
			'</layer>'+
			'<font face="verdana" size="-2" color="#040200">'+
			'Localizar Servidor WMS!'+
			'</font>'+
			'</ilayer>'+
		'</td>'+
		'<td valign="middle" align="center" width="10%">'+
		'<a href="#" style="cursor:pointer" onClick="escondeWMS();return false">'+
		'<img border="0" alt="" title="FECHAR!" src="../../img/fechar_.gif"></a>'+
		'</td>'+
		'<td valign="middle" align="center" width="10%">'+
		'&nbsp;'+
		'</td>'+
		'</tr>'+
		'</table>'+
	'</td></tr>'+
	'<tr height="90%" valign="top">'+
		'<td width="100%" valign="top" colspan="4" align="center">'+
			'<div bgcolor="#F5F5F5" id="tableBodyWMS" style="position:relative;display:block;">'+
				'<table valign="top" border="0" width="100%" cellspacing="0" cellpadding="0" height="100%">'+
					'<tr>'+
					'<td valign="top" align="center" width="95%">'+
					'<table border="0" valign="top" align="center" width="100%" height="350" '+
					'cellspacing="0" cellpadding="0" class="divBody" bgcolor="#F5F5F5">'+
						'<tr height="100%">'+
							'<td id="insertTdWMS" width="100%" height="100%" align="center" valign="top">'+
							// conteúdo da subjanela
							strPesqWMS+
							'</td>'+
						'</tr>'+
					'</table>'+
					'</td>'+
					'</tr>'+
				'</table>'+
			'</div>'+
		'</td>'+
	'</tr>'+
	'</table>';
////////////////////////////////////////////////////////////////////
/*!
	\brief Função que armazena a resposta do servidor WMS.
	\param Array response, array de objetos da classe TeWMS.
	\return void.
	\public
*/
function setResponseServer(response) {
	listServers.push(response);
}
/*!
	\brief Recupera a lista de respostas de servidores WMS pesquisados durante a sessão.
	\param void.
	\return Array, array de objetos da classe TeWMS.
	\public
*/
function getResponseServer() {
	return listServers;
}
/*!
	\brief Trata a resposta do servidor WMS após uma requisição via getCapabilities().
	\param String response, resposta do servidor WMS em XML.
	\return void.
	\public
*/
function GetCapabilitiesResponseFunction(response) {
	if (response=="ERROR") {
		window.document.getElementById("frameHttp").innerHTML = "Requisição completa.";
		OBJ("serversWMS").innerHTML ="<font size='-1' color='#333'>Não foi possível ler o documento de resposta do servidor requisitado.</font>";
		document.getElementById("btDesenhar").style.display="none";
		document.getElementById("btHistorico").style.display="none";
	}else if(response.isSetServiceException()) {
		//alert((response.isSetServiceException()).toString());
		setResponseServer(response);
		window.document.getElementById("frameHttp").innerHTML = "Requisição completa.";
		// Exibe exceção retornada pelo servidor WMS.
		var exceptionResponse = response.getServiceExceptionResponse();
		alert(exceptionResponse);
	}else if(response) {
		setResponseServer(response);
		window.document.getElementById("frameHttp").innerHTML = "Requisição completa.";
		document.getElementById("btDesenhar").style.display="inline";
		if (permiteAcesso) {
			document.getElementById("btHistorico").style.display="inline";
		}else {
			document.getElementById("btHistorico").style.display="none";
		}
		//chama frame com árvore de layers
		showLayer();
	}
}
/*!
	\brief Processa a requisição getCapabilities() através de instância de cliente WMS, TeWMS usando o parâmetro wmsURL.
	\param String wmsURL, endereço do recurso, servidor WMS.
	\return void.
	\public
*/
function searchWMS(wmsURL) {
	window.document.getElementById("frameHttp").innerHTML = "Procurando...";
	var request = new TeWMSGetCapabilitiesRequest(wmsURL,"1.1.1");
	wmsClient = new TeWMS();
	wmsClient.GetCapabilities(request, GetCapabilitiesResponseFunction);
}
/*!
	\brief Trata a resposta do servidor WMS ao método getMap().
	\param String response, objeto HTML que representa uma imagem, tag img, com referência ao recurso
	imagem recebido do servidor WMS.
	\return void.
	\public
*/
function GetMapResponseFunction(response) {
	strImgWMS = response;
	getFrame("ifrmMapa").insertWMSMap(response);
	getFrame("ifrmMapa").hideIt();
}
/*!
	\brief Inicia processo de requisição de getMap(), após receber e tratar parte dos atributos da requisição.
	\param String selServer, titulo do servidor WMS.
	\param String strLayersMap, lista de planos selecionados pelo usuário na interface.
	\param String strURLMap, endereço do recurço apontado pelo servidor WMS com sendo o fornecedor do serviço
	de imagens de mapa.
	\param String strLayersFormat, formato de compressão do arquivo de imagem de resposta.
	\return void.
	\public
*/
function showLayerSelectedWMS(selServer, strLayersMap, strURLMap, strLayersFormat ) {
	if (boolStop) {
		paransMap = "&mapURL="+strURLMap.substring(7)+"&format="+strLayersFormat+"&nameLayers="+strLayersMap;
		strLayersMap = "";
		for (var i = 0; i < listServers.length; i++) {
			if (listServers[i].getServiceTitle() == selServer){
				wmsClient.GetMap(paransMap, GetMapResponseFunction);
				boolStop=false;
				//break;
			}
		}
	}
}
/*!
	\brief Recupera a lista de atributos usada na última requisição getMap() efetuada.
	\param void.
	\return String paransMap, lista de parâmetros para requisição getMap(). 
	\public
*/
function getParansMap() {
	return paransMap;
}
/*!
	\brief Atualiza o endereço do servidor WMS na caixa de texto de pesquisa de servidores WMS.
	\param String sel, endereço selecionado pelo usuário na lista de histórico de servidores WMS.
	\return void.
	\public
*/
function carregaURL(sel) {
	OBJ("txtUrl").value = sel;
}
/*!
	\brief 
	\param 
	\return 
	\public
*/
function showLayer() {
	//OBJ("serversWMS").innerHTML ="<IFRAME src='layersWMS.php' id='iframeLayer' style='Z-INDEX:1;background-color:#FFFFFF;' frameBorder='0' width='100%' scrolling='auto' height='250' align='center'></IFRAME>";
	OBJ("serversWMS").style.display="none";
	OBJ("layersWMS").style.display="inline";
	OBJ("iframeLayerWms").src="layersWMS.php";
	// altera a aba selecionada para aba de tree layers
	swapBgColor(OBJ("aba1"));
}
/*!
	\brief Insere na div de identificador "janelaWMS" o conteúdo HTML que representa a interface da
	subjanela de pesquisa de servidores WMS.
	\param void.
	\return void.
	\public
*/
function onLoadWMS(){
	OBJ("janelaWMS").innerHTML = strFrmFlutWMS;
	onLoadIframe();
}
/*!
	\brief Identifica o atributo a ser alterado, captura o novo ponto de tela que deve ser
	usado para mover a janela.
	\param Event e, evento percebido sobre a barra da subjanela flutuante.
	\return void.
	\public
*/
function ddInit_(e){
	topDog_=isIE ? "BODY" : "HTML";
	whichWMS=isIE ? document.all.janelaWMS : OBJ("janelaWMS");
	hotDog_=isIE ? event.srcElement : e.target;
	while (hotDog_.id!="titleBarWMS"&&hotDog_.tagName!=topDog_){
		hotDog_=isIE ? hotDog_.parentElement : hotDog_.parentNode;
	}
	if (hotDog_.id=="titleBarWMS"){
		offsetx=isIE ? event.clientX : e.clientX;
		offsety=isIE ? event.clientY : e.clientY;
		nowX=parseInt(whichWMS.style.left);
		nowY=parseInt(whichWMS.style.top);
		ddEnabled_=true;
		document.onmousemove=dd_;
	}
}
/*!
	\brief Aplica a nova posição ao elemento base da subjanela.
	\param Event e, evento percebido sobre a barra da subjanela flutuante.
	\return void.
	\public
*/
function dd_(e){
	if (!ddEnabled_) return;
	whichWMS.style.left=isIE ? nowX+event.clientX-offsetx : nowX+e.clientX-offsetx;
	whichWMS.style.top=isIE ? nowY+event.clientY-offsety : nowY+e.clientY-offsety;
	return false;
}
/*!
	\brief Atualiza eventos percebidos sobre a subjanela.
	\param String whatDog, nome de identificação do objeto que abriga a subjanela.
	\return Boolean, false se falhou.
	\public
*/
function ddN4(whatDog){
	if (!isN4) return;
	N4=eval(whatDog);
	N4.captureEvents(Event.MOUSEDOWN|Event.MOUSEUP);
	N4.onmousedown=function(e){
		N4.captureEvents(Event.MOUSEMOVE);
		N4x=e.x;
		N4y=e.y;
	}
	N4.onmousemove=function(e){
		if (isHot){
			N4.moveBy(e.x-N4x,e.y-N4y);
		return false;
		}
	}
	N4.onmouseup=function(){
		N4.releaseEvents(Event.MOUSEMOVE);
	}
}
/*!
	\brief Troca a imagem de seta que permite encolher/espandir o corpo da subjanela.
	\param String imgName, nome da imagem que foi pré carregada para este fim.
	\return void.
	\private
*/
function roll_(imgName){
	if (a==0) {
   		imgState=eval(imgName + 'on.src');
   		hideBody_();
   		title_ = "Desce janela!";
   		a = 1;
   		//stopPoint();
   	}else {
		imgState=eval(imgName + 'off.src');
		showBody_();
		title_ = "Sobe janela!";
		a = 0;
		//startPoint();
	}
	
	document.images[imgName].src = imgState;
	document.images[imgName].title = title_;
}
/*!
	\brief Exibe a subjanela.
	\param void.
	\return void.
	\public
*/
function exibeWMS(){
	whichWMS=isIE ? document.all.janelaWMS : OBJ("janelaWMS");
	if (isIE||isNN) whichWMS.style.visibility="visible";
	else if (isN4) document.janelaWMS.visibility="show";
}
/*!
	\brief Fecha a subjanela.
	\param void.
	\return void.
	\public
*/
function escondeWMS(){
	if (isIE||isNN) whichWMS.style.visibility="hidden";
	else if (isN4) document.janelaWMS.visibility="hide";
}
/*!
	\brief Esconde o corpo da subjanela.
	\param void.
	\return void.
	\private
*/
function hideBody_() {
	OBJ("tableBodyWMS").style.display="none";
}
/*!
	\brief Exibe o corpo da subjanela.
	\param void.
	\return void.
	\private
*/
function showBody_() {
	OBJ("tableBodyWMS").style.display="block";
}
/*!
	\brief Alternando o controle de captura de evento para movimentação da subjanela.
	\param Event e, evento percebido sobre a barra de controle da subjanela.
	\return void.
	\public
*/
function alternateInit(e) {
	ddInit(e);
	ddInit_(e);
}
// ATUALIZANDO OS EVENTOS PERCEBIDOS NA JANELA PRINCIPAL SOBRE OS ELEMENTOS DIV FLUTUANTES
/*! Atualiza a função de resposta ao evento de mouse, onmousedown. */
document.onmousedown=alternateInit;
/*! Atualiza a função de resposta ao evento de mouse, onmouseup. */
document.onmouseup=Function("ddEnabled=false;ddEnabled_=false");
///////////////////////////////////////////////////////////////////////////////////////
/*!
	\brief Exibe a lista de servidores existentes no histórico de servidores disponíveis.
	\param void.
	\return void.
	\public
*/
function listarServersWMS() {
	document.getElementById("btDesenhar").style.display="none";
	OBJ("layersWMS").style.display="none";
	OBJ("serversWMS").style.display="inline";
	OBJ("iframeListServer").src="historicoServicesWMS.php";
}
/*!
	\brief Exibe a árvore de planos disponíveis em um servidor WMS.
	\param void.
	\return void.
	\public
*/
function listarLayersWMS() {
	OBJ("btDesenhar").style.display="inline";
	OBJ("layersWMS").style.display="inline";
	OBJ("serversWMS").style.display="none";
}
/*!
	\brief Insere objeto iframe no corpo da subjanela de pesquisa de servidores WMS, definindo o estado
	inicial da subjanela, executa quando evento de onload do sitio é gerado pelo navegador.
	\param void.
	\return void.
	\public
*/
function onLoadIframe() {
	OBJ("serversWMS").innerHTML="<IFRAME id='iframeListServer' style='Z-INDEX:1;background-color:#FFFFFF;' "+
	"src='historicoServicesWMS.php"+
	"' frameBorder='0' "+
	((!isIE_)?(''):("class='divFrame'"))+
	" width='100%' scrolling='yes' height='250' align='center'></IFRAME>";
	
	OBJ("layersWMS").innerHTML="<IFRAME id='iframeLayerWms' style='Z-INDEX:1;background-color:#FFFFFF;' "+
	"src='"+
	"' frameBorder='0' "+
	((!isIE_)?(''):("class='divFrame'"))+
	" width='100%' scrolling='yes' height='250' align='center'></IFRAME>";
}
/*!
\brief Troca a cor de fundo da coluna selecionada e da coluna que perdeu a seleção.
\param Object ref, referência ao objeto DOM que representa a coluna selecionada.
\return void.
\public
*/
function swapBgColor(ref) {
	OBJ("aba1").style.backgroundColor="#F5F5F5";
	OBJ("aba2").style.backgroundColor="#F5F5F5";
	ref.style.backgroundColor="#d7e5d7";
}
/*!
\brief Atualiza uma referência ao objeto iframe apresentado na interface de 
		subjanela flutuante com a árvore de layers disponíveis no servidor WMS pesquisado.
\param Object ref, referência ao objeto iframe da subjanela.
\return void.
\public
*/
function setReferenceFrame(ref) {
	iframeWMS = ref;
}

